@@ -49,13 +49,15 @@ struct IndexCache
4949 # sym => (clockidx, idx_in_clockbuffer)
5050 callback_to_clocks:: Dict{Any, Vector{Int}}
5151 tunable_idx:: TunableIndexMap
52+ initials_idx:: TunableIndexMap
5253 constant_idx:: ParamIndexMap
5354 nonnumeric_idx:: NonnumericMap
5455 observed_syms_to_timeseries:: Dict{BasicSymbolic, TimeseriesSetType}
5556 dependent_pars_to_timeseries:: Dict {
5657 Union{BasicSymbolic, CallWithMetadata}, TimeseriesSetType}
5758 discrete_buffer_sizes:: Vector{Vector{BufferTemplate}}
5859 tunable_buffer_size:: BufferTemplate
60+ initials_buffer_size:: BufferTemplate
5961 constant_buffer_sizes:: Vector{BufferTemplate}
6062 nonnumeric_buffer_sizes:: Vector{BufferTemplate}
6163 symbol_to_variable:: Dict{Symbol, SymbolicParam}
@@ -251,7 +253,9 @@ function IndexCache(sys::AbstractSystem)
251253
252254 tunable_idxs = TunableIndexMap ()
253255 tunable_buffer_size = 0
254- for buffers in (tunable_buffers, initial_param_buffers)
256+ bufferlist = is_initializesystem (sys) ? (tunable_buffers, initial_param_buffers) :
257+ (tunable_buffers,)
258+ for buffers in bufferlist
255259 for (i, (_, buf)) in enumerate (buffers)
256260 for (j, p) in enumerate (buf)
257261 idx = if size (p) == ()
@@ -271,6 +275,43 @@ function IndexCache(sys::AbstractSystem)
271275 end
272276 end
273277
278+ initials_idxs = TunableIndexMap ()
279+ initials_buffer_size = 0
280+ if ! is_initializesystem (sys)
281+ for (i, (_, buf)) in enumerate (initial_param_buffers)
282+ for (j, p) in enumerate (buf)
283+ idx = if size (p) == ()
284+ initials_buffer_size + 1
285+ else
286+ reshape (
287+ (initials_buffer_size + 1 ): (initials_buffer_size + length (p)), size (p))
288+ end
289+ initials_buffer_size += length (p)
290+ initials_idxs[p] = idx
291+ initials_idxs[default_toterm (p)] = idx
292+ if hasname (p) && (! iscall (p) || operation (p) != = getindex)
293+ symbol_to_variable[getname (p)] = p
294+ symbol_to_variable[getname (default_toterm (p))] = p
295+ end
296+ end
297+ end
298+ end
299+
300+ for k in collect (keys (tunable_idxs))
301+ v = tunable_idxs[k]
302+ v isa AbstractArray || continue
303+ for (kk, vv) in zip (collect (k), v)
304+ tunable_idxs[kk] = vv
305+ end
306+ end
307+ for k in collect (keys (initials_idxs))
308+ v = initials_idxs[k]
309+ v isa AbstractArray || continue
310+ for (kk, vv) in zip (collect (k), v)
311+ initials_idxs[kk] = vv
312+ end
313+ end
314+
274315 dependent_pars_to_timeseries = Dict{
275316 Union{BasicSymbolic, CallWithMetadata}, TimeseriesSetType}()
276317
@@ -341,12 +382,14 @@ function IndexCache(sys::AbstractSystem)
341382 disc_idxs,
342383 callback_to_clocks,
343384 tunable_idxs,
385+ initials_idxs,
344386 const_idxs,
345387 nonnumeric_idxs,
346388 observed_syms_to_timeseries,
347389 dependent_pars_to_timeseries,
348390 disc_buffer_templates,
349391 BufferTemplate (Real, tunable_buffer_size),
392+ BufferTemplate (Real, initials_buffer_size),
350393 const_buffer_sizes,
351394 nonnumeric_buffer_sizes,
352395 symbol_to_variable
@@ -385,6 +428,8 @@ function SymbolicIndexingInterface.parameter_index(ic::IndexCache, sym)
385428 Symbolics. shape (sym) != = Symbolics. Unknown ()
386429 return if (idx = check_index_map (ic. tunable_idx, sym)) != = nothing
387430 ParameterIndex (SciMLStructures. Tunable (), idx, validate_size)
431+ elseif (idx = check_index_map (ic. initials_idx, sym)) != = nothing
432+ ParameterIndex (SciMLStructures. Initials (), idx, validate_size)
388433 elseif (idx = check_index_map (ic. discrete_idx, sym)) != = nothing
389434 ParameterIndex (
390435 SciMLStructures. Discrete (), (idx. buffer_idx, idx. idx_in_buffer), validate_size)
@@ -465,6 +510,12 @@ function reorder_parameters(ic::IndexCache, ps; drop_missing = false)
465510 (BasicSymbolic[unwrap (variable (:DEF ))
466511 for _ in 1 : (ic. tunable_buffer_size. length)],)
467512 end
513+ initials_buf = if ic. initials_buffer_size. length == 0
514+ ()
515+ else
516+ (BasicSymbolic[unwrap (variable (:DEF ))
517+ for _ in 1 : (ic. initials_buffer_size. length)],)
518+ end
468519
469520 disc_buf = Tuple (BasicSymbolic[unwrap (variable (:DEF ))
470521 for _ in 1 : (sum (x -> x. length, temp))]
@@ -486,6 +537,13 @@ function reorder_parameters(ic::IndexCache, ps; drop_missing = false)
486537 else
487538 param_buf[1 ][i] = unwrap .(collect (p))
488539 end
540+ elseif haskey (ic. initials_idx, p)
541+ i = ic. initials_idx[p]
542+ if i isa Int
543+ initials_buf[1 ][i] = unwrap (p)
544+ else
545+ initials_buf[1 ][i] = unwrap .(collect (p))
546+ end
489547 elseif haskey (ic. constant_idx, p)
490548 i, j = ic. constant_idx[p]
491549 const_buf[i][j] = p
@@ -498,7 +556,8 @@ function reorder_parameters(ic::IndexCache, ps; drop_missing = false)
498556 end
499557
500558 result = broadcast .(
501- unwrap, (param_buf... , disc_buf... , const_buf... , nonnumeric_buf... ))
559+ unwrap, (
560+ param_buf... , initials_buf... , disc_buf... , const_buf... , nonnumeric_buf... ))
502561 if drop_missing
503562 result = map (result) do buf
504563 filter (buf) do sym
@@ -521,6 +580,11 @@ function iterated_buffer_index(ic::IndexCache, ind::ParameterIndex)
521580 elseif ic. tunable_buffer_size. length > 0
522581 idx += 1
523582 end
583+ if ind. portion isa SciMLStructures. Initials
584+ return idx + 1
585+ elseif ic. initials_buffer_size. length > 0
586+ idx += 1
587+ end
524588 if ind. portion isa SciMLStructures. Discrete
525589 return idx + ind. idx[1 ]
526590 elseif ! isempty (ic. discrete_buffer_sizes)
@@ -542,6 +606,8 @@ function get_buffer_template(ic::IndexCache, pidx::ParameterIndex)
542606
543607 if portion isa SciMLStructures. Tunable
544608 return ic. tunable_buffer_size
609+ elseif portion isa SciMLStructures. Initials
610+ return ic. initials_buffer_size
545611 elseif portion isa SciMLStructures. Discrete
546612 return ic. discrete_buffer_sizes[idx[1 ]][1 ]
547613 elseif portion isa SciMLStructures. Constants
0 commit comments