|
67 | 67 | function resize_or_push!(v, val, idx)
|
68 | 68 | n = length(v)
|
69 | 69 | if idx > n
|
70 |
| - for i in (n + 1):idx |
| 70 | + for _ in (n + 1):idx |
71 | 71 | push!(v, Int[])
|
72 | 72 | end
|
73 | 73 | resize!(v, idx)
|
74 | 74 | end
|
75 | 75 | push!(v[idx], val)
|
76 | 76 | end
|
77 | 77 |
|
78 |
| -function split_system(ci::ClockInference) |
| 78 | +function split_system(ci::ClockInference{S}) where {S} |
79 | 79 | @unpack ts, eq_domain, var_domain, inferred = ci
|
80 | 80 | fullvars = get_fullvars(ts)
|
81 |
| - @unpack graph, var_to_diff = ts.structure |
| 81 | + @unpack graph = ts.structure |
82 | 82 | continuous_id = Ref(0)
|
83 | 83 | clock_to_id = Dict{TimeDomain, Int}()
|
84 | 84 | id_to_clock = TimeDomain[]
|
@@ -121,26 +121,10 @@ function split_system(ci::ClockInference)
|
121 | 121 | resize_or_push!(cid_to_var, i, cid)
|
122 | 122 | end
|
123 | 123 |
|
124 |
| - eqs = equations(ts) |
125 |
| - tss = similar(cid_to_eq, TearingState) |
| 124 | + tss = similar(cid_to_eq, S) |
126 | 125 | for (id, ieqs) in enumerate(cid_to_eq)
|
127 |
| - vars = cid_to_var[id] |
128 |
| - ts_i = ts |
129 |
| - fadj = Vector{Int}[] |
130 |
| - eqs_i = Equation[] |
131 |
| - eq_to_diff = DiffGraph(length(ieqs)) |
132 |
| - ne = 0 |
133 |
| - for (j, eq_i) in enumerate(ieqs) |
134 |
| - vars = copy(graph.fadjlist[eq_i]) |
135 |
| - ne += length(vars) |
136 |
| - push!(fadj, vars) |
137 |
| - push!(eqs_i, eqs[eq_i]) |
138 |
| - eq_to_diff[j] = ts_i.structure.eq_to_diff[eq_i] |
139 |
| - end |
140 |
| - @set! ts_i.structure.graph = complete(BipartiteGraph(ne, fadj, ndsts(graph))) |
| 126 | + ts_i = system_subset(ts, ieqs) |
141 | 127 | @set! ts_i.structure.only_discrete = id != continuous_id
|
142 |
| - @set! ts_i.sys.eqs = eqs_i |
143 |
| - @set! ts_i.structure.eq_to_diff = eq_to_diff |
144 | 128 | tss[id] = ts_i
|
145 | 129 | end
|
146 | 130 | return tss, inputs, continuous_id, id_to_clock
|
@@ -213,16 +197,20 @@ function generate_discrete_affect(syss, inputs, continuous_id, id_to_clock;
|
213 | 197 | @unpack u, p, t = integrator
|
214 | 198 | c2d_obs = $cont_to_disc_obs
|
215 | 199 | d2c_obs = $disc_to_cont_obs
|
| 200 | + # Like Sample |
216 | 201 | c2d_view = view(p, $cont_to_disc_idxs)
|
| 202 | + # Like Hold |
217 | 203 | d2c_view = view(p, $disc_to_cont_idxs)
|
218 | 204 | disc_state = view(p, $disc_range)
|
219 | 205 | disc = $disc
|
220 |
| - # Write continuous info to discrete |
221 |
| - # Write discrete info to continuous |
| 206 | + # Write continuous into to discrete: handles `Sample` |
222 | 207 | copyto!(c2d_view, c2d_obs(integrator.u, p, t))
|
| 208 | + # Write discrete into to continuous |
| 209 | + # get old discrete states |
223 | 210 | copyto!(d2c_view, d2c_obs(disc_state, p, t))
|
224 | 211 | push!(saved_values.t, t)
|
225 | 212 | push!(saved_values.saveval, $save_vec)
|
| 213 | + # update discrete states |
226 | 214 | $empty_disc || disc(disc_state, disc_state, p, t)
|
227 | 215 | end)
|
228 | 216 | sv = SavedValues(Float64, Vector{Float64})
|
|
0 commit comments