@@ -49,13 +49,15 @@ struct IndexCache
49
49
# sym => (clockidx, idx_in_clockbuffer)
50
50
callback_to_clocks:: Dict{Any, Vector{Int}}
51
51
tunable_idx:: TunableIndexMap
52
+ initials_idx:: TunableIndexMap
52
53
constant_idx:: ParamIndexMap
53
54
nonnumeric_idx:: NonnumericMap
54
55
observed_syms_to_timeseries:: Dict{BasicSymbolic, TimeseriesSetType}
55
56
dependent_pars_to_timeseries:: Dict {
56
57
Union{BasicSymbolic, CallWithMetadata}, TimeseriesSetType}
57
58
discrete_buffer_sizes:: Vector{Vector{BufferTemplate}}
58
59
tunable_buffer_size:: BufferTemplate
60
+ initials_buffer_size:: BufferTemplate
59
61
constant_buffer_sizes:: Vector{BufferTemplate}
60
62
nonnumeric_buffer_sizes:: Vector{BufferTemplate}
61
63
symbol_to_variable:: Dict{Symbol, SymbolicParam}
@@ -251,7 +253,9 @@ function IndexCache(sys::AbstractSystem)
251
253
252
254
tunable_idxs = TunableIndexMap ()
253
255
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
255
259
for (i, (_, buf)) in enumerate (buffers)
256
260
for (j, p) in enumerate (buf)
257
261
idx = if size (p) == ()
@@ -271,6 +275,43 @@ function IndexCache(sys::AbstractSystem)
271
275
end
272
276
end
273
277
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
+
274
315
dependent_pars_to_timeseries = Dict{
275
316
Union{BasicSymbolic, CallWithMetadata}, TimeseriesSetType}()
276
317
@@ -341,12 +382,14 @@ function IndexCache(sys::AbstractSystem)
341
382
disc_idxs,
342
383
callback_to_clocks,
343
384
tunable_idxs,
385
+ initials_idxs,
344
386
const_idxs,
345
387
nonnumeric_idxs,
346
388
observed_syms_to_timeseries,
347
389
dependent_pars_to_timeseries,
348
390
disc_buffer_templates,
349
391
BufferTemplate (Real, tunable_buffer_size),
392
+ BufferTemplate (Real, initials_buffer_size),
350
393
const_buffer_sizes,
351
394
nonnumeric_buffer_sizes,
352
395
symbol_to_variable
@@ -385,6 +428,8 @@ function SymbolicIndexingInterface.parameter_index(ic::IndexCache, sym)
385
428
Symbolics. shape (sym) != = Symbolics. Unknown ()
386
429
return if (idx = check_index_map (ic. tunable_idx, sym)) != = nothing
387
430
ParameterIndex (SciMLStructures. Tunable (), idx, validate_size)
431
+ elseif (idx = check_index_map (ic. initials_idx, sym)) != = nothing
432
+ ParameterIndex (SciMLStructures. Initials (), idx, validate_size)
388
433
elseif (idx = check_index_map (ic. discrete_idx, sym)) != = nothing
389
434
ParameterIndex (
390
435
SciMLStructures. Discrete (), (idx. buffer_idx, idx. idx_in_buffer), validate_size)
@@ -465,6 +510,12 @@ function reorder_parameters(ic::IndexCache, ps; drop_missing = false)
465
510
(BasicSymbolic[unwrap (variable (:DEF ))
466
511
for _ in 1 : (ic. tunable_buffer_size. length)],)
467
512
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
468
519
469
520
disc_buf = Tuple (BasicSymbolic[unwrap (variable (:DEF ))
470
521
for _ in 1 : (sum (x -> x. length, temp))]
@@ -486,6 +537,13 @@ function reorder_parameters(ic::IndexCache, ps; drop_missing = false)
486
537
else
487
538
param_buf[1 ][i] = unwrap .(collect (p))
488
539
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
489
547
elseif haskey (ic. constant_idx, p)
490
548
i, j = ic. constant_idx[p]
491
549
const_buf[i][j] = p
@@ -498,7 +556,8 @@ function reorder_parameters(ic::IndexCache, ps; drop_missing = false)
498
556
end
499
557
500
558
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... ))
502
561
if drop_missing
503
562
result = map (result) do buf
504
563
filter (buf) do sym
@@ -521,6 +580,11 @@ function iterated_buffer_index(ic::IndexCache, ind::ParameterIndex)
521
580
elseif ic. tunable_buffer_size. length > 0
522
581
idx += 1
523
582
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
524
588
if ind. portion isa SciMLStructures. Discrete
525
589
return idx + ind. idx[1 ]
526
590
elseif ! isempty (ic. discrete_buffer_sizes)
@@ -542,6 +606,8 @@ function get_buffer_template(ic::IndexCache, pidx::ParameterIndex)
542
606
543
607
if portion isa SciMLStructures. Tunable
544
608
return ic. tunable_buffer_size
609
+ elseif portion isa SciMLStructures. Initials
610
+ return ic. initials_buffer_size
545
611
elseif portion isa SciMLStructures. Discrete
546
612
return ic. discrete_buffer_sizes[idx[1 ]][1 ]
547
613
elseif portion isa SciMLStructures. Constants
0 commit comments