Skip to content

Commit 195d6a5

Browse files
authored
Merge pull request #697 from SciML/myb/diff
Add special rules for max and min
2 parents a9275a0 + 7f5e0ab commit 195d6a5

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

src/differentials.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ derivative(f, args, v) = NoDeriv()
197197
# Pre-defined derivatives
198198
import DiffRules
199199
for (modu, fun, arity) DiffRules.diffrules()
200-
fun in [:*, :+, :abs] && continue # special
200+
fun in [:*, :+, :abs, :mod, :rem, :max, :min] && continue # special
201201
for i 1:arity
202202

203203
expr = if arity == 1

src/extra_functions.jl

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,23 @@
44

55
@register Base.signbit(x)
66
ModelingToolkit.derivative(::typeof(signbit), args::NTuple{1,Any}, ::Val{1}) = 0
7-
87
ModelingToolkit.derivative(::typeof(abs), args::NTuple{1,Any}, ::Val{1}) = IfElse.ifelse(signbit(args[1]),-one(args[1]),one(args[1]))
8+
function ModelingToolkit.derivative(::typeof(min), args::NTuple{2,Any}, ::Val{1})
9+
x, y = args
10+
IfElse.ifelse(x < y, one(x), zero(x))
11+
end
12+
function ModelingToolkit.derivative(::typeof(min), args::NTuple{2,Any}, ::Val{2})
13+
x, y = args
14+
IfElse.ifelse(x < y, zero(y), one(y))
15+
end
16+
function ModelingToolkit.derivative(::typeof(max), args::NTuple{2,Any}, ::Val{1})
17+
x, y = args
18+
IfElse.ifelse(x > y, one(x), zero(x))
19+
end
20+
function ModelingToolkit.derivative(::typeof(max), args::NTuple{2,Any}, ::Val{2})
21+
x, y = args
22+
IfElse.ifelse(x > y, zero(y), one(y))
23+
end
924

1025
@register IfElse.ifelse(x,y,z::Any)
1126
ModelingToolkit.derivative(::typeof(IfElse.ifelse), args::NTuple{3,Any}, ::Val{1}) = 0

0 commit comments

Comments
 (0)