Skip to content

Commit 9530a2e

Browse files
committed
init
1 parent 5cdb4ba commit 9530a2e

File tree

3 files changed

+68
-4
lines changed

3 files changed

+68
-4
lines changed

src/systems/parameter_buffer.jl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,17 +33,19 @@ function MTKParameters(
3333
else
3434
error("Cannot create MTKParameters if system does not have index_cache")
3535
end
36+
3637
all_ps = Set(unwrap.(parameters(sys)))
3738
union!(all_ps, default_toterm.(unwrap.(parameters(sys))))
3839
if p isa Vector && !(eltype(p) <: Pair) && !isempty(p)
3940
ps = parameters(sys)
40-
length(p) == length(ps) || error("Invalid parameters")
41+
length(p) == length(ps) || error("The number of parameter values is not equal to the number of parameters.")
4142
p = ps .=> p
4243
end
4344
if p isa SciMLBase.NullParameters || isempty(p)
4445
p = Dict()
4546
end
4647
p = todict(p)
48+
4749
defs = Dict(default_toterm(unwrap(k)) => v for (k, v) in defaults(sys))
4850
if eltype(u0) <: Pair
4951
u0 = todict(u0)
@@ -761,7 +763,7 @@ end
761763

762764
function Base.showerror(io::IO, e::MissingParametersError)
763765
println(io, MISSING_PARAMETERS_MESSAGE)
764-
println(io, e.vars)
766+
println(io, join(e.vars, ", "))
765767
end
766768

767769
function InvalidParameterSizeException(param, val)

src/systems/problem_utils.jl

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -684,12 +684,17 @@ function process_SciMLProblem(
684684

685685
u0Type = typeof(u0map)
686686
pType = typeof(pmap)
687-
_u0map = u0map
687+
688688
u0map = to_varmap(u0map, dvs)
689689
symbols_to_symbolics!(sys, u0map)
690-
_pmap = pmap
690+
check_keys(sys, u0map)
691+
691692
pmap = to_varmap(pmap, ps)
692693
symbols_to_symbolics!(sys, pmap)
694+
check_keys(sys, pmap)
695+
badkeys = filter(k -> symbolic_type(k) === NotSymbolic(), keys(pmap))
696+
isempty(badkeys) || throw(BadKeyError(collect(badkeys)))
697+
693698
defs = add_toterms(recursive_unwrap(defaults(sys)))
694699
cmap, cs = get_cmap(sys)
695700
kwargs = NamedTuple(kwargs)
@@ -778,6 +783,39 @@ function process_SciMLProblem(
778783
implicit_dae ? (f, du0, u0, p) : (f, u0, p)
779784
end
780785

786+
# Check that the keys of a u0map or pmap are valid
787+
# (i.e. are symbolic keys, and are defined for the system.)
788+
function check_keys(sys, map)
789+
badkeys = Any[]
790+
for k in keys(map)
791+
if symbolic_type(k) === NotSymbolic()
792+
push!(badkeys, k)
793+
elseif k isa Symbol
794+
!hasproperty(sys, k) && push!(badkeys, k)
795+
elseif k Set(parameters(sys)) && k Set(unknowns(sys))
796+
push!(badkeys, k)
797+
end
798+
end
799+
800+
isempty(badkeys) || throw(BadKeyError(collect(badkeys)))
801+
end
802+
803+
const BAD_KEY_MESSAGE = """
804+
Undefined keys found in the parameter or initial condition maps.
805+
The following keys are either invalid or not parameters/states of the system:
806+
"""
807+
808+
struct BadKeyError <: Exception
809+
vars::Any
810+
end
811+
812+
function Base.showerror(io::IO, e::BadKeyError)
813+
println(io, BAD_KEY_MESSAGE)
814+
println(io, join(e.vars, ", "))
815+
end
816+
817+
818+
781819
##############
782820
# Legacy functions for backward compatibility
783821
##############

test/problem_validation.jl

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using ModelingToolkit
2+
using ModelingToolkit: t_nounits as t, D_nounits as D
3+
4+
@testset "Input map validation" begin
5+
@variables X(t)
6+
@parameters p d
7+
eqs = [D(X) ~ p - d*X]
8+
@mtkbuild osys = ODESystem(eqs, t)
9+
10+
p = "I accidentally renamed p"
11+
u0 = [X => 1.0]
12+
ps = [p => 1.0, d => 0.5]
13+
@test_throws ModelingToolkit.BadKeyError oprob = ODEProblem(osys, u0, (0.0, 1.0), ps)
14+
15+
ps = [p => 1.0, d => 0.5, "Random stuff" => 3.0]
16+
@test_throws ModelingToolkit.BadKeyError oprob = ODEProblem(osys, u0, (0.0, 1.0), ps)
17+
18+
u0 = [:X => 1.0, "random" => 3.0]
19+
@test_throws ModelingToolkit.BadKeyError oprob = ODEProblem(osys, u0, (0.0, 1.0), ps)
20+
21+
@parameters k
22+
ps = [p => 1., d => 0.5, k => 3.]
23+
@test_throws ModelingToolkit.BadKeyError oprob = ODEProblem(osys, u0, (0.0, 1.0), ps)
24+
end

0 commit comments

Comments
 (0)