Skip to content

Commit 336b147

Browse files
committed
Merge branch 'master' into error_missing_guesses_v2
2 parents 19e8a89 + f5587e1 commit 336b147

File tree

5 files changed

+38
-10
lines changed

5 files changed

+38
-10
lines changed

docs/src/tutorials/initialization.md

+8-1
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,13 @@ may not be analytically satisfiable!**. In our case here, if you sit down with a
194194
long enough you will see that `λ = 0` is required for this equation, but since we chose
195195
`λ = 1` we end up with a set of equations that are impossible to satisfy.
196196

197+
!!! note
198+
199+
If you would prefer to have an error instead of a warning in the context of non-fully
200+
determined systems, pass the keyword argument `fully_determined = true` into the
201+
problem constructor. Additionally, any warning about not being fully determined can
202+
be suppressed via passing `warn_initialize_determined = false`.
203+
197204
## Diving Deeper: Constructing the Initialization System
198205

199206
To get a better sense of the initialization system and to help debug it, you can construct
@@ -271,7 +278,7 @@ sol = solve(iprob)
271278
```
272279

273280
!!! note
274-
281+
275282
For more information on solving NonlinearProblems and NonlinearLeastSquaresProblems,
276283
check out the [NonlinearSolve.jl tutorials!](https://docs.sciml.ai/NonlinearSolve/stable/tutorials/getting_started/).
277284

downstream/Project.toml

-2
This file was deleted.

format/Project.toml

-2
This file was deleted.

src/systems/diffeqs/abstractodesystem.jl

+8-5
Original file line numberDiff line numberDiff line change
@@ -762,6 +762,7 @@ function process_DEProblem(constructor, sys::AbstractODESystem, u0map, parammap;
762762
warn_initialize_determined = true,
763763
build_initializeprob = true,
764764
initialization_eqs = [],
765+
fully_determined = false,
765766
kwargs...)
766767
eqs = equations(sys)
767768
dvs = unknowns(sys)
@@ -835,7 +836,7 @@ function process_DEProblem(constructor, sys::AbstractODESystem, u0map, parammap;
835836
end
836837
initializeprob = ModelingToolkit.InitializationProblem(
837838
sys, t, u0map, parammap; guesses, warn_initialize_determined,
838-
initialization_eqs, eval_expression, eval_module)
839+
initialization_eqs, eval_expression, eval_module, fully_determined)
839840
initializeprobmap = getu(initializeprob, unknowns(sys))
840841

841842
zerovars = Dict(setdiff(unknowns(sys), keys(defaults(sys))) .=> 0.0)
@@ -1478,6 +1479,7 @@ InitializationProblem{iip}(sys::AbstractODESystem, u0map, tspan,
14781479
simplify = false,
14791480
linenumbers = true, parallel = SerialForm(),
14801481
initialization_eqs = [],
1482+
fully_determined = false,
14811483
kwargs...) where {iip}
14821484
```
14831485
@@ -1527,6 +1529,7 @@ function InitializationProblem{iip, specialize}(sys::AbstractODESystem,
15271529
check_length = true,
15281530
warn_initialize_determined = true,
15291531
initialization_eqs = [],
1532+
fully_determined = false,
15301533
kwargs...) where {iip, specialize}
15311534
if !iscomplete(sys)
15321535
error("A completed system is required. Call `complete` or `structural_simplify` on the system before creating an `ODEProblem`")
@@ -1535,10 +1538,10 @@ function InitializationProblem{iip, specialize}(sys::AbstractODESystem,
15351538
isys = get_initializesystem(sys; initialization_eqs)
15361539
elseif isempty(u0map) && get_initializesystem(sys) === nothing
15371540
isys = structural_simplify(
1538-
generate_initializesystem(sys; initialization_eqs); fully_determined = false)
1541+
generate_initializesystem(sys; initialization_eqs); fully_determined)
15391542
else
15401543
isys = structural_simplify(
1541-
generate_initializesystem(sys; u0map, initialization_eqs); fully_determined = false)
1544+
generate_initializesystem(sys; u0map, initialization_eqs); fully_determined)
15421545
end
15431546

15441547
uninit = setdiff(unknowns(sys), [unknowns(isys); getfield.(observed(isys), :lhs)])
@@ -1553,10 +1556,10 @@ function InitializationProblem{iip, specialize}(sys::AbstractODESystem,
15531556
nunknown = length(unknowns(isys))
15541557

15551558
if warn_initialize_determined && neqs > nunknown
1556-
@warn "Initialization system is overdetermined. $neqs equations for $nunknown unknowns. Initialization will default to using least squares. To suppress this warning pass warn_initialize_determined = false."
1559+
@warn "Initialization system is overdetermined. $neqs equations for $nunknown unknowns. Initialization will default to using least squares. To suppress this warning pass warn_initialize_determined = false. To make this warning into an error, pass fully_determined = true"
15571560
end
15581561
if warn_initialize_determined && neqs < nunknown
1559-
@warn "Initialization system is underdetermined. $neqs equations for $nunknown unknowns. Initialization will default to using least squares. To suppress this warning pass warn_initialize_determined = false."
1562+
@warn "Initialization system is underdetermined. $neqs equations for $nunknown unknowns. Initialization will default to using least squares. To suppress this warning pass warn_initialize_determined = false. To make this warning into an error, pass fully_determined = true"
15601563
end
15611564

15621565
parammap = parammap isa DiffEqBase.NullParameters || isempty(parammap) ?

test/initializationsystem.jl

+22
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ sol = solve(initprob)
1717
@test SciMLBase.successful_retcode(sol)
1818
@test maximum(abs.(sol[conditions])) < 1e-14
1919

20+
@test_throws ModelingToolkit.ExtraVariablesSystemException ModelingToolkit.InitializationProblem(
21+
pend, 0.0, [], [g => 1];
22+
guesses = [ModelingToolkit.missing_variable_defaults(pend); x => 1; y => 0.2],
23+
fully_determined = true)
24+
2025
initprob = ModelingToolkit.InitializationProblem(pend, 0.0, [x => 1, y => 0], [g => 1];
2126
guesses = ModelingToolkit.missing_variable_defaults(pend))
2227
@test initprob isa NonlinearProblem
@@ -31,6 +36,10 @@ initprob = ModelingToolkit.InitializationProblem(
3136
sol = solve(initprob)
3237
@test !SciMLBase.successful_retcode(sol)
3338

39+
@test_throws ModelingToolkit.ExtraVariablesSystemException ModelingToolkit.InitializationProblem(
40+
pend, 0.0, [], [g => 1]; guesses = ModelingToolkit.missing_variable_defaults(pend),
41+
fully_determined = true)
42+
3443
prob = ODEProblem(pend, [x => 1, y => 0], (0.0, 1.5), [g => 1],
3544
guesses = ModelingToolkit.missing_variable_defaults(pend))
3645
prob.f.initializeprob isa NonlinearProblem
@@ -47,6 +56,11 @@ sol = solve(prob.f.initializeprob)
4756
sol = solve(prob, Rodas5P())
4857
@test maximum(abs.(sol[conditions][1])) < 1e-14
4958

59+
@test_throws ModelingToolkit.ExtraVariablesSystemException ODEProblem(
60+
pend, [x => 1], (0.0, 1.5), [g => 1],
61+
guesses = ModelingToolkit.missing_variable_defaults(pend),
62+
fully_determined = true)
63+
5064
@connector Port begin
5165
p(t)
5266
dm(t) = 0, [connect = Flow]
@@ -225,14 +239,22 @@ initsol = solve(initprob, reltol = 1e-12, abstol = 1e-12)
225239
@test SciMLBase.successful_retcode(initsol)
226240
@test maximum(abs.(initsol[conditions])) < 1e-14
227241

242+
@test_throws ModelingToolkit.ExtraEquationsSystemException ModelingToolkit.InitializationProblem(
243+
sys, 0.0, fully_determined = true)
244+
228245
allinit = unknowns(sys) .=> initsol[unknowns(sys)]
229246
prob = ODEProblem(sys, allinit, (0, 0.1))
230247
sol = solve(prob, Rodas5P(), initializealg = BrownFullBasicInit())
231248
# If initialized incorrectly, then it would be InitialFailure
232249
@test sol.retcode == SciMLBase.ReturnCode.Unstable
233250
@test maximum(abs.(initsol[conditions][1])) < 1e-14
234251

252+
prob = ODEProblem(sys, allinit, (0, 0.1))
235253
prob = ODEProblem(sys, [], (0, 0.1), check = false)
254+
255+
@test_throws ModelingToolkit.ExtraEquationsSystemException ODEProblem(
256+
sys, [], (0, 0.1), fully_determined = true)
257+
236258
sol = solve(prob, Rodas5P())
237259
# If initialized incorrectly, then it would be InitialFailure
238260
@test sol.retcode == SciMLBase.ReturnCode.Unstable

0 commit comments

Comments
 (0)