Documentation

Complexitylib.Classes.PCP.Internal.SelfLoops

Adding self-loops #

Powering names a vertex within distance k ≤ h of v by a length-h walk that takes k real steps and then stays put, so the graph it runs on must have a self-loop at every vertex (RegGraph.Loops). This module adds them.

A self-loop at every vertex is itself a RegGraphloopGraph, of degree one, whose rotation map is the identity — so adding loops is just union with it, and the spectral bound comes free from spectralBound_union: the loops contribute their full weight 1 and the original graph its lam, giving (1 + deg · lam) / (1 + deg), still below one.

On the constraint side the loops carry the trivially true constraint. They are never violated, so the number of broken darts is unchanged while the number of darts grows by a factor (deg + 1) / deg; the value is scaled by exactly deg / (deg + 1), which unsatFrac_addLoops records.

Main definitions #

Main results #

The graph with exactly one self-loop at each vertex.

Equations
  • One or more equations did not get rendered due to their size.
Instances For

    G with a self-loop added at every vertex.

    Equations
    Instances For

      The canonical self-loop at each vertex of G.addLoops.

      Equations
      Instances For
        theorem Complexity.RegGraph.spectralBound_addLoops (G : RegGraph) {lam : } (hlam : 0 lam) (h : G.SpectralBound lam) :
        G.addLoops.SpectralBound ((1 + G.deg * lam) / (1 + G.deg))

        Adding loops keeps a spectral bound below one.

        theorem Complexity.RegGraph.addLoops_bound_lt_one (G : RegGraph) {lam : } (hlam1 : lam < 1) :
        (1 + G.deg * lam) / (1 + G.deg) < 1

        R with a trivially satisfied self-loop added at every vertex.

        Equations
        • One or more equations did not get rendered due to their size.
        Instances For

          The broken darts are unchanged: only the original constraints can fail.

          theorem Complexity.RegCSP.unsatFrac_addLoops {α : Type} (R : RegCSP α) (a : R.Assignment) :
          R.addLoops.unsatFrac a = R.unsatFrac a * R.graph.deg / (R.graph.deg + 1)

          Adding loops scales the value by deg / (deg + 1).

          The scaling passes to the value.