Documentation

Complexitylib.Classes.PCP.Internal.CloudDisagreement

Charging disagreement inside a cloud #

The soundness half of Dinur's degree reduction, one cloud at a time.

An assignment of the reduced system labels half-edges, not vertices. It is decoded back to a vertex assignment by plurality: decode A v is a label that at least a 1 / card α fraction of v's cloud agrees with. The half-edges of the cloud that disagree form a set the cloud's expander must charge for: by edge expansion, the disagreeing set sends out many cloud-links, and every one of them joins two half-edges with different labels, so every one of them is an unsatisfied constraint.

Everything is phrased at the level of a cloud's enumeration cloudList v, so that the expander family — which lives on Fin n — applies directly, with cloudRot_getElem as the only bridge back to half-edges.

Main definitions #

Main results #

Plurality decoding #

noncomputable def Complexity.ConstraintGraph.decode {α : Type} [Fintype α] [DecidableEq α] [Nonempty α] (G : ConstraintGraph α) (A : G.HalfEdgeα) (v : Fin G.numVerts) :
α

The plurality label of v's cloud: a label at least a 1 / card α fraction of the cloud agrees with.

Equations
Instances For
    noncomputable def Complexity.ConstraintGraph.devIdx {α : Type} [Fintype α] [DecidableEq α] [Nonempty α] (G : ConstraintGraph α) (A : G.HalfEdgeα) (v : Fin G.numVerts) :

    The indices of v's cloud whose labels disagree with the plurality.

    Equations
    Instances For
      theorem Complexity.ConstraintGraph.mem_devIdx {α : Type} [Fintype α] [DecidableEq α] [Nonempty α] (G : ConstraintGraph α) {A : G.HalfEdgeα} {v : Fin G.numVerts} {i : Fin (G.cloudList v).length} :
      i G.devIdx A v A (G.cloudList v)[i] G.decode A v
      theorem Complexity.ConstraintGraph.mem_compl_devIdx {α : Type} [Fintype α] [DecidableEq α] [Nonempty α] (G : ConstraintGraph α) {A : G.HalfEdgeα} {v : Fin G.numVerts} {i : Fin (G.cloudList v).length} :
      i (G.devIdx A v) A (G.cloudList v)[i] = G.decode A v

      Plurality. The part of a cloud agreeing with its decoded label is at least a 1 / card α fraction of the cloud.

      From cloud indices to half-edges #

      theorem Complexity.ConstraintGraph.cloud_filter_eq_image {α : Type} (G : ConstraintGraph α) (v : Fin G.numVerts) (P : G.HalfEdgeProp) [DecidablePred P] :
      Finset.filter P (G.cloud v) = Finset.image (fun (i : Fin (G.cloudList v).length) => (G.cloudList v)[i]) {i : Fin (G.cloudList v).length | P (G.cloudList v)[i]}

      A cloud's filtered subset is the image of the corresponding index set.

      Counting inside a cloud is the same through its enumeration.

      noncomputable def Complexity.ConstraintGraph.devSet {α : Type} [Fintype α] [DecidableEq α] [Nonempty α] (G : ConstraintGraph α) (A : G.HalfEdgeα) :

      The half-edges whose label disagrees with their vertex's decoded label.

      Equations
      Instances For
        theorem Complexity.ConstraintGraph.mem_devSet {α : Type} [Fintype α] [DecidableEq α] [Nonempty α] (G : ConstraintGraph α) {A : G.HalfEdgeα} {p : G.HalfEdge} :
        p G.devSet A A p G.decode A (G.owner p)
        theorem Complexity.ConstraintGraph.card_devIdx_eq {α : Type} [Fintype α] [DecidableEq α] [Nonempty α] (G : ConstraintGraph α) (A : G.HalfEdgeα) (v : Fin G.numVerts) :
        (G.devIdx A v).card = {pG.devSet A | G.owner p = v}.card

        A cloud's disagreeing indices count the same as its disagreeing half-edges.

        theorem Complexity.ConstraintGraph.sum_card_devIdx {α : Type} [Fintype α] [DecidableEq α] [Nonempty α] (G : ConstraintGraph α) (A : G.HalfEdgeα) :
        v : Fin G.numVerts, (G.devIdx A v).card = (G.devSet A).card

        Summed over the vertices, the cloud charges account for every disagreeing half-edge exactly once.

        noncomputable def Complexity.ConstraintGraph.cloudUnsat {α : Type} [DecidableEq α] (G : ConstraintGraph α) (E : ExpanderFamily) (A : (G.reduce E).Assignment) (v : Fin G.numVerts) :

        The unsatisfied cloud-links of the reduced system sitting at v.

        Equations
        Instances For
          theorem Complexity.ConstraintGraph.cloudUnsat_disjoint {α : Type} [DecidableEq α] (G : ConstraintGraph α) (E : ExpanderFamily) (A : (G.reduce E).Assignment) {u v : Fin G.numVerts} (huv : u v) :
          Disjoint (G.cloudUnsat E A u) (G.cloudUnsat E A v)

          The clouds' unsatisfied links are disjoint: a dart's tail determines the vertex it sits at.

          Every boundary dart of the disagreeing set is an unsatisfied cloud-link: its two ends carry different labels, one being the plurality and one not.

          The charge #

          theorem Complexity.ConstraintGraph.cloud_disagreement_bound {α : Type} [Fintype α] [DecidableEq α] [Nonempty α] (G : ConstraintGraph α) (E : ExpanderFamily) (A : (G.reduce E).Assignment) (v : Fin G.numVerts) :
          (1 - E.lam) * E.degree * (G.devIdx A v).card / (Fintype.card α) (G.cloudUnsat E A v).card

          The cloud charge. The disagreeing part of v's cloud is billed (1 - lam) · degree / card α unsatisfied cloud-links per disagreeing half-edge.

          The total charge #

          The clouds' unsatisfied links are disjoint subsets of all the unsatisfied darts, so their counts add up to at most the whole.

          theorem Complexity.ConstraintGraph.total_cloud_charge {α : Type} [Fintype α] [DecidableEq α] [Nonempty α] (G : ConstraintGraph α) (E : ExpanderFamily) (A : (G.reduce E).Assignment) :
          (1 - E.lam) * E.degree * (G.devSet A).card / (Fintype.card α) ((G.reduce E).unsatDarts A).card

          The total cloud charge. Every disagreeing half-edge is billed (1 - lam) · degree / card α unsatisfied cloud-links, and the bills for different vertices never overlap.