Skip to content

Commit 1fde3a4

Browse files
Add accessor functions
1 parent 8a6b391 commit 1fde3a4

File tree

4 files changed

+31
-12
lines changed

4 files changed

+31
-12
lines changed

src/ModelingToolkit.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ module ModelingToolkit
22

33
export Operation, Expression
44
export calculate_jacobian, generate_jacobian, generate_function
5+
export independent_variables, dependent_variables, parameters
56
export @register
67

78

@@ -22,6 +23,10 @@ function calculate_jacobian end
2223
function generate_jacobian end
2324
function generate_function end
2425

26+
function independent_variables end
27+
function dependent_variables end
28+
function parameters end
29+
2530
@enum FunctionVersion ArrayFunction=1 SArrayFunction=2
2631

2732
include("variables.jl")

src/systems/diffeqs/diffeqsystem.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,10 @@ Base.:(==)(sys1::ODESystem, sys2::ODESystem) =
7777
_eq_unordered(sys1.dvs, sys2.dvs) && _eq_unordered(sys1.ps, sys2.ps)
7878
# NOTE: equality does not check cached Jacobian
7979

80+
independent_variables(sys::ODESystem) = Set{Variable}([sys.iv])
81+
dependent_variables(sys::ODESystem) = Set{Variable}(sys.dvs)
82+
parameters(sys::ODESystem) = Set{Variable}(sys.ps)
83+
8084

8185
function calculate_jacobian(sys::ODESystem)
8286
isempty(sys.jac[]) || return sys.jac[] # use cached Jacobian, if possible

src/systems/nonlinear/nonlinear_system.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@ function _find_params(O, vs)
3232
end
3333

3434

35+
independent_variables(sys::NonlinearSystem) = Set{Variable}()
36+
dependent_variables(sys::NonlinearSystem) = Set{Expression}(sys.vs)
37+
parameters(sys::NonlinearSystem) = Set{Variable}(sys.ps)
38+
39+
3540
function calculate_jacobian(sys::NonlinearSystem)
3641
rhs = [eq.rhs for eq in sys.eqs]
3742
jac = expand_derivatives.(calculate_jacobian(rhs, sys.vs))

test/system_construction.jl

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,22 @@ using Test
66
@variables x(t) y(t) z(t)
77
@derivatives D'~t
88

9-
function test_diffeq_inference(name, de, iv, dvs, ps)
9+
function _clean(O::Operation)
10+
@assert isa(O.op, Variable)
11+
return O.op
12+
end
13+
_clean(x::Variable) = x
14+
function test_diffeq_inference(name, sys, iv, dvs, ps)
1015
@testset "ODESystem construction: $name" begin
11-
@test de.iv.name == :t
12-
@test Set([dv.name for dv de.dvs]) == Set(dvs)
13-
@test Set([p.name for p de.ps ]) == Set(ps)
16+
@test independent_variables(sys) == Set([_clean(iv)])
17+
@test dependent_variables(sys) == Set(_clean.(dvs))
18+
@test parameters(sys) == Set(_clean.(ps))
1419
end
1520
end
16-
function test_nlsys_inference(name, de, vs, ps)
21+
function test_nlsys_inference(name, sys, vs, ps)
1722
@testset "NonlinearSystem construction: $name" begin
18-
@test Set(vs) == Set(vs)
19-
@test Set([p.name for p de.ps]) == Set(ps)
23+
@test dependent_variables(sys) == Set(vs)
24+
@test parameters(sys) == Set(_clean.(ps))
2025
end
2126
end
2227

@@ -25,7 +30,7 @@ eqs = [D(x) ~ σ*(y-x),
2530
D(y) ~ x*-z)-y,
2631
D(z) ~ x*y - β*z]
2732
de = ODESystem(eqs)
28-
test_diffeq_inference("standard", de, :t, (:x, :y, :z), (:σ, :ρ, :β))
33+
test_diffeq_inference("standard", de, t, (x, y, z), (σ, ρ, β))
2934
generate_function(de, [x,y,z], [σ,ρ,β])
3035
generate_function(de, [x,y,z], [σ,ρ,β]; version=ModelingToolkit.SArrayFunction)
3136
jac_expr = generate_jacobian(de)
@@ -41,7 +46,7 @@ ModelingToolkit.generate_ode_iW(de)
4146
D(y) ~ x*-z)-y,
4247
D(z) ~ x*y - β*z]
4348
de = ODESystem(eqs)
44-
test_diffeq_inference("global iv-varying", de, :t, (:x, :y, :z), (:σ′, :ρ, :β))
49+
test_diffeq_inference("global iv-varying", de, t, (x, y, z), (σ′, ρ, β))
4550
@test begin
4651
f = eval(generate_function(de, [x,y,z], [σ′,ρ,β]))
4752
du = [0.0,0.0,0.0]
@@ -54,7 +59,7 @@ ModelingToolkit.generate_ode_iW(de)
5459
D(y) ~ x*-z)-y,
5560
D(z) ~ x*y - β*z]
5661
de = ODESystem(eqs)
57-
test_diffeq_inference("single internal iv-varying", de, :t, (:x, :y, :z), (:σ, :ρ, :β))
62+
test_diffeq_inference("single internal iv-varying", de, t, (x, y, z), (σ, ρ, β))
5863
@test begin
5964
f = eval(generate_function(de, [x,y,z], [σ,ρ,β]))
6065
du = [0.0,0.0,0.0]
@@ -64,7 +69,7 @@ ModelingToolkit.generate_ode_iW(de)
6469

6570
eqs = [D(x) ~ x + 10σ(t-1) + 100σ(t-2) + 1000σ(t^2)]
6671
de = ODESystem(eqs)
67-
test_diffeq_inference("many internal iv-varying", de, :t, (:x,), (:σ,))
72+
test_diffeq_inference("many internal iv-varying", de, t, (x,), (σ,))
6873
@test begin
6974
f = eval(generate_function(de, [x], [σ]))
7075
du = [0.0]
@@ -105,7 +110,7 @@ eqs = [0 ~ σ*(y-x),
105110
0 ~ x*-z)-y,
106111
0 ~ x*y - β*z]
107112
ns = NonlinearSystem(eqs, [x,y,z])
108-
test_nlsys_inference("standard", ns, (x, y, z), (:σ, :ρ, :β))
113+
test_nlsys_inference("standard", ns, (x, y, z), (σ, ρ, β))
109114

110115
generate_function(ns, [x,y,z], [σ,ρ,β])
111116

0 commit comments

Comments
 (0)