Skip to content

Commit d866eed

Browse files
Merge pull request #815 from sathvikbhagavan/sb/docs
docs: update and cleanup tutorials and examples
2 parents b861b05 + 9d3f9f0 commit d866eed

22 files changed

+253
-277
lines changed

.buildkite/pipeline.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ steps:
5555
queue: "juliagpu"
5656
cuda: "*"
5757
if: build.message !~ /\[skip docs\]/ && !build.pull_request.draft
58-
timeout_in_minutes: 1000
58+
timeout_in_minutes: 1440
5959

6060
env:
6161
SECRET_DOCUMENTER_KEY: "yBJHrf5zUPu3VFotb0W4TRdauMTGgNUei3ax0xrVTmcrrP3EX8zSGaj9MNZji9H6JqyNEhCqZMGcHhxR5XK0f97YjhAp5rDNpwV6FbIXY8FXgFyIOLAenYUklta1W6fNM7KTz3Dq3UnKBAprKhQBwUw3SldTuvtm+IhiVT2rFmADqxMSQcv+5LivYEgAFrrd6LX+PHhonj38VN46z5Bi3TOIGAnByVlZssX7cOwaRg/8TloLPsWAUlQiPr89Vdlow9k6SQV8W9mf00/Rq4LFd1Eq1EYTCSmReVawMxVpXh1mj7MSabf9ppVWYOmjP5Rzatk8YFWlJf80HVvzY7tXRQ==;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"

.github/workflows/CI.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ jobs:
2525
- AdaptiveLoss
2626
- Logging
2727
- Forward
28-
- NeuralAdapter
2928
- DGM
3029
version:
3130
- "1"

docs/Project.toml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
11
[deps]
22
AdvancedHMC = "0bf59076-c3b1-5ca4-86bd-e02cd72cde3d"
3+
ComponentArrays = "b0b7db55-cfe3-40fc-9ded-d10e2dbeff66"
34
Cubature = "667455a9-e2ce-5579-9412-b964f529a492"
45
DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e"
56
Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f"
67
Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4"
78
DomainSets = "5b8099bc-c8ec-5219-889f-1d9e522a28bf"
89
Flux = "587475ba-b771-5e3f-ad9e-33799f191a9c"
910
Integrals = "de52edbc-65ea-441a-8357-d3a637375a31"
11+
LineSearches = "d3d80556-e9d4-5f37-9878-2ab0fcc64255"
1012
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
1113
Lux = "b2108857-7c20-44ae-9111-449ecde12c47"
14+
LuxCUDA = "d0bbae9a-e099-4d5b-a835-1c6931763bda"
15+
MethodOfLines = "94925ecb-adb7-4558-8ed8-f975c56a0bf4"
1216
ModelingToolkit = "961ee093-0014-501f-94e3-6117800e7a78"
1317
MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca"
1418
NeuralPDE = "315f7962-48a3-4962-8226-d0f33b1235f0"
@@ -19,19 +23,24 @@ OptimizationPolyalgorithms = "500b13db-7e66-49ce-bda4-eed966be6282"
1923
OrdinaryDiffEq = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed"
2024
Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80"
2125
QuasiMonteCarlo = "8a4e6c94-4038-4cdc-81c3-7e6ffdb2a71b"
26+
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
2227
Roots = "f2b01f46-fcfa-551c-844a-d8ac1e96c665"
2328
SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b"
2429

2530
[compat]
2631
AdvancedHMC = "0.6"
32+
ComponentArrays = "0.15"
2733
Cubature = "1.5"
2834
DiffEqBase = "6.106"
2935
Distributions = "0.25"
3036
Documenter = "1"
3137
DomainSets = "0.6, 0.7"
3238
Flux = "0.14"
3339
Integrals = "4"
40+
LineSearches = "7.2"
3441
Lux = "0.5"
42+
LuxCUDA = "0.3"
43+
MethodOfLines = "0.10"
3544
ModelingToolkit = "8.33"
3645
MonteCarloMeasurements = "1"
3746
NeuralPDE = "5.3"
@@ -42,5 +51,6 @@ OptimizationPolyalgorithms = "0.2"
4251
OrdinaryDiffEq = "6.31"
4352
Plots = "1.36"
4453
QuasiMonteCarlo = "0.3"
54+
Random = "1"
4555
Roots = "2.0"
4656
SpecialFunctions = "2.1"

docs/src/examples/3rd.md

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ callback = function (p, l)
4747
return false
4848
end
4949
50-
res = Optimization.solve(prob, Adam(0.01); callback = callback, maxiters = 2000)
50+
res = Optimization.solve(prob, OptimizationOptimisers.Adam(0.01); maxiters = 2000)
5151
phi = discretization.phi
5252
```
5353

@@ -67,5 +67,3 @@ x_plot = collect(xs)
6767
plot(x_plot, u_real, title = "real")
6868
plot!(x_plot, u_predict, title = "predict")
6969
```
70-
71-
![hodeplot](https://user-images.githubusercontent.com/12683885/90276340-69bc3e00-de6c-11ea-89a7-7d291123a38b.png)

docs/src/examples/heterogeneous.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,5 +45,5 @@ callback = function (p, l)
4545
return false
4646
end
4747
48-
res = Optimization.solve(prob, BFGS(); callback = callback, maxiters = 100)
48+
res = Optimization.solve(prob, BFGS(); maxiters = 100)
4949
```

docs/src/examples/ks.md

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ callback = function (p, l)
7272
end
7373
7474
opt = OptimizationOptimJL.BFGS()
75-
res = Optimization.solve(prob, opt; callback = callback, maxiters = 2000)
75+
res = Optimization.solve(prob, opt; maxiters = 2000)
7676
phi = discretization.phi
7777
```
7878

@@ -93,5 +93,3 @@ p2 = plot(xs, u_real, title = "analytic")
9393
p3 = plot(xs, diff_u, title = "error")
9494
plot(p1, p2, p3)
9595
```
96-
97-
![plotks](https://user-images.githubusercontent.com/12683885/91025889-a6253200-e602-11ea-8f61-8e6e2488e025.png)

docs/src/examples/linear_parabolic.md

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ w(t, 1) = \frac{e^{\lambda_1} cos(\frac{x}{a})-e^{\lambda_2}cos(\frac{x}{a})}{\l
2323

2424
with a physics-informed neural network.
2525

26-
```@example
27-
using NeuralPDE, Lux, ModelingToolkit, Optimization, OptimizationOptimJL
26+
```@example linear_parabolic
27+
using NeuralPDE, Lux, ModelingToolkit, Optimization, OptimizationOptimisers, OptimizationOptimJL, LineSearches
2828
using Plots
29-
import ModelingToolkit: Interval, infimum, supremum
29+
using ModelingToolkit: Interval, infimum, supremum
3030
3131
@parameters t, x
3232
@variables u(..), w(..)
@@ -71,7 +71,7 @@ input_ = length(domains)
7171
n = 15
7272
chain = [Lux.Chain(Dense(input_, n, Lux.σ), Dense(n, n, Lux.σ), Dense(n, 1)) for _ in 1:2]
7373
74-
strategy = QuadratureTraining()
74+
strategy = StochasticTraining(500)
7575
discretization = PhysicsInformedNN(chain, strategy)
7676
7777
@named pdesystem = PDESystem(eqs, bcs, domains, [t, x], [u(t, x), w(t, x)])
@@ -85,14 +85,14 @@ global iteration = 0
8585
callback = function (p, l)
8686
if iteration % 10 == 0
8787
println("loss: ", l)
88-
println("pde_losses: ", map(l_ -> l_(p), pde_inner_loss_functions))
89-
println("bcs_losses: ", map(l_ -> l_(p), bcs_inner_loss_functions))
88+
println("pde_losses: ", map(l_ -> l_(p.u), pde_inner_loss_functions))
89+
println("bcs_losses: ", map(l_ -> l_(p.u), bcs_inner_loss_functions))
9090
end
9191
global iteration += 1
9292
return false
9393
end
9494
95-
res = Optimization.solve(prob, BFGS(); callback = callback, maxiters = 5000)
95+
res = Optimization.solve(prob, OptimizationOptimisers.Adam(1e-2); maxiters = 10000)
9696
9797
phi = discretization.phi
9898
@@ -105,14 +105,19 @@ analytic_sol_func(t, x) = [u_analytic(t, x), w_analytic(t, x)]
105105
u_real = [[analytic_sol_func(t, x)[i] for t in ts for x in xs] for i in 1:2]
106106
u_predict = [[phi[i]([t, x], minimizers_[i])[1] for t in ts for x in xs] for i in 1:2]
107107
diff_u = [abs.(u_real[i] .- u_predict[i]) for i in 1:2]
108+
ps = []
108109
for i in 1:2
109110
p1 = plot(ts, xs, u_real[i], linetype = :contourf, title = "u$i, analytic")
110111
p2 = plot(ts, xs, u_predict[i], linetype = :contourf, title = "predict")
111112
p3 = plot(ts, xs, diff_u[i], linetype = :contourf, title = "error")
112-
plot(p1, p2, p3)
113-
savefig("sol_u$i")
113+
push!(ps, plot(p1, p2, p3))
114114
end
115115
```
116116

117-
![linear_parabolic_sol_u1](https://user-images.githubusercontent.com/26853713/125745625-49c73760-0522-4ed4-9bdd-bcc567c9ace3.png)
118-
![linear_parabolic_sol_u2](https://user-images.githubusercontent.com/26853713/125745637-b12e1d06-e27b-46fe-89f3-076d415fcd7e.png)
117+
```@example linear_parabolic
118+
ps[1]
119+
```
120+
121+
```@example linear_parabolic
122+
ps[2]
123+
```

docs/src/examples/nonlinear_elliptic.md

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ where k is a root of the algebraic (transcendental) equation f(k) = g(k).
2626

2727
This is done using a derivative neural network approximation.
2828

29-
```@example
29+
```@example nonlinear_elliptic
3030
using NeuralPDE, Lux, ModelingToolkit, Optimization, OptimizationOptimJL, Roots
3131
using Plots
32-
import ModelingToolkit: Interval, infimum, supremum
32+
using ModelingToolkit: Interval, infimum, supremum
3333
3434
@parameters x, y
3535
Dx = Differential(x)
@@ -79,18 +79,14 @@ input_ = length(domains)
7979
n = 15
8080
chain = [Lux.Chain(Dense(input_, n, Lux.σ), Dense(n, n, Lux.σ), Dense(n, 1)) for _ in 1:6] # 1:number of @variables
8181
82-
strategy = QuadratureTraining()
82+
strategy = GridTraining(0.01)
8383
discretization = PhysicsInformedNN(chain, strategy)
8484
8585
vars = [u(x, y), w(x, y), Dxu(x, y), Dyu(x, y), Dxw(x, y), Dyw(x, y)]
8686
@named pdesystem = PDESystem(eqs_, bcs__, domains, [x, y], vars)
8787
prob = NeuralPDE.discretize(pdesystem, discretization)
8888
sym_prob = NeuralPDE.symbolic_discretize(pdesystem, discretization)
8989
90-
strategy = NeuralPDE.QuadratureTraining()
91-
discretization = PhysicsInformedNN(chain, strategy)
92-
sym_prob = NeuralPDE.symbolic_discretize(pdesystem, discretization)
93-
9490
pde_inner_loss_functions = sym_prob.loss_functions.pde_loss_functions
9591
bcs_inner_loss_functions = sym_prob.loss_functions.bc_loss_functions[1:6]
9692
aprox_derivative_loss_functions = sym_prob.loss_functions.bc_loss_functions[7:end]
@@ -99,15 +95,15 @@ global iteration = 0
9995
callback = function (p, l)
10096
if iteration % 10 == 0
10197
println("loss: ", l)
102-
println("pde_losses: ", map(l_ -> l_(p), pde_inner_loss_functions))
103-
println("bcs_losses: ", map(l_ -> l_(p), bcs_inner_loss_functions))
104-
println("der_losses: ", map(l_ -> l_(p), aprox_derivative_loss_functions))
98+
println("pde_losses: ", map(l_ -> l_(p.u), pde_inner_loss_functions))
99+
println("bcs_losses: ", map(l_ -> l_(p.u), bcs_inner_loss_functions))
100+
println("der_losses: ", map(l_ -> l_(p.u), aprox_derivative_loss_functions))
105101
end
106102
global iteration += 1
107103
return false
108104
end
109105
110-
res = Optimization.solve(prob, BFGS(); callback = callback, maxiters = 5000)
106+
res = Optimization.solve(prob, BFGS(); maxiters = 100)
111107
112108
phi = discretization.phi
113109
@@ -120,14 +116,19 @@ analytic_sol_func(x, y) = [u_analytic(x, y), w_analytic(x, y)]
120116
u_real = [[analytic_sol_func(x, y)[i] for x in xs for y in ys] for i in 1:2]
121117
u_predict = [[phi[i]([x, y], minimizers_[i])[1] for x in xs for y in ys] for i in 1:2]
122118
diff_u = [abs.(u_real[i] .- u_predict[i]) for i in 1:2]
119+
ps = []
123120
for i in 1:2
124121
p1 = plot(xs, ys, u_real[i], linetype = :contourf, title = "u$i, analytic")
125122
p2 = plot(xs, ys, u_predict[i], linetype = :contourf, title = "predict")
126123
p3 = plot(xs, ys, diff_u[i], linetype = :contourf, title = "error")
127-
plot(p1, p2, p3)
128-
savefig("non_linear_elliptic_sol_u$i")
124+
push!(ps, plot(p1, p2, p3))
129125
end
130126
```
131127

132-
![non_linear_elliptic_sol_u1](https://user-images.githubusercontent.com/26853713/125745550-0b667c10-b09a-4659-a543-4f7a7e025d6c.png)
133-
![non_linear_elliptic_sol_u2](https://user-images.githubusercontent.com/26853713/125745571-45a04739-7838-40ce-b979-43b88d149028.png)
128+
```@example nonlinear_elliptic
129+
ps[1]
130+
```
131+
132+
```@example nonlinear_elliptic
133+
ps[2]
134+
```

docs/src/examples/nonlinear_hyperbolic.md

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,11 @@ where k is a root of the algebraic (transcendental) equation f(k) = g(k), j0 and
3232

3333
We solve this with Neural:
3434

35-
```@example
36-
using NeuralPDE, Lux, ModelingToolkit, Optimization, OptimizationOptimJL, Roots
35+
```@example nonlinear_hyperbolic
36+
using NeuralPDE, Lux, ModelingToolkit, Optimization, OptimizationOptimJL, Roots, LineSearches
3737
using SpecialFunctions
3838
using Plots
39-
import ModelingToolkit: Interval, infimum, supremum
39+
using ModelingToolkit: Interval, infimum, supremum
4040
4141
@parameters t, x
4242
@variables u(..), w(..)
@@ -94,12 +94,12 @@ bcs_inner_loss_functions = sym_prob.loss_functions.bc_loss_functions
9494
9595
callback = function (p, l)
9696
println("loss: ", l)
97-
println("pde_losses: ", map(l_ -> l_(p), pde_inner_loss_functions))
98-
println("bcs_losses: ", map(l_ -> l_(p), bcs_inner_loss_functions))
97+
println("pde_losses: ", map(l_ -> l_(p.u), pde_inner_loss_functions))
98+
println("bcs_losses: ", map(l_ -> l_(p.u), bcs_inner_loss_functions))
9999
return false
100100
end
101101
102-
res = Optimization.solve(prob, BFGS(); callback = callback, maxiters = 1000)
102+
res = Optimization.solve(prob, BFGS(linesearch = BackTracking()); maxiters = 200)
103103
104104
phi = discretization.phi
105105
@@ -112,14 +112,20 @@ analytic_sol_func(t, x) = [u_analytic(t, x), w_analytic(t, x)]
112112
u_real = [[analytic_sol_func(t, x)[i] for t in ts for x in xs] for i in 1:2]
113113
u_predict = [[phi[i]([t, x], minimizers_[i])[1] for t in ts for x in xs] for i in 1:2]
114114
diff_u = [abs.(u_real[i] .- u_predict[i]) for i in 1:2]
115+
ps = []
115116
for i in 1:2
116117
p1 = plot(ts, xs, u_real[i], linetype = :contourf, title = "u$i, analytic")
117118
p2 = plot(ts, xs, u_predict[i], linetype = :contourf, title = "predict")
118119
p3 = plot(ts, xs, diff_u[i], linetype = :contourf, title = "error")
119-
plot(p1, p2, p3)
120-
savefig("nonlinear_hyperbolic_sol_u$i")
120+
push!(ps, plot(p1, p2, p3))
121121
end
122122
```
123123

124-
![nonlinear_hyperbolic_sol_u1](https://user-images.githubusercontent.com/26853713/126457614-d19e7a4d-f9e3-4e78-b8ae-1e58114a744e.png)
125-
![nonlinear_hyperbolic_sol_u2](https://user-images.githubusercontent.com/26853713/126457617-ee26c587-a97f-4a2e-b6b7-b326b1f117af.png)
124+
125+
```@example nonlinear_hyperbolic
126+
ps[1]
127+
```
128+
129+
```@example nonlinear_hyperbolic
130+
ps[2]
131+
```

docs/src/examples/wave.md

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ Further, the solution of this equation with the given boundary conditions is pre
1717

1818
```@example wave
1919
using NeuralPDE, Lux, Optimization, OptimizationOptimJL
20-
import ModelingToolkit: Interval
20+
using ModelingToolkit: Interval
2121
2222
@parameters t, x
2323
@variables u(..)
@@ -81,8 +81,6 @@ p3 = plot(ts, xs, diff_u, linetype = :contourf, title = "error");
8181
plot(p1, p2, p3)
8282
```
8383

84-
![waveplot](https://user-images.githubusercontent.com/12683885/101984293-74a7a380-3c91-11eb-8e78-72a50d88e3f8.png)
85-
8684
## 1D Damped Wave Equation with Dirichlet boundary conditions
8785

8886
Now let's solve the 1-dimensional wave equation with damping.
@@ -101,7 +99,7 @@ with grid discretization `dx = 0.05` and physics-informed neural networks. Here,
10199
```@example wave2
102100
using NeuralPDE, Lux, ModelingToolkit, Optimization, OptimizationOptimJL
103101
using Plots, Printf
104-
import ModelingToolkit: Interval, infimum, supremum
102+
using ModelingToolkit: Interval, infimum, supremum
105103
106104
@parameters t, x
107105
@variables u(..) Dxu(..) Dtu(..) O1(..) O2(..)
@@ -159,14 +157,14 @@ bcs_inner_loss_functions = sym_prob.loss_functions.bc_loss_functions
159157
160158
callback = function (p, l)
161159
println("loss: ", l)
162-
println("pde_losses: ", map(l_ -> l_(p), pde_inner_loss_functions))
163-
println("bcs_losses: ", map(l_ -> l_(p), bcs_inner_loss_functions))
160+
println("pde_losses: ", map(l_ -> l_(p.u), pde_inner_loss_functions))
161+
println("bcs_losses: ", map(l_ -> l_(p.u), bcs_inner_loss_functions))
164162
return false
165163
end
166164
167-
res = Optimization.solve(prob, BFGS(); callback = callback, maxiters = 2000)
165+
res = Optimization.solve(prob, BFGS(); maxiters = 2000)
168166
prob = remake(prob, u0 = res.u)
169-
res = Optimization.solve(prob, BFGS(); callback = callback, maxiters = 2000)
167+
res = Optimization.solve(prob, BFGS(); maxiters = 2000)
170168
171169
phi = discretization.phi[1]
172170
@@ -214,11 +212,3 @@ p2 = plot(ts, xs, u_predict, linetype = :contourf, title = "predict");
214212
p3 = plot(ts, xs, diff_u, linetype = :contourf, title = "error");
215213
plot(p1, p2, p3)
216214
```
217-
218-
We can see the results here:
219-
220-
![Damped_wave_sol_adaptive_u](https://user-images.githubusercontent.com/12683885/149665332-d4daf7d0-682e-4933-a2b4-34f403881afb.png)
221-
222-
Plotted as a line, one can see the analytical solution and the prediction here:
223-
224-
![1Dwave_damped_adaptive](https://user-images.githubusercontent.com/12683885/149665327-69d04c01-2240-45ea-981e-a7b9412a3b58.gif)

docs/src/tutorials/constraints.md

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ p(-2.2) = p(2.2) = 0
2121
with Physics-Informed Neural Networks.
2222

2323
```@example fokkerplank
24-
using NeuralPDE, Lux, ModelingToolkit, Optimization, OptimizationOptimJL
24+
using NeuralPDE, Lux, ModelingToolkit, Optimization, OptimizationOptimJL, LineSearches
2525
using Integrals, Cubature
26-
import ModelingToolkit: Interval, infimum, supremum
26+
using ModelingToolkit: Interval, infimum, supremum
2727
# the example is taken from this article https://arxiv.org/abs/1910.10503
2828
@parameters x
2929
@variables p(..)
@@ -78,15 +78,13 @@ aprox_derivative_loss_functions = sym_prob.loss_functions.bc_loss_functions
7878
7979
cb_ = function (p, l)
8080
println("loss: ", l)
81-
println("pde_losses: ", map(l_ -> l_(p), pde_inner_loss_functions))
82-
println("bcs_losses: ", map(l_ -> l_(p), bcs_inner_loss_functions))
83-
println("additional_loss: ", norm_loss_function(phi, p, nothing))
81+
println("pde_losses: ", map(l_ -> l_(p.u), pde_inner_loss_functions))
82+
println("bcs_losses: ", map(l_ -> l_(p.u), bcs_inner_loss_functions))
83+
println("additional_loss: ", norm_loss_function(phi, p.u, nothing))
8484
return false
8585
end
8686
87-
res = Optimization.solve(prob, LBFGS(), callback = cb_, maxiters = 400)
88-
prob = remake(prob, u0 = res.u)
89-
res = Optimization.solve(prob, BFGS(), callback = cb_, maxiters = 2000)
87+
res = Optimization.solve(prob, BFGS(linesearch = BackTracking()), callback = cb_, maxiters = 600)
9088
```
9189

9290
And some analysis:
@@ -103,5 +101,3 @@ u_predict = [first(phi(x, res.u)) for x in xs]
103101
plot(xs, u_real, label = "analytic")
104102
plot!(xs, u_predict, label = "predict")
105103
```
106-
107-
![fp](https://user-images.githubusercontent.com/12683885/129405830-3d00c24e-adf1-443b-aa36-6af0e5305821.png)

0 commit comments

Comments
 (0)