Skip to content

Commit 95b48b2

Browse files
authored
Merge pull request #124 from mlubin/ml/fixeval
remove call to simplify() in differentiate()
2 parents e71569d + 7ad7924 commit 95b48b2

File tree

2 files changed

+47
-41
lines changed

2 files changed

+47
-41
lines changed

src/differentiate.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ function differentiate(ex::Expr,wrt)
1616
if ex.head != :call
1717
error("Unrecognized expression $ex")
1818
end
19-
simplify(differentiate(SymbolParameter(ex.args[1]), ex.args[2:end], wrt))
19+
# TODO: When simplify no longer calls eval, simplify the result.
20+
differentiate(SymbolParameter(ex.args[1]), ex.args[2:end], wrt)
2021
end
2122

2223
differentiate(x::SymbolParameter{T}, args, wrt) where {T} = error("Derivative of function " * string(T) * " not supported")

test/symbolic.jl

Lines changed: 45 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2,45 +2,51 @@
22
# Univariate Calculus
33
#
44

5+
macro test_simplified_isequal(lhs, rhs)
6+
quote
7+
@test isequal(simplify($(esc(lhs))), $(esc(rhs)))
8+
end
9+
end
10+
511
@test isequal(differentiate(:(2), :x), 0)
612
@test isequal(differentiate(:(x), :x), 1)
7-
@test isequal(differentiate(:(x + x), :x), 2)
8-
@test isequal(differentiate(:(x - x), :x), 0)
9-
@test isequal(differentiate(:(2 * x), :x), 2)
10-
@test isequal(differentiate(:(2 / x), :x), :(-2 / x^2))
11-
@test isequal(differentiate(:(x / 2), :x), 0.5)
12-
@test isequal(differentiate(:(sin(x) / x), :x), :((cos(x) * x - sin(x)) / x^2))
13-
@test isequal(differentiate(:(x * 2), :x), 2)
14-
@test isequal(differentiate(:(a * x), :x), :a)
15-
@test isequal(differentiate(:(x * a), :x), :a)
16-
@test isequal(differentiate(:(x ^ 2), :x), :(2 * x))
17-
@test isequal(differentiate(:(a * x ^ 2), :x), :(a * (2 * x)))
18-
@test isequal(differentiate(:(2 ^ x), :x), :(*(0.6931471805599453, ^(2, x))))
19-
@test isequal(differentiate(:(sin(x)), :x), :(cos(x)))
20-
@test isequal(differentiate(:(cos(x)), :x), :(-sin(x)))
21-
@test isequal(differentiate(:(tan(x)), :x), :(1 + tan(x)^2))
22-
@test isequal(differentiate(:(exp(x)), :x), :(exp(x)))
23-
@test isequal(differentiate(:(log(x)), :x), :(1 / x))
24-
@test isequal(differentiate(:(sin(x) + sin(x)), :x), :(cos(x) + cos(x)))
25-
@test isequal(differentiate(:(sin(x) - cos(x)), :x), :(cos(x) + sin(x)))
26-
@test isequal(differentiate(:(x * sin(x)), :x), :(sin(x) + x * cos(x)))
27-
@test isequal(differentiate(:(x / sin(x)), :x), :((sin(x) - x * cos(x)) / (sin(x)^2)))
28-
@test isequal(differentiate(:(sin(sin(x))), :x), :(*(cos(x),cos(sin(x)))))
29-
@test isequal(differentiate(:(sin(cos(x) + sin(x))), :x), :(*(+(-sin(x),cos(x)),cos(+(cos(x),sin(x))))))
30-
@test isequal(differentiate(:(exp(-x)), :x), :(-exp(-x)))
31-
@test isequal(differentiate(:(log(x^2)), :x), :((2x) * (1 / x^2)))
32-
@test isequal(differentiate(:(abs2(x)), :x), :(2x))
33-
@test isequal(differentiate(:(inv(x)), :x), :(-abs2(inv(x))))
34-
@test isequal(differentiate(:(x^n), :x), :(*(n, ^(x, -(n, 1)))))
35-
@test isequal(differentiate(:(n^x), :x), :(*(^(n, x), log(n))))
36-
@test isequal(differentiate(:(n^n), :x), 0)
13+
@test_simplified_isequal differentiate(:(x + x), :x) 2
14+
@test_simplified_isequal differentiate(:(x - x), :x) 0
15+
@test_simplified_isequal differentiate(:(2 * x), :x) 2
16+
@test_simplified_isequal differentiate(:(2 / x), :x) :(-2 / x^2)
17+
@test_simplified_isequal differentiate(:(x / 2), :x) 0.5
18+
@test_simplified_isequal differentiate(:(sin(x) / x), :x) :((cos(x) * x - sin(x)) / x^2)
19+
@test_simplified_isequal differentiate(:(x * 2), :x) 2
20+
@test_simplified_isequal differentiate(:(a * x), :x) :a
21+
@test_simplified_isequal differentiate(:(x * a), :x) :a
22+
@test_simplified_isequal differentiate(:(x ^ 2), :x) :(2 * x)
23+
@test_simplified_isequal differentiate(:(a * x ^ 2), :x) :(a * (2 * x))
24+
@test_simplified_isequal differentiate(:(2 ^ x), :x) :(*(0.6931471805599453, ^(2, x)))
25+
@test_simplified_isequal differentiate(:(sin(x)), :x) :(cos(x))
26+
@test_simplified_isequal differentiate(:(cos(x)), :x) :(-sin(x))
27+
@test_simplified_isequal differentiate(:(tan(x)), :x) :(1 + tan(x)^2)
28+
@test_simplified_isequal differentiate(:(exp(x)), :x) :(exp(x))
29+
@test_simplified_isequal differentiate(:(log(x)), :x) :(1 / x)
30+
@test_simplified_isequal differentiate(:(sin(x) + sin(x)), :x) :(cos(x) + cos(x))
31+
@test_simplified_isequal differentiate(:(sin(x) - cos(x)), :x) :(cos(x) + sin(x))
32+
@test_simplified_isequal differentiate(:(x * sin(x)), :x) :(sin(x) + x * cos(x))
33+
@test_simplified_isequal differentiate(:(x / sin(x)), :x) :((sin(x) - x * cos(x)) / (sin(x)^2))
34+
@test_simplified_isequal differentiate(:(sin(sin(x))), :x) :(*(cos(x),cos(sin(x))))
35+
@test_simplified_isequal differentiate(:(sin(cos(x) + sin(x))), :x) :(*(+(-sin(x),cos(x)),cos(+(cos(x),sin(x)))))
36+
@test_simplified_isequal differentiate(:(exp(-x)), :x) :(-exp(-x))
37+
@test_simplified_isequal differentiate(:(log(x^2)), :x) :((2x) * (1 / x^2))
38+
@test_simplified_isequal differentiate(:(abs2(x)), :x) :(2x)
39+
@test_simplified_isequal differentiate(:(inv(x)), :x) :(-abs2(inv(x)))
40+
@test_simplified_isequal differentiate(:(x^n), :x) :(*(n, ^(x, -(n, 1))))
41+
@test_simplified_isequal differentiate(:(n^x), :x) :(*(^(n, x), log(n)))
42+
@test_simplified_isequal differentiate(:(n^n), :x) 0
3743

3844
#
3945
# Multivariate Calculus
4046
#
4147

42-
@test isequal(differentiate(:(sin(x) + sin(y)), [:x, :y]), [:(cos(x)), :(cos(y))])
43-
@test isequal(differentiate(:(x^2), [:x, :y]), Any[:(2*x), 0])
48+
@test isequal(simplify.(differentiate(:(sin(x) + sin(y)), [:x, :y])), [:(cos(x)), :(cos(y))])
49+
@test isequal(simplify.(differentiate(:(x^2), [:x, :y])), Any[:(2*x), 0])
4450

4551
# TODO: Get the generalized power rule right.
4652
# @test isequal(differentiate(:(sin(x)^2), :x), :(2 * sin(x) * cos(x)))
@@ -50,7 +56,7 @@
5056
#
5157

5258
# @test isequal(differentiate("sin(x) + cos(x)^2"), :(+(cos(x),*(2,cos(x)))))
53-
@test isequal(differentiate("x + exp(-x) + sin(exp(x))", :x), :(+(1,-exp(-x),*(exp(x),cos(exp(x))))))
59+
@test_simplified_isequal differentiate("x + exp(-x) + sin(exp(x))", :x) :(+(1,-exp(-x),*(exp(x),cos(exp(x)))))
5460

5561
# TODO: Make these work
5662
# differentiate(:(sin(x)), :x)(0.0)
@@ -65,13 +71,13 @@ x = BasicVariable(:x)
6571
y = BasicVariable(:y)
6672

6773
@test isequal(@sexpr(x + y), :($x + $y))
68-
@test isequal(differentiate(@sexpr(3 * x), x), 3)
69-
@test isequal(differentiate(:(sin(sin(x))), :x), :(*(cos(x),cos(sin(x)))))
70-
@test isequal(differentiate(@sexpr(sin(sin(x))), x), :(*(cos($x),cos(sin($x)))))
74+
@test_simplified_isequal differentiate(@sexpr(3 * x), x) 3
75+
@test_simplified_isequal differentiate(:(sin(sin(x))), :x) :(*(cos(x),cos(sin(x))))
76+
@test_simplified_isequal differentiate(@sexpr(sin(sin(x))), x) :(*(cos($x),cos(sin($x))))
7177

7278
function testfun(x)
7379
z = BasicVariable(:z)
74-
differentiate(@sexpr(3*x + x^2*z), z)
80+
simplify(differentiate(@sexpr(3*x + x^2*z), z))
7581
end
7682

7783
@test isequal(testfun(x), :(^($(x),2)))
@@ -100,6 +106,5 @@ end
100106
#
101107
# Tests with ifelse
102108
#
103-
@test isequal(differentiate(:(ifelse(x < 1, exp(x^2), 1/x)), :x), :(ifelse(x < 1,2x * exp(x^2), -1/x^2)))
104-
@test isequal(differentiate(:(ifelse(x <= 0, 0, ifelse(x > 1, 1, x))), :x),
105-
:(ifelse(x <= 0, 0, ifelse(x > 1, 0, 1))))
109+
@test_simplified_isequal differentiate(:(ifelse(x < 1, exp(x^2), 1/x)), :x) :(ifelse(x < 1,2x * exp(x^2), -1/x^2))
110+
@test_simplified_isequal differentiate(:(ifelse(x <= 0, 0, ifelse(x > 1, 1, x))), :x) :(ifelse(x <= 0, 0, ifelse(x > 1, 0, 1)))

0 commit comments

Comments
 (0)