Methods of constructing simplicial sets - Topology

Skip to content
Back to top
View this page
Edit this page

# Methods of constructing simplicial sets

This implements various constructions on simplicial sets: subsimplicial sets, pullbacks, products, pushouts, quotients, wedges, disjoint unions, smash products, cones, and suspensions. The best way to access these is with methods attached to simplicial sets themselves, as in the following.

EXAMPLES:

Sage

    sage: K = simplicial_sets.Simplex(1)
    sage: square = K.product(K)

    sage: K = simplicial_sets.Simplex(1)
    sage: endpoints = K.n_skeleton(0)
    sage: circle = K.quotient(endpoints)

Python

    >>> from sage.all import *
    >>> K = simplicial_sets.Simplex(Integer(1))
    >>> square = K.product(K)

    >>> K = simplicial_sets.Simplex(Integer(1))
    >>> endpoints = K.n_skeleton(Integer(0))
    >>> circle = K.quotient(endpoints)

The mapping cone of a morphism of simplicial sets is constructed as a pushout:

Sage

    sage: eta = simplicial_sets.HopfMap()
    sage: CP2 = eta.mapping_cone()
    sage: type(CP2)
    <class 'sage.topology.simplicial_set_constructions.PushoutOfSimplicialSets_finite_with_category'>

[Python]

    >>> from sage.all import *
    >>> eta = simplicial_sets.HopfMap()
    >>> CP2 = eta.mapping_cone()
    >>> type(CP2)
    <class 'sage.topology.simplicial_set_constructions.PushoutOfSimplicialSets_finite_with_category'>

See the main documentation for simplicial sets, as well as for the classes for pushouts, pullbacks, etc., for more details.

Many of the classes defined here inherit from `sage.structure.unique_representation.UniqueRepresentation`. This means that they produce identical output if given the same input, so for example, if `K` is a simplicial set, calling `K.suspension()` twice returns the same result both times:

Sage

    sage: CP2.suspension() is CP2.suspension()
    True

Python

    >>> from sage.all import *
    >>> CP2.suspension() is CP2.suspension()
    True

So on one hand, a command like `simplicial_sets.Sphere(2)` constructs a distinct copy of a 2-sphere each time it is called; on the other, once you have constructed a 2-sphere, then constructing its cone, its suspension, its product with another simplicial set, etc., will give you the same result each time:

Sage

    sage: simplicial_sets.Sphere(2) == simplicial_sets.Sphere(2)
    False
    sage: S2 = simplicial_sets.Sphere(2)
    sage: S2.product(S2) == S2.product(S2)
    True
    sage: S2.disjoint_union(CP2, S2) == S2.disjoint_union(CP2, S2)
    True

[Python]

    >>> from sage.all import *
    >>> simplicial_sets.Sphere(Integer(2)) == simplicial_sets.Sphere(Integer(2))
    False
    >>> S2 = simplicial_sets.Sphere(Integer(2))
    >>> S2.product(S2) == S2.product(S2)
    True
    >>> S2.disjoint_union(CP2, S2) == S2.disjoint_union(CP2, S2)
    True

AUTHORS:

- John H. Palmieri (2016-07)

class sage.topology.simplicial_set_constructions.ConeOfSimplicialSet(base)

  Bases: `SimplicialSet_arbitrary`, `UniqueRepresentation`

  Return the unreduced cone on a finite simplicial set.

  INPUT:

  - `base` – return the cone on this simplicial set

  Add a point \(*\) (which will become the base point) and for each simplex \(\sigma\) in `base`, add both \(\sigma\) and a simplex made up of \(*\) and \(\sigma\) (topologically, form the join of \(*\) and \(\sigma\)).

  EXAMPLES:

  Sage

      sage: from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet
      sage: v = AbstractSimplex(0, name='v')
      sage: e = AbstractSimplex(1, name='e')
      sage: X = SimplicialSet({e: (v, v)})
      sage: CX = X.cone() # indirect doctest
      sage: CX.nondegenerate_simplices()
      [*, v, (v,*), e, (e,*)]
      sage: CX.base_point()
      *

  Python

      >>> from sage.all import *
      >>> from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet
      >>> v = AbstractSimplex(Integer(0), name='v')
      >>> e = AbstractSimplex(Integer(1), name='e')
      >>> X = SimplicialSet({e: (v, v)})
      >>> CX = X.cone() # indirect doctest
      >>> CX.nondegenerate_simplices()
      [*, v, (v,*), e, (e,*)]
      >>> CX.base_point()
      *

  n_skeleton(n)

    Return the \(n\)-skeleton of this simplicial set.

    That is, the simplicial set generated by all nondegenerate simplices of dimension at most \(n\).

    INPUT:

    - `n` – the dimension

    In the case when the cone is infinite, the \(n\)-skeleton of the cone is computed as the \(n\)-skeleton of the cone of the \(n\)-skeleton.

    EXAMPLES:

    Sage

        sage: # needs sage.groups
        sage: G = groups.misc.MultiplicativeAbelian([2])
        sage: B = simplicial_sets.ClassifyingSpace(G)
        sage: X = B.disjoint_union(B)
        sage: CX = B.cone()
        sage: CX.n_skeleton(3).homology()                                           # needs sage.modules
        {0: 0, 1: 0, 2: 0, 3: Z}

    Python

        >>> from sage.all import *
        >>> # needs sage.groups
        >>> G = groups.misc.MultiplicativeAbelian([Integer(2)])
        >>> B = simplicial_sets.ClassifyingSpace(G)
        >>> X = B.disjoint_union(B)
        >>> CX = B.cone()
        >>> CX.n_skeleton(Integer(3)).homology()                                           # needs sage.modules
        {0: 0, 1: 0, 2: 0, 3: Z}

class sage.topology.simplicial_set_constructions.ConeOfSimplicialSet_finite(base)

  Bases: `ConeOfSimplicialSet`, `SimplicialSet_finite`

  Return the unreduced cone on a finite simplicial set.

  INPUT:

  - `base` – return the cone on this simplicial set

  Add a point \(*\) (which will become the base point) and for each simplex \(\sigma\) in `base`, add both \(\sigma\) and a simplex made up of \(*\) and \(\sigma\) (topologically, form the join of \(*\) and \(\sigma\)).

  EXAMPLES:

  Sage

      sage: from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet
      sage: v = AbstractSimplex(0, name='v')
      sage: e = AbstractSimplex(1, name='e')
      sage: X = SimplicialSet({e: (v, v)})
      sage: CX = X.cone() # indirect doctest
      sage: CX.nondegenerate_simplices()
      [*, v, (v,*), e, (e,*)]
      sage: CX.base_point()
      *

  Python

      >>> from sage.all import *
      >>> from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet
      >>> v = AbstractSimplex(Integer(0), name='v')
      >>> e = AbstractSimplex(Integer(1), name='e')
      >>> X = SimplicialSet({e: (v, v)})
      >>> CX = X.cone() # indirect doctest
      >>> CX.nondegenerate_simplices()
      [*, v, (v,*), e, (e,*)]
      >>> CX.base_point()
      *

  base_as_subset()

    If this is the cone \(CX\) on \(X\), return \(X\) as a subsimplicial set.

    EXAMPLES:

    Sage

        sage: # needs sage.groups
        sage: X = simplicial_sets.RealProjectiveSpace(4).unset_base_point()
        sage: Y = X.cone()
        sage: Y.base_as_subset()
        Simplicial set with 5 non-degenerate simplices
        sage: Y.base_as_subset() == X
        True

    Python

        >>> from sage.all import *
        >>> # needs sage.groups
        >>> X = simplicial_sets.RealProjectiveSpace(Integer(4)).unset_base_point()
        >>> Y = X.cone()
        >>> Y.base_as_subset()
        Simplicial set with 5 non-degenerate simplices
        >>> Y.base_as_subset() == X
        True

  map_from_base()

    If this is the cone \(CX\) on \(X\), return the inclusion map from \(X\).

    EXAMPLES:

    Sage

        sage: X = simplicial_sets.Simplex(2).n_skeleton(1)
        sage: Y = X.cone()
        sage: Y.map_from_base()
        Simplicial set morphism:
          From: Simplicial set with 6 non-degenerate simplices
          To:   Cone of Simplicial set with 6 non-degenerate simplices
          Defn: [(0,), (1,), (2,), (0, 1), (0, 2), (1, 2)]
                --> [(0,), (1,), (2,), (0, 1), (0, 2), (1, 2)]

    Python

        >>> from sage.all import *
        >>> X = simplicial_sets.Simplex(Integer(2)).n_skeleton(Integer(1))
        >>> Y = X.cone()
        >>> Y.map_from_base()
        Simplicial set morphism:
          From: Simplicial set with 6 non-degenerate simplices
          To:   Cone of Simplicial set with 6 non-degenerate simplices
          Defn: [(0,), (1,), (2,), (0, 1), (0, 2), (1, 2)]
                --> [(0,), (1,), (2,), (0, 1), (0, 2), (1, 2)]

class sage.topology.simplicial_set_constructions.DisjointUnionOfSimplicialSets(factors=None)

  Bases: `PushoutOfSimplicialSets`, `Factors`

  Return the disjoint union of simplicial sets.

  INPUT:

  - `factors` – list or tuple of simplicial sets

  Discard any factors which are empty and return the disjoint union of the remaining simplicial sets in `factors`. The disjoint union comes equipped with a map from each factor, as long as all of the factors are finite.

  EXAMPLES:

  Sage

      sage: CP2 = simplicial_sets.ComplexProjectiveSpace(2)
      sage: K = simplicial_sets.KleinBottle()
      sage: W = CP2.disjoint_union(K)
      sage: W.homology()                                                          # needs sage.modules
      {0: Z, 1: Z x C2, 2: Z, 3: 0, 4: Z}

      sage: W.inclusion_map(1)
      Simplicial set morphism:
        From: Klein bottle
        To:   Disjoint union: (CP^2 u Klein bottle)
        Defn: [Delta_{0,0}, Delta_{1,0}, Delta_{1,1}, Delta_{1,2}, Delta_{2,0}, Delta_{2,1}]
              --> [Delta_{0,0}, Delta_{1,0}, Delta_{1,1}, Delta_{1,2}, Delta_{2,0}, Delta_{2,1}]

  Python

      >>> from sage.all import *
      >>> CP2 = simplicial_sets.ComplexProjectiveSpace(Integer(2))
      >>> K = simplicial_sets.KleinBottle()
      >>> W = CP2.disjoint_union(K)
      >>> W.homology()                                                          # needs sage.modules
      {0: Z, 1: Z x C2, 2: Z, 3: 0, 4: Z}

      >>> W.inclusion_map(Integer(1))
      Simplicial set morphism:
        From: Klein bottle
        To:   Disjoint union: (CP^2 u Klein bottle)
        Defn: [Delta_{0,0}, Delta_{1,0}, Delta_{1,1}, Delta_{1,2}, Delta_{2,0}, Delta_{2,1}]
              --> [Delta_{0,0}, Delta_{1,0}, Delta_{1,1}, Delta_{1,2}, Delta_{2,0}, Delta_{2,1}]

  n_skeleton(n)

    Return the \(n\)-skeleton of this simplicial set.

    That is, the simplicial set generated by all nondegenerate simplices of dimension at most \(n\).

    INPUT:

    - `n` – the dimension

    The \(n\)-skeleton of the disjoint union is computed as the disjoint union of the \(n\)-skeleta of the component simplicial sets.

    EXAMPLES:

    Sage

        sage: # needs sage.groups
        sage: G = groups.misc.MultiplicativeAbelian([2])
        sage: B = simplicial_sets.ClassifyingSpace(G)
        sage: T = simplicial_sets.Torus()
        sage: X = B.disjoint_union(T)
        sage: X.n_skeleton(3).homology()                                            # needs sage.modules
        {0: Z, 1: Z x Z x C2, 2: Z, 3: Z}

    Python

        >>> from sage.all import *
        >>> # needs sage.groups
        >>> G = groups.misc.MultiplicativeAbelian([Integer(2)])
        >>> B = simplicial_sets.ClassifyingSpace(G)
        >>> T = simplicial_sets.Torus()
        >>> X = B.disjoint_union(T)
        >>> X.n_skeleton(Integer(3)).homology()                                            # needs sage.modules
        {0: Z, 1: Z x Z x C2, 2: Z, 3: Z}

  summand(i)

    alias of `factor()`.

  summands()

    alias of `factors()`.

class sage.topology.simplicial_set_constructions.DisjointUnionOfSimplicialSets_finite(factors=None)

  Bases: `DisjointUnionOfSimplicialSets`, `PushoutOfSimplicialSets_finite`

  The disjoint union of finite simplicial sets.

  inclusion_map(i)

    Return the inclusion map of the \(i\)-th factor.

    EXAMPLES:

    Sage

        sage: S1 = simplicial_sets.Sphere(1)
        sage: S2 = simplicial_sets.Sphere(2)
        sage: W = S1.disjoint_union(S2, S1)
        sage: W.inclusion_map(1)
        Simplicial set morphism:
          From: S^2
          To:   Disjoint union: (S^1 u S^2 u S^1)
          Defn: [v_0, sigma_2] --> [v_0, sigma_2]
        sage: W.inclusion_map(0).domain()
        S^1
        sage: W.inclusion_map(2).domain()
        S^1

    Python

        >>> from sage.all import *
        >>> S1 = simplicial_sets.Sphere(Integer(1))
        >>> S2 = simplicial_sets.Sphere(Integer(2))
        >>> W = S1.disjoint_union(S2, S1)
        >>> W.inclusion_map(Integer(1))
        Simplicial set morphism:
          From: S^2
          To:   Disjoint union: (S^1 u S^2 u S^1)
          Defn: [v_0, sigma_2] --> [v_0, sigma_2]
        >>> W.inclusion_map(Integer(0)).domain()
        S^1
        >>> W.inclusion_map(Integer(2)).domain()
        S^1

class sage.topology.simplicial_set_constructions.Factors

  Bases: `object`

  Classes which inherit from this should define a `_factors` attribute for their instances, and this class accesses that attribute. This is used by `ProductOfSimplicialSets`, `WedgeOfSimplicialSets`, and `DisjointUnionOfSimplicialSets`.

  factor(i)

    Return the \(i\)-th factor of this construction of simplicial sets.

    INPUT:

    - `i` – integer; the index of the factor

    EXAMPLES:

    Sage

        sage: S2 = simplicial_sets.Sphere(2)
        sage: S3 = simplicial_sets.Sphere(3)
        sage: K = S2.disjoint_union(S3)
        sage: K.factor(0)
        S^2

        sage: # needs sage.groups
        sage: G = groups.misc.MultiplicativeAbelian([2])
        sage: B = simplicial_sets.ClassifyingSpace(G)
        sage: X = B.wedge(S3, B)
        sage: X.factor(1)
        S^3
        sage: X.factor(2)
        Classifying space of Multiplicative Abelian group isomorphic to C2

    Python

        >>> from sage.all import *
        >>> S2 = simplicial_sets.Sphere(Integer(2))
        >>> S3 = simplicial_sets.Sphere(Integer(3))
        >>> K = S2.disjoint_union(S3)
        >>> K.factor(Integer(0))
        S^2

        >>> # needs sage.groups
        >>> G = groups.misc.MultiplicativeAbelian([Integer(2)])
        >>> B = simplicial_sets.ClassifyingSpace(G)
        >>> X = B.wedge(S3, B)
        >>> X.factor(Integer(1))
        S^3
        >>> X.factor(Integer(2))
        Classifying space of Multiplicative Abelian group isomorphic to C2

  factors()

    Return the factors involved in this construction of simplicial sets.

    EXAMPLES:

    Sage

        sage: S2 = simplicial_sets.Sphere(2)
        sage: S3 = simplicial_sets.Sphere(3)
        sage: S2.wedge(S3).factors() == (S2, S3)
        True
        sage: S2.product(S3).factors()[0]
        S^2

    Python

        >>> from sage.all import *
        >>> S2 = simplicial_sets.Sphere(Integer(2))
        >>> S3 = simplicial_sets.Sphere(Integer(3))
        >>> S2.wedge(S3).factors() == (S2, S3)
        True
        >>> S2.product(S3).factors()[Integer(0)]
        S^2

class sage.topology.simplicial_set_constructions.ProductOfSimplicialSets(factors=None)

  Bases: `PullbackOfSimplicialSets`, `Factors`

  Return the product of simplicial sets.

  INPUT:

  - `factors` – list or tuple of simplicial sets

  Return the product of the simplicial sets in `factors`.

  If \(X\) and \(Y\) are simplicial sets, then their product \(X \times Y\) is defined to be the simplicial set with \(n\)-simplices \(X_n \times Y_n\). Therefore the simplices in the product have the form \((s_I \sigma, s_J \tau)\), where \(s_I = s_{i_1} ... s_{i_p}\) and \(s_J = s_{j_1} ... s_{j_q}\) are composites of degeneracy maps, written in decreasing order. Such a simplex is nondegenerate if the indices \(I\) and \(J\) are disjoint. Therefore if \(\sigma\) and \(\tau\) are nondegenerate simplices of dimensions \(m\) and \(n\), in the product they will lead to nondegenerate simplices up to dimension \(m+n\), and no further.

  This extends in the more or less obvious way to products with more than two factors: with three factors, a simplex \((s_I \sigma, s_J \tau, s_K \rho)\) is nondegenerate if \(I \cap J \cap K\) is empty, etc.

  If a simplicial set is constructed as a product, the factors are recorded and are accessible via the method `Factors.factors()`. If it is constructed as a product and then copied, this information is lost.

  EXAMPLES:

  Sage

      sage: from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet
      sage: v = AbstractSimplex(0, name='v')
      sage: w = AbstractSimplex(0, name='w')
      sage: e = AbstractSimplex(1, name='e')
      sage: X = SimplicialSet({e: (v, w)})
      sage: square = X.product(X)

  Python

      >>> from sage.all import *
      >>> from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet
      >>> v = AbstractSimplex(Integer(0), name='v')
      >>> w = AbstractSimplex(Integer(0), name='w')
      >>> e = AbstractSimplex(Integer(1), name='e')
      >>> X = SimplicialSet({e: (v, w)})
      >>> square = X.product(X)

  `square` is now the standard triangulation of the square: 4 vertices, 5 edges (the four on the border plus the diagonal), 2 triangles:

  Sage

      sage: square.f_vector()
      [4, 5, 2]

      sage: S1 = simplicial_sets.Sphere(1)
      sage: T = S1.product(S1)
      sage: T.homology(reduced=False)                                             # needs sage.modules
      {0: Z, 1: Z x Z, 2: Z}

  [Python]

      >>> from sage.all import *
      >>> square.f_vector()
      [4, 5, 2]

      >>> S1 = simplicial_sets.Sphere(Integer(1))
      >>> T = S1.product(S1)
      >>> T.homology(reduced=False)                                             # needs sage.modules
      {0: Z, 1: Z x Z, 2: Z}

  Since `S1` is pointed, so is `T`:

  Sage

      sage: S1.is_pointed()
      True
      sage: S1.base_point()
      v_0
      sage: T.is_pointed()
      True
      sage: T.base_point()
      (v_0, v_0)

      sage: S2 = simplicial_sets.Sphere(2)
      sage: S3 = simplicial_sets.Sphere(3)
      sage: Z = S2.product(S3)
      sage: Z.homology()                                                          # needs sage.modules
      {0: 0, 1: 0, 2: Z, 3: Z, 4: 0, 5: Z}

  Python

      >>> from sage.all import *
      >>> S1.is_pointed()
      True
      >>> S1.base_point()
      v_0
      >>> T.is_pointed()
      True
      >>> T.base_point()
      (v_0, v_0)

      >>> S2 = simplicial_sets.Sphere(Integer(2))
      >>> S3 = simplicial_sets.Sphere(Integer(3))
      >>> Z = S2.product(S3)
      >>> Z.homology()                                                          # needs sage.modules
      {0: 0, 1: 0, 2: Z, 3: Z, 4: 0, 5: Z}

  Products involving infinite simplicial sets:

  Sage

      sage: # needs sage.groups
      sage: G = groups.misc.MultiplicativeAbelian([2])
      sage: B = simplicial_sets.ClassifyingSpace(G)
      sage: B.rename('RP^oo')
      sage: X = B.product(B); X
      RP^oo x RP^oo
      sage: X.n_cells(1)
      [(f, f), (f, s_0 1), (s_0 1, f)]
      sage: X.homology(range(3), base_ring=GF(2))                                 # needs sage.modules
      {0: Vector space of dimension 0 over Finite Field of size 2,
       1: Vector space of dimension 2 over Finite Field of size 2,
       2: Vector space of dimension 3 over Finite Field of size 2}
      sage: Y = B.product(S2)
      sage: Y.homology(range(5), base_ring=GF(2))                                 # needs sage.modules
      {0: Vector space of dimension 0 over Finite Field of size 2,
       1: Vector space of dimension 1 over Finite Field of size 2,
       2: Vector space of dimension 2 over Finite Field of size 2,
       3: Vector space of dimension 2 over Finite Field of size 2,
       4: Vector space of dimension 2 over Finite Field of size 2}

  [Python]

      >>> from sage.all import *
      >>> # needs sage.groups
      >>> G = groups.misc.MultiplicativeAbelian([Integer(2)])
      >>> B = simplicial_sets.ClassifyingSpace(G)
      >>> B.rename('RP^oo')
      >>> X = B.product(B); X
      RP^oo x RP^oo
      >>> X.n_cells(Integer(1))
      [(f, f), (f, s_0 1), (s_0 1, f)]
      >>> X.homology(range(Integer(3)), base_ring=GF(Integer(2)))                                 # needs sage.modules
      {0: Vector space of dimension 0 over Finite Field of size 2,
       1: Vector space of dimension 2 over Finite Field of size 2,
       2: Vector space of dimension 3 over Finite Field of size 2}
      >>> Y = B.product(S2)
      >>> Y.homology(range(Integer(5)), base_ring=GF(Integer(2)))                                 # needs sage.modules
      {0: Vector space of dimension 0 over Finite Field of size 2,
       1: Vector space of dimension 1 over Finite Field of size 2,
       2: Vector space of dimension 2 over Finite Field of size 2,
       3: Vector space of dimension 2 over Finite Field of size 2,
       4: Vector space of dimension 2 over Finite Field of size 2}

  factor(i, as_subset=False)

    Return the \(i\)-th factor of the product.

    INPUT:

    - `i` – integer; the index of the factor

    - `as_subset` – boolean (default: `False`)

    If `as_subset` is `True`, return the \(i\)-th factor as a subsimplicial set of the product, identifying it with its product with the base point in each other factor. As a subsimplicial set, it comes equipped with an inclusion map. This option will raise an error if any factor does not have a base point.

    If `as_subset` is `False`, return the \(i\)-th factor in its original form as a simplicial set.

    EXAMPLES:

    Sage

        sage: S2 = simplicial_sets.Sphere(2)
        sage: S3 = simplicial_sets.Sphere(3)
        sage: K = S2.product(S3)
        sage: K.factor(0)
        S^2

        sage: K.factor(0, as_subset=True)
        Simplicial set with 2 non-degenerate simplices
        sage: K.factor(0, as_subset=True).homology()                                # needs sage.modules
        {0: 0, 1: 0, 2: Z}

        sage: K.factor(0) is S2
        True
        sage: K.factor(0, as_subset=True) is S2
        False

    Python

        >>> from sage.all import *
        >>> S2 = simplicial_sets.Sphere(Integer(2))
        >>> S3 = simplicial_sets.Sphere(Integer(3))
        >>> K = S2.product(S3)
        >>> K.factor(Integer(0))
        S^2

        >>> K.factor(Integer(0), as_subset=True)
        Simplicial set with 2 non-degenerate simplices
        >>> K.factor(Integer(0), as_subset=True).homology()                                # needs sage.modules
        {0: 0, 1: 0, 2: Z}

        >>> K.factor(Integer(0)) is S2
        True
        >>> K.factor(Integer(0), as_subset=True) is S2
        False

  n_skeleton(n)

    Return the \(n\)-skeleton of this simplicial set.

    That is, the simplicial set generated by all nondegenerate simplices of dimension at most \(n\).

    INPUT:

    - `n` – the dimension

    In the finite case, this returns the ordinary \(n\)-skeleton. In the infinite case, it computes the \(n\)-skeleton of the product of the \(n\)-skeleta of the factors.

    EXAMPLES:

    Sage

        sage: S2 = simplicial_sets.Sphere(2)
        sage: S3 = simplicial_sets.Sphere(3)
        sage: S2.product(S3).n_skeleton(2)
        Simplicial set with 2 non-degenerate simplices

        sage: # needs sage.groups
        sage: G = groups.misc.MultiplicativeAbelian([2])
        sage: B = simplicial_sets.ClassifyingSpace(G)
        sage: X = B.product(B)
        sage: X.n_skeleton(2)
        Simplicial set with 13 non-degenerate simplices

    Python

        >>> from sage.all import *
        >>> S2 = simplicial_sets.Sphere(Integer(2))
        >>> S3 = simplicial_sets.Sphere(Integer(3))
        >>> S2.product(S3).n_skeleton(Integer(2))
        Simplicial set with 2 non-degenerate simplices

        >>> # needs sage.groups
        >>> G = groups.misc.MultiplicativeAbelian([Integer(2)])
        >>> B = simplicial_sets.ClassifyingSpace(G)
        >>> X = B.product(B)
        >>> X.n_skeleton(Integer(2))
        Simplicial set with 13 non-degenerate simplices

class sage.topology.simplicial_set_constructions.ProductOfSimplicialSets_finite(factors=None)

  Bases: `ProductOfSimplicialSets`, `PullbackOfSimplicialSets_finite`

  The product of finite simplicial sets.

  When the factors are all finite, there are more methods available for the resulting product, as compared to products with infinite factors: projection maps, the wedge as a subcomplex, and the fat wedge as a subcomplex. See `projection_map()`, `wedge_as_subset()`, and `fat_wedge_as_subset()`

  fat_wedge_as_subset()

    Return the fat wedge as a subsimplicial set of this product of pointed simplicial sets.

    The fat wedge consists of those terms where at least one factor is the base point. Thus with two factors this is the ordinary wedge, but with more factors, it is larger.

    EXAMPLES:

    Sage

        sage: S1 = simplicial_sets.Sphere(1)
        sage: X = S1.product(S1, S1)
        sage: W = X.fat_wedge_as_subset()
        sage: W.homology()                                                          # needs sage.modules
        {0: 0, 1: Z x Z x Z, 2: Z x Z x Z}

    Python

        >>> from sage.all import *
        >>> S1 = simplicial_sets.Sphere(Integer(1))
        >>> X = S1.product(S1, S1)
        >>> W = X.fat_wedge_as_subset()
        >>> W.homology()                                                          # needs sage.modules
        {0: 0, 1: Z x Z x Z, 2: Z x Z x Z}

  projection_map(i)

    Return the map projecting onto the \(i\)-th factor.

    INPUT:

    - `i` – integer; the index of the projection map

    EXAMPLES:

    Sage

        sage: T = simplicial_sets.Torus()
        sage: f_0 = T.projection_map(0)
        sage: f_1 = T.projection_map(1)

        sage: # needs sage.modules
        sage: m_0 = f_0.induced_homology_morphism().to_matrix(1)  # matrix in dim 1
        sage: m_1 = f_1.induced_homology_morphism().to_matrix(1)
        sage: m_0.rank()
        1
        sage: m_0 == m_1
        False

    Python

        >>> from sage.all import *
        >>> T = simplicial_sets.Torus()
        >>> f_0 = T.projection_map(Integer(0))
        >>> f_1 = T.projection_map(Integer(1))

        >>> # needs sage.modules
        >>> m_0 = f_0.induced_homology_morphism().to_matrix(Integer(1))  # matrix in dim 1
        >>> m_1 = f_1.induced_homology_morphism().to_matrix(Integer(1))
        >>> m_0.rank()
        1
        >>> m_0 == m_1
        False

  wedge_as_subset()

    Return the wedge as a subsimplicial set of this product of pointed simplicial sets.

    This will raise an error if any factor is not pointed.

    EXAMPLES:

    Sage

        sage: from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet
        sage: v = AbstractSimplex(0, name='v')
        sage: e = AbstractSimplex(1, name='e')
        sage: w = AbstractSimplex(0, name='w')
        sage: f = AbstractSimplex(1, name='f')
        sage: X = SimplicialSet({e: (v, v)}, base_point=v)
        sage: Y = SimplicialSet({f: (w, w)}, base_point=w)
        sage: P = X.product(Y)
        sage: W = P.wedge_as_subset()
        sage: W.nondegenerate_simplices()
        [(v, w), (e, s_0 w), (s_0 v, f)]
        sage: W.homology()                                                          # needs sage.modules
        {0: 0, 1: Z x Z}

    Python

        >>> from sage.all import *
        >>> from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet
        >>> v = AbstractSimplex(Integer(0), name='v')
        >>> e = AbstractSimplex(Integer(1), name='e')
        >>> w = AbstractSimplex(Integer(0), name='w')
        >>> f = AbstractSimplex(Integer(1), name='f')
        >>> X = SimplicialSet({e: (v, v)}, base_point=v)
        >>> Y = SimplicialSet({f: (w, w)}, base_point=w)
        >>> P = X.product(Y)
        >>> W = P.wedge_as_subset()
        >>> W.nondegenerate_simplices()
        [(v, w), (e, s_0 w), (s_0 v, f)]
        >>> W.homology()                                                          # needs sage.modules
        {0: 0, 1: Z x Z}

class sage.topology.simplicial_set_constructions.PullbackOfSimplicialSets(maps=None)

  Bases: `SimplicialSet_arbitrary`, `UniqueRepresentation`

  Return the pullback obtained from the morphisms `maps`.

  INPUT:

  - `maps` – list or tuple of morphisms of simplicial sets

  If only a single map \(f: X \to Y\) is given, then return \(X\). If no maps are given, return the one-point simplicial set. Otherwise, given a simplicial set \(Y\) and maps \(f_i: X_i \to Y\) for \(0 \leq i \leq m\), construct the pullback \(P\): see Wikipedia article Pullback_(category_theory). This is constructed as pullbacks of sets for each set of \(n\)-simplices, so \(P_n\) is the subset of the product \(\prod (X_i)_n\) consisting of those elements \((x_i)\) for which \(f_i(x_i) = f_j(x_j)\) for all \(i\), \(j\).

  This is pointed if the maps \(f_i\) are.

  EXAMPLES:

  The pullback of a quotient map by a subsimplicial set and the base point map gives a simplicial set isomorphic to the original subcomplex:

  Sage

      sage: # needs sage.groups
      sage: RP5 = simplicial_sets.RealProjectiveSpace(5)
      sage: K = RP5.quotient(RP5.n_skeleton(2))
      sage: X = K.pullback(K.quotient_map(), K.base_point_map())
      sage: X.homology() == RP5.n_skeleton(2).homology()                          # needs sage.modules
      True

  Python

      >>> from sage.all import *
      >>> # needs sage.groups
      >>> RP5 = simplicial_sets.RealProjectiveSpace(Integer(5))
      >>> K = RP5.quotient(RP5.n_skeleton(Integer(2)))
      >>> X = K.pullback(K.quotient_map(), K.base_point_map())
      >>> X.homology() == RP5.n_skeleton(Integer(2)).homology()                          # needs sage.modules
      True

  Pullbacks of identity maps:

  Sage

      sage: S2 = simplicial_sets.Sphere(2)
      sage: one = S2.Hom(S2).identity()
      sage: P = S2.pullback(one, one)
      sage: P.homology()                                                          # needs sage.modules
      {0: 0, 1: 0, 2: Z}

  [Python]

      >>> from sage.all import *
      >>> S2 = simplicial_sets.Sphere(Integer(2))
      >>> one = S2.Hom(S2).identity()
      >>> P = S2.pullback(one, one)
      >>> P.homology()                                                          # needs sage.modules
      {0: 0, 1: 0, 2: Z}

  The pullback is constructed in terms of the product – of course, the product is a special case of the pullback – and the simplices are named appropriately:

  Sage

      sage: P.nondegenerate_simplices()
      [(v_0, v_0), (sigma_2, sigma_2)]

  Python

      >>> from sage.all import *
      >>> P.nondegenerate_simplices()
      [(v_0, v_0), (sigma_2, sigma_2)]

  defining_map(i)

    Return the \(i\)-th map defining the pullback.

    INPUT:

    - `i` – integer

    If this pullback was constructed as `Y.pullback(f_0, f_1, ...)`, this returns \(f_i\).

    EXAMPLES:

    Sage

        sage: # needs sage.groups
        sage: RP5 = simplicial_sets.RealProjectiveSpace(5)
        sage: K = RP5.quotient(RP5.n_skeleton(2))
        sage: Y = K.pullback(K.quotient_map(), K.base_point_map())
        sage: Y.defining_map(1)
        Simplicial set morphism:
          From: Point
          To:   Quotient: (RP^5/Simplicial set with 3 non-degenerate simplices)
          Defn: Constant map at *
        sage: Y.defining_map(0).domain()
        RP^5

    Python

        >>> from sage.all import *
        >>> # needs sage.groups
        >>> RP5 = simplicial_sets.RealProjectiveSpace(Integer(5))
        >>> K = RP5.quotient(RP5.n_skeleton(Integer(2)))
        >>> Y = K.pullback(K.quotient_map(), K.base_point_map())
        >>> Y.defining_map(Integer(1))
        Simplicial set morphism:
          From: Point
          To:   Quotient: (RP^5/Simplicial set with 3 non-degenerate simplices)
          Defn: Constant map at *
        >>> Y.defining_map(Integer(0)).domain()
        RP^5

  n_skeleton(n)

    Return the \(n\)-skeleton of this simplicial set.

    That is, the simplicial set generated by all nondegenerate simplices of dimension at most \(n\).

    INPUT:

    - `n` – the dimension

    The \(n\)-skeleton of the pullback is computed as the pullback of the \(n\)-skeleta of the component simplicial sets.

    EXAMPLES:

    Sage

        sage: # needs sage.groups
        sage: G = groups.misc.MultiplicativeAbelian([2])
        sage: B = simplicial_sets.ClassifyingSpace(G)
        sage: one = Hom(B,B).identity()
        sage: c = Hom(B,B).constant_map()
        sage: P = B.pullback(one, c)
        sage: P.n_skeleton(2)
        Pullback of maps:
          Simplicial set endomorphism of Simplicial set with 3 non-degenerate simplices
            Defn: Identity map
          Simplicial set endomorphism of Simplicial set with 3 non-degenerate simplices
            Defn: Constant map at 1
        sage: P.n_skeleton(3).homology()                                            # needs sage.modules
        {0: 0, 1: C2, 2: 0, 3: Z}

    Python

        >>> from sage.all import *
        >>> # needs sage.groups
        >>> G = groups.misc.MultiplicativeAbelian([Integer(2)])
        >>> B = simplicial_sets.ClassifyingSpace(G)
        >>> one = Hom(B,B).identity()
        >>> c = Hom(B,B).constant_map()
        >>> P = B.pullback(one, c)
        >>> P.n_skeleton(Integer(2))
        Pullback of maps:
          Simplicial set endomorphism of Simplicial set with 3 non-degenerate simplices
            Defn: Identity map
          Simplicial set endomorphism of Simplicial set with 3 non-degenerate simplices
            Defn: Constant map at 1
        >>> P.n_skeleton(Integer(3)).homology()                                            # needs sage.modules
        {0: 0, 1: C2, 2: 0, 3: Z}

class sage.topology.simplicial_set_constructions.PullbackOfSimplicialSets_finite(maps=None)

  Bases: `PullbackOfSimplicialSets`, `SimplicialSet_finite`

  The pullback of finite simplicial sets obtained from `maps`.

  When the simplicial sets involved are all finite, there are more methods available to the resulting pullback, as compared to case when some of the components are infinite: the structure maps from the pullback and the pullback’s universal property: see `structure_map()` and `universal_property()`.

  projection_map(i)

    alias of `structure_map()`.

  structure_map(i)

    Return the \(i\)-th projection map of the pullback.

    INPUT:

    - `i` – integer

    If this pullback \(P\) was constructed as `Y.pullback(f_0, f_1, ...)`, where \(f_i: X_i \to Y\), then there are structure maps \(\bar{f}_i: P \to X_i\). This method constructs \(\bar{f}_i\).

    EXAMPLES:

    Sage

        sage: # needs sage.groups
        sage: RP5 = simplicial_sets.RealProjectiveSpace(5)
        sage: K = RP5.quotient(RP5.n_skeleton(2))
        sage: Y = K.pullback(K.quotient_map(), K.base_point_map())
        sage: Y.structure_map(0)
        Simplicial set morphism:
          From: Pullback of maps:
          Simplicial set morphism:
            From: RP^5
            To:   Quotient: (RP^5/Simplicial set with 3 non-degenerate simplices)
            Defn: [1, f, f * f, f * f * f, f * f * f * f, f * f * f * f * f]
                  --> [*, s_0 *, s_1 s_0 *, f * f * f, f * f * f * f, f * f * f * f * f]
          Simplicial set morphism:
            From: Point
            To:   Quotient: (RP^5/Simplicial set with 3 non-degenerate simplices)
            Defn: Constant map at *
          To:   RP^5
          Defn: [(1, *), (f, s_0 *), (f * f, s_1 s_0 *)] --> [1, f, f * f]
        sage: Y.structure_map(1).codomain()
        Point

    Python

        >>> from sage.all import *
        >>> # needs sage.groups
        >>> RP5 = simplicial_sets.RealProjectiveSpace(Integer(5))
        >>> K = RP5.quotient(RP5.n_skeleton(Integer(2)))
        >>> Y = K.pullback(K.quotient_map(), K.base_point_map())
        >>> Y.structure_map(Integer(0))
        Simplicial set morphism:
          From: Pullback of maps:
          Simplicial set morphism:
            From: RP^5
            To:   Quotient: (RP^5/Simplicial set with 3 non-degenerate simplices)
            Defn: [1, f, f * f, f * f * f, f * f * f * f, f * f * f * f * f]
                  --> [*, s_0 *, s_1 s_0 *, f * f * f, f * f * f * f, f * f * f * f * f]
          Simplicial set morphism:
            From: Point
            To:   Quotient: (RP^5/Simplicial set with 3 non-degenerate simplices)
            Defn: Constant map at *
          To:   RP^5
          Defn: [(1, *), (f, s_0 *), (f * f, s_1 s_0 *)] --> [1, f, f * f]
        >>> Y.structure_map(Integer(1)).codomain()
        Point

    These maps are also accessible via `projection_map()`:

    Sage

        sage: Y.projection_map(1).codomain()                                        # needs sage.groups
        Point

    [Python]

        >>> from sage.all import *
        >>> Y.projection_map(Integer(1)).codomain()                                        # needs sage.groups
        Point

  universal_property(*maps)

    Return the map induced by `maps`.

    INPUT:

    - `maps` – maps from a simplicial set \(Z\) to the “factors” \(X_i\) forming the pullback

    If the pullback \(P\) is formed by maps \(f_i: X_i \to Y\), then given maps \(g_i: Z \to X_i\) such that \(f_i g_i = f_j g_j\) for all \(i\), \(j\), then there is a unique map \(g: Z \to P\) making the appropriate diagram commute. This constructs that map.

    EXAMPLES:

    Sage

        sage: S1 = simplicial_sets.Sphere(1)
        sage: T = S1.product(S1)
        sage: K = T.factor(0, as_subset=True)
        sage: f = S1.Hom(T)({S1.n_cells(0)[0]: K.n_cells(0)[0],
        ....:                S1.n_cells(1)[0]: K.n_cells(1)[0]})
        sage: P = S1.product(T)
        sage: P.universal_property(S1.Hom(S1).identity(), f)
        Simplicial set morphism:
          From: S^1
          To:   S^1 x S^1 x S^1
          Defn: [v_0, sigma_1] --> [(v_0, (v_0, v_0)), (sigma_1, (sigma_1, s_0 v_0))]

    Python

        >>> from sage.all import *
        >>> S1 = simplicial_sets.Sphere(Integer(1))
        >>> T = S1.product(S1)
        >>> K = T.factor(Integer(0), as_subset=True)
        >>> f = S1.Hom(T)({S1.n_cells(Integer(0))[Integer(0)]: K.n_cells(Integer(0))[Integer(0)],
        ...                S1.n_cells(Integer(1))[Integer(0)]: K.n_cells(Integer(1))[Integer(0)]})
        >>> P = S1.product(T)
        >>> P.universal_property(S1.Hom(S1).identity(), f)
        Simplicial set morphism:
          From: S^1
          To:   S^1 x S^1 x S^1
          Defn: [v_0, sigma_1] --> [(v_0, (v_0, v_0)), (sigma_1, (sigma_1, s_0 v_0))]

class sage.topology.simplicial_set_constructions.PushoutOfSimplicialSets(maps=None, vertex_name=None)

  Bases: `SimplicialSet_arbitrary`, `UniqueRepresentation`

  Return the pushout obtained from the morphisms `maps`.

  INPUT:

  - `maps` – list or tuple of morphisms of simplicial sets

  - `vertex_name` – (default: `None`)

  If only a single map \(f: X \to Y\) is given, then return \(Y\). If no maps are given, return the empty simplicial set. Otherwise, given a simplicial set \(X\) and maps \(f_i: X \to Y_i\) for \(0 \leq i \leq m\), construct the pushout \(P\): see Wikipedia article Pushout_(category_theory). This is constructed as pushouts of sets for each set of \(n\)-simplices, so \(P_n\) is the disjoint union of the sets \((Y_i)_n\), with elements \(f_i(x)\) identified for \(n\)-simplex \(x\) in \(X\).

  Simplices in the pushout are given names as follows: if a simplex comes from a single \(Y_i\), it inherits its name. Otherwise it must come from a simplex (or several) in \(X\), and then it inherits one of those names, and it should be the first alphabetically. For example, if vertices \(v\), \(w\), and \(z\) in \(X\) are glued together, then the resulting vertex in the pushout will be called \(v\).

  Base points are taken care of automatically: if each of the maps \(f_i\) is pointed, so is the pushout. If \(X\) is a point or if \(X\) is nonempty and any of the spaces \(Y_i\) is a point, use those for the base point. In all of these cases, if `vertex_name` is `None`, generate the name of the base point automatically; otherwise, use `vertex_name` for its name.

  In all other cases, the pushout is not pointed.

  EXAMPLES:

  Sage

      sage: from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet
      sage: v = AbstractSimplex(0, name='v')
      sage: a = AbstractSimplex(0, name='a')
      sage: b = AbstractSimplex(0, name='b')
      sage: c = AbstractSimplex(0, name='c')
      sage: e0 = AbstractSimplex(1, name='e_0')
      sage: e1 = AbstractSimplex(1, name='e_1')
      sage: e2 = AbstractSimplex(1, name='e_2')
      sage: X = SimplicialSet({e2: (b, a)})
      sage: Y0 = SimplicialSet({e2: (b,a), e0: (c,b), e1: (c,a)})
      sage: Y1 = simplicial_sets.Simplex(0)
      sage: f0_data = {a:a, b:b, e2: e2}
      sage: v = Y1.n_cells(0)[0]
      sage: f1_data = {a:v, b:v, e2:v.apply_degeneracies(0)}
      sage: f0 = X.Hom(Y0)(f0_data)
      sage: f1 = X.Hom(Y1)(f1_data)
      sage: P = X.pushout(f0, f1)
      sage: P.nondegenerate_simplices()
      [a, c, e_0, e_1]

  Python

      >>> from sage.all import *
      >>> from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet
      >>> v = AbstractSimplex(Integer(0), name='v')
      >>> a = AbstractSimplex(Integer(0), name='a')
      >>> b = AbstractSimplex(Integer(0), name='b')
      >>> c = AbstractSimplex(Integer(0), name='c')
      >>> e0 = AbstractSimplex(Integer(1), name='e_0')
      >>> e1 = AbstractSimplex(Integer(1), name='e_1')
      >>> e2 = AbstractSimplex(Integer(1), name='e_2')
      >>> X = SimplicialSet({e2: (b, a)})
      >>> Y0 = SimplicialSet({e2: (b,a), e0: (c,b), e1: (c,a)})
      >>> Y1 = simplicial_sets.Simplex(Integer(0))
      >>> f0_data = {a:a, b:b, e2: e2}
      >>> v = Y1.n_cells(Integer(0))[Integer(0)]
      >>> f1_data = {a:v, b:v, e2:v.apply_degeneracies(Integer(0))}
      >>> f0 = X.Hom(Y0)(f0_data)
      >>> f1 = X.Hom(Y1)(f1_data)
      >>> P = X.pushout(f0, f1)
      >>> P.nondegenerate_simplices()
      [a, c, e_0, e_1]

  There are defining maps \(f_i: X \to Y_i\) and structure maps \(\bar{f}_i: Y_i \to P\); the latter are only implemented in Sage when each \(Y_i\) is finite.

  Sage

      sage: P.defining_map(0) == f0
      True
      sage: P.structure_map(1)
      Simplicial set morphism:
        From: 0-simplex
        To:   Pushout of maps:
        Simplicial set morphism:
          From: Simplicial set with 3 non-degenerate simplices
          To:   Simplicial set with 6 non-degenerate simplices
          Defn: [a, b, e_2] --> [a, b, e_2]
        Simplicial set morphism:
          From: Simplicial set with 3 non-degenerate simplices
          To:   0-simplex
          Defn: Constant map at (0,)
        Defn: Constant map at a
      sage: P.structure_map(0).domain() == Y0
      True
      sage: P.structure_map(0).codomain() == P
      True

  [Python]

      >>> from sage.all import *
      >>> P.defining_map(Integer(0)) == f0
      True
      >>> P.structure_map(Integer(1))
      Simplicial set morphism:
        From: 0-simplex
        To:   Pushout of maps:
        Simplicial set morphism:
          From: Simplicial set with 3 non-degenerate simplices
          To:   Simplicial set with 6 non-degenerate simplices
          Defn: [a, b, e_2] --> [a, b, e_2]
        Simplicial set morphism:
          From: Simplicial set with 3 non-degenerate simplices
          To:   0-simplex
          Defn: Constant map at (0,)
        Defn: Constant map at a
      >>> P.structure_map(Integer(0)).domain() == Y0
      True
      >>> P.structure_map(Integer(0)).codomain() == P
      True

  An inefficient way of constructing a suspension for an unpointed set: take the pushout of two copies of the inclusion map \(X \to CX\):

  Sage

      sage: T = simplicial_sets.Torus()
      sage: T = T.unset_base_point()
      sage: CT = T.cone()
      sage: inc = CT.base_as_subset().inclusion_map()
      sage: P = T.pushout(inc, inc)
      sage: P.homology()                                                          # needs sage.modules
      {0: 0, 1: 0, 2: Z x Z, 3: Z}
      sage: len(P.nondegenerate_simplices())
      20

  Python

      >>> from sage.all import *
      >>> T = simplicial_sets.Torus()
      >>> T = T.unset_base_point()
      >>> CT = T.cone()
      >>> inc = CT.base_as_subset().inclusion_map()
      >>> P = T.pushout(inc, inc)
      >>> P.homology()                                                          # needs sage.modules
      {0: 0, 1: 0, 2: Z x Z, 3: Z}
      >>> len(P.nondegenerate_simplices())
      20

  It is more efficient to construct the suspension as the quotient \(CX/X\):

  Sage

      sage: len(CT.quotient(CT.base_as_subset()).nondegenerate_simplices())
      8

  [Python]

      >>> from sage.all import *
      >>> len(CT.quotient(CT.base_as_subset()).nondegenerate_simplices())
      8

  It is more efficient still if the original simplicial set has a base point:

  Sage

      sage: T = simplicial_sets.Torus()
      sage: len(T.suspension().nondegenerate_simplices())
      6

      sage: S1 = simplicial_sets.Sphere(1)
      sage: pt = simplicial_sets.Point()
      sage: bouquet = pt.pushout(S1.base_point_map(),
      ....:                      S1.base_point_map(),
      ....:                      S1.base_point_map())
      sage: bouquet.homology(1)                                                   # needs sage.modules
      Z x Z x Z

  Python

      >>> from sage.all import *
      >>> T = simplicial_sets.Torus()
      >>> len(T.suspension().nondegenerate_simplices())
      6

      >>> S1 = simplicial_sets.Sphere(Integer(1))
      >>> pt = simplicial_sets.Point()
      >>> bouquet = pt.pushout(S1.base_point_map(),
      ...                      S1.base_point_map(),
      ...                      S1.base_point_map())
      >>> bouquet.homology(Integer(1))                                                   # needs sage.modules
      Z x Z x Z

  defining_map(i)

    Return the \(i\)-th map defining the pushout.

    INPUT:

    - `i` – integer

    If this pushout was constructed as `X.pushout(f_0, f_1, ...)`, this returns \(f_i\).

    EXAMPLES:

    Sage

        sage: S1 = simplicial_sets.Sphere(1)
        sage: T = simplicial_sets.Torus()
        sage: X = S1.wedge(T)  # a pushout
        sage: X.defining_map(0)
        Simplicial set morphism:
          From: Point
          To:   S^1
          Defn: Constant map at v_0
        sage: X.defining_map(1).domain()
        Point
        sage: X.defining_map(1).codomain()
        Torus

    Python

        >>> from sage.all import *
        >>> S1 = simplicial_sets.Sphere(Integer(1))
        >>> T = simplicial_sets.Torus()
        >>> X = S1.wedge(T)  # a pushout
        >>> X.defining_map(Integer(0))
        Simplicial set morphism:
          From: Point
          To:   S^1
          Defn: Constant map at v_0
        >>> X.defining_map(Integer(1)).domain()
        Point
        >>> X.defining_map(Integer(1)).codomain()
        Torus

  n_skeleton(n)

    Return the \(n\)-skeleton of this simplicial set.

    That is, the simplicial set generated by all nondegenerate simplices of dimension at most \(n\).

    INPUT:

    - `n` – the dimension

    The \(n\)-skeleton of the pushout is computed as the pushout of the \(n\)-skeleta of the component simplicial sets.

    EXAMPLES:

    Sage

        sage: # needs sage.groups
        sage: G = groups.misc.MultiplicativeAbelian([2])
        sage: B = simplicial_sets.ClassifyingSpace(G)
        sage: K = B.n_skeleton(3)
        sage: Q = K.pushout(K.inclusion_map(), K.constant_map())
        sage: Q.n_skeleton(5).homology()                                            # needs sage.modules
        {0: 0, 1: 0, 2: 0, 3: 0, 4: Z, 5: Z}

    Python

        >>> from sage.all import *
        >>> # needs sage.groups
        >>> G = groups.misc.MultiplicativeAbelian([Integer(2)])
        >>> B = simplicial_sets.ClassifyingSpace(G)
        >>> K = B.n_skeleton(Integer(3))
        >>> Q = K.pushout(K.inclusion_map(), K.constant_map())
        >>> Q.n_skeleton(Integer(5)).homology()                                            # needs sage.modules
        {0: 0, 1: 0, 2: 0, 3: 0, 4: Z, 5: Z}

    Of course, computing the \(n\)-skeleton and then taking homology need not yield the same answer as asking for homology through dimension \(n\), since the latter computation will use the \((n+1)\)-skeleton:

    Sage

        sage: Q.homology(range(6))                                                  # needs sage.groups sage.modules
        {0: 0, 1: 0, 2: 0, 3: 0, 4: Z, 5: C2}

    [Python]

        >>> from sage.all import *
        >>> Q.homology(range(Integer(6)))                                                  # needs sage.groups sage.modules
        {0: 0, 1: 0, 2: 0, 3: 0, 4: Z, 5: C2}

class sage.topology.simplicial_set_constructions.PushoutOfSimplicialSets_finite(maps=None, vertex_name=None)

  Bases: `PushoutOfSimplicialSets`, `SimplicialSet_finite`

  The pushout of finite simplicial sets obtained from `maps`.

  When the simplicial sets involved are all finite, there are more methods available to the resulting pushout, as compared to case when some of the components are infinite: the structure maps to the pushout and the pushout’s universal property: see `structure_map()` and `universal_property()`.

  structure_map(i)

    Return the \(i\)-th structure map of the pushout.

    INPUT:

    - `i` – integer

    If this pushout \(Z\) was constructed as `X.pushout(f_0, f_1, ...)`, where \(f_i: X \to Y_i\), then there are structure maps \(\bar{f}_i: Y_i \to Z\). This method constructs \(\bar{f}_i\).

    EXAMPLES:

    Sage

        sage: S1 = simplicial_sets.Sphere(1)
        sage: T = simplicial_sets.Torus()
        sage: X = S1.disjoint_union(T)  # a pushout
        sage: X.structure_map(0)
        Simplicial set morphism:
          From: S^1
          To:   Disjoint union: (S^1 u Torus)
          Defn: [v_0, sigma_1] --> [v_0, sigma_1]
        sage: X.structure_map(1).domain()
        Torus
        sage: X.structure_map(1).codomain()
        Disjoint union: (S^1 u Torus)

    Python

        >>> from sage.all import *
        >>> S1 = simplicial_sets.Sphere(Integer(1))
        >>> T = simplicial_sets.Torus()
        >>> X = S1.disjoint_union(T)  # a pushout
        >>> X.structure_map(Integer(0))
        Simplicial set morphism:
          From: S^1
          To:   Disjoint union: (S^1 u Torus)
          Defn: [v_0, sigma_1] --> [v_0, sigma_1]
        >>> X.structure_map(Integer(1)).domain()
        Torus
        >>> X.structure_map(Integer(1)).codomain()
        Disjoint union: (S^1 u Torus)

  universal_property(*maps)

    Return the map induced by `maps`.

    INPUT:

    - `maps` – maps “factors” \(Y_i\) forming the pushout to a fixed simplicial set \(Z\)

    If the pushout \(P\) is formed by maps \(f_i: X \to Y_i\), then given maps \(g_i: Y_i \to Z\) such that \(g_i f_i = g_j f_j\) for all \(i\), \(j\), then there is a unique map \(g: P \to Z\) making the appropriate diagram commute. This constructs that map.

    EXAMPLES:

    Sage

        sage: from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet
        sage: v = AbstractSimplex(0, name='v')
        sage: w = AbstractSimplex(0, name='w')
        sage: x = AbstractSimplex(0, name='x')
        sage: evw = AbstractSimplex(1, name='vw')
        sage: evx = AbstractSimplex(1, name='vx')
        sage: ewx = AbstractSimplex(1, name='wx')
        sage: X = SimplicialSet({evw: (w, v), evx: (x, v)})
        sage: Y_0 = SimplicialSet({evw: (w, v), evx: (x, v), ewx: (x, w)})
        sage: Y_1 = SimplicialSet({evx: (x, v)})

        sage: f_0 = Hom(X, Y_0)({v:v, w:w, x:x, evw:evw, evx:evx})
        sage: f_1 = Hom(X, Y_1)({v:v, w:v, x:x,
        ....:                    evw:v.apply_degeneracies(0), evx:evx})
        sage: P = X.pushout(f_0, f_1)

        sage: one = Hom(Y_1, Y_1).identity()
        sage: g = Hom(Y_0, Y_1)({v:v, w:v, x:x,
        ....:                    evw:v.apply_degeneracies(0), evx:evx, ewx:evx})
        sage: P.universal_property(g, one)
        Simplicial set morphism:
          From: Pushout of maps:
          Simplicial set morphism:
            From: Simplicial set with 5 non-degenerate simplices
            To:   Simplicial set with 6 non-degenerate simplices
            Defn: [v, w, x, vw, vx] --> [v, w, x, vw, vx]
          Simplicial set morphism:
            From: Simplicial set with 5 non-degenerate simplices
            To:   Simplicial set with 3 non-degenerate simplices
            Defn: [v, w, x, vw, vx] --> [v, v, x, s_0 v, vx]
          To:   Simplicial set with 3 non-degenerate simplices
          Defn: [v, x, vx, wx] --> [v, x, vx, vx]

    Python

        >>> from sage.all import *
        >>> from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet
        >>> v = AbstractSimplex(Integer(0), name='v')
        >>> w = AbstractSimplex(Integer(0), name='w')
        >>> x = AbstractSimplex(Integer(0), name='x')
        >>> evw = AbstractSimplex(Integer(1), name='vw')
        >>> evx = AbstractSimplex(Integer(1), name='vx')
        >>> ewx = AbstractSimplex(Integer(1), name='wx')
        >>> X = SimplicialSet({evw: (w, v), evx: (x, v)})
        >>> Y_0 = SimplicialSet({evw: (w, v), evx: (x, v), ewx: (x, w)})
        >>> Y_1 = SimplicialSet({evx: (x, v)})

        >>> f_0 = Hom(X, Y_0)({v:v, w:w, x:x, evw:evw, evx:evx})
        >>> f_1 = Hom(X, Y_1)({v:v, w:v, x:x,
        ...                    evw:v.apply_degeneracies(Integer(0)), evx:evx})
        >>> P = X.pushout(f_0, f_1)

        >>> one = Hom(Y_1, Y_1).identity()
        >>> g = Hom(Y_0, Y_1)({v:v, w:v, x:x,
        ...                    evw:v.apply_degeneracies(Integer(0)), evx:evx, ewx:evx})
        >>> P.universal_property(g, one)
        Simplicial set morphism:
          From: Pushout of maps:
          Simplicial set morphism:
            From: Simplicial set with 5 non-degenerate simplices
            To:   Simplicial set with 6 non-degenerate simplices
            Defn: [v, w, x, vw, vx] --> [v, w, x, vw, vx]
          Simplicial set morphism:
            From: Simplicial set with 5 non-degenerate simplices
            To:   Simplicial set with 3 non-degenerate simplices
            Defn: [v, w, x, vw, vx] --> [v, v, x, s_0 v, vx]
          To:   Simplicial set with 3 non-degenerate simplices
          Defn: [v, x, vx, wx] --> [v, x, vx, vx]

class sage.topology.simplicial_set_constructions.QuotientOfSimplicialSet(inclusion, vertex_name='*')

  Bases: `PushoutOfSimplicialSets`

  Return the quotient of a simplicial set by a subsimplicial set.

  INPUT:

  - `inclusion` – inclusion map of a subcomplex (= subsimplicial set) of a simplicial set

  - `vertex_name` – string (default: `'*'`)

  A subcomplex \(A\) comes equipped with the inclusion map \(A \to X\) to its ambient complex \(X\), and this constructs the quotient \(X/A\), collapsing \(A\) to a point. The resulting point is called `vertex_name`, which is `'*'` by default.

  When the simplicial sets involved are finite, there is a `QuotientOfSimplicialSet_finite.quotient_map()` method available.

  EXAMPLES:

  Sage

      sage: # needs sage.groups
      sage: RP5 = simplicial_sets.RealProjectiveSpace(5)
      sage: RP2 = RP5.n_skeleton(2)
      sage: RP5_2 = RP5.quotient(RP2); RP5_2
      Quotient: (RP^5/Simplicial set with 3 non-degenerate simplices)
      sage: RP5_2.quotient_map()
      Simplicial set morphism:
        From: RP^5
        To:   Quotient: (RP^5/Simplicial set with 3 non-degenerate simplices)
        Defn: [1, f, f * f, f * f * f, f * f * f * f, f * f * f * f * f]
              --> [*, s_0 *, s_1 s_0 *, f * f * f, f * f * f * f, f * f * f * f * f]

  Python

      >>> from sage.all import *
      >>> # needs sage.groups
      >>> RP5 = simplicial_sets.RealProjectiveSpace(Integer(5))
      >>> RP2 = RP5.n_skeleton(Integer(2))
      >>> RP5_2 = RP5.quotient(RP2); RP5_2
      Quotient: (RP^5/Simplicial set with 3 non-degenerate simplices)
      >>> RP5_2.quotient_map()
      Simplicial set morphism:
        From: RP^5
        To:   Quotient: (RP^5/Simplicial set with 3 non-degenerate simplices)
        Defn: [1, f, f * f, f * f * f, f * f * f * f, f * f * f * f * f]
              --> [*, s_0 *, s_1 s_0 *, f * f * f, f * f * f * f, f * f * f * f * f]

  ambient()

    Return the ambient space.

    That is, if this quotient is \(K/L\), return \(K\).

    EXAMPLES:

    Sage

        sage: # needs sage.groups
        sage: RP5 = simplicial_sets.RealProjectiveSpace(5)
        sage: RP2 = RP5.n_skeleton(2)
        sage: RP5_2 = RP5.quotient(RP2)
        sage: RP5_2.ambient()
        RP^5

        sage: # needs sage.groups
        sage: G = groups.misc.MultiplicativeAbelian([2])
        sage: B = simplicial_sets.ClassifyingSpace(G)
        sage: K = B.n_skeleton(3)
        sage: Q = B.quotient(K)
        sage: Q.ambient()
        Classifying space of Multiplicative Abelian group isomorphic to C2

    Python

        >>> from sage.all import *
        >>> # needs sage.groups
        >>> RP5 = simplicial_sets.RealProjectiveSpace(Integer(5))
        >>> RP2 = RP5.n_skeleton(Integer(2))
        >>> RP5_2 = RP5.quotient(RP2)
        >>> RP5_2.ambient()
        RP^5

        >>> # needs sage.groups
        >>> G = groups.misc.MultiplicativeAbelian([Integer(2)])
        >>> B = simplicial_sets.ClassifyingSpace(G)
        >>> K = B.n_skeleton(Integer(3))
        >>> Q = B.quotient(K)
        >>> Q.ambient()
        Classifying space of Multiplicative Abelian group isomorphic to C2

  n_skeleton(n)

    Return the \(n\)-skeleton of this simplicial set.

    That is, the simplicial set generated by all nondegenerate simplices of dimension at most \(n\).

    INPUT:

    - `n` – the dimension

    The \(n\)-skeleton of the quotient is computed as the quotient of the \(n\)-skeleta.

    EXAMPLES:

    Sage

        sage: # needs sage.groups
        sage: G = groups.misc.MultiplicativeAbelian([2])
        sage: B = simplicial_sets.ClassifyingSpace(G)
        sage: K = B.n_skeleton(3)
        sage: Q = B.quotient(K)
        sage: Q.n_skeleton(6)
        Quotient: (Simplicial set with 7
                   non-degenerate simplices/Simplicial set with 4
                                            non-degenerate simplices)
        sage: Q.n_skeleton(6).homology()                                            # needs sage.modules
        {0: 0, 1: 0, 2: 0, 3: 0, 4: Z, 5: C2, 6: 0}

    Python

        >>> from sage.all import *
        >>> # needs sage.groups
        >>> G = groups.misc.MultiplicativeAbelian([Integer(2)])
        >>> B = simplicial_sets.ClassifyingSpace(G)
        >>> K = B.n_skeleton(Integer(3))
        >>> Q = B.quotient(K)
        >>> Q.n_skeleton(Integer(6))
        Quotient: (Simplicial set with 7
                   non-degenerate simplices/Simplicial set with 4
                                            non-degenerate simplices)
        >>> Q.n_skeleton(Integer(6)).homology()                                            # needs sage.modules
        {0: 0, 1: 0, 2: 0, 3: 0, 4: Z, 5: C2, 6: 0}

  subcomplex()

    Return the subcomplex space associated to this quotient.

    That is, if this quotient is \(K/L\), return \(L\).

    EXAMPLES:

    Sage

        sage: # needs sage.groups
        sage: RP5 = simplicial_sets.RealProjectiveSpace(5)
        sage: RP2 = RP5.n_skeleton(2)
        sage: RP5_2 = RP5.quotient(RP2)
        sage: RP5_2.subcomplex()
        Simplicial set with 3 non-degenerate simplices

        sage: # needs sage.groups
        sage: G = groups.misc.MultiplicativeAbelian([2])
        sage: B = simplicial_sets.ClassifyingSpace(G)
        sage: K = B.n_skeleton(3)
        sage: Q = B.quotient(K)
        sage: Q.subcomplex()
        Simplicial set with 4 non-degenerate simplices

    Python

        >>> from sage.all import *
        >>> # needs sage.groups
        >>> RP5 = simplicial_sets.RealProjectiveSpace(Integer(5))
        >>> RP2 = RP5.n_skeleton(Integer(2))
        >>> RP5_2 = RP5.quotient(RP2)
        >>> RP5_2.subcomplex()
        Simplicial set with 3 non-degenerate simplices

        >>> # needs sage.groups
        >>> G = groups.misc.MultiplicativeAbelian([Integer(2)])
        >>> B = simplicial_sets.ClassifyingSpace(G)
        >>> K = B.n_skeleton(Integer(3))
        >>> Q = B.quotient(K)
        >>> Q.subcomplex()
        Simplicial set with 4 non-degenerate simplices

class sage.topology.simplicial_set_constructions.QuotientOfSimplicialSet_finite(inclusion, vertex_name='*')

  Bases: `QuotientOfSimplicialSet`, `PushoutOfSimplicialSets_finite`

  The quotient of finite simplicial sets.

  When the simplicial sets involved are finite, there is a `quotient_map()` method available.

  quotient_map()

    Return the quotient map from the original simplicial set to the quotient.

    EXAMPLES:

    Sage

        sage: K = simplicial_sets.Simplex(1)
        sage: S1 = K.quotient(K.n_skeleton(0))
        sage: q = S1.quotient_map()
        sage: q
        Simplicial set morphism:
          From: 1-simplex
          To:   Quotient: (1-simplex/Simplicial set with 2 non-degenerate simplices)
          Defn: [(0,), (1,), (0, 1)] --> [*, *, (0, 1)]
        sage: q.domain() == K
        True
        sage: q.codomain() == S1
        True

    Python

        >>> from sage.all import *
        >>> K = simplicial_sets.Simplex(Integer(1))
        >>> S1 = K.quotient(K.n_skeleton(Integer(0)))
        >>> q = S1.quotient_map()
        >>> q
        Simplicial set morphism:
          From: 1-simplex
          To:   Quotient: (1-simplex/Simplicial set with 2 non-degenerate simplices)
          Defn: [(0,), (1,), (0, 1)] --> [*, *, (0, 1)]
        >>> q.domain() == K
        True
        >>> q.codomain() == S1
        True

class sage.topology.simplicial_set_constructions.ReducedConeOfSimplicialSet(base)

  Bases: `QuotientOfSimplicialSet`

  Return the reduced cone on a simplicial set.

  INPUT:

  - `base` – return the cone on this simplicial set

  Start with the unreduced cone: take `base` and add a point \(*\) (which will become the base point) and for each simplex \(\sigma\) in `base`, add both \(\sigma\) and a simplex made up of \(*\) and \(\sigma\) (topologically, form the join of \(*\) and \(\sigma\)).

  Now reduce: take the quotient by the 1-simplex connecting the old base point to the new one.

  EXAMPLES:

  Sage

      sage: from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet
      sage: v = AbstractSimplex(0, name='v')
      sage: e = AbstractSimplex(1, name='e')
      sage: X = SimplicialSet({e: (v, v)})
      sage: X = X.set_base_point(v)
      sage: CX = X.cone()  # indirect doctest
      sage: CX.nondegenerate_simplices()
      [*, e, (e,*)]

  Python

      >>> from sage.all import *
      >>> from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet
      >>> v = AbstractSimplex(Integer(0), name='v')
      >>> e = AbstractSimplex(Integer(1), name='e')
      >>> X = SimplicialSet({e: (v, v)})
      >>> X = X.set_base_point(v)
      >>> CX = X.cone()  # indirect doctest
      >>> CX.nondegenerate_simplices()
      [*, e, (e,*)]

  n_skeleton(n)

    Return the \(n\)-skeleton of this simplicial set.

    That is, the simplicial set generated by all nondegenerate simplices of dimension at most \(n\).

    INPUT:

    - `n` – the dimension

    In the case when the cone is infinite, the \(n\)-skeleton of the cone is computed as the \(n\)-skeleton of the cone of the \(n\)-skeleton.

    EXAMPLES:

    Sage

        sage: G = groups.misc.MultiplicativeAbelian([2])                            # needs sage.groups
        sage: B = simplicial_sets.ClassifyingSpace(G)                               # needs sage.groups
        sage: B.cone().n_skeleton(3).homology()                                     # needs sage.groups sage.modules
        {0: 0, 1: 0, 2: 0, 3: Z}

    Python

        >>> from sage.all import *
        >>> G = groups.misc.MultiplicativeAbelian([Integer(2)])                            # needs sage.groups
        >>> B = simplicial_sets.ClassifyingSpace(G)                               # needs sage.groups
        >>> B.cone().n_skeleton(Integer(3)).homology()                                     # needs sage.groups sage.modules
        {0: 0, 1: 0, 2: 0, 3: Z}

class sage.topology.simplicial_set_constructions.ReducedConeOfSimplicialSet_finite(base)

  Bases: `ReducedConeOfSimplicialSet`, `QuotientOfSimplicialSet_finite`

  Return the reduced cone on a simplicial set.

  INPUT:

  - `base` – return the cone on this simplicial set

  Start with the unreduced cone: take `base` and add a point \(*\) (which will become the base point) and for each simplex \(\sigma\) in `base`, add both \(\sigma\) and a simplex made up of \(*\) and \(\sigma\) (topologically, form the join of \(*\) and \(\sigma\)).

  Now reduce: take the quotient by the 1-simplex connecting the old base point to the new one.

  EXAMPLES:

  Sage

      sage: from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet
      sage: v = AbstractSimplex(0, name='v')
      sage: e = AbstractSimplex(1, name='e')
      sage: X = SimplicialSet({e: (v, v)})
      sage: X = X.set_base_point(v)
      sage: CX = X.cone()  # indirect doctest
      sage: CX.nondegenerate_simplices()
      [*, e, (e,*)]

  Python

      >>> from sage.all import *
      >>> from sage.topology.simplicial_set import AbstractSimplex, SimplicialSet
      >>> v = AbstractSimplex(Integer(0), name='v')
      >>> e = AbstractSimplex(Integer(1), name='e')
      >>> X = SimplicialSet({e: (v, v)})
      >>> X = X.set_base_point(v)
      >>> CX = X.cone()  # indirect doctest
      >>> CX.nondegenerate_simplices()
      [*, e, (e,*)]

  map_from_base()

    If this is the cone \(\tilde{C}X\) on \(X\), return the map from \(X\).

    The map is defined to be the composite \(X \to CX \to \tilde{C}X\). This is used by the `SuspensionOfSimplicialSet_finite` class to construct the reduced suspension: take the quotient of the reduced cone by the image of \(X\) therein.

    EXAMPLES:

    Sage

        sage: S3 = simplicial_sets.Sphere(3)
        sage: CS3 = S3.cone()
        sage: CS3.map_from_base()
        Simplicial set morphism:
          From: S^3
          To:   Reduced cone of S^3
          Defn: [v_0, sigma_3] --> [*, sigma_3]

    Python

        >>> from sage.all import *
        >>> S3 = simplicial_sets.Sphere(Integer(3))
        >>> CS3 = S3.cone()
        >>> CS3.map_from_base()
        Simplicial set morphism:
          From: S^3
          To:   Reduced cone of S^3
          Defn: [v_0, sigma_3] --> [*, sigma_3]

class sage.topology.simplicial_set_constructions.SmashProductOfSimplicialSets_finite(factors=None)

  Bases: `QuotientOfSimplicialSet_finite`, `Factors`

  Return the smash product of finite pointed simplicial sets.

  INPUT:

  - `factors` – list or tuple of simplicial sets

  Return the smash product of the simplicial sets in `factors`: the smash product \(X \wedge Y\) is defined to be the quotient \((X \times Y) / (X \vee Y)\), where \(X \vee Y\) is the wedge sum.

  Each element of `factors` must be finite and pointed. (As of July 2016, constructing the wedge as a subcomplex of the product is only possible in Sage for finite simplicial sets.)

  EXAMPLES:

  Sage

      sage: T = simplicial_sets.Torus()
      sage: S2 = simplicial_sets.Sphere(2)
      sage: T.smash_product(S2).homology() == T.suspension(2).homology()          # needs sage.modules
      True

  Python

      >>> from sage.all import *
      >>> T = simplicial_sets.Torus()
      >>> S2 = simplicial_sets.Sphere(Integer(2))
      >>> T.smash_product(S2).homology() == T.suspension(Integer(2)).homology()          # needs sage.modules
      True

class sage.topology.simplicial_set_constructions.SubSimplicialSet(data, ambient=None)

  Bases: `SimplicialSet_finite`, `UniqueRepresentation`

  Return a finite simplicial set as a subsimplicial set of another simplicial set.

  This keeps track of the ambient simplicial set and the inclusion map from the subcomplex into it.

  INPUT:

  - `data` – the data defining the subset: a dictionary where the keys are simplices from the ambient simplicial set and the values are their faces.

  - `ambient` – the ambient simplicial set. If omitted, use the same simplicial set as the subset and the ambient complex.

  EXAMPLES:

  Sage

      sage: S3 = simplicial_sets.Sphere(3)
      sage: K = simplicial_sets.KleinBottle()
      sage: X = S3.disjoint_union(K)
      sage: Y = X.structure_map(0).image()  # the S3 summand
      sage: Y.inclusion_map()
      Simplicial set morphism:
        From: Simplicial set with 2 non-degenerate simplices
        To:   Disjoint union: (S^3 u Klein bottle)
        Defn: [v_0, sigma_3] --> [v_0, sigma_3]
      sage: Y.ambient_space()
      Disjoint union: (S^3 u Klein bottle)

  Python

      >>> from sage.all import *
      >>> S3 = simplicial_sets.Sphere(Integer(3))
      >>> K = simplicial_sets.KleinBottle()
      >>> X = S3.disjoint_union(K)
      >>> Y = X.structure_map(Integer(0)).image()  # the S3 summand
      >>> Y.inclusion_map()
      Simplicial set morphism:
        From: Simplicial set with 2 non-degenerate simplices
        To:   Disjoint union: (S^3 u Klein bottle)
        Defn: [v_0, sigma_3] --> [v_0, sigma_3]
      >>> Y.ambient_space()
      Disjoint union: (S^3 u Klein bottle)

  ambient_space()

    Return the simplicial set of which this is a subsimplicial set.

    EXAMPLES:

    Sage

        sage: T = simplicial_sets.Torus()
        sage: eight = T.wedge_as_subset()
        sage: eight
        Simplicial set with 3 non-degenerate simplices
        sage: eight.fundamental_group()                                             # needs sage.groups
        Finitely presented group < e0, e1 |  >
        sage: eight.ambient_space()
        Torus

    Python

        >>> from sage.all import *
        >>> T = simplicial_sets.Torus()
        >>> eight = T.wedge_as_subset()
        >>> eight
        Simplicial set with 3 non-degenerate simplices
        >>> eight.fundamental_group()                                             # needs sage.groups
        Finitely presented group < e0, e1 |  >
        >>> eight.ambient_space()
        Torus

  inclusion_map()

    Return the inclusion map from this subsimplicial set into its ambient space.

    EXAMPLES:

    Sage

        sage: RP6 = simplicial_sets.RealProjectiveSpace(6)                          # needs sage.groups
        sage: K = RP6.n_skeleton(2)                                                 # needs sage.groups
        sage: K.inclusion_map()                                                     # needs sage.groups
        Simplicial set morphism:
          From: Simplicial set with 3 non-degenerate simplices
          To:   RP^6
          Defn: [1, f, f * f] --> [1, f, f * f]

    Python

        >>> from sage.all import *
        >>> RP6 = simplicial_sets.RealProjectiveSpace(Integer(6))                          # needs sage.groups
        >>> K = RP6.n_skeleton(Integer(2))                                                 # needs sage.groups
        >>> K.inclusion_map()                                                     # needs sage.groups
        Simplicial set morphism:
          From: Simplicial set with 3 non-degenerate simplices
          To:   RP^6
          Defn: [1, f, f * f] --> [1, f, f * f]

    \(RP^6\) itself is constructed as a subsimplicial set of \(RP^\infty\):

    Sage

        sage: latex(RP6.inclusion_map())                                            # needs sage.groups
        RP^{6} \to RP^{\infty}

    [Python]

        >>> from sage.all import *
        >>> latex(RP6.inclusion_map())                                            # needs sage.groups
        RP^{6} \to RP^{\infty}

class sage.topology.simplicial_set_constructions.SuspensionOfSimplicialSet(base)

  Bases: `SimplicialSet_arbitrary`, `UniqueRepresentation`

  Return the (reduced) suspension of a simplicial set.

  INPUT:

  - `base` – return the suspension of this simplicial set

  If this simplicial set `X=base` is not pointed, or if it is itself an unreduced suspension, return the unreduced suspension: the quotient \(CX/X\), where \(CX\) is the (ordinary, unreduced) cone on \(X\). If \(X\) is pointed, then use the reduced cone instead, and so return the reduced suspension.

  We use \(S\) to denote unreduced suspension, \(\Sigma\) for reduced suspension.

  EXAMPLES:

  Sage

      sage: # needs sage.groups
      sage: G = groups.misc.MultiplicativeAbelian([2])
      sage: B = simplicial_sets.ClassifyingSpace(G)
      sage: B.suspension()
      Sigma(Classifying space of Multiplicative Abelian group isomorphic to C2)
      sage: B.suspension().n_skeleton(3).homology()                               # needs sage.modules
      {0: 0, 1: 0, 2: C2, 3: 0}

  Python

      >>> from sage.all import *
      >>> # needs sage.groups
      >>> G = groups.misc.MultiplicativeAbelian([Integer(2)])
      >>> B = simplicial_sets.ClassifyingSpace(G)
      >>> B.suspension()
      Sigma(Classifying space of Multiplicative Abelian group isomorphic to C2)
      >>> B.suspension().n_skeleton(Integer(3)).homology()                               # needs sage.modules
      {0: 0, 1: 0, 2: C2, 3: 0}

  If `X` is finite, the suspension comes with a quotient map from the cone:

  Sage

      sage: S3 = simplicial_sets.Sphere(3)
      sage: S4 = S3.suspension()
      sage: S4.quotient_map()
      Simplicial set morphism:
        From: Reduced cone of S^3
        To:   Sigma(S^3)
        Defn: [*, sigma_3, (sigma_3,*)] --> [*, s_2 s_1 s_0 *, (sigma_3,*)]

  [Python]

      >>> from sage.all import *
      >>> S3 = simplicial_sets.Sphere(Integer(3))
      >>> S4 = S3.suspension()
      >>> S4.quotient_map()
      Simplicial set morphism:
        From: Reduced cone of S^3
        To:   Sigma(S^3)
        Defn: [*, sigma_3, (sigma_3,*)] --> [*, s_2 s_1 s_0 *, (sigma_3,*)]

  n_skeleton(n)

    Return the \(n\)-skeleton of this simplicial set.

    That is, the simplicial set generated by all nondegenerate simplices of dimension at most \(n\).

    INPUT:

    - `n` – the dimension

    In the case when the suspension is infinite, the \(n\)-skeleton of the suspension is computed as the \(n\)-skeleton of the suspension of the \(n\)-skeleton.

    EXAMPLES:

    Sage

        sage: # needs sage.groups
        sage: G = groups.misc.MultiplicativeAbelian([2])
        sage: B = simplicial_sets.ClassifyingSpace(G)
        sage: SigmaB = B.suspension()
        sage: SigmaB.n_skeleton(4).homology(base_ring=GF(2))                        # needs sage.modules
        {0: Vector space of dimension 0 over Finite Field of size 2,
         1: Vector space of dimension 0 over Finite Field of size 2,
         2: Vector space of dimension 1 over Finite Field of size 2,
         3: Vector space of dimension 1 over Finite Field of size 2,
         4: Vector space of dimension 1 over Finite Field of size 2}

    Python

        >>> from sage.all import *
        >>> # needs sage.groups
        >>> G = groups.misc.MultiplicativeAbelian([Integer(2)])
        >>> B = simplicial_sets.ClassifyingSpace(G)
        >>> SigmaB = B.suspension()
        >>> SigmaB.n_skeleton(Integer(4)).homology(base_ring=GF(Integer(2)))                        # needs sage.modules
        {0: Vector space of dimension 0 over Finite Field of size 2,
         1: Vector space of dimension 0 over Finite Field of size 2,
         2: Vector space of dimension 1 over Finite Field of size 2,
         3: Vector space of dimension 1 over Finite Field of size 2,
         4: Vector space of dimension 1 over Finite Field of size 2}

class sage.topology.simplicial_set_constructions.SuspensionOfSimplicialSet_finite(base)

  Bases: `SuspensionOfSimplicialSet`, `QuotientOfSimplicialSet_finite`

  The (reduced) suspension of a finite simplicial set.

  See `SuspensionOfSimplicialSet` for more information.

class sage.topology.simplicial_set_constructions.WedgeOfSimplicialSets(factors=None)

  Bases: `PushoutOfSimplicialSets`, `Factors`

  Return the wedge sum of pointed simplicial sets.

  INPUT:

  - `factors` – list or tuple of simplicial sets

  Return the wedge of the simplicial sets in `factors`: the wedge sum \(X \vee Y\) is formed by taking the disjoint union of \(X\) and \(Y\) and identifying their base points. In this construction, the new base point is renamed ‘*’.

  The wedge comes equipped with maps to and from each factor, or actually, maps from each factor, and maps to simplicial sets isomorphic to each factor. The codomains of the latter maps are quotients of the wedge, not identical to the original factors.

  EXAMPLES:

  Sage

      sage: CP2 = simplicial_sets.ComplexProjectiveSpace(2)
      sage: K = simplicial_sets.KleinBottle()
      sage: W = CP2.wedge(K)
      sage: W.homology()                                                          # needs sage.modules
      {0: 0, 1: Z x C2, 2: Z, 3: 0, 4: Z}

      sage: W.inclusion_map(1)
      Simplicial set morphism:
        From: Klein bottle
        To:   Wedge: (CP^2 v Klein bottle)
        Defn: [Delta_{0,0}, Delta_{1,0}, Delta_{1,1}, Delta_{1,2}, Delta_{2,0}, Delta_{2,1}]
              --> [*, Delta_{1,0}, Delta_{1,1}, Delta_{1,2}, Delta_{2,0}, Delta_{2,1}]

      sage: W.projection_map(0).domain()
      Wedge: (CP^2 v Klein bottle)
      sage: W.projection_map(0).codomain() # copy of CP^2
      Quotient: (Wedge: (CP^2 v Klein bottle)/Simplicial set with 6 non-degenerate simplices)
      sage: W.projection_map(0).codomain().homology()                             # needs sage.modules
      {0: 0, 1: 0, 2: Z, 3: 0, 4: Z}

  Python

      >>> from sage.all import *
      >>> CP2 = simplicial_sets.ComplexProjectiveSpace(Integer(2))
      >>> K = simplicial_sets.KleinBottle()
      >>> W = CP2.wedge(K)
      >>> W.homology()                                                          # needs sage.modules
      {0: 0, 1: Z x C2, 2: Z, 3: 0, 4: Z}

      >>> W.inclusion_map(Integer(1))
      Simplicial set morphism:
        From: Klein bottle
        To:   Wedge: (CP^2 v Klein bottle)
        Defn: [Delta_{0,0}, Delta_{1,0}, Delta_{1,1}, Delta_{1,2}, Delta_{2,0}, Delta_{2,1}]
              --> [*, Delta_{1,0}, Delta_{1,1}, Delta_{1,2}, Delta_{2,0}, Delta_{2,1}]

      >>> W.projection_map(Integer(0)).domain()
      Wedge: (CP^2 v Klein bottle)
      >>> W.projection_map(Integer(0)).codomain() # copy of CP^2
      Quotient: (Wedge: (CP^2 v Klein bottle)/Simplicial set with 6 non-degenerate simplices)
      >>> W.projection_map(Integer(0)).codomain().homology()                             # needs sage.modules
      {0: 0, 1: 0, 2: Z, 3: 0, 4: Z}

  An error occurs if any of the factors is not pointed:

  Sage

      sage: CP2.wedge(simplicial_sets.Simplex(1))
      Traceback (most recent call last):
      ...
      ValueError: the simplicial sets must be pointed

  [Python]

      >>> from sage.all import *
      >>> CP2.wedge(simplicial_sets.Simplex(Integer(1)))
      Traceback (most recent call last):
      ...
      ValueError: the simplicial sets must be pointed

  summand(i)

    alias of `factor()`.

  summands()

    alias of `factors()`.

class sage.topology.simplicial_set_constructions.WedgeOfSimplicialSets_finite(factors=None)

  Bases: `WedgeOfSimplicialSets`, `PushoutOfSimplicialSets_finite`

  The wedge sum of finite pointed simplicial sets.

  inclusion_map(i)

    Return the inclusion map of the \(i\)-th factor.

    EXAMPLES:

    Sage

        sage: S1 = simplicial_sets.Sphere(1)
        sage: S2 = simplicial_sets.Sphere(2)
        sage: W = S1.wedge(S2, S1)
        sage: W.inclusion_map(1)
        Simplicial set morphism:
          From: S^2
          To:   Wedge: (S^1 v S^2 v S^1)
          Defn: [v_0, sigma_2] --> [*, sigma_2]
        sage: W.inclusion_map(0).domain()
        S^1
        sage: W.inclusion_map(2).domain()
        S^1

    Python

        >>> from sage.all import *
        >>> S1 = simplicial_sets.Sphere(Integer(1))
        >>> S2 = simplicial_sets.Sphere(Integer(2))
        >>> W = S1.wedge(S2, S1)
        >>> W.inclusion_map(Integer(1))
        Simplicial set morphism:
          From: S^2
          To:   Wedge: (S^1 v S^2 v S^1)
          Defn: [v_0, sigma_2] --> [*, sigma_2]
        >>> W.inclusion_map(Integer(0)).domain()
        S^1
        >>> W.inclusion_map(Integer(2)).domain()
        S^1

  projection_map(i)

    Return the projection map onto the \(i\)-th factor.

    EXAMPLES:

    Sage

        sage: S1 = simplicial_sets.Sphere(1)
        sage: S2 = simplicial_sets.Sphere(2)
        sage: W = S1.wedge(S2, S1)
        sage: W.projection_map(1)
        Simplicial set morphism:
          From: Wedge: (S^1 v S^2 v S^1)
          To:   Quotient: (Wedge: (S^1 v S^2 v S^1)/Simplicial set with
                                                    3 non-degenerate simplices)
          Defn: [*, sigma_1, sigma_1, sigma_2] --> [*, s_0 *, s_0 *, sigma_2]
        sage: W.projection_map(1).image().homology(1)                               # needs sage.modules
        0
        sage: W.projection_map(1).image().homology(2)                               # needs sage.modules
        Z

    Python

        >>> from sage.all import *
        >>> S1 = simplicial_sets.Sphere(Integer(1))
        >>> S2 = simplicial_sets.Sphere(Integer(2))
        >>> W = S1.wedge(S2, S1)
        >>> W.projection_map(Integer(1))
        Simplicial set morphism:
          From: Wedge: (S^1 v S^2 v S^1)
          To:   Quotient: (Wedge: (S^1 v S^2 v S^1)/Simplicial set with
                                                    3 non-degenerate simplices)
          Defn: [*, sigma_1, sigma_1, sigma_2] --> [*, s_0 *, s_0 *, sigma_2]
        >>> W.projection_map(Integer(1)).image().homology(Integer(1))                               # needs sage.modules
        0
        >>> W.projection_map(Integer(1)).image().homology(Integer(2))                               # needs sage.modules
        Z