Skip to content

Commit 5a47811

Browse files
committed
Factor update
Update is now more compliant with expression format from ODESystem equations
1 parent dd5708b commit 5a47811

File tree

2 files changed

+42
-8
lines changed

2 files changed

+42
-8
lines changed

src/transform/binarize.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ Rules for transform narity operations into arity 1 operations. (Works...)
33
=#
44
function binarize!(ex::Expr)
55
(arity(ex) < 3) && return ex
6-
if op(ex) (:+, :*, :min, :max)
7-
new_arg = Vector{Union{Symbol, Expr}}(undef,0)
6+
if op(ex) (:+, :*, :min, :max, +, *)
7+
new_arg = Vector{Union{Symbol, Expr, typeof(+), typeof(*)}}(undef,0)
88
push!(new_arg, op(ex))
99
for j=3:(arity(ex) + 1)
1010
push!(new_arg, ex.args[j])

src/transform/factor.jl

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
num_or_var(ex::Number) = true
22
num_or_var(ex::Symbol) = true
3-
num_or_var(ex::Any) = false
3+
num_or_var(ex::Num) = true
4+
num_or_var(ex::typeof(+)) = true
5+
num_or_var(ex::typeof(*)) = true
6+
num_or_var(ex::Any) = checkop(op(ex))
7+
checkop(op::Symbol) = true
8+
checkop(op::Any) = false
9+
410
function num_or_var(ex::Vector)
511
for i in ex
612
if ~num_or_var(i)
@@ -16,12 +22,40 @@ function is_factor(ex::Expr)
1622
num_or_var(ex.args[2:end])
1723
end
1824

19-
factor!(ex::Number; assignments::Vector{Assignment}) = assignments
20-
factor!(ex::Symbol; assignments::Vector{Assignment}) = assignments
25+
# factor!(ex::Number; assignments::Vector{Assignment}) = assignments
26+
# factor!(ex::Symbol; assignments::Vector{Assignment}) = assignments
2127
factor!(ex::NTuple; assignments::Vector{Assignment}) = factor!(Expr(:($([i for i in ex]...))), assignments=assignments)
2228
factor!(ex::Tuple; assignments::Vector{Assignment}) = factor!(Expr(:($([i for i in ex]...))), assignments=assignments)
2329

30+
function factor!(ex::Number; assignments = Assignment[])
31+
new = Assignment(gensym(:aux), ex)
32+
index = findall(x -> x.rhs==new.rhs, assignments)
33+
if isempty(index)
34+
push!(assignments, new)
35+
else
36+
p = collect(1:length(assignments))
37+
deleteat!(p, index[1])
38+
push!(p, index[1])
39+
assignments[:] = assignments[p]
40+
end
41+
return assignments
42+
end
43+
function factor!(ex::Symbol; assignments = Assignment[])
44+
new = Assignment(gensym(:aux), ex)
45+
index = findall(x -> x.rhs==new.rhs, assignments)
46+
if isempty(index)
47+
push!(assignments, new)
48+
else
49+
p = collect(1:length(assignments))
50+
deleteat!(p, index[1])
51+
push!(p, index[1])
52+
assignments[:] = assignments[p]
53+
end
54+
return assignments
55+
end
56+
2457
function factor!(ex::Expr; assignments = Assignment[])
58+
binarize!(ex)
2559
if is_factor(ex)
2660
new = Assignment(gensym(:aux), ex)
2761
index = findall(x -> x.rhs==new.rhs, assignments)
@@ -31,7 +65,7 @@ function factor!(ex::Expr; assignments = Assignment[])
3165
p = collect(1:length(assignments))
3266
deleteat!(p, index[1])
3367
push!(p, index[1])
34-
assignments = assignments[p]
68+
assignments[:] = assignments[p]
3569
end
3670
return assignments
3771
end
@@ -40,12 +74,12 @@ function factor!(ex::Expr; assignments = Assignment[])
4074
if num_or_var(arg)
4175
push!(new_expr, arg)
4276
else
43-
assignments = factor!(arg, assignments=assignments)
77+
factor!(arg, assignments=assignments)
4478
push!(new_expr, assignments[end].lhs)
4579
end
4680
end
4781
pushfirst!(new_expr, :call)
48-
assignments = factor!(Expr(:($([i for i in new_expr]...))), assignments=assignments)
82+
factor!(Expr(:($([i for i in new_expr]...))), assignments=assignments)
4983
return assignments
5084
end
5185

0 commit comments

Comments
 (0)