Skip to content

Commit 6781381

Browse files
variable dependencies
1 parent b54b749 commit 6781381

File tree

7 files changed

+64
-44
lines changed

7 files changed

+64
-44
lines changed

src/variables.jl

Lines changed: 47 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,32 @@ Variable(name,args...;kwargs...) = Variable(name,args...;subtype=:Variable,kwarg
2929
Parameter(name,args...;kwargs...) = Variable(name,args...;subtype=:Parameter,kwargs...)
3030
Constant(value::Number) = Variable(Symbol(value),value,typeof(value);subtype=:Constant)
3131
Constant(name,args...;kwargs...) = Variable(name,args...;subtype=:Constant,kwargs...)
32-
DependentVariable(name,args...;kwargs...) = Variable(name,args...;subtype=:DependentVariable,kwargs...)
33-
StateVariable(name,args...;kwargs...) = Variable(name,args...;subtype=:StateVariable,kwargs...)
34-
ControlVariable(name,args...;kwargs...) = Variable(name,args...;subtype=:ControlVariable,kwargs...)
3532
IndependentVariable(name,args...;kwargs...) = Variable(name,args...;subtype=:IndependentVariable,kwargs...)
36-
JumpVariable(name,args...;kwargs...) = Variable(name,args...;subtype=:JumpVariable,kwargs...)
37-
NoiseVariable(name,args...;kwargs...) = Variable(name,args...;subtype=:NoiseVariable,kwargs...)
33+
34+
function DependentVariable(name,args...;dependents = [],kwargs...)
35+
@assert !isempty(dependents)
36+
Variable(name,args...;subtype=:DependentVariable,dependents=dependents,kwargs...)
37+
end
38+
39+
function StateVariable(name,args...;dependents = [],kwargs...)
40+
@assert !isempty(dependents)
41+
Variable(name,args...;subtype=:StateVariable,dependents=dependents,kwargs...)
42+
end
43+
44+
function ControlVariable(name,args...;dependents = [],kwargs...)
45+
@assert !isempty(dependents)
46+
Variable(name,args...;subtype=:ControlVariable,dependents=dependents,kwargs...)
47+
end
48+
49+
function JumpVariable(name,args...;dependents = [],kwargs...)
50+
@assert !isempty(dependents)
51+
Variable(name,args...;subtype=:JumpVariable,dependents=dependents,kwargs...)
52+
end
53+
54+
function NoiseVariable(name,args...;dependents = [],kwargs...)
55+
@assert !isempty(dependents)
56+
Variable(name,args...;subtype=:NoiseVariable,dependents=dependents,kwargs...)
57+
end
3858

3959
export Variable,Parameter,Constant,DependentVariable,IndependentVariable,JumpVariable,NoiseVariable,
4060
@Var, @DVar, @IVar, @Param, @Const
@@ -109,28 +129,35 @@ function _parse_vars(macroname, fun, x)
109129
x = flatten_expr!(x)
110130
for _var in x
111131
iscall = typeof(_var) <: Expr && _var.head == :call
112-
@show iscall
113-
if iscall
114-
dependents = Variable[:($(esc(d))) for d in _var.args[2:end]]
115-
var = _var.args[1]
116-
else
117-
dependents = Variable[]
118-
var = _var
119-
end
120-
issym = var isa Symbol
121-
isassign = issym ? false : var.head == :(=)
122-
@assert issym || isassign "@$macroname expects a tuple of expressions!\nE.g. `@$macroname x y z=1`"
123-
if issym
132+
issym = _var isa Symbol
133+
isassign = issym ? false : _var.head == :(=)
134+
@assert iscall || issym || isassign "@$macroname expects a tuple of expressions!\nE.g. `@$macroname x y z=1`"
135+
if iscall || issym
136+
if iscall
137+
dependents = :([$(_var.args[2:end]...)])
138+
var = _var.args[1]
139+
else
140+
dependents = Variable[]
141+
var = _var
142+
end
124143
lhs = var
125144
push!(lhss, lhs)
126145
expr = :( $lhs = $fun( Symbol($(String(lhs))) ,
127146
dependents = $dependents))
128147
end
129148
if isassign
130-
lhs = var.args[1]
131-
rhs = var.args[2]
149+
iscall = typeof(_var.args[1]) <: Expr && _var.args[1].head == :call
150+
if iscall
151+
dependents = :([$(_var.args[1].args[2:end]...)])
152+
lhs = _var.args[1].args[1]
153+
else
154+
dependents = Variable[]
155+
lhs = _var.args[1]
156+
end
157+
rhs = _var.args[2]
132158
push!(lhss, lhs)
133-
expr = :( $lhs = $fun( Symbol($(String(lhs))) , $rhs))
159+
expr = :( $lhs = $fun( Symbol($(String(lhs))) , $rhs,
160+
dependents = $dependents))
134161
end
135162
push!(ex.args, expr)
136163
end

test/ambiguity.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
using SciCompDSL
22
using Base.Test
33

4-
@DVar x y z
54
@IVar t
5+
@DVar x(t) y(t) z(t)
66

77
struct __MyType__ end
88
Base.:~(::__MyType__,::Number) = 2

test/basic_variables_and_operations.jl

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,19 @@ using SciCompDSL
22
using Base.Test
33

44
@IVar t
5-
@DVar x(t)
6-
macroexpand(:(@DVar x(t)))
7-
macroexpand(:(@IVar t))
8-
@DVar x y z
5+
@DVar x(t) y(t) z(t)
6+
@test_throws AssertionError @DVar w
97

108
@Deriv D'~t # Default of first derivative, Derivative(t,1)
119
@Param σ ρ β
1210
@Const c=0
1311

1412
# Default values
1513
p = Parameter(:p, 1)
16-
u = DependentVariable(:u, [1])
14+
u = DependentVariable(:u, [1], dependents = [t])
1715

18-
s = JumpVariable(:s,3)
19-
n = NoiseVariable(:n)
16+
s = JumpVariable(:s,3,dependents=[t])
17+
n = NoiseVariable(:n,dependents=[t])
2018

2119
σ*(y-x)
2220
D*x
@@ -26,11 +24,3 @@ D*y ~ x*(ρ-z)-sin(y)
2624
@test D*t == Constant(1)
2725
null_op = 0*t
2826
@test simplify_constants(null_op) == Constant(0)
29-
30-
macro escape_all(x...)
31-
:($(esc(x))...)
32-
end
33-
x = 1
34-
y = 2
35-
z = 3
36-
macroexpand(:(@escape_all x y z))

test/derivatives.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ using Base.Test
33

44
# Derivatives
55
@IVar t
6-
@Var x y z
6+
@Var x(t) y(t) z(t)
77
@Param σ ρ β
88
@Deriv D'~t
99
dsin = D*sin(t)

test/internal.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ using Base.Test
44
# `Expr`, `Number` -> `Operation`
55
@IVar a
66
@Param b
7-
@DVar x
7+
@DVar x(t)
88
@Var y
99
@test parse(Operation, 2) == 2
1010
expr = :(-inv(2sqrt(+($a, $b))))

test/system_construction.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ using SciCompDSL
22
using Base.Test
33

44
# Define some variables
5-
@DVar x y z
65
@IVar t
6+
@DVar x(t) y(t) z(t)
77
@Deriv D'~t # Default of first derivative, Derivative(t,1)
88
@Param σ ρ β
99
@Const c=0
@@ -37,7 +37,7 @@ test_vars_extraction(de, de2)
3737
# Conversion to first-order ODEs #17
3838
@Deriv D3'''~t
3939
@Deriv D2''~t
40-
@DVar u u_tt u_t x_t
40+
@DVar u(t) u_tt(t) u_t(t) x_t(t)
4141
eqs = [D3*u ~ 2(D2*u) + D*u + D*x + 1
4242
D2*x ~ D*x + 2]
4343
de = DiffEqSystem(eqs, [t])

test/variable_parsing.jl

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,13 @@ a1 = Variable(:a,1.0)
1010
b
1111
end
1212

13-
@DVar x y=sin(1)+exp(1) z
14-
x1 = DependentVariable(:x)
15-
y1 = DependentVariable(:y, sin(1) + exp(1))
16-
z1 = DependentVariable(:z)
13+
@IVar t
14+
@DVar x(t)
15+
@DVar y(t)=sin(1)+exp(1)
16+
@DVar z(t)
17+
x1 = DependentVariable(:x,dependents = [t])
18+
y1 = DependentVariable(:y, sin(1) + exp(1),dependents = [t])
19+
z1 = DependentVariable(:z,dependents = [t])
1720
@test x1 == x
1821
@test y1 == y
1922
@test z1 == z

0 commit comments

Comments
 (0)