11mutable struct Variable <: Expression
22 name:: Symbol
3- value
43 value_type:: DataType
54 subtype:: Symbol
65 diff:: Union{Function,Nothing} # FIXME
@@ -13,26 +12,23 @@ mutable struct Variable <: Expression
1312end
1413
1514Variable (name,
16- value = nothing ,
17- value_type = typeof (value);
15+ value_type = Any;
1816 subtype:: Symbol = :Variable ,
1917 dependents:: Vector{Variable} = Variable[],
2018 flow:: Bool = false ,
2119 description:: String = " " ,
2220 domain = Reals (),
2321 size = nothing ,
2422 context = nothing ) =
25- Variable (name,value, value_type,subtype,nothing ,
23+ Variable (name,value_type,subtype,nothing ,
2624 dependents,description,flow,domain,size,context)
2725Variable (name,args... ;kwargs... ) = Variable (name,args... ;subtype= :Variable ,kwargs... )
2826
29- Variable (name,x:: Variable ) = Variable (name,x. value,x . value_type,
27+ Variable (name,x:: Variable ) = Variable (name,x. value_type,
3028 x. subtype,D,x. dependents,x. description,x. flow,x. domain,
3129 x. size,x. context)
3230
3331Parameter (name,args... ;kwargs... ) = Variable (name,args... ;subtype= :Parameter ,kwargs... )
34- Constant (value:: Number ) = Variable (Symbol (value),value,typeof (value);subtype= :Constant )
35- Constant (name,args... ;kwargs... ) = Variable (name,args... ;subtype= :Constant ,kwargs... )
3632IndependentVariable (name,args... ;kwargs... ) = Variable (name,args... ;subtype= :IndependentVariable ,kwargs... )
3733
3834function DependentVariable (name,args... ;dependents = [],kwargs... )
@@ -64,53 +60,38 @@ export Variable,Parameter,Constant,DependentVariable,IndependentVariable,JumpVar
6460 @Var , @DVar , @IVar , @Param , @Const
6561
6662
67- Base. get (x:: Variable ) = x. value
63+ struct Constant <: Expression
64+ value:: Number
65+ end
66+ Base. get (c:: Constant ) = c. value
67+
6868
69- Base. iszero (:: Expression ) = false
70- Base. iszero (c:: Variable ) = get (c) isa Number && iszero (get (c))
71- Base. isone (:: Expression ) = false
72- Base. isone (c:: Variable ) = get (c) isa Number && isone (get (c))
69+ Base. iszero (ex:: Expression ) = isa (ex, Constant) && iszero (ex. value)
70+ Base. isone (ex:: Expression ) = isa (ex, Constant) && isone (ex. value)
7371
7472
7573# Variables use isequal for equality since == is an Operation
76- function Base.:(== )(x:: Variable ,y:: Variable )
77- x. name == y. name && x. subtype == y. subtype && x . value == y . value &&
74+ function Base.:(== )(x:: Variable , y:: Variable )
75+ x. name == y. name && x. subtype == y. subtype &&
7876 x. value_type == y. value_type && x. diff == y. diff
7977end
80-
81- function Base.:(== )(x:: Variable ,y:: Number )
82- x == Constant (y)
83- end
84-
85- function Base.:(== )(x:: Number ,y:: Variable )
86- Constant (x) == y
87- end
78+ Base.:(== )(:: Variable , :: Number ) = false
79+ Base.:(== )(:: Number , :: Variable ) = false
80+ Base.:(== )(:: Variable , :: Constant ) = false
81+ Base.:(== )(:: Constant , :: Variable ) = false
82+ Base.:(== )(c:: Constant , n:: Number ) = c. value == n
83+ Base.:(== )(n:: Number , c:: Constant ) = c. value == n
84+ Base.:(== )(a:: Constant , b:: Constant ) = a. value == b. value
8885
8986function Base. convert (:: Type{Expr} , x:: Variable )
90- if x. subtype == :Constant
91- return x. value
92- elseif x. diff == nothing
93- return :($ (x. name))
94- else
95- return :($ (Symbol (" $(x. name) _$(x. diff. x. name) " )))
96- end
87+ x. diff === nothing && return x. name
88+ return Symbol (" $(x. name) _$(x. diff. x. name) " )
9789end
90+ Base. convert (:: Type{Expr} , c:: Constant ) = c. value
9891
99- function Base. show (io:: IO , A:: Variable )
100- if A. subtype == :Constant
101- print (io," Constant($(A. value) )" )
102- else
103- str = " $(A. subtype) ($(A. name) )"
104- if A. value != nothing
105- str *= " , value = " * string (A. value)
106- end
107-
108- if A. diff != nothing
109- str *= " , diff = " * string (A. diff)
110- end
111-
112- print (io,str)
113- end
92+ function Base. show (io:: IO , x:: Variable )
93+ print (io, x. subtype, ' (' , x. name, ' )' )
94+ x. diff === nothing || print (io, " , diff = " , x. diff)
11495end
11596
11697# Build variables more easily
@@ -121,45 +102,29 @@ function _parse_vars(macroname, fun, x)
121102 # begin
122103 # x
123104 # y
124- # z = exp(2)
105+ # z
125106 # end
126107 x = flatten_expr! (x)
127108 for _var in x
128109 iscall = typeof (_var) <: Expr && _var. head == :call
129110 issym = _var isa Symbol
130- isassign = issym ? false : _var. head == :(= )
131- @assert iscall || issym || isassign " @$macroname expects a tuple of expressions!\n E.g. `@$macroname x y z=1`"
132- if iscall || issym
133- if iscall
134- dependents = :([$ (_var. args[2 : end ]. .. )])
135- var = _var. args[1 ]
136- else
137- dependents = Variable[]
138- var = _var
139- end
140- lhs = var
141- push! (lhss, lhs)
142- expr = :( $ lhs = $ fun ( Symbol ($ (String (lhs))) ,
143- dependents = $ dependents))
144- end
145- if isassign
146- iscall = typeof (_var. args[1 ]) <: Expr && _var. args[1 ]. head == :call
147- if iscall
148- dependents = :([$ (_var. args[1 ]. args[2 : end ]. .. )])
149- lhs = _var. args[1 ]. args[1 ]
150- else
151- dependents = Variable[]
152- lhs = _var. args[1 ]
153- end
154- rhs = _var. args[2 ]
155- push! (lhss, lhs)
156- expr = :( $ lhs = $ fun ( Symbol ($ (String (lhs))) , $ rhs,
157- dependents = $ dependents))
111+ @assert iscall || issym " @$macroname expects a tuple of expressions!\n E.g. `@$macroname x y z`"
112+
113+ if iscall
114+ dependents = :([$ (_var. args[2 : end ]. .. )])
115+ lhs = _var. args[1 ]
116+ else
117+ dependents = Variable[]
118+ lhs = _var
158119 end
120+
121+ push! (lhss, lhs)
122+ expr = :( $ lhs = $ fun ( Symbol ($ (String (lhs))) ,
123+ dependents = $ dependents))
159124 push! (ex. args, expr)
160125 end
161- push! (ex. args, Expr (:tuple , lhss... ))
162- ex
126+ push! (ex. args, build_expr (:tuple , lhss))
127+ return ex
163128end
164129
165130for funs in ((:DVar , :DependentVariable ), (:IVar , :IndependentVariable ),
0 commit comments