Skip to content

Commit bfafd89

Browse files
authored
add kwarg to disable checking number of equations and states agree (#1021)
* add ability to disable check_eqs_u0 * tweak error message * remove @show * disable length checks for ReactionSystems
1 parent b8d072b commit bfafd89

File tree

5 files changed

+25
-13
lines changed

5 files changed

+25
-13
lines changed

src/systems/abstractsystem.jl

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -665,15 +665,17 @@ AbstractTrees.children(sys::ModelingToolkit.AbstractSystem) = ModelingToolkit.ge
665665
AbstractTrees.printnode(io::IO, sys::ModelingToolkit.AbstractSystem) = print(io, nameof(sys))
666666
AbstractTrees.nodetype(::ModelingToolkit.AbstractSystem) = ModelingToolkit.AbstractSystem
667667

668-
function check_eqs_u0(eqs, dvs, u0)
668+
function check_eqs_u0(eqs, dvs, u0; check_length=true, kwargs...)
669669
if u0 !== nothing
670-
if !(length(eqs) == length(dvs) == length(u0))
671-
throw(ArgumentError("Equations ($(length(eqs))), states ($(length(dvs))), and initial conditions ($(length(u0))) are of different lengths."))
672-
end
673-
else
674-
if !(length(eqs) == length(dvs))
675-
throw(ArgumentError("Equations ($(length(eqs))), states ($(length(dvs))) are of different lengths."))
670+
if check_length
671+
if !(length(eqs) == length(dvs) == length(u0))
672+
throw(ArgumentError("Equations ($(length(eqs))), states ($(length(dvs))), and initial conditions ($(length(u0))) are of different lengths. To allow a different number of equations than states use kwarg check_length=false."))
673+
end
674+
elseif length(dvs) != length(u0)
675+
throw(ArgumentError("States ($(length(dvs))) and initial conditions ($(length(u0))) are of different lengths."))
676676
end
677+
elseif check_length && (length(eqs) != length(dvs))
678+
throw(ArgumentError("Equations ($(length(eqs))) and states ($(length(dvs))) are of different lengths. To allow these to differ use kwarg check_length=false."))
677679
end
678680
return nothing
679681
end

src/systems/diffeqs/abstractodesystem.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,7 @@ function process_DEProblem(constructor, sys::AbstractODESystem,u0map,parammap;
426426
end
427427
p = varmap_to_vars(parammap,ps; defaults=pdefs)
428428

429-
check_eqs_u0(eqs, dvs, u0)
429+
check_eqs_u0(eqs, dvs, u0; kwargs...)
430430

431431
f = constructor(sys,dvs,ps,u0;ddvs=ddvs,tgrad=tgrad,jac=jac,checkbounds=checkbounds,
432432
linenumbers=linenumbers,parallel=parallel,simplify=simplify,

src/systems/nonlinear/nonlinearsystem.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ function process_NonlinearProblem(constructor, sys::NonlinearSystem,u0map,paramm
226226
u0 = varmap_to_vars(u0map,dvs; defaults=defs)
227227
p = varmap_to_vars(parammap,ps; defaults=defs)
228228

229-
check_eqs_u0(eqs, dvs, u0)
229+
check_eqs_u0(eqs, dvs, u0; kwargs...)
230230

231231
f = constructor(sys,dvs,ps,u0;jac=jac,checkbounds=checkbounds,
232232
linenumbers=linenumbers,parallel=parallel,simplify=simplify,

src/systems/reaction/reactionsystem.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -506,13 +506,13 @@ end
506506

507507

508508
# ODEProblem from AbstractReactionNetwork
509-
function DiffEqBase.ODEProblem(rs::ReactionSystem, u0, tspan, p=DiffEqBase.NullParameters(), args...; kwargs...)
510-
return ODEProblem(convert(ODESystem,rs; kwargs...),u0,tspan,p, args...; kwargs...)
509+
function DiffEqBase.ODEProblem(rs::ReactionSystem, u0, tspan, p=DiffEqBase.NullParameters(), args...; check_length=false, kwargs...)
510+
return ODEProblem(convert(ODESystem,rs; kwargs...),u0,tspan,p, args...; check_length, kwargs...)
511511
end
512512

513513
# NonlinearProblem from AbstractReactionNetwork
514-
function DiffEqBase.NonlinearProblem(rs::ReactionSystem, u0, p=DiffEqBase.NullParameters(), args...; kwargs...)
515-
return NonlinearProblem(convert(NonlinearSystem,rs; kwargs...), u0, p, args...; kwargs...)
514+
function DiffEqBase.NonlinearProblem(rs::ReactionSystem, u0, p=DiffEqBase.NullParameters(), args...; check_length=false, kwargs...)
515+
return NonlinearProblem(convert(NonlinearSystem,rs; kwargs...), u0, p, args...; check_length, kwargs...)
516516
end
517517

518518

test/odesystem.jl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,3 +330,13 @@ sys = ode_order_lowering(sys)
330330
prob = ODEProblem(sys, [], tspan)
331331
sol = solve(prob, Tsit5())
332332
@test sum(abs, sol[end]) < 1
333+
334+
335+
# check_eqs_u0 kwarg test
336+
@parameters t
337+
@variables x1(t) x2(t)
338+
D =Differential(t)
339+
eqs = [D(x1) ~ -x1]
340+
sys = ODESystem(eqs,t,[x1,x2],[])
341+
@test_throws ArgumentError ODEProblem(sys, [1.0,1.0], (0.0,1.0))
342+
prob = ODEProblem(sys, [1.0,1.0], (0.0,1.0), check_length=false)

0 commit comments

Comments
 (0)