Skip to content

Time rescaling integration: derived timesteps via a warp (phased plan — NT data layer → DTO evaluator → Piccolo templates → Altissimo) #148

Description

@aarontrowbridge

Important

Problem — Free-time in the stack has three formulations of the same physics with wildly different numerics: per-knot free Δt decision variables (the N-variable block — measured stalls, exploitation, det drift), the all-equal constraint (uniform mesh, free duration — correct semantics, but parameterized as N equality-chained variables), and pinned bounds. The measured evidence (Piccolo.jl#317): pinned-but-variable stalls at F=0.65 where a derived-timestep engine (Δt never a decision variable; duration as ONE coordinate on a fixed rational weight vector) solves the identical problem to 1e-12; the hub's bordered Jacobian adds a measured 1.05–1.9× wall (K-stable); a complete validated prototype exists (GriddedDiscretization, 451-test suite independently reproduced).
Approach — Integrate time rescaling (TR) as a first-class time mode in three phases, ordered to be collision-free with the open-core split (slices 3b–3e own the Piccolo-template + Piccolissimo-integrator refactor queue; this track owns the NT data layer + DTO evaluator/integrator plumbing):

Phase 1a — NamedTrajectories: derived timestep rows. A trajectory may carry a monotone warp t = w(s) with a small parameter vector (v1: GlobalScale, w(s)=T·s on uniform rational weights). The timestep component stays present (get_times, plotting, rollouts keep working) but becomes DERIVED: excluded from the decision vector, recomputed on unpack (sync_timesteps!), never optimizer data. This is the prototype's §5.4 "derived pinned rows" pattern — it kills the N-variable block AND the error-tuning channel by construction, and makes the AL KKT-plateau stall on free-Δt structurally unreachable.

Phase 1b — DTO plumbing. Integrators read derived Δt; the defect Jacobian/Hessian gain the warp-parameter column (exact entries w_n·∂Φ/∂Δt_n — a dense border column, O(Nb) measured-cheap); regularizer weights use derived Δt with the single ∂J/∂T chain term (kills the explicit per-knot ∂J/∂Δt scatter); TimeConsistencyConstraint, TimeStepsAllEqualConstraint, and the auto-Δt≥0 bound become obsolete under derived mode; MinimumTimeObjectiveD·T exactly.

Phase 2 — Piccolo template surface. timesteps_all_equal=true REMAPS to Phase-1 derived-TR: identical documented semantics (uniform mesh, free duration), better structure (one variable, no degenerate block). Fixed-T = derived with T as data. Bounded per-knot stays as the free-time default per #317. The three-mode statement (#317) becomes the kwarg surface.

Phase 3 — Altissimo. The warp column as a global reduction (supported pattern, KnotLayout halo unchanged for uniform mesh); matrix-free JVP/VJP/HVP gain the T-slot via the exact chain rule w_n·∂/∂Δt_n.

Amicode side (parallel, cheap): skills carry the three modes + TR terminology (landed: armonissima#75/#79); the produced template switches to pinned-or-TR (amicode#613); formulation vocabulary gains time_mode: rescaled.

Acceptance Criteria

  • Phase 1a: trajectory with a warp exposes derived Δt rows; vec(traj) excludes them; unpack! + sync_timesteps! restore consistency; all existing NT consumers (get_times, plotting, rollouts) unchanged on the derived rows
  • Phase 1b: a 1q unitary problem solves end-to-end through the DTO evaluator with the warp as the only free time quantity; JVP/VJP parity vs FD including the T-column; the drift-dominated benchmark converges free-T where per-knot free-Δt stalls (the 0.65-vs-1.0 evidence reproduced in-stack)
  • Phase 2: all-equal problems produce derived-TR construction (no Δt decision variables; one duration variable); bit-parity of objective/Jacobian values at equal T
  • F_pre convergence-suite parity maintained (fidelity_regression suite green)

Testing Decisions

  • NT: roundtrip/sync/derived-row testitems (prototype §8 patterns, exact == assertions)
  • DTO: integrator FD-parity incl. the T-column; #172-pending constraint suite untouched; fidelity_regression as the parity gate
  • Prototype as oracle: GriddedDiscretization.jl (branch dev/time-dependent) is the reference implementation — port semantics, not code, where licenses/structure demand

Key Decisions

  • Phase order 1a → 1b → 2 → 3 chosen because NT is outside the open-core split's refactor queue (collision-free), and each phase is independently mergeable behind defaults
  • GlobalScale only in v1; PiecewiseLinearWarp interface lands with it (prototype-tested) but is not wired into the NLP
  • The all-equal constraint is NOT deleted in Phase 2 — it remaps; its documented semantics (#317) are preserved

Prior Art

  • GriddedDiscretization.jl PLAN §5.1–5.4 (grid/warp/trajectory core), §7 (objectives/NLP), §10 (ten verified migration call sites); NOTE §2–§6 (two-error-channel theory, geometric-vs-Hamiltonian scaling, Magnus separability)
  • Piccolo.jl#317 (the three-mode semantics), DirectTrajOpt.jl#145 (default Δt window — pre-derived guard), #464 (the AL stall this cures structurally)
  • ADR-0001/0008/0009/0010/0011 (Piccolissimo-side conventions for Phase 3)

Source

  • Campaign: piccolissimo-matrixfree-autodev (session-20260827); user directive 2026-08-28: "figure out how best to integrate the new time rescaling and then do it"

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    afkImplement + merge unattended — tests decide green

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions