Skip to content

Commit 8c71b48

Browse files
Merge pull request #243 from SciML/update_quadrature_strategy
Update quadrature strategy
2 parents 903a9dc + 3b1574e commit 8c71b48

File tree

2 files changed

+51
-26
lines changed

2 files changed

+51
-26
lines changed

src/pinns_pde_solve.jl

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -601,13 +601,13 @@ function get_loss_function(loss_functions, bounds, strategy::QuadratureTraining;
601601
end
602602

603603
f = (lb,ub,loss_,θ) -> begin
604-
_loss = (x,θ) -> sum(inner_loss(loss_, x, θ))
604+
_loss = (x,θ) -> inner_loss(loss_, x, θ)
605605
prob = QuadratureProblem(_loss,lb,ub,θ;batch = strategy.batch)
606-
solve(prob,
606+
abs(solve(prob,
607607
strategy.quadrature_alg,
608608
reltol = strategy.reltol,
609609
abstol = strategy.abstol,
610-
maxiters = strategy.maxiters)[1]
610+
maxiters = strategy.maxiters)[1])
611611
end
612612
loss = (θ) -> τ*sum(f(lb,ub,loss_,θ) for (lb,ub,loss_) in zip(lbs,ubs,loss_functions))
613613
return loss
@@ -723,11 +723,6 @@ function DiffEqBase.discretize(pde_system::PDESystem, discretization::PhysicsInf
723723
strategy)
724724
(pde_loss_function, bc_loss_function)
725725
elseif strategy isa QuadratureTraining
726-
dim<=1 && error("QuadratureTraining works only with dimensionality more than 1")
727-
728-
(dim<=2 && strategy.quadrature_alg in [CubaCuhre(),CubaDivonne()]
729-
&& error("$(strategy.quadrature_alg) works only with dimensionality more than 2"))
730-
731726
bounds = get_bounds(domains,bcs,dict_indvars,dict_depvars)
732727
pde_bounds, bcs_bounds = bounds
733728

@@ -745,12 +740,39 @@ function DiffEqBase.discretize(pde_system::PDESystem, discretization::PhysicsInf
745740
strategy;
746741
τ=τp)
747742

748-
τb = 1.0f0 / (bsl*Int(round(τ_^(bl/pl))))
749-
750-
bc_loss_function = get_loss_function(_bc_loss_functions,
743+
τb = 1.0f0 / (bsl * τ_^(bl/pl))
744+
745+
if bl == 0
746+
bc_loss_function = get_loss_function(_bc_loss_functions,
747+
[[[]]],
748+
GridTraining(0.1))
749+
750+
elseif bl == 1 && strategy.quadrature_alg in [CubaCuhre(),CubaDivonne()]
751+
@warn "$(strategy.quadrature_alg) does not work with one-dimensional
752+
problems, so for the boundary conditions loss function,
753+
the quadrature algorithm was replaced by HCubatureJL"
754+
755+
strategy = QuadratureTraining(quadrature_alg = HCubatureJL(),
756+
reltol = bsl*(strategy.reltol)^(bl/pl),
757+
abstol = bsl*(strategy.abstol)^(bl/pl),
758+
maxiters = bsl*Int(round((strategy.maxiters)^(bl/pl))),
759+
batch = strategy.batch)
760+
bc_loss_function = get_loss_function(_bc_loss_functions,
761+
bcs_bounds,
762+
strategy;
763+
τ=τb)
764+
else
765+
strategy = QuadratureTraining(quadrature_alg = strategy.quadrature_alg,
766+
reltol = bsl*(strategy.reltol)^(bl/pl),
767+
abstol = bsl*(strategy.abstol)^(bl/pl),
768+
maxiters = bsl*Int(round((strategy.maxiters)^(bl/pl))),
769+
batch = strategy.batch)
770+
bc_loss_function = get_loss_function(_bc_loss_functions,
751771
bcs_bounds,
752772
strategy;
753773
τ=τb)
774+
end
775+
754776
(pde_loss_function, bc_loss_function)
755777
end
756778

test/NNPDE_tests.jl

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ dt = 0.1
3737
# Neural network
3838
chain = FastChain(FastDense(1,12,Flux.σ),FastDense(12,1))
3939

40-
strategy = NeuralPDE.GridTraining(dt)
40+
strategy = NeuralPDE.QuadratureTraining()
4141
discretization = NeuralPDE.PhysicsInformedNN(chain,
4242
strategy;
4343
init_params = nothing,
@@ -160,8 +160,7 @@ function run_2d_poisson_equation(strategy)
160160
res = GalacticOptim.solve(prob, ADAM(0.01); cb = cb, maxiters=2)
161161
end
162162

163-
algs = [CubaVegas(), CubaSUAVE(),HCubatureJL(), CubatureJLh(), CubatureJLp()]
164-
#CubaDivonne(),CubaCuhre() doesn't work with dim = 2
163+
algs = [HCubatureJL(), CubatureJLh(), CubatureJLp(),CubaCuhre()]
165164
for alg in algs
166165
strategy = NeuralPDE.QuadratureTraining(quadrature_alg = alg,reltol=1e-8,abstol=1e-8,maxiters=600)
167166
run_2d_poisson_equation(strategy)
@@ -232,12 +231,12 @@ domains = [x ∈ IntervalDomain(0.0,1.0), y ∈ IntervalDomain(0.0,1.0)]
232231
# Neural network
233232
chain1 = FastChain(FastDense(2,10,Flux.σ),FastDense(10,1))
234233
chain2 = FastChain(FastDense(2,10,Flux.σ),FastDense(10,1))
235-
236-
discretization = NeuralPDE.PhysicsInformedNN([chain1,chain2],NeuralPDE.GridTraining([0.1, 0.1]))
234+
strategy = NeuralPDE.QuadratureTraining(quadrature_alg=CubaCuhre(),reltol= 1e-4,abstol= 1e-3,maxiters=20)
235+
discretization = NeuralPDE.PhysicsInformedNN([chain1,chain2],strategy)
237236
pde_system = PDESystem(eqs,bcs,domains,[x,y],[u1,u2])
238237
prob = NeuralPDE.discretize(pde_system,discretization)
239238

240-
res = GalacticOptim.solve(prob,Optim.BFGS(); cb = cb, maxiters=600)
239+
res = GalacticOptim.solve(prob,Optim.BFGS(); cb = cb, maxiters=300)
241240
phi = discretization.phi
242241

243242
analytic_sol_func(x,y) =[1/3*(6x - y), 1/2*(6x - y)]
@@ -250,7 +249,7 @@ sep = [acum[i]+1 : acum[i+1] for i in 1:length(acum)-1]
250249
minimizers = [res.minimizer[s] for s in sep]
251250
u_predict = [[phi[i]([x,y],minimizers[i])[1] for x in xs for y in ys] for i in 1:2]
252251

253-
@test u_predict u_real atol = 10.0
252+
@test u_predict u_real atol = 2.0
254253

255254
# p1 =plot(xs, ys, u_predict, st=:surface);
256255
# p2 = plot(xs, ys, u_real, st=:surface);
@@ -300,19 +299,18 @@ train_sets = NeuralPDE.generate_training_sets(domains,dx,bcs,indvars,depvars)
300299
pde_train_set,bcs_train_set,train_set = train_sets
301300
pde_bounds, bcs_bounds = NeuralPDE.get_bounds(domains,bcs,indvars,depvars)
302301

303-
quadrature_strategy = NeuralPDE.QuadratureTraining(quadrature_alg=HCubatureJL(),reltol= 1e-3,abstol= 1e-3,maxiters=20)
304-
τp = 1/100
302+
quadrature_strategy = NeuralPDE.QuadratureTraining(quadrature_alg=CubaCuhre(),reltol= 1e-4,abstol= 1e-3,maxiters=20)
305303
pde_loss_function = NeuralPDE.get_loss_function(_pde_loss_function,
306304
pde_bounds,
307305
quadrature_strategy;
308-
τ = τp)
306+
τ = 1/100)
309307

310308

311-
grid_strategy = NeuralPDE.GridTraining(dx)
309+
quadrature_strategy = NeuralPDE.QuadratureTraining(quadrature_alg=HCubatureJL(),reltol= 1e-2,abstol= 1e-1,maxiters=5)
312310
bc_loss_function = NeuralPDE.get_loss_function(_bc_loss_functions,
313-
bcs_train_set,
314-
grid_strategy;
315-
τ = nothing)
311+
bcs_bounds,
312+
quadrature_strategy;
313+
τ = 1/20)
316314

317315
function loss_function_(θ,p)
318316
return pde_loss_function(θ) + bc_loss_function(θ)
@@ -321,7 +319,12 @@ end
321319
f_ = OptimizationFunction(loss_function_, GalacticOptim.AutoZygote())
322320
prob = GalacticOptim.OptimizationProblem(f_, initθ)
323321

324-
res = GalacticOptim.solve(prob,Optim.BFGS(); cb = cb, maxiters=400)
322+
cb_ = function (p,l)
323+
println("Current losses are: ", pde_loss_function(p), " , ", bc_loss_function(p))
324+
return false
325+
end
326+
327+
res = GalacticOptim.solve(prob,Optim.BFGS(); cb = cb_, maxiters=400)
325328

326329
xs,ts = [domain.domain.lower:dx:domain.domain.upper for domain in domains]
327330
analytic_sol_func(x,t) = sum([(8/(k^3*pi^3)) * sin(k*pi*x)*cos(C*k*pi*t) for k in 1:2:50000])

0 commit comments

Comments
 (0)