Skip to content

Commit 0176fef

Browse files
Merge pull request #788 from SciML/myb/set
Depwarn fixes
2 parents 152dfa1 + 66feeec commit 0176fef

16 files changed

+138
-91
lines changed

Project.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
name = "ModelingToolkit"
22
uuid = "961ee093-0014-501f-94e3-6117800e7a78"
33
authors = ["Chris Rackauckas <[email protected]>"]
4-
version = "5.6.1"
4+
version = "5.6.2"
55

66
[deps]
77
ArrayInterface = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9"
8+
ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9"
89
DataStructures = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8"
910
DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e"
1011
DiffEqJump = "c894b116-72e5-5b58-be3c-e6d8d4ac2b12"
@@ -37,6 +38,7 @@ Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"
3738

3839
[compat]
3940
ArrayInterface = "2.8, 3.0"
41+
ConstructionBase = "1"
4042
DataStructures = "0.17, 0.18"
4143
DiffEqBase = "6.54.0"
4244
DiffEqJump = "6.7.5"

src/ModelingToolkit.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ using StaticArrays, LinearAlgebra, SparseArrays, LabelledArrays
66
using Latexify, Unitful, ArrayInterface
77
using MacroTools
88
using UnPack: @unpack
9-
using Setfield
9+
using Setfield, ConstructionBase
1010
using DiffEqJump
1111
using DataStructures
1212
using SpecialFunctions, NaNMath

src/systems/abstractsystem.jl

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,11 @@ for prop in [
149149
:Wfact_t
150150
:systems
151151
:structure
152+
:op
153+
:equality_constraints
154+
:inequality_constraints
155+
:controls
156+
:loss
152157
]
153158
fname1 = Symbol(:get_, prop)
154159
fname2 = Symbol(:has_, prop)
@@ -158,6 +163,25 @@ for prop in [
158163
end
159164
end
160165

166+
Setfield.get(obj::AbstractSystem, l::Setfield.PropertyLens{field}) where {field} = getfield(obj, field)
167+
@generated function ConstructionBase.setproperties(obj::AbstractSystem, patch::NamedTuple)
168+
if issubset(fieldnames(patch), fieldnames(obj))
169+
args = map(fieldnames(obj)) do fn
170+
if fn in fieldnames(patch)
171+
:(patch.$fn)
172+
else
173+
:(getfield(obj, $(Meta.quot(fn))))
174+
end
175+
end
176+
return Expr(:block,
177+
Expr(:meta, :inline),
178+
Expr(:call,:(constructorof($obj)), args...)
179+
)
180+
else
181+
error("This should never happen. Trying to set $(typeof(obj)) with $patch.")
182+
end
183+
end
184+
161185
function Base.getproperty(sys::AbstractSystem, name::Symbol)
162186
sysname = nameof(sys)
163187
systems = get_systems(sys)

src/systems/control/controlsystem.jl

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
abstract type AbstractControlSystem <: AbstractSystem end
22

33
function namespace_controls(sys::AbstractSystem)
4-
[rename(x,renamespace(sys.name,x.name)) for x in controls(sys)]
4+
[rename(x,renamespace(nameof(sys),nameof(x))) for x in controls(sys)]
55
end
66

77
function controls(sys::AbstractControlSystem,args...)
88
name = last(args)
9-
extra_names = reduce(Symbol,[Symbol(:₊,x.name) for x in args[1:end-1]])
9+
extra_names = reduce(Symbol,[Symbol(:₊,nameof(x)) for x in args[1:end-1]])
1010
newname = renamespace(extra_names,name)
11-
rename(x,renamespace(sys.name,newname))(sys.iv())
11+
rename(x,renamespace(nameof(sys),newname))(get_iv(sys))
1212
end
1313

1414
function controls(sys::AbstractControlSystem,name::Symbol)
15-
x = sys.controls[findfirst(x->x.name==name,sys.ps)]
16-
rename(x,renamespace(sys.name,x.name))()
15+
x = get_controls(sys)[findfirst(x->nameof(x)==name,sys.ps)]
16+
rename(x,renamespace(nameof(sys),nameof(x)))
1717
end
1818

19-
controls(sys::AbstractControlSystem) = isempty(sys.systems) ? sys.controls : [sys.controls;reduce(vcat,namespace_controls.(sys.systems))]
19+
controls(sys::AbstractControlSystem) = isempty(get_systems(sys)) ? get_controls(sys) : [get_controls(sys);reduce(vcat,namespace_controls.(get_systems(sys)))]
2020

2121
"""
2222
$(TYPEDEF)
@@ -107,13 +107,13 @@ function (f::ControlToExpr)(O)
107107
!istree(O) && return O
108108
res = if isa(operation(O), Sym)
109109
# normal variables and control variables
110-
(any(isequal(O), f.states) || any(isequal(O), f.controls)) && return tosymbol(O)
110+
(any(isequal(O), f.states) || any(isequal(O), controls(f))) && return tosymbol(O)
111111
build_expr(:call, Any[operation(O).name; f.(arguments(O))])
112112
else
113113
build_expr(:call, Any[Symbol(operation(O)); f.(arguments(O))])
114114
end
115115
end
116-
(f::ControlToExpr)(x::Sym) = x.name
116+
(f::ControlToExpr)(x::Sym) = nameof(x)
117117

118118
function constructRadauIIA5(T::Type = Float64)
119119
sq6 = sqrt(convert(T, 6))
@@ -146,19 +146,24 @@ function runge_kutta_discretize(sys::ControlSystem,dt,tspan;
146146
n = length(tspan[1]:dt:tspan[2]) - 1
147147
m = length(tab.α)
148148

149-
f = @RuntimeGeneratedFunction(build_function([x.rhs for x in equations(sys)],sys.states,sys.controls,sys.ps,sys.iv,conv = ModelingToolkit.ControlToExpr(sys))[1])
150-
L = @RuntimeGeneratedFunction(build_function(sys.loss,sys.states,sys.controls,sys.ps,sys.iv,conv = ModelingToolkit.ControlToExpr(sys)))
149+
sts = states(sys)
150+
ctr = controls(sys)
151+
ps = parameters(sys)
152+
lo = get_loss(sys)
153+
iv = get_iv(sys)
154+
f = @RuntimeGeneratedFunction(build_function([x.rhs for x in equations(sys)],sts,ctr,ps,iv,conv = ModelingToolkit.ControlToExpr(sys))[1])
155+
L = @RuntimeGeneratedFunction(build_function(lo,sts,ctr,ps,iv,conv = ModelingToolkit.ControlToExpr(sys)))
151156

152157
var(n, i...) = var(nameof(n), i...)
153-
var(n::Symbol, i...) = Sym{FnType{Tuple{symtype(sys.iv)}, Real}}(nameof(Variable(n, i...)))
158+
var(n::Symbol, i...) = Sym{FnType{Tuple{symtype(iv)}, Real}}(nameof(Variable(n, i...)))
154159
# Expand out all of the variables in time and by stages
155-
timed_vars = [[var(operation(x),i)(sys.iv) for i in 1:n+1] for x in states(sys)]
156-
k_vars = [[var(Symbol(:ᵏ,nameof(operation(x))),i,j)(sys.iv) for i in 1:m, j in 1:n] for x in states(sys)]
160+
timed_vars = [[var(operation(x),i)(iv) for i in 1:n+1] for x in states(sys)]
161+
k_vars = [[var(Symbol(:ᵏ,nameof(operation(x))),i,j)(iv) for i in 1:m, j in 1:n] for x in states(sys)]
157162
states_timeseries = [getindex.(timed_vars,j) for j in 1:n+1]
158163
k_timeseries = [[Num.(getindex.(k_vars,i,j)) for i in 1:m] for j in 1:n]
159-
control_timeseries = [[[var(operation(x),i,j)(sys.iv) for x in controls(sys)] for i in 1:m] for j in 1:n]
164+
control_timeseries = [[[var(operation(x),i,j)(iv) for x in sts] for i in 1:m] for j in 1:n]
160165
ps = parameters(sys)
161-
iv = sys.iv
166+
iv = iv
162167

163168
# Calculate all of the update and stage equations
164169
mult = [tab.A * k_timeseries[i] for i in 1:n]

src/systems/diffeqs/abstractodesystem.jl

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -244,8 +244,13 @@ function process_DEProblem(constructor, sys::AbstractODESystem,u0map,parammap;
244244
kwargs...)
245245
dvs = states(sys)
246246
ps = parameters(sys)
247-
u0map′ = lower_mapnames(u0map,get_iv(sys))
248-
u0 = varmap_to_vars(u0map′,dvs; defaults=default_u0(sys))
247+
248+
if u0map !== nothing
249+
u0map′ = lower_mapnames(u0map,get_iv(sys))
250+
u0 = varmap_to_vars(u0map′,dvs; defaults=default_u0(sys))
251+
else
252+
u0 = nothing
253+
end
249254

250255
if !(parammap isa DiffEqBase.NullParameters)
251256
parammap′ = lower_mapnames(parammap)

src/systems/diffeqs/first_order_transform.jl

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@ Takes a Nth order ODESystem and returns a new ODESystem written in first order
55
form by defining new variables which represent the N-1 derivatives.
66
"""
77
function ode_order_lowering(sys::ODESystem)
8-
eqs_lowered, new_vars = ode_order_lowering(equations(sys), sys.iv, states(sys))
9-
return ODESystem(eqs_lowered, sys.iv, new_vars, sys.ps)
8+
iv = independent_variable(sys)
9+
eqs_lowered, new_vars = ode_order_lowering(equations(sys), iv, states(sys))
10+
return ODESystem(eqs_lowered, iv, new_vars, parameters(sys))
1011
end
1112

1213
function ode_order_lowering(eqs, iv, states)

src/systems/diffeqs/odesystem.jl

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -182,9 +182,15 @@ function collect_var!(states, parameters, var, iv)
182182
end
183183

184184
# NOTE: equality does not check cached Jacobian
185-
Base.:(==)(sys1::ODESystem, sys2::ODESystem) =
186-
_eq_unordered(sys1.eqs, sys2.eqs) && isequal(sys1.iv, sys2.iv) &&
187-
_eq_unordered(sys1.states, sys2.states) && _eq_unordered(sys1.ps, sys2.ps)
185+
function Base.:(==)(sys1::ODESystem, sys2::ODESystem)
186+
iv1 = independent_variable(sys1)
187+
iv2 = independent_variable(sys2)
188+
isequal(iv1, iv2) &&
189+
_eq_unordered(get_eqs(sys1), get_eqs(sys2)) &&
190+
_eq_unordered(get_states(sys1), get_states(sys2)) &&
191+
_eq_unordered(get_ps(sys1), get_ps(sys2)) &&
192+
all(s1 == s2 for (s1, s2) in zip(get_systems(sys1), get_systems(sys2)))
193+
end
188194

189195
function flatten(sys::ODESystem)
190196
systems = get_systems(sys)

src/systems/diffeqs/sdesystem.jl

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,10 @@ function SDESystem(deqs::AbstractVector{<:Equation}, neqs, iv, dvs, ps;
101101
end
102102

103103
function generate_diffusion_function(sys::SDESystem, dvs = states(sys), ps = parameters(sys); kwargs...)
104-
return build_function(sys.noiseeqs,
104+
return build_function(get_noiseeqs(sys),
105105
map(x->time_varying_as_func(value(x), sys), dvs),
106106
map(x->time_varying_as_func(value(x), sys), ps),
107-
sys.iv; kwargs...)
107+
independent_variable(sys); kwargs...)
108108
end
109109

110110
"""
@@ -114,36 +114,34 @@ Choose correction_factor=-1//2 (1//2) to converte Ito -> Stratonovich (Stratonov
114114
"""
115115
function stochastic_integral_transform(sys::SDESystem, correction_factor)
116116
# use the general interface
117-
if typeof(sys.noiseeqs) <: Vector
118-
eqs = vcat([sys.eqs[i].lhs ~ sys.noiseeqs[i] for i in eachindex(sys.states)]...)
119-
de = ODESystem(eqs,sys.iv,sys.states,sys.ps)
117+
if typeof(get_noiseeqs(sys)) <: Vector
118+
eqs = vcat([equations(sys)[i].lhs ~ get_noiseeqs(sys)[i] for i in eachindex(states(sys))]...)
119+
de = ODESystem(eqs,get_iv(sys),states(sys),parameters(sys))
120120

121121
jac = calculate_jacobian(de, sparse=false, simplify=false)
122-
∇σσ′ = simplify.(jac*sys.noiseeqs)
122+
∇σσ′ = simplify.(jac*get_noiseeqs(sys))
123123

124-
deqs = vcat([sys.eqs[i].lhs ~ sys.eqs[i].rhs+ correction_factor*∇σσ′[i] for i in eachindex(sys.states)]...)
124+
deqs = vcat([equations(sys)[i].lhs ~ equations(sys)[i].rhs+ correction_factor*∇σσ′[i] for i in eachindex(states(sys))]...)
125125
else
126-
dimstate, m = size(sys.noiseeqs)
127-
eqs = vcat([sys.eqs[i].lhs ~ sys.noiseeqs[i] for i in eachindex(sys.states)]...)
128-
de = ODESystem(eqs,sys.iv,sys.states,sys.ps)
126+
dimstate, m = size(get_noiseeqs(sys))
127+
eqs = vcat([equations(sys)[i].lhs ~ get_noiseeqs(sys)[i] for i in eachindex(states(sys))]...)
128+
de = ODESystem(eqs,get_iv(sys),states(sys),parameters(sys))
129129

130130
jac = calculate_jacobian(de, sparse=false, simplify=false)
131-
∇σσ′ = simplify.(jac*sys.noiseeqs[:,1])
131+
∇σσ′ = simplify.(jac*get_noiseeqs(sys)[:,1])
132132
for k = 2:m
133-
eqs = vcat([sys.eqs[i].lhs ~ sys.noiseeqs[Int(i+(k-1)*dimstate)] for i in eachindex(sys.states)]...)
134-
de = ODESystem(eqs,sys.iv,sys.states,sys.ps)
133+
eqs = vcat([equations(sys)[i].lhs ~ get_noiseeqs(sys)[Int(i+(k-1)*dimstate)] for i in eachindex(states(sys))]...)
134+
de = ODESystem(eqs,get_iv(sys),states(sys),parameters(sys))
135135

136136
jac = calculate_jacobian(de, sparse=false, simplify=false)
137-
∇σσ′ = ∇σσ′ + simplify.(jac*sys.noiseeqs[:,k])
137+
∇σσ′ = ∇σσ′ + simplify.(jac*get_noiseeqs(sys)[:,k])
138138
end
139139

140-
deqs = vcat([sys.eqs[i].lhs ~ sys.eqs[i].rhs + correction_factor*∇σσ′[i] for i in eachindex(sys.states)]...)
140+
deqs = vcat([equations(sys)[i].lhs ~ equations(sys)[i].rhs + correction_factor*∇σσ′[i] for i in eachindex(states(sys))]...)
141141
end
142142

143143

144-
de = SDESystem(deqs,sys.noiseeqs,sys.iv,sys.states,sys.ps)
145-
146-
de
144+
SDESystem(deqs,get_noiseeqs(sys),get_iv(sys),states(sys),parameters(sys))
147145
end
148146

149147

@@ -161,7 +159,7 @@ Create an `SDEFunction` from the [`SDESystem`](@ref). The arguments `dvs` and `p
161159
are used to set the order of the dependent variable and parameter vectors,
162160
respectively.
163161
"""
164-
function DiffEqBase.SDEFunction{iip}(sys::SDESystem, dvs = sys.states, ps = sys.ps,
162+
function DiffEqBase.SDEFunction{iip}(sys::SDESystem, dvs = states(sys), ps = parameters(sys),
165163
u0 = nothing;
166164
version = nothing, tgrad=false, sparse = false,
167165
jac = false, Wfact = false, eval_expression = true, kwargs...) where {iip}
@@ -215,7 +213,7 @@ function DiffEqBase.SDEFunction{iip}(sys::SDESystem, dvs = sys.states, ps = sys.
215213
Wfact = _Wfact === nothing ? nothing : _Wfact,
216214
Wfact_t = _Wfact_t === nothing ? nothing : _Wfact_t,
217215
mass_matrix = _M,
218-
syms = Symbol.(sys.states))
216+
syms = Symbol.(states(sys)))
219217
end
220218

221219
function DiffEqBase.SDEFunction(sys::SDESystem, args...; kwargs...)
@@ -287,7 +285,7 @@ function SDEFunctionExpr{iip}(sys::SDESystem, dvs = states(sys),
287285
Wfact = Wfact,
288286
Wfact_t = Wfact_t,
289287
mass_matrix = M,
290-
syms = $(Symbol.(states(sys))),kwargs...)
288+
syms = $(Symbol.(states(sys))))
291289
end
292290
!linenumbers ? striplines(ex) : ex
293291
end
@@ -322,13 +320,14 @@ function DiffEqBase.SDEProblem{iip}(sys::SDESystem,u0map,tspan,parammap=DiffEqBa
322320
f, u0, p = process_DEProblem(SDEFunction{iip}, sys, u0map, parammap; kwargs...)
323321
sparsenoise === nothing && (sparsenoise = get(kwargs, :sparse, false))
324322

325-
if typeof(sys.noiseeqs) <: AbstractVector
323+
noiseeqs = get_noiseeqs(sys)
324+
if noiseeqs isa AbstractVector
326325
noise_rate_prototype = nothing
327326
elseif sparsenoise
328-
I,J,V = findnz(SparseArrays.sparse(sys.noiseeqs))
327+
I,J,V = findnz(SparseArrays.sparse(noiseeqs))
329328
noise_rate_prototype = SparseArrays.sparse(I,J,zero(eltype(u0)))
330329
else
331-
noise_rate_prototype = zeros(eltype(u0),size(sys.noiseeqs))
330+
noise_rate_prototype = zeros(eltype(u0),size(noiseeqs))
332331
end
333332

334333
SDEProblem{iip}(f,f.g,u0,tspan,p;noise_rate_prototype=noise_rate_prototype,kwargs...)
@@ -363,13 +362,15 @@ function SDEProblemExpr{iip}(sys::SDESystem,u0map,tspan,
363362
linenumbers = get(kwargs, :linenumbers, true)
364363
sparsenoise === nothing && (sparsenoise = get(kwargs, :sparse, false))
365364

366-
if typeof(sys.noiseeqs) <: AbstractVector
365+
noiseeqs = get_noiseeqs(sys)
366+
if noiseeqs isa AbstractVector
367367
noise_rate_prototype = nothing
368368
elseif sparsenoise
369-
I,J,V = findnz(SparseArrays.sparse(sys.noiseeqs))
369+
I,J,V = findnz(SparseArrays.sparse(noiseeqs))
370370
noise_rate_prototype = SparseArrays.sparse(I,J,zero(eltype(u0)))
371371
else
372-
noise_rate_prototype = zeros(eltype(u0),size(sys.noiseeqs))
372+
T = u0 === nothing ? Float64 : eltype(u0)
373+
noise_rate_prototype = zeros(T,size(get_noiseeqs(sys)))
373374
end
374375
ex = quote
375376
f = $f

src/systems/optimization/optimizationsystem.jl

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,11 +98,10 @@ function generate_function(sys::OptimizationSystem, vs = states(sys), ps = param
9898
conv = AbstractSysToExpr(sys),kwargs...)
9999
end
100100

101-
equations(sys::OptimizationSystem) = isempty(sys.systems) ? sys.op : sys.op + reduce(+,namespace_expr.(sys.systems))
102-
namespace_expr(sys::OptimizationSystem) = namespace_expr(sys.op,sys.name,nothing)
101+
equations(sys::OptimizationSystem) = isempty(get_systems(sys)) ? get_op(sys) : get_op(sys) + reduce(+,namespace_expr.(get_systems(sys)))
102+
namespace_expr(sys::OptimizationSystem) = namespace_expr(get_op(sys),nameof(sys),nothing)
103103

104-
hessian_sparsity(sys::OptimizationSystem) =
105-
hessian_sparsity(sys.op, states(sys))
104+
hessian_sparsity(sys::OptimizationSystem) = hessian_sparsity(get_op(sys), states(sys))
106105

107106
struct AutoModelingToolkit <: DiffEqBase.AbstractADType end
108107

src/systems/reaction/reactionsystem.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -446,7 +446,7 @@ function Base.convert(::Type{<:SDESystem},rs::ReactionSystem, combinatoric_ratel
446446
(noise_scaling===nothing) ?
447447
get_ps(rs) :
448448
union(get_ps(rs),toparam.(noise_scaling)),
449-
name=rs.name,systems=convert.(SDESystem,get_systems(rs)))
449+
name=nameof(rs),systems=convert.(SDESystem,get_systems(rs)))
450450
end
451451

452452
"""

0 commit comments

Comments
 (0)