Skip to content

Commit e6ce6ab

Browse files
committed
Rename MutatingFunctionalAffect to ImperativeAffect
1 parent 3fd4462 commit e6ce6ab

File tree

3 files changed

+83
-83
lines changed

3 files changed

+83
-83
lines changed

src/systems/callbacks.jl

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,9 @@ function namespace_affect(affect::FunctionalAffect, s)
7272
end
7373

7474
"""
75-
MutatingFunctionalAffect(f::Function; modified::NamedTuple, observed::NamedTuple, ctx)
75+
ImperativeAffect(f::Function; modified::NamedTuple, observed::NamedTuple, ctx)
7676
77-
`MutatingFunctionalAffect` is a helper for writing affect functions that will compute observed values and
77+
`ImperativeAffect` is a helper for writing affect functions that will compute observed values and
7878
ensure that modified values are correctly written back into the system. The affect function `f` needs to have
7979
one of four signatures:
8080
* `f(modified::NamedTuple)::NamedTuple` if the function only writes values (unknowns or parameters) to the system,
@@ -93,15 +93,15 @@ then the NamedTuple `(;x=2)` will be passed as `observed` to the affect function
9393
9494
The NamedTuple returned from `f` includes the values to be written back to the system after `f` returns. For example, if we want to update the value of `x` to be the result of `x + y` we could write
9595
96-
MutatingFunctionalAffect(observed=(; x_plus_y = x + y), modified=(; x)) do m, o
96+
ImperativeAffect(observed=(; x_plus_y = x + y), modified=(; x)) do m, o
9797
@set! m.x = o.x_plus_y
9898
end
9999
100100
Where we use Setfield to copy the tuple `m` with a new value for `x`, then return the modified value of `m`. All values updated by the tuple must have names originally declared in
101101
`modified`; a runtime error will be produced if a value is written that does not appear in `modified`. The user can dynamically decide not to write a value back by not including it
102102
in the returned tuple, in which case the associated field will not be updated.
103103
"""
104-
@kwdef struct MutatingFunctionalAffect
104+
@kwdef struct ImperativeAffect
105105
f::Any
106106
obs::Vector
107107
obs_syms::Vector{Symbol}
@@ -111,50 +111,50 @@ in the returned tuple, in which case the associated field will not be updated.
111111
skip_checks::Bool
112112
end
113113

114-
function MutatingFunctionalAffect(f::Function;
114+
function ImperativeAffect(f::Function;
115115
observed::NamedTuple = NamedTuple{()}(()),
116116
modified::NamedTuple = NamedTuple{()}(()),
117117
ctx = nothing,
118118
skip_checks = false)
119-
MutatingFunctionalAffect(f,
119+
ImperativeAffect(f,
120120
collect(values(observed)), collect(keys(observed)),
121121
collect(values(modified)), collect(keys(modified)),
122122
ctx, skip_checks)
123123
end
124-
function MutatingFunctionalAffect(f::Function, modified::NamedTuple;
124+
function ImperativeAffect(f::Function, modified::NamedTuple;
125125
observed::NamedTuple = NamedTuple{()}(()), ctx = nothing, skip_checks=false)
126-
MutatingFunctionalAffect(f, observed = observed, modified = modified, ctx = ctx, skip_checks = skip_checks)
126+
ImperativeAffect(f, observed = observed, modified = modified, ctx = ctx, skip_checks = skip_checks)
127127
end
128-
function MutatingFunctionalAffect(
128+
function ImperativeAffect(
129129
f::Function, modified::NamedTuple, observed::NamedTuple; ctx = nothing, skip_checks=false)
130-
MutatingFunctionalAffect(f, observed = observed, modified = modified, ctx = ctx, skip_checks = skip_checks)
130+
ImperativeAffect(f, observed = observed, modified = modified, ctx = ctx, skip_checks = skip_checks)
131131
end
132-
function MutatingFunctionalAffect(
132+
function ImperativeAffect(
133133
f::Function, modified::NamedTuple, observed::NamedTuple, ctx; skip_checks=false)
134-
MutatingFunctionalAffect(f, observed = observed, modified = modified, ctx = ctx, skip_checks = skip_checks)
134+
ImperativeAffect(f, observed = observed, modified = modified, ctx = ctx, skip_checks = skip_checks)
135135
end
136136

137-
function Base.show(io::IO, mfa::MutatingFunctionalAffect)
137+
function Base.show(io::IO, mfa::ImperativeAffect)
138138
obs_vals = join(map((ob,nm) -> "$ob => $nm", mfa.obs, mfa.obs_syms), ", ")
139139
mod_vals = join(map((md,nm) -> "$md => $nm", mfa.modified, mfa.mod_syms), ", ")
140140
affect = mfa.f
141-
print(io, "MutatingFunctionalAffect(observed: [$obs_vals], modified: [$mod_vals], affect:$affect)")
141+
print(io, "ImperativeAffect(observed: [$obs_vals], modified: [$mod_vals], affect:$affect)")
142142
end
143-
func(f::MutatingFunctionalAffect) = f.f
144-
context(a::MutatingFunctionalAffect) = a.ctx
145-
observed(a::MutatingFunctionalAffect) = a.obs
146-
observed_syms(a::MutatingFunctionalAffect) = a.obs_syms
147-
discretes(a::MutatingFunctionalAffect) = filter(ModelingToolkit.isparameter, a.modified)
148-
modified(a::MutatingFunctionalAffect) = a.modified
149-
modified_syms(a::MutatingFunctionalAffect) = a.mod_syms
143+
func(f::ImperativeAffect) = f.f
144+
context(a::ImperativeAffect) = a.ctx
145+
observed(a::ImperativeAffect) = a.obs
146+
observed_syms(a::ImperativeAffect) = a.obs_syms
147+
discretes(a::ImperativeAffect) = filter(ModelingToolkit.isparameter, a.modified)
148+
modified(a::ImperativeAffect) = a.modified
149+
modified_syms(a::ImperativeAffect) = a.mod_syms
150150

151-
function Base.:(==)(a1::MutatingFunctionalAffect, a2::MutatingFunctionalAffect)
151+
function Base.:(==)(a1::ImperativeAffect, a2::ImperativeAffect)
152152
isequal(a1.f, a2.f) && isequal(a1.obs, a2.obs) && isequal(a1.modified, a2.modified) &&
153153
isequal(a1.obs_syms, a2.obs_syms) && isequal(a1.mod_syms, a2.mod_syms) &&
154154
isequal(a1.ctx, a2.ctx)
155155
end
156156

157-
function Base.hash(a::MutatingFunctionalAffect, s::UInt)
157+
function Base.hash(a::ImperativeAffect, s::UInt)
158158
s = hash(a.f, s)
159159
s = hash(a.obs, s)
160160
s = hash(a.obs_syms, s)
@@ -163,8 +163,8 @@ function Base.hash(a::MutatingFunctionalAffect, s::UInt)
163163
hash(a.ctx, s)
164164
end
165165

166-
function namespace_affect(affect::MutatingFunctionalAffect, s)
167-
MutatingFunctionalAffect(func(affect),
166+
function namespace_affect(affect::ImperativeAffect, s)
167+
ImperativeAffect(func(affect),
168168
namespace_expr.(observed(affect), (s,)),
169169
observed_syms(affect),
170170
renamespace.((s,), modified(affect)),
@@ -174,7 +174,7 @@ function namespace_affect(affect::MutatingFunctionalAffect, s)
174174
end
175175

176176
function has_functional_affect(cb)
177-
(affects(cb) isa FunctionalAffect || affects(cb) isa MutatingFunctionalAffect)
177+
(affects(cb) isa FunctionalAffect || affects(cb) isa ImperativeAffect)
178178
end
179179

180180
#################################### continuous events #####################################
@@ -219,7 +219,7 @@ Affects (i.e. `affect` and `affect_neg`) can be specified as either:
219219
+ `read_parameters` is a vector of the parameters that are *used* by `f!`. Their indices are passed to `f` in `p` similarly to the indices of `unknowns` passed in `u`.
220220
+ `modified_parameters` is a vector of the parameters that are *modified* by `f!`. Note that a parameter will not appear in `p` if it only appears in `modified_parameters`; it must appear in both `parameters` and `modified_parameters` if it is used in the affect definition.
221221
+ `ctx` is a user-defined context object passed to `f!` when invoked. This value is aliased for each problem.
222-
* A [`MutatingFunctionalAffect`](@ref); refer to its documentation for details.
222+
* A [`ImperativeAffect`](@ref); refer to its documentation for details.
223223
224224
Callbacks that impact a DAE are applied, then the DAE is reinitialized using `reinitializealg` (which defaults to `SciMLBase.CheckInit`).
225225
This reinitialization algorithm ensures that the DAE is satisfied after the callback runs. The default value of `CheckInit` will simply validate
@@ -228,10 +228,10 @@ initialization.
228228
"""
229229
struct SymbolicContinuousCallback
230230
eqs::Vector{Equation}
231-
initialize::Union{Vector{Equation}, FunctionalAffect, MutatingFunctionalAffect}
232-
finalize::Union{Vector{Equation}, FunctionalAffect, MutatingFunctionalAffect}
233-
affect::Union{Vector{Equation}, FunctionalAffect, MutatingFunctionalAffect}
234-
affect_neg::Union{Vector{Equation}, FunctionalAffect, MutatingFunctionalAffect, Nothing}
231+
initialize::Union{Vector{Equation}, FunctionalAffect, ImperativeAffect}
232+
finalize::Union{Vector{Equation}, FunctionalAffect, ImperativeAffect}
233+
affect::Union{Vector{Equation}, FunctionalAffect, ImperativeAffect}
234+
affect_neg::Union{Vector{Equation}, FunctionalAffect, ImperativeAffect, Nothing}
235235
rootfind::SciMLBase.RootfindOpt
236236
reinitializealg::SciMLBase.DAEInitializationAlgorithm
237237
function SymbolicContinuousCallback(;
@@ -390,7 +390,7 @@ reinitialization_algs(cbs::Vector{SymbolicContinuousCallback}) =
390390

391391
namespace_affects(af::Vector, s) = Equation[namespace_affect(a, s) for a in af]
392392
namespace_affects(af::FunctionalAffect, s) = namespace_affect(af, s)
393-
namespace_affects(af::MutatingFunctionalAffect, s) = namespace_affect(af, s)
393+
namespace_affects(af::ImperativeAffect, s) = namespace_affect(af, s)
394394
namespace_affects(::Nothing, s) = nothing
395395

396396
function namespace_callback(cb::SymbolicContinuousCallback, s)::SymbolicContinuousCallback
@@ -460,15 +460,15 @@ scalarize_affects(affects) = scalarize(affects)
460460
scalarize_affects(affects::Tuple) = FunctionalAffect(affects...)
461461
scalarize_affects(affects::NamedTuple) = FunctionalAffect(; affects...)
462462
scalarize_affects(affects::FunctionalAffect) = affects
463-
scalarize_affects(affects::MutatingFunctionalAffect) = affects
463+
scalarize_affects(affects::ImperativeAffect) = affects
464464

465465
SymbolicDiscreteCallback(p::Pair) = SymbolicDiscreteCallback(p[1], p[2])
466466
SymbolicDiscreteCallback(cb::SymbolicDiscreteCallback) = cb # passthrough
467467

468468
function Base.show(io::IO, db::SymbolicDiscreteCallback)
469469
println(io, "condition: ", db.condition)
470470
println(io, "affects:")
471-
if db.affects isa FunctionalAffect || db.affects isa MutatingFunctionalAffect
471+
if db.affects isa FunctionalAffect || db.affects isa ImperativeAffect
472472
# TODO
473473
println(io, " ", db.affects)
474474
else
@@ -1011,7 +1011,7 @@ function check_assignable(sys, sym)
10111011
end
10121012
end
10131013

1014-
function compile_user_affect(affect::MutatingFunctionalAffect, cb, sys, dvs, ps; kwargs...)
1014+
function compile_user_affect(affect::ImperativeAffect, cb, sys, dvs, ps; kwargs...)
10151015
#=
10161016
Implementation sketch:
10171017
generate observed function (oop), should save to a component array under obs_syms
@@ -1113,7 +1113,7 @@ function compile_user_affect(affect::MutatingFunctionalAffect, cb, sys, dvs, ps;
11131113
elseif applicable(user_affect, upd_component_array)
11141114
user_affect(upd_component_array)
11151115
else
1116-
@error "User affect function $user_affect needs to implement one of the supported MutatingFunctionalAffect callback forms; see the MutatingFunctionalAffect docstring for more details"
1116+
@error "User affect function $user_affect needs to implement one of the supported ImperativeAffect callback forms; see the ImperativeAffect docstring for more details"
11171117
user_affect(upd_component_array, obs_component_array, integ, ctx) # this WILL error but it'll give a more sensible message
11181118
end
11191119

@@ -1127,7 +1127,7 @@ function compile_user_affect(affect::MutatingFunctionalAffect, cb, sys, dvs, ps;
11271127
end
11281128
end
11291129

1130-
function compile_affect(affect::Union{FunctionalAffect, MutatingFunctionalAffect}, cb, sys, dvs, ps; kwargs...)
1130+
function compile_affect(affect::Union{FunctionalAffect, ImperativeAffect}, cb, sys, dvs, ps; kwargs...)
11311131
compile_user_affect(affect, cb, sys, dvs, ps; kwargs...)
11321132
end
11331133

src/systems/index_cache.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ function IndexCache(sys::AbstractSystem)
126126
for affect in affs
127127
if affect isa Equation
128128
is_parameter(sys, affect.lhs) && push!(discs, affect.lhs)
129-
elseif affect isa FunctionalAffect || affect isa MutatingFunctionalAffect
129+
elseif affect isa FunctionalAffect || affect isa ImperativeAffect
130130
union!(discs, unwrap.(discretes(affect)))
131131
else
132132
error("Unhandled affect type $(typeof(affect))")

0 commit comments

Comments
 (0)