Skip to content

perf(compositor): root-matched recurrence вместо exp/sin/cos на каждом узле сетки #227

Description

@lemone112

Пользовательский результат

Cold compilation spring→compositor artifact перестаёт вычислять exp/sin/cos для каждого узла равномерной сетки. После одного точного старта остальные samples генерируются корневой рекуррентной формой линейной ODE, сохраняя declared reconstruction tolerance и browser trajectory.

Математический закон

Пусть:

y(t) = x(t)-1

а непрерывные полюса системы — p₁,p₂. На равномерной сетке с шагом h:

q₁ = exp(p₁h)
q₂ = exp(p₂h)

Тогда значения удовлетворяют точной recurrence:

y[n+2] = (q₁+q₂)y[n+1] - q₁q₂ y[n]

Для underdamped в безразмерном времени:

q₁+q₂ = 2 exp(-ζh) cos(h sqrt(1-ζ²))
q₁q₂  = exp(-2ζh)

Critical/overdamped используют те же symmetric pole coefficients без комплексной арифметики runtime.

Это root-matched recurrence exact в real arithmetic; это не Euler, Verlet или RK approximation.

Подтверждённый потенциал

Исследовательский прототип на Node 22 для underdamped grid generation показал примерно 12.9–13.5× ускорение формульного inner loop на 256/1024/4096 узлах. Это диагностический факт одной машины, не product claim.

Wolfram/high-precision sweep на ζ=0.01…10, v₀=0/3, до 4096 узлов дал max error порядка 1e-12…5e-11, то есть намного ниже текущего compositor tolerance 1/400.

Реализация

  • использовать только в compile/grid path; per-frame random-access solveSpring(t) остаётся аналитическим;
  • coefficients строятся из устойчивого pole-space после fix(core): устойчивый pole-space solver без потери медленного overdamped-полюса #226;
  • первые два состояния вычисляются независимой точной формой;
  • поддержать value-only и при необходимости synchronized velocity recurrence;
  • не аллоцировать на узел;
  • предусмотреть optional periodic re-anchor только если adversarial sweep докажет необходимость;
  • signed zero, terminal endpoint и finite policy остаются текущими;
  • recurrence не становится новым публичным API.

RED / доказательства

  1. Characterization existing makeSpringValueSampler grid outputs.
  2. Independent high-precision reference, не использующий production recurrence coefficients.
  3. Sweep under/critical/over, near-critical, v₀, log-scale h, до BASE_GRID_MAX.
  4. Error accumulation bound зафиксирован численно/аналитически; threshold существенно ниже reconstruction budget.
  5. Exact endpoint/tangent anchor semantics segmenter сохранены.
  6. Differential final nodes, serialized linear() и browser trajectory — не только raw grid.
  7. Mutation: coefficient sign/order, q₁q₂, bad initialization, off-by-one, skipped re-anchor.
  8. Benchmark: direct formula vs recurrence отдельно от RDP/serialization; cold compile end-to-end отдельно.
  9. Chromium/Firefox/WebKit compiled artifacts эквивалентны в declared tolerance.

GO

  • grid generation и/или end-to-end cold compile статистически быстрее на pinned runner;
  • max numeric recurrence drift имеет доказанный большой запас к tolerance;
  • artifact quality/size не ухудшены;
  • code size финансируется выигрышем/дедупликацией, existing gates не повышаются.

NO-GO

Если browser/end-to-end compile почти не выигрывает из-за доминирования RDP/serialization, сохранить benchmark/oracle и не оставлять дополнительную production complexity. В таком случае приоритет переходит local energy grid.

Не входит

  • nonuniform grid recurrence;
  • runtime integration;
  • новая spring family;
  • cache/Atlas.

Зависит: #226. Родитель: #225. Связано: #220, #223.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions