From b71363f10757439f9dd32f448890aacd96f1fe8d Mon Sep 17 00:00:00 2001 From: Yuriy Skalko Date: Fri, 25 Oct 2013 15:47:12 +0300 Subject: [PATCH 1/2] Implement simplify(:(*(-1,x))) ==> -x --- src/symbolic.jl | 3 +++ test/symbolic.jl | 10 +++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/symbolic.jl b/src/symbolic.jl index 35fa41d..c2f6e6f 100644 --- a/src/symbolic.jl +++ b/src/symbolic.jl @@ -171,6 +171,9 @@ function simplify(::SymbolParameter{:*}, args) # Special Case: simplify(:(x * y * z * 0)) == 0 elseif any(args .== 0) return 0 + # Special Case: simplify(:(*(-1,x))) == -x + elseif length(args) == 2 && args[1] == -1 + return Expr(:call, :-, args[2]) else (prod, sym_args) = mul_numeric_args(args) args = prod==1 ? sym_args : [prod, sym_args] diff --git a/test/symbolic.jl b/test/symbolic.jl index d6fae32..84ff9b5 100644 --- a/test/symbolic.jl +++ b/test/symbolic.jl @@ -17,17 +17,17 @@ @test isequal(differentiate(:(a * x ^ 2), :x), :(a * (2 * x))) @test isequal(differentiate(:(2 ^ x), :x), :(*(0.6931471805599453, ^(2, x)))) @test isequal(differentiate(:(sin(x)), :x), :(cos(x))) -@test isequal(differentiate(:(cos(x)), :x), :(*(-1,sin(x)))) # needs a better simplify +@test isequal(differentiate(:(cos(x)), :x), :(-sin(x))) @test isequal(differentiate(:(tan(x)), :x), :(1 + tan(x)^2)) @test isequal(differentiate(:(exp(x)), :x), :(exp(x))) @test isequal(differentiate(:(log(x)), :x), :(1 / x)) @test isequal(differentiate(:(sin(x) + sin(x)), :x), :(cos(x) + cos(x))) -@test isequal(differentiate(:(sin(x) - cos(x)), :x), :(-(cos(x),*(-1,sin(x))))) # Simplify -(a, -(b)) => +(a, b) +@test isequal(differentiate(:(sin(x) - cos(x)), :x), :(-(cos(x),-sin(x)))) # Simplify -(a, -(b)) => +(a, b) @test isequal(differentiate(:(x * sin(x)), :x), :(sin(x) + x * cos(x))) @test isequal(differentiate(:(x / sin(x)), :x), :((sin(x) - x * cos(x)) / (sin(x)^2))) @test isequal(differentiate(:(sin(sin(x))), :x), :(*(cos(x),cos(sin(x))))) -@test isequal(differentiate(:(sin(cos(x) + sin(x))), :x), :(*(+(*(-1,sin(x)),cos(x)),cos(+(cos(x),sin(x)))))) # Clean this up -@test isequal(differentiate(:(exp(-x)), :x), :(*(-1,exp(-(x))))) # Simplify this to -(exp(-x)) +@test isequal(differentiate(:(sin(cos(x) + sin(x))), :x), :(*(+(-sin(x),cos(x)),cos(+(cos(x),sin(x)))))) +@test isequal(differentiate(:(exp(-x)), :x), :(-exp(-x))) @test isequal(differentiate(:(log(x^2)), :x), :(/(*(2,x),^(x,2)))) @test isequal(differentiate(:(x^n), :x), :(*(n, ^(x, -(n, 1))))) @test isequal(differentiate(:(n^x), :x), :(*(^(n, x), log(n)))) @@ -47,7 +47,7 @@ # # @test isequal(differentiate("sin(x) + cos(x)^2"), :(+(cos(x),*(2,cos(x))))) -@test isequal(differentiate("x + exp(-x) + sin(exp(x))", :x), :(+(1,*(-1,exp(-(x))),*(exp(x),cos(exp(x)))))) +@test isequal(differentiate("x + exp(-x) + sin(exp(x))", :x), :(+(1,-exp(-x),*(exp(x),cos(exp(x)))))) # TODO: Make these work # differentiate(:(sin(x)), :x)(0.0) From 51bb6936a0d7e920bc21fe12f1c7f498ad8550b3 Mon Sep 17 00:00:00 2001 From: Yuriy Skalko Date: Fri, 25 Oct 2013 16:11:14 +0300 Subject: [PATCH 2/2] Implement simplify(:(x - (-y))) ==> x + y --- src/symbolic.jl | 6 ++++++ test/symbolic.jl | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/symbolic.jl b/src/symbolic.jl index c2f6e6f..3c9bb3b 100644 --- a/src/symbolic.jl +++ b/src/symbolic.jl @@ -145,6 +145,9 @@ function simplify(::SymbolParameter{:+}, args) end end +isminus(ex::Expr) = ex.head == :call && ex.args[1] == :- && length(ex.args) == 2 +isminus(ex) = false + # Assume length(args) == 3 function simplify(::SymbolParameter{:-}, args) # Remove any 0's in a subtraction @@ -154,6 +157,9 @@ function simplify(::SymbolParameter{:-}, args) # Special Case: simplify(:(x - x)) == 0 elseif length(args) == 2 && args[1] == args[2] return 0 + # Special Case: simplify(:(x - (-y))) == x + y + elseif length(args) == 2 && isminus(args[2]) + return Expr(:call, :+, args[1], args[2].args[2]) else return Expr(:call, :-, args...) end diff --git a/test/symbolic.jl b/test/symbolic.jl index 84ff9b5..cb85e84 100644 --- a/test/symbolic.jl +++ b/test/symbolic.jl @@ -22,7 +22,7 @@ @test isequal(differentiate(:(exp(x)), :x), :(exp(x))) @test isequal(differentiate(:(log(x)), :x), :(1 / x)) @test isequal(differentiate(:(sin(x) + sin(x)), :x), :(cos(x) + cos(x))) -@test isequal(differentiate(:(sin(x) - cos(x)), :x), :(-(cos(x),-sin(x)))) # Simplify -(a, -(b)) => +(a, b) +@test isequal(differentiate(:(sin(x) - cos(x)), :x), :(cos(x) + sin(x))) @test isequal(differentiate(:(x * sin(x)), :x), :(sin(x) + x * cos(x))) @test isequal(differentiate(:(x / sin(x)), :x), :((sin(x) - x * cos(x)) / (sin(x)^2))) @test isequal(differentiate(:(sin(sin(x))), :x), :(*(cos(x),cos(sin(x)))))