An example of set factory - Parents and Elements

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

# An example of set factory

The goal of this module is to exemplify the use of set factories. Note that the code is intentionally kept minimal; many things and in particular several iterators could be written in a more efficient way.

See also

`set_factories` for an introduction to set factories, their specifications, and examples of their use and implementation based on this module.

We describe here a factory used to construct the set \(S\) of couples \((x,y)\) with \(x\) and \(y\) in \(I:=\{0,1,2,3,4\}\), together with the following subsets, where \((a, b)\in S\)

\[ \begin{align}\begin{aligned}S_a := \{(x,y) \in S \mid x = a\},\\S^b := \{(x,y) \in S \mid y = b\},\\S_a^b := \{(x,y) \in S \mid x = a, y = b\}.\end{aligned}\end{align} \]

class sage.structure.set_factories_example.AllPairs(policy)

  Bases: `ParentWithSetFactory`, `DisjointUnionEnumeratedSets`

  This parent shows how one can use set factories together with `DisjointUnionEnumeratedSets`.

  It is constructed as the disjoint union (`DisjointUnionEnumeratedSets`) of `Pairs_Y` parents:

  \[S := \bigcup_{i = 0,1,..., 4} S^y\]

  Warning

  When writing a parent `P` as a disjoint union of a family of parents `P_i`, the parents `P_i` must be constructed as facade parents for `P`. As a consequence, it should be passed `P.facade_policy()` as policy argument. See the source code of `pairs_y()` for an example.

  check_element(el, check)
  pairs_y(letter)

    Construct the parent for the disjoint union.

    Construct a parent in `Pairs_Y` as a facade parent for `self`.

    This is an internal function which should be hidden from the user (typically under the name `_pairs_y`. We put it here for documentation.

class sage.structure.set_factories_example.PairsX_(x, policy)

  Bases: `ParentWithSetFactory`, `UniqueRepresentation`

  The set of pairs \((x, 0), (x, 1), ..., (x, 4)\).

  an_element()
  check_element(el, check)

class sage.structure.set_factories_example.Pairs_Y(y, policy)

  Bases: `ParentWithSetFactory`, `DisjointUnionEnumeratedSets`

  The set of pairs \((0, y), (1, y), ..., (4, y)\).

  It is constructed as the disjoint union (`DisjointUnionEnumeratedSets`) of `SingletonPair` parents:

  \[S^y := \bigcup_{i = 0,1,..., 4} S_i^y\]

  See also

  `AllPairs` for how to properly construct `DisjointUnionEnumeratedSets` using `ParentWithSetFactory`.

  an_element()
  check_element(el, check)
  single_pair(letter)

    Construct the singleton pair parent.

    Construct a singleton pair for `(self.y, letter)` as a facade parent for `self`.

    See also

    `AllPairs` for how to properly construct `DisjointUnionEnumeratedSets` using `ParentWithSetFactory`.

class sage.structure.set_factories_example.SingletonPair(x, y, policy)

  Bases: `ParentWithSetFactory`, `UniqueRepresentation`

  check_element(el, check)

class sage.structure.set_factories_example.XYPair(parent, value, check=True)

  Bases: `ElementWrapper`

  A class for Elements \((x,y)\) with \(x\) and \(y\) in \(\{0,1,2,3,4\}\).

  EXAMPLES:

  Sage

      sage: from sage.structure.set_factories_example import XYPair
      sage: p = XYPair(Parent(), (0,1)); p
      (0, 1)
      sage: p = XYPair(Parent(), (0,8))
      Traceback (most recent call last):
      ...
      ValueError: numbers must be in range(5)

  Python

      >>> from sage.all import *
      >>> from sage.structure.set_factories_example import XYPair
      >>> p = XYPair(Parent(), (Integer(0),Integer(1))); p
      (0, 1)
      >>> p = XYPair(Parent(), (Integer(0),Integer(8)))
      Traceback (most recent call last):
      ...
      ValueError: numbers must be in range(5)

sage.structure.set_factories_example.XYPairs(x=None, y=None, policy=None)

  Construct the subset from constraints.

  Consider the set \(S\) of couples \((x,y)\) with \(x\) and \(y\) in \(I:=\{0,1,2,3,4\}\). Returns the subsets of element of \(S\) satisfying some constraints.

  INPUT:

  - `x=a` – where `a` is an integer (default: `None`)

  - `y=b` – where `b` is an integer (default: `None`)

  - `policy` – the policy passed to the created set

  See also

  `set_factories.SetFactoryPolicy`

  EXAMPLES:

  Let us first create the set factory:

  Sage

      sage: from sage.structure.set_factories_example import XYPairsFactory
      sage: XYPairs = XYPairsFactory()

  Python

      >>> from sage.all import *
      >>> from sage.structure.set_factories_example import XYPairsFactory
      >>> XYPairs = XYPairsFactory()

  One can then use the set factory to construct a set:

  Sage

      sage: P = XYPairs(); P.list()
      [(0, 0), (1, 0), (2, 0), (3, 0), (4, 0), (0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (0, 2), (1, 2), (2, 2), (3, 2), (4, 2), (0, 3), (1, 3), (2, 3), (3, 3), (4, 3), (0, 4), (1, 4), (2, 4), (3, 4), (4, 4)]

  [Python]

      >>> from sage.all import *
      >>> P = XYPairs(); P.list()
      [(0, 0), (1, 0), (2, 0), (3, 0), (4, 0), (0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (0, 2), (1, 2), (2, 2), (3, 2), (4, 2), (0, 3), (1, 3), (2, 3), (3, 3), (4, 3), (0, 4), (1, 4), (2, 4), (3, 4), (4, 4)]

  Note

  This function is actually the `__call__` method of `XYPairsFactory`.

class sage.structure.set_factories_example.XYPairsFactory

  Bases: `SetFactory`

  An example of set factory, for sets of pairs of integers.

  See also

  `set_factories` for an introduction to set factories.

  add_constraints(cons, args_opts)

    Add constraints to the set `cons` as per `SetFactory.add_constraints`.

    This is a crude implementation for the sake of the demonstration which should not be taken as an example.

    EXAMPLES:

    Sage

        sage: from sage.structure.set_factories_example import XYPairs
        sage: XYPairs.add_constraints((3,None), ((2,), {}))
        Traceback (most recent call last):
        ...
        ValueError: Duplicate value for constraints 'x': was 3 now 2
        sage: XYPairs.add_constraints((), ((2,), {}))
        (2, None)
        sage: XYPairs.add_constraints((), ((2,), {'y':3}))
        (2, 3)

    Python

        >>> from sage.all import *
        >>> from sage.structure.set_factories_example import XYPairs
        >>> XYPairs.add_constraints((Integer(3),None), ((Integer(2),), {}))
        Traceback (most recent call last):
        ...
        ValueError: Duplicate value for constraints 'x': was 3 now 2
        >>> XYPairs.add_constraints((), ((Integer(2),), {}))
        (2, None)
        >>> XYPairs.add_constraints((), ((Integer(2),), {'y':Integer(3)}))
        (2, 3)