Skip to content

marked

quiverlab.surfaces.marked

Marked bordered surfaces (Plan 48). A MarkedSurface is the combinatorial datum (genus, boundary marked-point counts, punctures) of a compact oriented surface with marked points. The ideal-arc count n = 6g-6+3(b+p)+Sum k_i (Fomin-Shapiro-Thurston 2008) and the Euler invariants are derived exactly (derivation in the Plan-48 doc, Task 1); construction refuses the FST-inadmissible surfaces loudly. Float-free (all counts are ints).

MarkedSurface dataclass

MarkedSurface(genus: int, boundary_marked: tuple, punctures: int = 0)

A compact connected oriented surface (S, M): genus genus, boundary components carrying boundary_marked = (k1, ..., kb) marked points each (k_i >= 1), and punctures interior marked points. Refuses the FST-inadmissible surfaces on construction. See Fomin-Shapiro-Thurston 2008 (fomin_shapiro_thurston).

num_boundary_components property

num_boundary_components: int

b = the number of boundary components.

total_marked property

total_marked: int

p + Sum k_i = all 0-cells (punctures + boundary marked points).

arc_count

arc_count() -> int

n = 6g - 6 + 3(b + p) + Sum k_i -- the number of interior arcs in any ideal triangulation (FST 2008; boundary segments are NOT arcs).

Source code in src/quiverlab/surfaces/marked.py
79
80
81
82
83
def arc_count(self) -> int:
    """n = 6g - 6 + 3(b + p) + Sum k_i -- the number of interior arcs in any ideal
    triangulation (FST 2008; boundary segments are NOT arcs)."""
    b, p, c = self.num_boundary_components, self.punctures, sum(self.boundary_marked)
    return 6 * self.genus - 6 + 3 * (b + p) + c

euler_characteristic

euler_characteristic() -> int

chi(S) = 2 - 2g - b for a compact surface with b boundary components.

Source code in src/quiverlab/surfaces/marked.py
75
76
77
def euler_characteristic(self) -> int:
    """chi(S) = 2 - 2g - b for a compact surface with b boundary components."""
    return 2 - 2 * self.genus - self.num_boundary_components

in_v1_scope

in_v1_scope() -> bool

True iff the surface is in Plan-48 v1 scope: unpunctured with non-empty boundary (the ABCP/LFS gentle regime).

Source code in src/quiverlab/surfaces/marked.py
93
94
95
96
def in_v1_scope(self) -> bool:
    """True iff the surface is in Plan-48 v1 scope: unpunctured with non-empty
    boundary (the ABCP/LFS gentle regime)."""
    return self.punctures == 0 and self.num_boundary_components >= 1

triangle_count

triangle_count() -> int

t = (2n + c)/3 -- an exact integer by the side-counting identity 3t = 2n + c.

Source code in src/quiverlab/surfaces/marked.py
85
86
87
88
89
90
91
def triangle_count(self) -> int:
    """t = (2n + c)/3 -- an exact integer by the side-counting identity 3t = 2n + c."""
    n, c = self.arc_count(), sum(self.boundary_marked)
    if (2 * n + c) % 3 != 0:                          # exact by the derivation
        raise AssertionError(
            f"triangle count is not integral: (2*{n} + {c}) is not divisible by 3")
    return (2 * n + c) // 3