Skip to content

Commit c58c63e

Browse files
committed
Num <: Real
1 parent 02540be commit c58c63e

File tree

11 files changed

+54
-38
lines changed

11 files changed

+54
-38
lines changed

src/ModelingToolkit.jl

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,9 @@ export Num
4343
"""
4444
$(TYPEDEF)
4545
46-
Wrap anything in a type that is a subtype of Number
46+
Wrap anything in a type that is a subtype of Real
4747
"""
48-
struct Num <: Number
48+
struct Num <: Real
4949
val
5050
end
5151

@@ -106,9 +106,20 @@ macro num_method(f, expr, Ts=nothing)
106106
end |> esc
107107
end
108108

109-
@num_method Base.isless isless(value(a), value(b))
110-
@num_method Base.isequal isequal(value(a), value(b)) (Number, Symbolic)
111-
@num_method Base.:(==) value(a) == value(b) (Number,)
109+
"""
110+
tosymbolic(a::Union{Sym,Num}) -> Sym{Real}
111+
tosymbolic(a::T) -> T
112+
"""
113+
tosymbolic(a::Num) = tosymbolic(value(a))
114+
tosymbolic(a::Sym) = tovar(a)
115+
tosymbolic(a) = a
116+
@num_method Base.isless isless(tosymbolic(a), tosymbolic(b)) (Real,)
117+
@num_method Base.:(<) (tosymbolic(a) < tosymbolic(b)) (Real,)
118+
@num_method Base.:(<=) (tosymbolic(a) <= tosymbolic(b)) (Real,)
119+
@num_method Base.:(>) (tosymbolic(a) > tosymbolic(b)) (Real,)
120+
@num_method Base.:(>=) (tosymbolic(a) >= tosymbolic(b)) (Real,)
121+
@num_method Base.isequal isequal(tosymbolic(a), tosymbolic(b)) (Number, Symbolic)
122+
@num_method Base.:(==) tosymbolic(a) == tosymbolic(b) (Number,)
112123

113124
Base.hash(x::Num, h::UInt) = hash(value(x), h)
114125

@@ -120,13 +131,6 @@ Base.convert(::Type{<:Array{Num}}, x::AbstractArray) = map(Num, x)
120131
Base.convert(::Type{<:Array{Num}}, x::AbstractArray{Num}) = x
121132
Base.convert(::Type{Sym}, x::Num) = value(x) isa Sym ? value(x) : error("cannot convert $x to Sym")
122133

123-
#=
124-
# TODO: use register?
125-
Base.isless(n::Num, x::Number) = value(n) < value(x)
126-
Base.isless(n::Num, x::Num) = value(n) < value(x)
127-
Base.isless(n::Number, x::Num) = value(n) < value(x)
128-
=#
129-
130134
LinearAlgebra.lu(x::Array{Num}; kw...) = lu(x, Val{false}(); kw...)
131135

132136
"""

src/context_dsl.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,5 @@ $(SIGNATURES)
1515
Define one or more known variables.
1616
"""
1717
macro parameters(xs...)
18-
esc(_parse_vars(:parameters, Parameter{Number}, xs))
18+
esc(_parse_vars(:parameters, Parameter{Real}, xs))
1919
end

src/register_function.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
macro register(expr, Ts = [Num, Symbolic, Number])
1+
macro register(expr, Ts = [Num, Symbolic, Real])
22
@assert expr.head == :call
33

44
f = expr.args[1]
@@ -8,16 +8,16 @@ macro register(expr, Ts = [Num, Symbolic, Number])
88

99
types = vec(collect(Iterators.product(ntuple(_->Ts, length(symbolic_args))...)))
1010

11-
# remove Number Number Number methods
12-
filter!(Ts->!all(T->T == Number, Ts), types)
11+
# remove Real Real Real methods
12+
filter!(Ts->!all(T->T == Real, Ts), types)
1313

1414
annotype(name,T) = :($name :: $T)
1515
setinds(xs, idx, vs) = (xs=copy(xs); xs[idx] .= map(annotype, xs[idx], vs); xs)
1616
name(x::Symbol) = :($value($x))
1717
name(x::Expr) = ((@assert x.head == :(::)); :($value($(x.args[1]))))
1818

1919
Expr(:block,
20-
[:($f($(setinds(args, symbolic_args, ts)...)) = Term{Number}($f, [$(map(name, args)...)]))
20+
[:($f($(setinds(args, symbolic_args, ts)...)) = Term{Real}($f, [$(map(name, args)...)]))
2121
for ts in types]...) |> esc
2222
end
2323

src/systems/abstractsystem.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ function namespace_variables(sys::AbstractSystem)
169169
end
170170

171171
function namespace_parameters(sys::AbstractSystem)
172-
[makeparam(renamespace(sys.name,x)) for x in parameters(sys)]
172+
[toparam(renamespace(sys.name,x)) for x in parameters(sys)]
173173
end
174174

175175
function namespace_pins(sys::AbstractSystem)

src/systems/control/controlsystem.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ function runge_kutta_discretize(sys::ControlSystem,dt,tspan;
136136
L = @RuntimeGeneratedFunction(build_function(sys.loss,sys.states,sys.controls,sys.ps,sys.iv,conv = ModelingToolkit.ControlToExpr(sys)))
137137

138138
var(n, i...) = var(nameof(n), i...)
139-
var(n::Symbol, i...) = Sym{FnType{Tuple{symtype(sys.iv)}, Number}}(nameof(Variable(n, i...)))
139+
var(n::Symbol, i...) = Sym{FnType{Tuple{symtype(sys.iv)}, Real}}(nameof(Variable(n, i...)))
140140
# Expand out all of the variables in time and by stages
141141
timed_vars = [[var(x.op,i)(sys.iv) for i in 1:n+1] for x in states(sys)]
142142
k_vars = [[var(Symbol(:ᵏ,nameof(x.op)),i,j)(sys.iv) for i in 1:m, j in 1:n] for x in states(sys)]

src/systems/diffeqs/modelingtoolkitize.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ function modelingtoolkitize(prob::DiffEqBase.ODEProblem)
1414
p = prob.p
1515
end
1616

17-
var(x, i) = Sym{FnType{Tuple{symtype(t)}, Number}}(nameof(Variable(:x, i)))
17+
var(x, i) = Sym{FnType{Tuple{symtype(t)}, Real}}(nameof(Variable(:x, i)))
1818
vars = reshape([var(:x, i)(value(t)) for i in eachindex(prob.u0)],size(prob.u0))
1919
params = p isa DiffEqBase.NullParameters ? [] :
2020
reshape([Variable(,i) for i in eachindex(p)],size(p))
@@ -52,7 +52,7 @@ function modelingtoolkitize(prob::DiffEqBase.SDEProblem)
5252
else
5353
p = prob.p
5454
end
55-
var(x, i) = Sym{FnType{Tuple{symtype(t)}, Number}}(nameof(Variable(:x, i)))
55+
var(x, i) = Sym{FnType{Tuple{symtype(t)}, Real}}(nameof(Variable(:x, i)))
5656
vars = reshape([var(:x, i)(value(t)) for i in eachindex(prob.u0)],size(prob.u0))
5757
params = p isa DiffEqBase.NullParameters ? [] :
5858
reshape([Variable(,i) for i in eachindex(p)],size(p))

src/systems/diffeqs/validation.jl

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
Base.:*(x::Expression,y::Unitful.AbstractQuantity) = x * ModelingToolkit.Constant(y)
1+
Base.:*(x::Expression,y::Unitful.AbstractQuantity) = x * y
22

3-
instantiate(x::ModelingToolkit.Constant) = x.value
4-
instantiate(x::ModelingToolkit.Variable{Number}) = 1.0
3+
instantiate(x::ModelingToolkit.Variable{Real}) = 1.0
54
instantiate(x::ModelingToolkit.Variable) = oneunit(1*ModelingToolkit.vartype(x))
65
function instantiate(x::ModelingToolkit.Operation)
76
if x.op isa Variable

src/systems/reaction/reactionsystem.jl

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -380,9 +380,6 @@ function Base.convert(::Type{<:ODESystem}, rs::ReactionSystem; combinatoric_rate
380380
systems=convert.(ODESystem,rs.systems))
381381
end
382382

383-
makeparam(s::Sym) = Sym{Parameter{Number}}(s.name)
384-
makeparam(s::Sym{<:Parameter}) = s
385-
386383
"""
387384
```julia
388385
Base.convert(::Type{<:SDESystem},rs::ReactionSystem)
@@ -426,7 +423,7 @@ function Base.convert(::Type{<:SDESystem},rs::ReactionSystem, combinatoric_ratel
426423
rs.states,
427424
(noise_scaling===nothing) ?
428425
rs.ps :
429-
union(rs.ps,makeparam.(noise_scaling)),
426+
union(rs.ps,toparam.(noise_scaling)),
430427
name=rs.name,systems=convert.(SDESystem,rs.systems))
431428
end
432429

src/utils.jl

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,15 @@ end
3333

3434
function detime_dvs(op::Term)
3535
if op.op isa Sym
36-
Sym{Number}(nameof(op.op))
36+
Sym{Real}(nameof(op.op))
3737
else
3838
Term(op.op,detime_dvs.(op.args))
3939
end
4040
end
4141
detime_dvs(op) = op
4242

4343
function retime_dvs(op::Sym,dvs,iv)
44-
Sym{FnType{Tuple{symtype(iv)}, Number}}(nameof(op))(iv)
44+
Sym{FnType{Tuple{symtype(iv)}, Real}}(nameof(op))(iv)
4545
end
4646

4747
function retime_dvs(op::Term, dvs, iv)
@@ -143,3 +143,19 @@ function states_to_sym(states)
143143
end
144144
end
145145
end
146+
147+
"""
148+
toparam(s::Sym) -> Sym{<:Parameter}
149+
150+
Maps the variable to a paramter.
151+
"""
152+
toparam(s::Sym) = Sym{Parameter{symtype(s)}}(s.name)
153+
toparam(s::Sym{<:Parameter}) = s
154+
155+
"""
156+
tovar(s::Sym) -> Sym{Real}
157+
158+
Maps the variable to a variable (state).
159+
"""
160+
tovar(s::Sym{<:Parameter}) = Sym{symtype(s)}(s.name)
161+
tovar(s::Sym) = s

src/variables.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ expr = β₁ * x + y^α + σ(3) * (z - t) - β₂ * w(t - 1)
4949
struct Variable{T} <: Function
5050
"""The variable's unique name."""
5151
name::Symbol
52-
Variable(name) = Sym{Number}(name)
52+
Variable(name) = Sym{Real}(name)
5353
Variable{T}(name) where T = Sym{T}(name)
5454
function Variable{T}(name, indices...) where T
5555
var_name = Symbol("$(name)$(join(map_subscripts.(indices), "ˏ"))")
@@ -215,7 +215,7 @@ z
215215
```
216216
"""
217217
macro variables(xs...)
218-
esc(_parse_vars(:variables, Number, xs))
218+
esc(_parse_vars(:variables, Real, xs))
219219
end
220220

221221
"""

0 commit comments

Comments
 (0)