Skip to content

Commit 903e80d

Browse files
Merge pull request #22 from magistere/simplify
Improve 'simplify' function
2 parents f6cb7c1 + 6d6817b commit 903e80d

File tree

2 files changed

+44
-1
lines changed

2 files changed

+44
-1
lines changed

src/symbolic.jl

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,31 @@ function simplify(ex::Expr)
102102
return new_ex
103103
end
104104

105+
function sum_numeric_args(args)
106+
sum = 0
107+
sym_args = {}
108+
for arg in args
109+
if isa(arg, Number)
110+
sum += arg
111+
else
112+
sym_args = [sym_args, arg]
113+
end
114+
end
115+
(sum, sym_args)
116+
end
117+
118+
function mul_numeric_args(args)
119+
prod = 1
120+
sym_args = {}
121+
for arg in args
122+
if isa(arg, Number)
123+
prod *= arg
124+
else
125+
sym_args = [sym_args, arg]
126+
end
127+
end
128+
(prod, sym_args)
129+
end
105130

106131
# Handles all lengths for ex.args
107132
# Removes any 0's in a sum
@@ -113,6 +138,8 @@ function simplify(::SymbolParameter{:+}, args)
113138
elseif length(new_args) == 1
114139
return new_args[1]
115140
else
141+
(sum, sym_args) = sum_numeric_args(new_args)
142+
new_args = sum==0 ? sym_args : [sum, sym_args]
116143
return Expr(:call, :+, new_args...)
117144
end
118145
end
@@ -144,6 +171,8 @@ function simplify(::SymbolParameter{:*}, args)
144171
elseif any(new_args .== 0)
145172
return 0
146173
else
174+
(prod, sym_args) = mul_numeric_args(new_args)
175+
new_args = prod==1 ? sym_args : [prod, sym_args]
147176
return Expr(:call, :*, new_args...)
148177
end
149178
end

test/symbolic.jl

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
@assert isequal(differentiate(:(x * a), :x), :a)
1616
@assert isequal(differentiate(:(x ^ 2), :x), :(2 * x))
1717
@assert isequal(differentiate(:(a * x ^ 2), :x), :(a * (2 * x)))
18-
@assert isequal(differentiate(:(2 ^ x), :x), :(*(^(2, x), 0.6931471805599453)))
18+
@assert isequal(differentiate(:(2 ^ x), :x), :(*(0.6931471805599453, ^(2, x))))
1919
@assert isequal(differentiate(:(sin(x)), :x), :(cos(x)))
2020
@assert isequal(differentiate(:(cos(x)), :x), :(*(-1,sin(x)))) # needs a better simplify
2121
@assert isequal(differentiate(:(tan(x)), :x), :(1 + tan(x)^2))
@@ -74,3 +74,17 @@ end
7474
@assert isequal(testfun(x), :(^($(x),2)))
7575
@assert isequal(testfun(3), 9)
7676
@assert isequal(testfun(@sexpr(x+y)), :(^(+($x,$y),2)))
77+
78+
#
79+
# Simplify tests
80+
#
81+
82+
@assert isequal(simplify(:(x+y)), :(+(x,y)))
83+
@assert isequal(simplify(:(x+3)), :(+(3,x)))
84+
@assert isequal(simplify(:(x+3+4)), :(+(7,x)))
85+
@assert isequal(simplify(:(2+y+x+3)), :(+(5,y,x)))
86+
87+
@assert isequal(simplify(:(x*y)), :(*(x,y)))
88+
@assert isequal(simplify(:(x*3)), :(*(3,x)))
89+
@assert isequal(simplify(:(x*3*4)), :(*(12,x)))
90+
@assert isequal(simplify(:(2*y*x*3)), :(*(6,y,x)))

0 commit comments

Comments
 (0)