Skip to content

Commit 2faa051

Browse files
Merge pull request #240 from JuliaDiffEq/myb/const
Add diff rule on constants
2 parents 2473af1 + 1423a4a commit 2faa051

File tree

4 files changed

+14
-7
lines changed

4 files changed

+14
-7
lines changed

Project.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "ModelingToolkit"
22
uuid = "961ee093-0014-501f-94e3-6117800e7a78"
33
authors = ["Chris Rackauckas <[email protected]>"]
4-
version = "1.2.3"
4+
version = "1.2.4"
55

66
[deps]
77
DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e"

src/differentials.jl

+1
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ sin(x())
9595
```
9696
"""
9797
derivative(O::Operation, idx) = derivative(O.op, (O.args...,), Val(idx))
98+
derivative(O::Constant, ::Any) = Constant(0)
9899

99100
# Pre-defined derivatives
100101
import DiffRules, SpecialFunctions, NaNMath

src/direct.jl

+4-6
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
function gradient(O::Operation, vars::AbstractVector{Operation}; simplify = true)
1+
function gradient(O::Expression, vars::AbstractVector{<:Expression}; simplify = true)
22
out = [expand_derivatives(Differential(v)(O)) for v in vars]
33
simplify ? simplify_constants.(out) : out
44
end
55

6-
function jacobian(ops::AbstractVector{Operation}, vars::AbstractVector{Operation}; simplify = true)
6+
function jacobian(ops::AbstractVector{<:Expression}, vars::AbstractVector{<:Expression}; simplify = true)
77
out = [expand_derivatives(Differential(v)(O)) for O in ops, v in vars]
88
simplify ? simplify_constants.(out) : out
99
end
1010

11-
function hessian(O::Operation, vars::AbstractVector{Operation}; simplify = true)
11+
function hessian(O::Expression, vars::AbstractVector{<:Expression}; simplify = true)
1212
out = [expand_derivatives(Differential(v2)(Differential(v1)(O))) for v1 in vars, v2 in vars]
1313
simplify ? simplify_constants.(out) : out
1414
end
@@ -25,9 +25,7 @@ function simplified_expr(O::Operation)
2525
return Expr(:call, Symbol(O.op), simplified_expr.(O.args)...)
2626
end
2727

28-
function simplified_expr(c::Constant)
29-
c.value
30-
end
28+
simplified_expr(c::Constant) = c.value
3129

3230
function simplified_expr(eq::Equation)
3331
Expr(:(=), simplified_expr(eq.lhs), simplified_expr(eq.rhs))

test/derivatives.jl

+8
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,11 @@ jac = calculate_jacobian(sys)
6464
# n-ary * and +
6565
isequal(ModelingToolkit.derivative(Operation(*, [x, y, z*ρ]), 1), y*(z*ρ))
6666
isequal(ModelingToolkit.derivative(Operation(+, [x*y, y, z]), 1), 1)
67+
68+
@test iszero(ModelingToolkit.derivative(ModelingToolkit.Constant(42), x))
69+
@test all(iszero, ModelingToolkit.gradient(ModelingToolkit.Constant(42), [t, x, y, z]))
70+
@test all(iszero, ModelingToolkit.hessian(ModelingToolkit.Constant(42), [t, x, y, z]))
71+
@test isequal(ModelingToolkit.jacobian([t, x, ModelingToolkit.Constant(42)], [t, x]),
72+
Expression[ModelingToolkit.Constant(1) ModelingToolkit.Constant(0)
73+
Differential(t)(x) ModelingToolkit.Constant(1)
74+
ModelingToolkit.Constant(0) ModelingToolkit.Constant(0)])

0 commit comments

Comments
 (0)