Skip to content

Commit 91e1d8f

Browse files
feat: initial implementation of new DiscreteSystem
1 parent 106a675 commit 91e1d8f

File tree

8 files changed

+577
-5
lines changed

8 files changed

+577
-5
lines changed

src/ModelingToolkit.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,8 @@ include("systems/diffeqs/first_order_transform.jl")
147147
include("systems/diffeqs/modelingtoolkitize.jl")
148148
include("systems/diffeqs/basic_transformations.jl")
149149

150+
include("systems/discrete_system/discrete_system.jl")
151+
150152
include("systems/jumps/jumpsystem.jl")
151153

152154
include("systems/optimization/constraints_system.jl")
@@ -209,6 +211,7 @@ export ODESystem,
209211
export DAEFunctionExpr, DAEProblemExpr
210212
export SDESystem, SDEFunction, SDEFunctionExpr, SDEProblemExpr
211213
export SystemStructure
214+
export DiscreteSystem, DiscreteProblem, DiscreteFunction, DiscreteFunctionExpr
212215
export JumpSystem
213216
export ODEProblem, SDEProblem
214217
export NonlinearFunction, NonlinearFunctionExpr

src/clock.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,3 +146,8 @@ Base.hash(c::SolverStepClock, seed::UInt) = seed ⊻ 0x953d7b9a18874b91
146146
function Base.:(==)(c1::SolverStepClock, c2::SolverStepClock)
147147
((c1.t === nothing || c2.t === nothing) || isequal(c1.t, c2.t))
148148
end
149+
150+
struct IntegerSequence <: AbstractClock
151+
t::Union{Nothing, Symbolic}
152+
IntegerSequence(t::Union{Num, Symbolic}) = new(value(t))
153+
end

src/discretedomain.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ struct Shift <: Operator
2828
Shift(t, steps = 1) = new(value(t), steps)
2929
end
3030
Shift(steps::Int) = new(nothing, steps)
31-
normalize_to_differential(s::Shift) = Differential(s.t)^s.steps
31+
normalize_to_differential(s::Shift) = Differential(s.t)^abs(s.steps)
3232
function (D::Shift)(x, allow_zero = false)
3333
!allow_zero && D.steps == 0 && return x
3434
Term{symtype(x)}(D, Any[x])
@@ -168,6 +168,7 @@ struct ShiftIndex
168168
steps::Int
169169
ShiftIndex(clock::TimeDomain = Inferred(), steps::Int = 0) = new(clock, steps)
170170
ShiftIndex(t::Num, dt::Real, steps::Int = 0) = new(Clock(t, dt), steps)
171+
ShiftIndex(t::Num, steps::Int = 0) = new(IntegerSequence(t), steps)
171172
end
172173

173174
function (xn::Num)(k::ShiftIndex)

src/systems/diffeqs/abstractodesystem.jl

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -812,7 +812,8 @@ function get_u0_p(sys,
812812
u0, p, defs
813813
end
814814

815-
function get_u0(sys, u0map, parammap = nothing; symbolic_u0 = false)
815+
function get_u0(
816+
sys, u0map, parammap = nothing; symbolic_u0 = false, toterm = default_toterm)
816817
dvs = unknowns(sys)
817818
ps = parameters(sys)
818819
defs = defaults(sys)
@@ -821,9 +822,10 @@ function get_u0(sys, u0map, parammap = nothing; symbolic_u0 = false)
821822
end
822823
defs = mergedefaults(defs, u0map, dvs)
823824
if symbolic_u0
824-
u0 = varmap_to_vars(u0map, dvs; defaults = defs, tofloat = false, use_union = false)
825+
u0 = varmap_to_vars(
826+
u0map, dvs; defaults = defs, tofloat = false, use_union = false, toterm)
825827
else
826-
u0 = varmap_to_vars(u0map, dvs; defaults = defs, tofloat = true)
828+
u0 = varmap_to_vars(u0map, dvs; defaults = defs, tofloat = true, toterm)
827829
end
828830
return u0, defs
829831
end

0 commit comments

Comments
 (0)