What to build
Redesign ControlParameter (src/local_controls.jl) so it can represent every tunable parameter of the underlying DE problem, not just piecewise-constant controls. A constant tunable parameter (e.g. a rate constant being estimated) is just the degenerate case of a ControlParameter with a single breakpoint spanning the whole tspan, with bounds=(v,v) if it must stay fixed.
This is part of a broader redesign (tracked across this and several follow-up issues) replacing SingleShootingLayer/MultipleShootingLayer's split control_indices/tunable_p/bounds_p/parameter_initialization machinery with one named, uniform mechanism: every entry of the DE's p is addressed by name (via SymbolicIndexingInterface's setp/getp) rather than by position. This issue covers only the ControlParameter type itself and its accessors — not the layer/ps wiring (that's covered in later issues).
Keep the existing time-grid API surface (get_timegrid, control_length, get_controls, get_bounds, build_index_grid, collect_tspans) working for the genuinely time-varying case; make sure the single-breakpoint (constant) case degrades cleanly through the same functions without special-casing call sites.
Acceptance criteria
Blocked by
None - can start immediately
What to build
Redesign
ControlParameter(src/local_controls.jl) so it can represent every tunable parameter of the underlying DE problem, not just piecewise-constant controls. A constant tunable parameter (e.g. a rate constant being estimated) is just the degenerate case of aControlParameterwith a single breakpoint spanning the whole tspan, withbounds=(v,v)if it must stay fixed.This is part of a broader redesign (tracked across this and several follow-up issues) replacing
SingleShootingLayer/MultipleShootingLayer's splitcontrol_indices/tunable_p/bounds_p/parameter_initializationmachinery with one named, uniform mechanism: every entry of the DE'spis addressed by name (viaSymbolicIndexingInterface'ssetp/getp) rather than by position. This issue covers only theControlParametertype itself and its accessors — not the layer/pswiring (that's covered in later issues).Keep the existing time-grid API surface (
get_timegrid,control_length,get_controls,get_bounds,build_index_grid,collect_tspans) working for the genuinely time-varying case; make sure the single-breakpoint (constant) case degrades cleanly through the same functions without special-casing call sites.Acceptance criteria
ControlParametercan represent a constant value (single breakpoint spanning a given tspan) using the same type and the same accessor functions as a genuinely time-varying controlcontrols/bounds) is preservedget_timegrid/control_length/get_controls/get_boundsBlocked by
None - can start immediately