CoreGapBlockCoverCoupled #
The arithmetic of the construction #
The block scale τ is large (8 ≤ τ·δ), the blocks have size between ¾τδ and ⁵⁄₄τ, and the
regularity scale ε₁ is small compared with δ, μ₂ and η. The four lemmas below are the only
computations the reduction needs; they are stated in isolation to keep the context small.
The coupled block-allocation residual. Given the accuracy ε, a density threshold
δ ≤ ε, the block uniformity scale ε₂ that the caller needs and a scale floor T₀, the residual
names a regularity window ε₁₀ > 0; for every regularity scale ε₁ ≤ ε₁₀ it then names a relative
block size α with ε₁/8 ≤ α, 2α ≤ 1 and (ε₁/8)/α ≤ ε₂ — the three inequalities the transfer
of regularity from the clusters to the blocks needs — and, for all large enough
(ε₁/8)-regular equipartitions, a family of block sub-triples at that α with pairwise disjoint
vertex-pair rectangles carrying the fractional optimum up to ε|V|².
Compared with Nibble.AX1.BlockCoverResidualFine the two scales ε₁ and α are no longer
universally quantified independently: the residual may demand that the regularity scale be fine
(hence the number of clusters large) and may pick the relative block size itself (hence the number
of blocks per cluster large). Both are exactly what the reduction to AX1 leaves free, which is why
Nibble.AX1.ax1_of_blockCoverCoupled still goes through.
Equations
- One or more equations did not get rendered due to their size.
Instances For
AX1 from the coupled block-allocation residual.
Axiom check #
CoreGapBlockAlloc #
The covering sum of one member #
The covering sum of one block sub-triple is balanced. With the prescribed sizes of
Nibble.AX1.IsGridSubTriple, the covering sum of a member is three times τ² times the product of
its three cluster densities, up to an additive 6τ + 3.
Members on nearly disjoint cluster triples never clash #
The two coordinates of a point of a rectangle lie in two different clusters of the triple.
Automatic disjointness. If the cluster triples of two members share at most one cluster, their vertex-pair rectangles are disjoint. Hence the disjointness clause of the residual only ever has to be verified for two members sharing a whole cluster pair.
The bookkeeping bridge: value of the family ⟹ the covering clause #
The covering clause of the residual follows from a lower bound on the value of the
family. Write x, y, z for the three cluster densities of a member; its value is τ²·xyz,
one third of its balanced covering sum (Nibble.AX1.cover_approx_of_gridSubTriple). If the total
value of the family recovers the cluster capacity LP of the cluster pairs of density at least θ,
up to E, then the covering clause of Nibble.AX1.BlockCoverResidualFine holds with total error
θ·|V|²/6 + E + k·(2τ + 1).
This is the tight bookkeeping of the block-allocation route: by
Nibble.AX1.cover_sum_le_cluster_capacity the covering sum of a disjoint family can never exceed
the same capacity LP, so the hypothesis hval is not only sufficient but essentially necessary.
Axiom check #
ClusterTripleLP #
The program #
The density capacity of a cluster pair: d(S,T)·|S|·|T|, the number of edges of G
between S and T.
Equations
- Nibble.AX1.clusterPairCap G S T = ↑(G.edgeDensity S T) * ↑S.card * ↑T.card
Instances For
The cluster triples through a given pair of clusters.
Instances For
Feasibility for the cluster-triple LP: nonnegative weights on the cluster triples, supported on the triangles of the cluster graph, whose total through any cluster pair is at most the density capacity of that pair.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The value of a point of the cluster-triple LP.
Equations
- Nibble.AX1.clusterLPValue x = ∑ th : Finset ↥P.parts, x th
Instances For
The support of a point of the cluster-triple LP.
Equations
- Nibble.AX1.clusterLPSupport x = {th : Finset ↥P.parts | x th ≠ 0}
Instances For
The bridge: ν₃* of the reduced graph is below the LP #
The bridge. For every slack η > 0 there is a feasible point of the cluster-triple LP
whose value is within η of ν₃* of the regularity-reduced graph.
Sparsification #
Sparsification of the cluster-triple LP. A feasible point can be replaced by a feasible
point of at least the same value whose support has at most #P.parts ^ 2 triples.
The bridge and the sparsification, combined. For every slack η > 0 there is a feasible
point of the cluster-triple LP with at most #P.parts ^ 2 triples in its support whose value is
within η of ν₃* of the regularity-reduced graph.
The covering clause, in LP form #
The covering clause of the residual, in LP form. If the total value τ²·xyz of a family
of block sub-triples recovers the value of a point of the cluster-triple LP that itself dominates
ν₃* (up to η), then the covering clause of Nibble.AX1.BlockCoverResidualCoupled holds with
total error E + η + k·(2τ + 1).
This is the LP-form replacement of Nibble.AX1.nu3star_le_cover_of_family_value, whose right-hand
side is the full cluster capacity: the full capacity is not reachable by a coherent family of
block sub-triples — a cluster triple with d(S,T) = 1 and d(S,Y) = d(T,Y) = θ cannot tile
S × T — whereas the LP optimum is exactly what the coarse-cell construction realises.
Axiom check #
ClusterTripleLPCount #
The fibre identity. Summing the LP mass through the pairs of a set F of ordered cluster
pairs charges every triple with the number of pairs of F it contains.
The sizes of two clusters multiply out to at most |V|² over all ordered pairs.
The value of a feasible point of the cluster-triple LP is at most |V|²/6.
The triples of the LP that use a cluster pair of density below δ.
Equations
- Nibble.AX1.sparseTriples G P δ = {th : Finset ↥P.parts | ∃ S ∈ th, ∃ T ∈ th, S ≠ T ∧ ↑(G.edgeDensity ↑S ↑T) < δ}
Instances For
The mass of the triples using a sparse cluster pair is at most δ|V|²/2. Every such triple
contains at least two ordered pairs of density below δ, and the capacities of those pairs add up
to at most δ|V|².
CoarseCellBlocks #
A subset of a prescribed size #
The union of a set of coarse cells #
The union of the coarse cells of S indexed by I, at cell length l.
Equations
- Nibble.AX1.cellUnion S l I = I.biUnion fun (i : Fin P) => Nibble.AX1.blockOf S l ↑i
Instances For
The vertex block of a member: n vertices inside the union of its coarse cells.
Equations
- Nibble.AX1.cellBlock S l I n = Nibble.AX1.takeSub (Nibble.AX1.cellUnion S l I) n
Instances For
The disjointness engine #
CoarseCellAssembly #
The block family of a coarse-cell placement. Every copy of Good becomes a member of the
family: its block at the position a is the prescribed number bs c a of vertices inside the union
of the coarse cells I c a of its cluster cl c a.
GridTripleDesign #
The quadratic shift of the cluster v in the cluster triple of vertex sum s.
Equations
- Nibble.AX1.triShift s v = v ^ 2 - v * s
Instances For
The block used in cluster v by the j-th sub-triple of the cluster triple of vertex
sum s.
Equations
- Nibble.AX1.triBlock s v j = j + Nibble.AX1.triShift s v
Instances For
The diagonal offset: in the cluster pair {a, b}, the triple of vertex sum s occupies
the diagonal {(k, k + (b - a) * (a + b - s))}. For a ≠ b this offset is an injective function
of s, which is the whole point of the design.
Inside one cluster triple, the q sub-triples cover every block of every one of the three
clusters exactly once.
The sub-triples of a fixed cluster triple form a line in the sense of
Nibble.AX1.lineTriple, re-based at the first cluster: all single-triple facts proved for the
line design apply.
The block pairs a cluster triple uses in one of its cluster pairs: the diagonal of offset
(b - a) * (a + b - s).
Equations
- Nibble.AX1.triPairSet s a b = Finset.image (fun (j : ZMod q) => (Nibble.AX1.triBlock s a j, Nibble.AX1.triBlock s b j)) Finset.univ
Instances For
Each cluster triple uses exactly q block pairs in each of its three cluster pairs.
The allocation is consistent: two cluster triples with different vertex sums use disjoint
sets of block pairs in every cluster pair {a, b} they share. Since the vertex sum is symmetric,
this holds simultaneously for all three pairs of each triple.
The form used in the assembly: two cluster triples through the same cluster pair {a, b},
with different third clusters, never share a block pair.
Feasibility of the allocation: if S is a set of third clusters, the triples
{a, b, x}, x ∈ S, together use q * #S distinct block pairs of the cluster pair {a, b}, out
of the q ^ 2 block pairs available. So the design fits as long as the number of cluster triples
through a pair is at most the number q of blocks per cluster.
The block pairs used in a cluster pair are of course among all q ^ 2 of them, so the count
above is a genuine packing bound: the design never overflows a cluster pair.
GridTripleDesignRect #
The cells used by one sub-triple of the design: the cluster triple T (a set of cluster
indices) with offset j occupies, in the cluster v ∈ T, the block triBlock (∑ T) v j.
Equations
- Nibble.AX1.triCells T j = Finset.image (fun (c : ZMod q) => (c, Nibble.AX1.triBlock (∑ v ∈ T, v) c j)) T
Instances For
Two distinct sub-triples of the design share at most one cell.
If the cluster triples differ, or if they agree but the offsets differ, then no two cells can be
common: two common cells lie in two distinct clusters a ≠ b, and the identity
triShift s b - triShift s a = (b - a) * (a + b - s) then forces the two vertex sums to be equal,
hence the offsets to be equal and (both triples being {a, b, ·} with the same sum) the triples to
be equal.
A vertex pair of the rectangle of a sub-triple whose three parts sit in the blocks of three distinct cells joins the blocks of two distinct cells.
The rectangles of the design are pairwise disjoint.
blk assigns to each cell — a pair (cluster index, block index) — a block of vertices, distinct
cells getting disjoint blocks. Two distinct sub-triples of the design (different cluster triples,
or the same cluster triple with different offsets) have disjoint vertex-pair rectangles, whatever
subsets of the three blocks are used as the parts A, B, C.
Combined with Nibble.AX1.tripleGraph_edgeDisjoint_of_rect_disjoint and
Nibble.AX1.sum_area_le_of_rect_disjoint this is the edge-disjointness requirement of
Nibble.AX1.BlockCoverResidual for the whole family of cluster triples at once.
BlockCoverUniformAux #
Naming the three elements of a triangle #
An ordered triple listing the three elements of t, when t has exactly three of them.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Cell disjointness gives rectangle disjointness #
The rectangles of two members that share at most one cell are disjoint. blk assigns a
block of vertices to each cell, distinct cells getting disjoint blocks; a member is given by three
distinct cells, and its three parts are subsets of the corresponding blocks.
A crude bound for the fractional triangle packing number #
CoarseCellCoupled #
The three positions of a cluster triple #
Copies #
The copies of the elements of Gd: n th copies of th.
Equations
- Nibble.AX1.copySet Gd n = Gd.biUnion fun (th : ι) => Finset.image (fun (j : ℕ) => (th, j)) (Finset.range (n th))
Instances For
The three positions of a cluster triple, indexed by ZMod 3.
Equations
- Nibble.AX1.triPos Pp th a = if a = 0 then (Nibble.AX1.pick3 th).1 else if a = 1 then (Nibble.AX1.pick3 th).2.1 else (Nibble.AX1.pick3 th).2.2
Instances For
The density of the cluster pair opposite to the position a.
Equations
- Nibble.AX1.dOpp G Pp th a = ↑(G.edgeDensity ↑(Nibble.AX1.triPos Pp th (a + 1)) ↑(Nibble.AX1.triPos Pp th (a + 2)))
Instances For
The density product of a cluster triple.
Equations
- Nibble.AX1.dProd G Pp th = Nibble.AX1.dOpp G Pp th 0 * Nibble.AX1.dOpp G Pp th 1 * Nibble.AX1.dOpp G Pp th 2
Instances For
The density product read off the three positions in their natural order.
The three opposite densities of a triple, seen from two of its positions. For two distinct
positions a, b the density of the pair (a, b) is the density opposite to the third position,
so the three factors multiply out to the density product.
Arithmetic of the parameters #
The reduction #
The coarse-cell reduction: the small-box allocation residual implies the coupled block-allocation residual.
AX1 from the small-box allocation residual. Composing the reduction of this file with
Nibble.AX1.ax1_of_blockCoverCoupled.