Source code for curver.kernel.homology


''' A module for representing homology classes on triangulations. '''

import curver

[docs]class HomologyClass: ''' This represents a homology class of a triangulation (relative to its vertices). ''' def __init__(self, triangulation, algebraic): assert isinstance(triangulation, curver.kernel.Triangulation) self.triangulation = triangulation self.zeta = self.triangulation.zeta self.algebraic = list(algebraic) assert len(self.algebraic) == self.zeta def __repr__(self): return str(self) def __str__(self): return str(self.algebraic) def __iter__(self): return iter(self.algebraic) def __call__(self, edge): ''' Return the geometric measure assigned to item. ''' if isinstance(edge, curver.IntegerType): edge = curver.kernel.Edge(edge) # If given an integer instead. return self.algebraic[edge.index] * edge.sign() def __eq__(self, other): return self.triangulation == other.triangulation and self.canonical().algebraic == other.canonical().algebraic def __hash__(self): return hash(tuple(self.canonical().algebraic)) def __add__(self, other): if isinstance(other, HomologyClass): if other.triangulation != self.triangulation: raise ValueError('Homology classes must be on the same triangulation to add them') algebraic = [x + y for x, y in zip(self, other)] return HomologyClass(self.triangulation, algebraic) elif other == 0: # So we can use sum. return self else: return NotImplemented def __radd__(self, other): return self + other def __neg__(self): algebraic = [-x for x in self] return HomologyClass(self.triangulation, algebraic) def __sub__(self, other): return self + (-other)
[docs] def canonical(self): ''' Return the canonical form of this HomologyClass. This is the HomologyClass that is homologous to this one and has weight 0 on each edge of the standard dual tree of the underlying triangulation. ''' return HomologyClass(self.triangulation, self.triangulation.homology_matrix().dot(self.algebraic).tolist())
[docs] def is_canonical(self): ''' Return whether this homology class is already in canonical form. This is useful for constructing a basis of H_1(S). ''' return self.canonical().algebraic == self.algebraic