@@ -882,6 +882,44 @@ namespace its subsystems or variables, i.e. `isequal(complete(sys).v.i, v.i)`.
882
882
function complete (sys:: AbstractSystem ; split = true )
883
883
if split && has_index_cache (sys)
884
884
@set! sys. index_cache = IndexCache (sys)
885
+ all_ps = parameters (sys)
886
+ if ! isempty (all_ps)
887
+ # reorder parameters by portions
888
+ ps_split = reorder_parameters (sys, all_ps)
889
+ # if there are no tunables, vcat them
890
+ if isempty (get_index_cache (sys). tunable_idx)
891
+ ordered_ps = reduce (vcat, ps_split)
892
+ else
893
+ # if there are tunables, they will all be in `ps_split[1]`
894
+ # and the arrays will have been scalarized
895
+ ordered_ps = eltype (all_ps)[]
896
+ i = 1
897
+ # go through all the tunables
898
+ while i <= length (ps_split[1 ])
899
+ sym = ps_split[1 ][i]
900
+ # if the sym is not a scalarized array symbolic OR it was already scalarized,
901
+ # just push it as-is
902
+ if ! iscall (sym) || operation (sym) != getindex ||
903
+ any (isequal (sym), all_ps)
904
+ push! (ordered_ps, sym)
905
+ i += 1
906
+ continue
907
+ end
908
+ # the next `length(sym)` symbols should be scalarized versions of the same
909
+ # array symbolic
910
+ if ! allequal (first (arguments (x))
911
+ for x in view (ps_split[1 ], i: (i + length (sym) - 1 )))
912
+ error (" This should not be possible. Please open an issue in ModelingToolkit.jl with an MWE and stacktrace." )
913
+ end
914
+ arrsym = first (arguments (sym))
915
+ push! (ordered_ps, arrsym)
916
+ i += length (arrsym)
917
+ end
918
+ ordered_ps = vcat (
919
+ ordered_ps, reduce (vcat, ps_split[2 : end ]; init = eltype (ordered_ps)[]))
920
+ end
921
+ @set! sys. ps = ordered_ps
922
+ end
885
923
end
886
924
if isdefined (sys, :initializesystem ) && get_initializesystem (sys) != = nothing
887
925
@set! sys. initializesystem = complete (get_initializesystem (sys); split)
0 commit comments