Reading a half-edge's endpoint #
A half-edge is numbered 2 e or 2 e + 1 according to which end of edge e it
is, so the vertex it hangs from is one of that edge's two endpoints — and both
are written down in the encoded graph. Halving the number picks the edge, its
parity picks the end.
Main definitions #
Complexity.ownerFn— the vertex a half-edge number hangs fromComplexity.cloudSizeFn— how many half-edges hang from a vertexComplexity.cloudIdxFn— how many of them come first
Main results #
Complexity.ownerFn_mem_FP,Complexity.ownerFn_eqComplexity.cloudSizeFn_mem_FP,Complexity.length_cloudSizeFn— the count is the number of half-edges the rule acceptsComplexity.ConstraintGraph.count_owner_eq_card_cloud— and counting numbers is counting half-edgesComplexity.cloudStepFn,Complexity.expStepFn— the two moves that need the expanderComplexity.preRotFn— the preprocessed graph's rotation map, as one function
Main results #
Complexity.expStepFn_eq— the expander move computes what it should
Counting a cloud #
The count is the number of half-edges the rule accepts.
The index is the number of earlier half-edges in the same cloud.
Finding a cloud's members #
The reading is the owner.
Counting numbers is counting half-edges.
Counting numbers below a bound is counting codes below it.
What the counts compute #
The size the algorithm counts is the size of the cloud.
The index the algorithm counts is the position in the cloud.
The code of a half-edge is below twice the edge count.
The search finds the k-th half-edge of the cloud.
The two moves that need the expander #
The cloud move, on pair (pair (graph) (unary owner)) (pair (unary code) (unary dart)): rotate the half-edge's index inside its cloud, then read off the
half-edge the new index names.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The expander move, on pair (graph) (pair (unary vertex) (unary dart)).
Equations
- One or more equations did not get rendered due to their size.
Instances For
The cloud move computes what it should.
The expander move computes what it should.
The whole rotation map #
Crossing an edge: flip the last bit of the vertex number.
Equations
- Complexity.flipFn v = Complexity.ifEqLen (Complexity.modC 2 v) [] (v ++ [true]) (Complexity.dropOne v)
Instances For
The preprocessed graph's rotation map, on
pair (graph) (pair (unary vertex) (unary dart)). Dart 0 is the self-loop,
dart 1 crosses the edge, the next deg are the cloud's, and the rest are the
superposed expander's.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The whole rotation map computes what it should.