Skip to content

Commit 58e7f7e

Browse files
Complete file re-org.
1 parent 0936112 commit 58e7f7e

File tree

3 files changed

+60
-96
lines changed

3 files changed

+60
-96
lines changed

src/Calculus.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ module Calculus
5656
include("derivative.jl")
5757
include("check_derivative.jl")
5858
include("integrate.jl")
59-
include("abstractsymbolic.jl")
60-
include("chainrule.jl")
59+
include("symbolic.jl")
60+
include("differentiate.jl")
6161
include("deparse.jl")
6262
end

src/differentiate.jl

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,33 @@
11

2-
export chainRule
2+
export differentiate
33

44
#################################################################
55
#
6-
# chainRule for differentiation
7-
# based on this code, I think by Miles Lubin:
6+
# differentiate()
7+
# based on John's differentiate and this code, I think by Miles Lubin:
88
# https://github.com/IainNZ/NLTester/blob/master/julia/nlp.jl#L74
99
#
1010
#################################################################
1111

12-
chainRule(ex::SymbolicVariable, wrt::SymbolicVariable) = (ex == wrt) ? 1 : 0
12+
differentiate(ex::SymbolicVariable, wrt::SymbolicVariable) = (ex == wrt) ? 1 : 0
1313

14-
chainRule(ex::Number, wrt::SymbolicVariable) = 0
14+
differentiate(ex::Number, wrt::SymbolicVariable) = 0
1515

16-
function chainRule(ex::Expr,wrt)
16+
function differentiate(ex::Expr,wrt)
1717
if ex.head != :call
1818
error("Unrecognized expression $ex")
1919
end
20-
simplify(chainRule(SymbolParameter(ex.args[1]), ex.args[2:end], wrt))
20+
simplify(differentiate(SymbolParameter(ex.args[1]), ex.args[2:end], wrt))
2121
end
2222

23-
chainRule{T}(x::SymbolParameter{T}, args, wrt) = error("Derivative of function " * string(T) * " not supported")
23+
differentiate{T}(x::SymbolParameter{T}, args, wrt) = error("Derivative of function " * string(T) * " not supported")
2424

2525
# The Power Rule:
26-
function chainRule(::SymbolParameter{:^}, args, wrt)
26+
function differentiate(::SymbolParameter{:^}, args, wrt)
2727
x = args[1]
2828
y = args[2]
29-
xp = chainRule(x, wrt)
30-
yp = chainRule(y, wrt)
29+
xp = differentiate(x, wrt)
30+
yp = differentiate(y, wrt)
3131
if xp == 0 && yp == 0
3232
return 0
3333
elseif xp != 0 && yp == 0
@@ -37,10 +37,10 @@ function chainRule(::SymbolParameter{:^}, args, wrt)
3737
end
3838
end
3939

40-
function chainRule(::SymbolParameter{:+}, args, wrt)
40+
function differentiate(::SymbolParameter{:+}, args, wrt)
4141
termdiffs = {:+}
4242
for y in args
43-
x = chainRule(y, wrt)
43+
x = differentiate(y, wrt)
4444
if x != 0
4545
push!(termdiffs, x)
4646
end
@@ -54,13 +54,13 @@ function chainRule(::SymbolParameter{:+}, args, wrt)
5454
end
5555
end
5656

57-
function chainRule(::SymbolParameter{:-}, args, wrt)
57+
function differentiate(::SymbolParameter{:-}, args, wrt)
5858
termdiffs = {:-}
5959
# first term is special, can't be dropped
60-
term1 = chainRule(args[1], wrt)
60+
term1 = differentiate(args[1], wrt)
6161
push!(termdiffs, term1)
6262
for y in args[2:end]
63-
x = chainRule(y, wrt)
63+
x = differentiate(y, wrt)
6464
if x != 0
6565
push!(termdiffs, x)
6666
end
@@ -78,14 +78,14 @@ end
7878
# The Product Rule
7979
# d/dx (f * g) = (d/dx f) * g + f * (d/dx g)
8080
# d/dx (f * g * h) = (d/dx f) * g * h + f * (d/dx g) * h + ...
81-
function chainRule(::SymbolParameter{:*}, args, wrt)
81+
function differentiate(::SymbolParameter{:*}, args, wrt)
8282
n = length(args)
8383
res_args = Array(Any, n)
8484
for i in 1:n
8585
new_args = Array(Any, n)
8686
for j in 1:n
8787
if j == i
88-
new_args[j] = chainRule(args[j], wrt)
88+
new_args[j] = differentiate(args[j], wrt)
8989
else
9090
new_args[j] = args[j]
9191
end
@@ -97,11 +97,11 @@ end
9797

9898
# The Quotient Rule
9999
# d/dx (f / g) = ((d/dx f) * g - f * (d/dx g)) / g^2
100-
function chainRule(::SymbolParameter{:/}, args, wrt)
100+
function differentiate(::SymbolParameter{:/}, args, wrt)
101101
x = args[1]
102102
y = args[2]
103-
xp = chainRule(x, wrt)
104-
yp = chainRule(y, wrt)
103+
xp = differentiate(x, wrt)
104+
yp = differentiate(y, wrt)
105105
if xp == 0 && yp == 0
106106
return 0
107107
elseif xp == 0
@@ -145,9 +145,9 @@ derivative_rules = [
145145
]
146146

147147
for (funsym, exp) in derivative_rules
148-
@eval function chainRule(::SymbolParameter{$(Meta.quot(funsym))}, args, wrt)
148+
@eval function differentiate(::SymbolParameter{$(Meta.quot(funsym))}, args, wrt)
149149
x = args[1]
150-
xp = chainRule(x, wrt)
150+
xp = differentiate(x, wrt)
151151
if x != 0
152152
return @sexpr($exp)
153153
else

test/symbolic.jl

Lines changed: 35 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,21 @@
1414
@assert isequal(differentiate(:(a * x ^ 2), :x), :(a * (2 * x)))
1515
@assert isequal(differentiate(:(2 ^ x), :x), :(*(^(2, x), 0.6931471805599453)))
1616
@assert isequal(differentiate(:(sin(x)), :x), :(cos(x)))
17-
@assert isequal(differentiate(:(cos(x)), :x), :(-sin(x)))
17+
@assert isequal(differentiate(:(cos(x)), :x), :(*(-1,sin(x)))) # needs a better simplify
1818
@assert isequal(differentiate(:(tan(x)), :x), :(1 + tan(x)^2))
1919
@assert isequal(differentiate(:(exp(x)), :x), :(exp(x)))
2020
@assert isequal(differentiate(:(log(x)), :x), :(1 / x))
2121
@assert isequal(differentiate(:(sin(x) + sin(x)), :x), :(cos(x) + cos(x)))
22-
@assert isequal(differentiate(:(sin(x) - cos(x)), :x), :(cos(x) - (-sin(x)))) # Simplify -(a, -(b)) => +(a, b)
22+
@assert isequal(differentiate(:(sin(x) - cos(x)), :x), :(-(cos(x),*(-1,sin(x))))) # Simplify -(a, -(b)) => +(a, b)
2323
@assert isequal(differentiate(:(x * sin(x)), :x), :(sin(x) + x * cos(x)))
2424
@assert isequal(differentiate(:(x / sin(x)), :x), :((sin(x) - x * cos(x)) / (sin(x)^2)))
25-
@assert isequal(differentiate(:(sin(sin(x))), :x), :(*(cos(sin(x)),cos(x))))
26-
@assert isequal(differentiate(:(sin(cos(x) + sin(x))), :x), :(*(cos(+(cos(x),sin(x))),+(-(sin(x)),cos(x))))) # Clean this up
27-
@assert isequal(differentiate(:(exp(-x)), :x), :(exp(-x) * -1)) # Simplify this to -(exp(-x))
28-
@assert isequal(differentiate(:(log(x^2)), :x), :(*(/(1,^(x,2)),*(2,x)))) # Clean this up
25+
@assert isequal(differentiate(:(sin(sin(x))), :x), :(*(cos(x),cos(sin(x)))))
26+
@assert isequal(differentiate(:(sin(cos(x) + sin(x))), :x), :(*(+(*(-1,sin(x)),cos(x)),cos(+(cos(x),sin(x)))))) # Clean this up
27+
@assert isequal(differentiate(:(exp(-x)), :x), :(*(-1,exp(-(x))))) # Simplify this to -(exp(-x))
28+
@assert isequal(differentiate(:(log(x^2)), :x), :(/(*(2,x),^(x,2))))
2929
@assert isequal(differentiate(:(x^n), :x), :(*(n, ^(x, -(n, 1)))))
3030
@assert isequal(differentiate(:(n^x), :x), :(*(^(n, x), log(n))))
31-
@assert isequal(differentiate(:(n^n), :x), :(^(n,n)))
31+
@assert isequal(differentiate(:(n^n), :x), 0)
3232

3333
#
3434
# Multivariate Calculus
@@ -63,75 +63,39 @@ y = BasicVariable(:y)
6363
@assert isequal(differentiate(:(sin(sin(x))), :x), :(*(cos(sin(x)),cos(x))))
6464
@assert isequal(differentiate(@sexpr(sin(sin(x))), x), :(*(cos(sin($x)),cos($x))))
6565

66-
#
67-
# Chain rule
68-
#
69-
70-
@assert isequal(chainRule(@sexpr(3 * x), x), :(1*3))
71-
@assert isequal(chainRule(:(sin(sin(x))), :x), :(*(*(1,cos(x)),cos(sin(x)))))
72-
@assert isequal(chainRule(@sexpr(sin(sin(x))), x), :(*(*(1,cos($(x))),cos(sin($(x))))))
73-
7466
function testfun(x)
7567
z = BasicVariable(:z)
76-
chainRule(@sexpr(3*x + x^2*z), z)
68+
differentiate(@sexpr(3*x + x^2*z), z)
7769
end
7870

7971
@assert isequal(testfun(x), :(*(1,^($(x),2))))
8072
@assert isequal(testfun(3), :(*(1,^(3,2))))
8173
@assert isequal(testfun(@sexpr(x+y)), :(*(1,^(+($(x),$(y)),2))))
8274

83-
@assert isequal(chainRule(:(2), :x), 0)
84-
@assert isequal(chainRule(:(x), :x), 1)
85-
@assert isequal(chainRule(:(x + x), :x), 2)
86-
@assert isequal(chainRule(:(x - x), :x), 0)
87-
@assert isequal(chainRule(:(2 * x), :x), 2)
88-
@assert isequal(chainRule(:(x * 2), :x), 2)
89-
@assert isequal(chainRule(:(a * x), :x), :a)
90-
@assert isequal(chainRule(:(x * a), :x), :a)
91-
@assert isequal(chainRule(:(x ^ 2), :x), :(2 * x))
92-
@assert isequal(chainRule(:(a * x ^ 2), :x), :(a * (2 * x)))
93-
@assert isequal(chainRule(:(2 ^ x), :x), :(*(^(2, x), 0.6931471805599453)))
94-
@assert isequal(chainRule(:(sin(x)), :x), :(cos(x)))
95-
@assert isequal(chainRule(:(cos(x)), :x), :(-sin(x)))
96-
@assert isequal(chainRule(:(tan(x)), :x), :(1 + tan(x)^2))
97-
@assert isequal(chainRule(:(exp(x)), :x), :(exp(x)))
98-
@assert isequal(chainRule(:(log(x)), :x), :(1 / x))
99-
@assert isequal(chainRule(:(sin(x) + sin(x)), :x), :(cos(x) + cos(x)))
100-
@assert isequal(chainRule(:(sin(x) - cos(x)), :x), :(cos(x) - (-sin(x)))) # Simplify -(a, -(b)) => +(a, b)
101-
@assert isequal(chainRule(:(x * sin(x)), :x), :(sin(x) + x * cos(x)))
102-
@assert isequal(chainRule(:(x / sin(x)), :x), :((sin(x) - x * cos(x)) / (sin(x)^2)))
103-
@assert isequal(chainRule(:(sin(sin(x))), :x), :(*(cos(sin(x)),cos(x))))
104-
@assert isequal(chainRule(:(sin(cos(x) + sin(x))), :x), :(*(cos(+(cos(x),sin(x))),+(-(sin(x)),cos(x))))) # Clean this up
105-
@assert isequal(chainRule(:(exp(-x)), :x), :(exp(-x) * -1)) # Simplify this to -(exp(-x))
106-
@assert isequal(chainRule(:(log(x^2)), :x), :(*(/(1,^(x,2)),*(2,x)))) # Clean this up
107-
@assert isequal(chainRule(:(x^n), :x), :(*(n, ^(x, -(n, 1)))))
108-
@assert isequal(chainRule(:(n^x), :x), :(*(^(n, x), log(n))))
109-
@assert isequal(chainRule(:(n^n), :x), 0)
110-
111-
chainRule(:(2), :x)
112-
chainRule(:(x), :x)
113-
chainRule(:(x + x), :x)
114-
chainRule(:(x - x), :x)
115-
chainRule(:(2 * x), :x)
116-
chainRule(:(x * 2), :x)
117-
chainRule(:(a * x), :x)
118-
chainRule(:(x * a), :x)
119-
chainRule(:(x ^ 2), :x)
120-
chainRule(:(a * x ^ 2), :x)
121-
chainRule(:(2 ^ x), :x)
122-
chainRule(:(sin(x)), :x)
123-
chainRule(:(cos(x)), :x)
124-
chainRule(:(tan(x)), :x)
125-
chainRule(:(exp(x)), :x)
126-
chainRule(:(log(x)), :x)
127-
chainRule(:(sin(x) + sin(x)), :x)
128-
chainRule(:(sin(x) - cos(x)), :x)
129-
chainRule(:(x * sin(x)), :x)
130-
chainRule(:(x / sin(x)), :x)
131-
chainRule(:(sin(sin(x))), :x)
132-
chainRule(:(sin(cos(x) + sin(x))), :x)
133-
chainRule(:(exp(-x)), :x)
134-
chainRule(:(log(x^2)), :x)
135-
chainRule(:(x^n), :x)
136-
chainRule(:(n^x), :x)
137-
chainRule(:(n^n), :x)
75+
differentiate(:(2), :x)
76+
differentiate(:(x), :x)
77+
differentiate(:(x + x), :x)
78+
differentiate(:(x - x), :x)
79+
differentiate(:(2 * x), :x)
80+
differentiate(:(x * 2), :x)
81+
differentiate(:(a * x), :x)
82+
differentiate(:(x * a), :x)
83+
differentiate(:(x ^ 2), :x)
84+
differentiate(:(a * x ^ 2), :x)
85+
differentiate(:(2 ^ x), :x)
86+
differentiate(:(sin(x)), :x)
87+
differentiate(:(cos(x)), :x)
88+
differentiate(:(tan(x)), :x)
89+
differentiate(:(exp(x)), :x)
90+
differentiate(:(log(x)), :x)
91+
differentiate(:(sin(x) + sin(x)), :x)
92+
differentiate(:(sin(x) - cos(x)), :x)
93+
differentiate(:(x * sin(x)), :x)
94+
differentiate(:(x / sin(x)), :x)
95+
differentiate(:(sin(sin(x))), :x)
96+
differentiate(:(sin(cos(x) + sin(x))), :x)
97+
differentiate(:(exp(-x)), :x)
98+
differentiate(:(log(x^2)), :x)
99+
differentiate(:(x^n), :x)
100+
differentiate(:(n^x), :x)
101+
differentiate(:(n^n), :x)

0 commit comments

Comments
 (0)