class curver.kernel.curve.MultiCurve(triangulation, geometric)[source]

Bases: curver.kernel.lamination.IntegralLamination

An IntegralLamination in which every component is a Curve.


Return the boundary of a regular neighbourhood of this lamination.


Return partial N(self cup other).


Return a dictionary mapping components to their multiplicities.


Return the crush map associated to this MultiCurve.


Return the number of component of this lamination dual to the given edge.

Note that when there is a terminal normal arc then we record this weight with a negative sign.


Return an Encoding of a right Dehn (multi)twist about the components of this multicurve, raised to the given power.


Return whether self cup other fills.


Return the geometric intersection number between this lamination and the given one(s).

If multiple laminations are given then sum(i(self, lamination) for laminations) is returned.


Return whether this lamination has no components.


Return whether this IntegralLamination fills the surface, that is, if it intersects all curves on the surface.

Note that this is equivalent to:
  • it meets every non S_{0,3} component of the surface, and
  • its boundary is peripheral.

Furthermore, if any component of this lamination is a non-peripheral curve then it cannot fill.


Return whether this lamination is integral.


Return whether this lamination does not have any peripheral components.


Return whether this lamination consists entirely of peripheral components.


Return whether this IntegralLamination is a polygonalisation, that is, if it cuts the surface into polygons.


Return whether this multicurve separates S.

That is, whether S - self has more components than S.


Return whether this lamination is short.

A lamination is short if all of its non-peripheral components are parallel to edges of the triangulation that it is defined on. This makes computing its components very easy.


Return the number of component of this lamination dual to the left of the given edge.

Note that when there is a terminal normal arc then we record this weight with a negative sign.


Return the maximal MultiArc contained within this lamination.


Return the maximal MultiCurve contained within this lamination.


Return that self does not share any components with the given IntegralLamination.


Return the lamination consisting of the non-peripheral components of this Lamination.


Return the total number of components.


Return a dictionary mapping component to (multiplicity, edge) for each component of self that is parallel to an edge.


Return one component of this Lamination.


Return the lamination consisting of the peripheral components of this Lamination.


Return a dictionary mapping component to (multiplicity, vertex) for each component of self that is peripheral around a vertex.


Return this lamination in its finest form.


Return the number of component of this lamination dual to the right the given edge.

Note that when there is a terminal normal arc then we record this weight with a negative sign.

Return a pair (s, h) where:
  • s is a short lamination of the correct class, and
  • s = h(self)

In each round, we do not look for an accelerating Dehn twist if a flip can drop the weight by at least drop`%. So if `drop == 0.0 then acceleration is never done and this returns the Mosher flip sequence. As long as drop > 0 this method runs in poly(||self||) time.

The original version of this method was based on [Bell16] but now a simpler and more efficient technique is used. The argument why this version runs in polynomial time follows that of [EricksonNayyeri13].


Return the lamination obtained by collapsing parallel components.


Return all sublaminations that appear within self.


Return the topological type of this lamination.. If the closed flag is set the the object returned records the topological type of the lamination after applying the forgetful map.

Two laminations are in the same mapping class group orbit if and only their topological types are equal.

trace_curve(edge, intersection, max_length)

Return the curve obtained by following along this lamination and closing up when you get back to this edge.

We start at the given edge and intersection point and only go for at most max_length. A ValueError is raised if:

  • we do not get back to the starting edge within this number of steps,
  • the lamination terminates into a vertex, or
  • upon returning to start_edge we cannot close up without creating intersections.

Return a vertex cycle of this multicurve.


Yield the vertex cycles of this multicurve.

These are the curves that use the same normal arcs as this multicurve but only pass through each edge at most twice. Be careful as there are often a lot of them.


Return the geometric intersection of this lamination with its underlying triangulation.