Degree reduction #
The first half of Dinur's preprocessing: an arbitrary constraint graph, whose vertices may have wildly different degrees, is replaced by a regular one over the same alphabet.
The vertices of the new graph are the half-edges of the old one — an edge
together with one of its endpoints — so there are exactly 2 · numEdges of
them, however lopsided the original degrees were. Each half-edge has
- one edge-link, to the other half of its own edge, carrying that edge's original constraint, and
E.degreecloud-links, wiring together the half-edges that share an endpoint, by a member of anExpanderFamily, carrying equality constraints.
So the result is (1 + E.degree)-regular by construction, with no padding, and
its size is a constant multiple of the original's — which is what the
amplification bookkeeping needs.
The cloud rotation, without dependent types #
A cloud's expander lives on Fin (cloud size), and cloud sizes differ, so the
naive rotation map forces a transport along owner p' = owner p that is not
type-correct to rewrite. The fix is cloudRotAux, which takes the cloud's
enumeration l as a parameter: within it the length is fixed, and
involutivity is an ordinary argument about a Nodup list. At the top level the
only rewriting needed is cloudList (owner p') = cloudList (owner p), an
equation between plain lists with no dependent type in sight.
Main definitions #
ConstraintGraph.owner,flipHalf,cloud,cloudList— the cloud structure on half-edgesConstraintGraph.cloudRotAux,cloudRot— the cloud-link rotationConstraintGraph.reduceGraph,reduce— the regular graph and system
Main results #
ConstraintGraph.cloudRotAux_involutive,cloudRot_involutiveConstraintGraph.cloudRot_getElem— a cloud, read through its enumeration, is a copy of the family's expanderConstraintGraph.order_reduceGraph,deg_reduceGraph— size2 · numEdges, degree1 + E.degreeConstraintGraph.satisfiable_reduce_of_satisfiable— completeness
Half-edges and clouds #
A half-edge: an edge together with one of its two endpoints (false is the
tail, true the head). These are the vertices of the reduced graph.
Instances For
The half-edges of a cloud, listed without repetition, in order of their numbers — the order an algorithm can find them in.
Instances For
The cloud rotation #
The cloud-link rotation, with the cloud's enumeration passed in explicitly so that no dependent rewriting is ever needed.
Equations
Instances For
Inside one cloud, the rotation is an involution: this is the family's own involutivity, transported through the enumeration.
The cloud-link rotation at a half-edge, using its own cloud.
Equations
- G.cloudRot E p j = G.cloudRotAux E (G.cloudList (G.owner p)) p j
Instances For
A cloud-link lands inside the enumeration it started from.
A cloud-link stays inside the cloud.
The cloud is a copy of the expander. Reading the cloud through its
enumeration, a cloud-link is exactly the family's rotation map. This is what
lets the expander estimates of Disagreement be applied to a cloud.
The reduced graph #
The reduced graph: every half-edge has one edge-link to the other half of
its edge, and E.degree cloud-links to the half-edges sharing its endpoint.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The reduced graph is (1 + E.degree)-regular.
The reduced constraint system #
The reduced constraint system: an edge-link carries the original constraint of its edge, oriented so that the tail's label comes first, and a cloud-link demands that the two half-edges agree.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The reduced system's vertices are the half-edges, numbered by their edge and their side.
Equations
- One or more equations did not get rendered due to their size.
Completeness: labelling every half-edge by its endpoint's label carries a
satisfying assignment of G to one of the reduced system.