Canonical integer interpolation on the CLOSED length orthant #
This is the DegSpec counterpart of the interpolated layer of
Certificate/SubdivisionGraph.lean (coreRise, pathValue,
interpolatedScript) together with the two exact Laplacian formulas that
Certificate/ExplicitPotentialRankOne.lean derives from it
(prin_interpolatedScript_core_eq_endpointSum,
prin_interpolatedScript_interior_eq_stepDifference).
Nothing in SubdivisionGraph.Spec is touched; these are separate statements
about DegSpec.graph.
The one genuinely new hypothesis: RepInvariant #
DegSpec.interpolatedScript has to be a function on the contracted vertex
set, whose core summand is DegSpec.Class, not Fin n. Its value at the
class of v can only be potential v if potential is constant on classes.
That is RepInvariant, and it is genuinely an extra input:
- on the interior it is free (
repInvariant_of_pos, sincerep = idthere); - along a single collapsed slot it is free for a certificate potential, by
ValidClosed's sharedlowerForm/upperFormrows (ExplicitPotential.CertificateData.potential_eq_of_segment_eval_zero); - on a whole class it is exactly the statement that
repmerges only vertices joined by chains of collapsed slots. Theforestfield does not imply this (see the caveat in the design note), so it is supplied, andrepInvariant_evaluatedPotential_of_zeroReachinCertificate/DegenerateRankOne.leandischarges it from such a chain.
Note that coreRise below is defined without rep, exactly as on a
Spec. That is deliberate: it keeps coreRise (evaluatedPotential …) = riseValue
definitionally, so the certificate's endpoint bounds apply verbatim. Under
RepInvariant the two readings agree anyway
(coreRise_eq_zero_of_length_zero).
Potentials constant on the contracted classes #
On the interior of the orthant rep is the identity, so every potential is
rep-invariant: the hypothesis costs nothing where the strictly positive layer
already applies.
Rise, path value, interpolated script #
A collapsed slot has zero rise, for any rep-invariant potential. This is
what makes the arithmetic interpolator well behaved at length = 0, where
SubdivisionArithmetic.potential_zero is unavailable.
The interpolator of a zero rise is identically zero up to the slot length.
Needed at length = 0, where potential_zero and potential_length both
require positivity.
Normalization at the tail endpoint, valid on the closed orthant.
Realization of the rise at the head endpoint, valid on the closed orthant.
Extend a rep-invariant core potential over every surviving slot by the canonical convex interpolation. Collapsed slots contribute nothing: they carry no interior vertex and their two endpoints are already one class.
Equations
- d.interpolatedScript potential = d.slotValueScript potential (d.pathValue potential)
Instances For
The interpolated path values are compatible with the core potential at both endpoints of every slot, collapsed ones included.
The script difference across a unit edge is the arithmetic interpolator's step slope.
The two exact Laplacian formulas #
Core-class formula. At a contracted class only the first and last unit
steps of the incident slots contribute, and the sum runs over every slot of
the uncontracted core — collapsed ones cancel by zero_slot_cancels.
The reuse mechanism, for the interpolated layer. The Laplacian at a contracted class is the sum, over the members of that class, of the strictly positive per-core-vertex endpoint formula.
Interior formula. Unchanged in shape: an interior vertex exists only on a slot of length at least two.
Convexity of the interpolator: the interior Laplacian coefficient is non-negative.
Path positions from numerical offsets #
SubdivisionGraph.Spec.pathPosition lives in Certificate/MovingPosition.lean;
this is its DegSpec counterpart, needed by the affine position decoder. The
consumer-facing difference is the trichotomy: pathVertex_zero,
pathVertex_length and pathVertex_interior are three separate cases, and at a
collapsed slot the first two coincide.
The path position at a numerical offset known not to pass the head.
Equations
- d.pathPosition e offset hOffset = ⟨offset, ⋯⟩
Instances For
The trichotomy, in one statement. On the closed orthant a numerical
path offset lands on the tail class, the head class, or an interior vertex —
the positive-world two-case split (offset = 0 versus offset > 0 ⟹ interior)
has no case for offset = length.