1
1
# <: Real to make tracing easier. Maybe a bad idea?
2
2
struct Variable <: Expression
3
3
name:: Symbol
4
- subtype:: Symbol
5
4
value
6
5
value_type:: DataType
6
+ subtype:: Symbol
7
7
diff:: Union{AbstractOperator,Void}
8
+ dependents:: Vector{Variable}
9
+ description:: String
10
+ flow:: Bool
11
+ domain
12
+ context
8
13
end
9
14
10
- Variable (name,subtype:: Symbol = :Variable ,value = nothing ,value_type = typeof (value)) =
11
- Variable (name,subtype,value,value_type,nothing )
12
- Variable (name,args... ) = Variable (name,:Variable ,args... )
13
- Parameter (name,args... ) = Variable (name,:Parameter ,args... )
14
- Constant (value:: Number ) = Variable (Symbol (value),:Constant ,value,typeof (value))
15
- Constant (name,value,args... ) = Variable (name,:Constant ,value,typeof (value))
16
- DependentVariable (name,args... ) = Variable (name,:DependentVariable ,args... )
17
- IndependentVariable (name,args... ) = Variable (name,:IndependentVariable ,args... )
18
- JumpVariable (name,rate,args... ) = Variable (name,:JumpVariable ,rate,typeof (rate),args... )
19
- NoiseVariable (name,args... ) = Variable (name,:NoiseVariable ,args... )
15
+ Variable (name,
16
+ value = nothing ,
17
+ value_type = typeof (value);
18
+ subtype:: Symbol = :Variable ,
19
+ dependents:: Vector{Variable} = Variable[],
20
+ flow:: Bool = false ,
21
+ description:: String = " " ,
22
+ domain = nothing ,
23
+ context = nothing ) =
24
+ Variable (name,value,value_type,subtype,nothing ,
25
+ dependents,description,flow,domain,context)
26
+ Variable (name,args... ;kwargs... ) = Variable (name,args... ;subtype= :Variable ,kwargs... )
27
+ Parameter (name,args... ;kwargs... ) = Variable (name,args... ;subtype= :Parameter ,kwargs... )
28
+ Constant (value:: Number ) = Variable (Symbol (value),value,typeof (value);subtype= :Constant )
29
+ Constant (name,args... ;kwargs... ) = Variable (name,args... ;subtype= :Constant ,kwargs... )
30
+ DependentVariable (name,args... ;kwargs... ) = Variable (name,args... ;subtype= :DependentVariable ,kwargs... )
31
+ IndependentVariable (name,args... ;kwargs... ) = Variable (name,args... ;subtype= :IndependentVariable ,kwargs... )
32
+ JumpVariable (name,args... ;kwargs... ) = Variable (name,args... ;subtype= :JumpVariable ,kwargs... )
33
+ NoiseVariable (name,args... ;kwargs... ) = Variable (name,args... ;subtype= :NoiseVariable ,kwargs... )
20
34
21
35
export Variable,Parameter,Constant,DependentVariable,IndependentVariable,JumpVariable,NoiseVariable,
22
36
@Var , @DVar , @IVar , @Param , @Const
54
68
55
69
extract_idv (eq) = eq. args[1 ]. diff. x
56
70
57
- function varname (var:: Variable , naming_scheme; lower= false )
58
- D = var. diff
59
- D == nothing && return var
60
- order = lower ? D. order- 1 : D. order
61
- varname (var. name, D. x, order, naming_scheme)
62
- end
63
- function varname (sym:: Symbol , idv, order:: Int , naming_scheme)
64
- order == 0 && return Variable (sym, :DependentVariable )
65
- name = String (sym)* naming_scheme* String (idv. name)^ order
66
- Variable (name, :DependentVariable )
67
- end
68
-
69
71
function extract_elements (ops, eltypes)
70
72
elems = Dict {Symbol, Vector{Variable}} ()
71
73
names = Dict {Symbol, Set{Symbol}} ()
@@ -84,9 +86,6 @@ function extract_elements!(op::AbstractOperation, elems, names)
84
86
if arg isa Operation
85
87
extract_elements! (arg, elems, names)
86
88
elseif arg isa Variable && haskey (elems, arg. subtype) && ! in (arg. name, names[arg. subtype])
87
- if arg. subtype == :DependentVariable && arg. diff != nothing
88
- arg = Variable (arg. name, arg. subtype)
89
- end
90
89
push! (names[arg. subtype], arg. name)
91
90
push! (elems[arg. subtype], arg)
92
91
end
0 commit comments