Skip to content

Commit 8b7b7ae

Browse files
Merge pull request #86 from JuliaDiffEq/hg/refactor/variable
Fold IndependentVariable into Parameter
2 parents 9709e9e + 0ee990f commit 8b7b7ae

12 files changed

+40
-48
lines changed

README.md

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,16 @@ to manipulate.
2121
### Example: ODE
2222

2323
Let's build an ODE. First we define some variables. In a differential equation
24-
system, we need to differentiate between our unknown (dependent) variables, independent
25-
variables, and parameters. Therefore we label them as follows:
24+
system, we need to differentiate between our unknown (dependent) variables
25+
and parameters. Therefore we label them as follows:
2626

2727
```julia
2828
using ModelingToolkit
2929

3030
# Define some variables
31-
@IVar t
31+
@Param t σ ρ β
3232
@Unknown x(t) y(t) z(t)
3333
@Deriv D'~t
34-
@Param σ ρ β
3534
```
3635

3736
Then we build the system:
@@ -259,16 +258,15 @@ is accessible via a function-based interface. This means that all macros are
259258
syntactic sugar in some form. For example, the variable construction:
260259

261260
```julia
262-
@IVar t
261+
@Param t σ ρ β
263262
@Unknown x(t) y(t) z(t)
264263
@Deriv D'~t
265-
@Param σ ρ β
266264
```
267265

268266
is syntactic sugar for:
269267

270268
```julia
271-
t = IndependentVariable(:t)
269+
t = Parameter(:t)
272270
x = Unknown(:x, dependents = [t])
273271
y = Unknown(:y, dependents = [t])
274272
z = Unknown(:z, dependents = [t])

src/equations.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ Base.:~(lhs::Number , rhs::Expression) = Equation(lhs, rhs)
1414

1515
_is_derivative(x::Variable) = x.diff !== nothing
1616
_is_dependent(x::Variable) = x.subtype === :Unknown && !isempty(x.dependents)
17+
_is_parameter(ivs) = x -> x.subtype === :Parameter && x ivs
1718
_subtype(subtype::Symbol) = x -> x.subtype === subtype
1819

1920
function extract_elements(eqs, predicates)

src/systems/diffeqs/diffeqsystem.jl

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@ end
99
DiffEqSystem(eqs, ivs, dvs, ps) = DiffEqSystem(eqs, ivs, dvs, ps, Matrix{Expression}(undef,0,0))
1010

1111
function DiffEqSystem(eqs)
12-
predicates = [_is_derivative, _subtype(:IndependentVariable), _is_dependent, _subtype(:Parameter)]
13-
_, ivs, dvs, ps = extract_elements(eqs, predicates)
12+
predicates = [_is_derivative, _is_dependent]
13+
_, dvs = extract_elements(eqs, predicates)
14+
ivs = unique(vcat((dv.dependents for dv dvs)...))
15+
ps, = extract_elements(eqs, [_is_parameter(ivs)])
1416
DiffEqSystem(eqs, ivs, dvs, ps, Matrix{Expression}(undef,0,0))
1517
end
1618

1719
function DiffEqSystem(eqs, ivs)
18-
predicates = [_is_derivative, _is_dependent, _subtype(:Parameter)]
20+
predicates = [_is_derivative, _is_dependent, _is_parameter(ivs)]
1921
_, dvs, ps = extract_elements(eqs, predicates)
2022
DiffEqSystem(eqs, ivs, dvs, ps, Matrix{Expression}(undef,0,0))
2123
end
@@ -85,7 +87,7 @@ function generate_ode_iW(sys::DiffEqSystem, simplify=true)
8587
diff_exprs = filter(!isintermediate, sys.eqs)
8688
jac = sys.jac
8789

88-
gam = Unknown(:gam)
90+
gam = Parameter(:gam)
8991

9092
W = LinearAlgebra.I - gam*jac
9193
W = SMatrix{size(W,1),size(W,2)}(W)

src/variables.jl

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,10 @@ end
88
Variable(name; subtype::Symbol, dependents::Vector{Variable} = Variable[]) =
99
Variable(name, subtype, nothing, dependents)
1010

11-
Parameter(name,args...;kwargs...) = Variable(name,args...;subtype=:Parameter,kwargs...)
12-
IndependentVariable(name,args...;kwargs...) = Variable(name,args...;subtype=:IndependentVariable,kwargs...)
13-
Unknown(name,args...;kwargs...) = Variable(name,args...;subtype=:Unknown,kwargs...)
11+
Parameter(name; kwargs...) = Variable(name; subtype=:Parameter, kwargs...)
12+
Unknown(name, ;kwargs...) = Variable(name; subtype=:Unknown, kwargs...)
1413

15-
export Variable,Parameter,Constant,Unknown,IndependentVariable,
16-
@Param, @Const, @Unknown, @IVar
14+
export Variable, Unknown, Parameter, Constant, @Unknown, @Param, @Const
1715

1816

1917
Base.copy(x::Variable) = Variable(x.name, x.subtype, x.diff, x.dependents)
@@ -53,7 +51,7 @@ end
5351
# Build variables more easily
5452
function _parse_vars(macroname, fun, x)
5553
ex = Expr(:block)
56-
lhss = Symbol[]
54+
var_names = Symbol[]
5755
# if parsing things in the form of
5856
# begin
5957
# x
@@ -62,33 +60,30 @@ function _parse_vars(macroname, fun, x)
6260
# end
6361
x = flatten_expr!(x)
6462
for _var in x
65-
iscall = typeof(_var) <: Expr && _var.head == :call
63+
iscall = isa(_var, Expr) && _var.head == :call
6664
issym = _var isa Symbol
67-
@assert iscall || issym "@$macroname expects a tuple of expressions!\nE.g. `@$macroname x y z`"
65+
@assert iscall || issym "@$macroname expects a tuple of expressions (`@$macroname x y z(t)`)"
6866

6967
if iscall
7068
dependents = :(Variable[$(_var.args[2:end]...)])
71-
lhs = _var.args[1]
69+
var_name = _var.args[1]
7270
else
7371
dependents = Variable[]
74-
lhs = _var
72+
var_name = _var
7573
end
7674

77-
push!(lhss, lhs)
78-
expr = :( $lhs = $fun( Symbol($(String(lhs))) ,
79-
dependents = $dependents))
75+
push!(var_names, var_name)
76+
expr = :($var_name = $fun($(Meta.quot(var_name)), dependents = $dependents))
8077
push!(ex.args, expr)
8178
end
82-
push!(ex.args, build_expr(:tuple, lhss))
79+
push!(ex.args, build_expr(:tuple, var_names))
8380
return ex
8481
end
85-
86-
for funs in [(:Unknown, :Unknown), (:IVar, :IndependentVariable), (:Param, :Parameter)]
87-
@eval begin
88-
macro ($(funs[1]))(x...)
89-
esc(_parse_vars(String($funs[1]), $funs[2], x))
90-
end
91-
end
82+
macro Unknown(xs...)
83+
esc(_parse_vars(:Unknown, Unknown, xs))
84+
end
85+
macro Param(xs...)
86+
esc(_parse_vars(:Param, Parameter, xs))
9287
end
9388

9489
function _const_assign(x)

test/ambiguity.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
using ModelingToolkit
22
using Test
33

4-
@IVar t
4+
@Param t
55
@Unknown x(t) y(t) z(t)
66

77
struct __MyType__ end

test/basic_variables_and_operations.jl

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
using ModelingToolkit
22
using Test
33

4-
@IVar t
4+
@Param t σ ρ β
55
@Unknown x(t) y(t) z(t)
6-
76
@Deriv D'~t # Default of first derivative, Derivative(t,1)
8-
@Param σ ρ β
97
@Const c=0
108

119
# Default values

test/components.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ function Lorenz(t)
2222
Lorenz(x, y, z, σ, ρ, β, generate_lorenz_eqs(t, x, y, z, σ, ρ, β))
2323
end
2424

25-
@IVar t
25+
@Param t
2626
lz1 = Lorenz(t)
2727
lz2 = Lorenz(t)
2828
lz1.x ~ lz2.x

test/derivatives.jl

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@ using ModelingToolkit
22
using Test
33

44
# Derivatives
5-
@IVar t
5+
@Param t σ ρ β
66
@Unknown x(t) y(t) z(t)
7-
@Param σ ρ β
87
@Deriv D'~t
98
dsin = D(sin(t))
109
expand_derivatives(dsin)

test/internal.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ using ModelingToolkit
22
using Test
33

44
# `Expr`, `Number` -> `Operation`
5-
@IVar a
5+
@Param a
66
@Param b
77
@Unknown x(t) y()
88
@test convert(Expression, 2) == 2

test/simplify.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
using ModelingToolkit
22
using Test
33

4-
@IVar t
4+
@Param t
55
@Unknown x(t) y(t) z(t)
66

77
null_op = 0*t

0 commit comments

Comments
 (0)