Skip to content

Commit 42f89ba

Browse files
Merge pull request #568 from SciML/ifelse_abs
Handle conditionals and abs
2 parents 597cfd2 + fe8f882 commit 42f89ba

File tree

5 files changed

+18
-9
lines changed

5 files changed

+18
-9
lines changed

Project.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ DiffRules = "b552c78f-8df3-52c6-915a-8e097449b14b"
1212
Distributed = "8ba89e20-285c-5b6f-9357-94700520ee1b"
1313
DocStringExtensions = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae"
1414
GeneralizedGenerated = "6b9d7cbe-bcb9-11e9-073f-15a7a543e2eb"
15+
IfElse = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173"
1516
LabelledArrays = "2ee39098-c373-598a-b85f-a56591580800"
1617
Latexify = "23fbe1c1-3f47-55db-b15f-69d7ec21a316"
1718
Libdl = "8f399da3-3557-5675-b5ff-fb832c97cbdb"

src/ModelingToolkit.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import GeneralizedGenerated
1414
import Libdl
1515
using DocStringExtensions
1616
using Base: RefValue
17+
import IfElse
1718

1819
using RecursiveArrayTools
1920

@@ -123,6 +124,7 @@ include("systems/reduction.jl")
123124

124125
include("latexify_recipes.jl")
125126
include("build_function.jl")
127+
include("extra_functions.jl")
126128

127129
export ODESystem, ODEFunction, ODEFunctionExpr, ODEProblemExpr
128130
export SDESystem, SDEFunction, SDEFunctionExpr, SDESystemExpr

src/differentials.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ derivative(O::Constant, ::Any) = Constant(0)
180180
# Pre-defined derivatives
181181
import DiffRules
182182
for (modu, fun, arity) DiffRules.diffrules()
183-
fun in [:*, :+] && continue # special
183+
fun in [:*, :+, :abs] && continue # special
184184
for i 1:arity
185185

186186
expr = if arity == 1

src/extra_functions.jl

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
@register Base.conj(x)
2+
@register Base.getindex(x,i)
3+
@register Base.binomial(n,k)
4+
@register Base.copysign(x,y)
5+
6+
@register Base.signbit(x)
7+
ModelingToolkit.derivative(::typeof(signbit), args::NTuple{1,Any}, ::Val{1}) = 0
8+
9+
ModelingToolkit.derivative(::typeof(abs), args::NTuple{1,Any}, ::Val{1}) = IfElse.ifelse(signbit(args[1]),-one(args[1]),one(args[1]))
10+
11+
@register IfElse.ifelse(x,y,z)
12+
ModelingToolkit.derivative(::typeof(IfElse.ifelse), args::NTuple{3,Any}, ::Val{1}) = 0
13+
ModelingToolkit.derivative(::typeof(IfElse.ifelse), args::NTuple{3,Any}, ::Val{2}) = IfElse.ifelse(args[1],1,0)
14+
ModelingToolkit.derivative(::typeof(IfElse.ifelse), args::NTuple{3,Any}, ::Val{3}) = IfElse.ifelse(args[1],0,1)

src/function_registration.jl

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -99,18 +99,10 @@ for fun ∈ [:<, :>, :(==), :&, :|, :div]
9999
@eval @register $sig
100100
end
101101

102-
# ifelse
103-
#@register Base.ifelse(cond,t,f)
104-
105102
# special cases
106103
Base.:^(x::Expression,y::T) where T <: Integer = Operation(Base.:^, Expression[x, y])
107104
Base.:^(x::Expression,y::T) where T <: Rational = Operation(Base.:^, Expression[x, y])
108105

109-
@register Base.conj(x)
110-
@register Base.getindex(x,i)
111-
@register Base.binomial(n,k)
112-
@register Base.copysign(x,y)
113-
114106
Base.getindex(x::Operation,i::Int64) = Operation(getindex,[x,i])
115107
Base.one(::Operation) = 1
116108

0 commit comments

Comments
 (0)