Species structures#

We will illustrate the use of the structure classes using the “balls and bars” model for integer compositions. An integer composition of 6 such as [2, 1, 3] can be represented in this model as ‘oooooo’ where the 6 o’s correspond to the balls and the 2 ‘s correspond to the bars. If BB is our species for this model, the it satisfies the following recursive definition:

BB = o + o*BB + o*|*BB

Here we define this species using the default structures:

sage: ball = species.SingletonSpecies()
sage: bar = species.EmptySetSpecies()
sage: BB = CombinatorialSpecies()
sage: BB.define(ball + ball*BB + ball*bar*BB)
sage: o = var('o')                                                                  # optional - sage.symbolic
sage: BB.isotypes([o]*3).list()                                                     # optional - sage.symbolic
[o*(o*o), o*((o*{})*o), (o*{})*(o*o), (o*{})*((o*{})*o)]
ball = species.SingletonSpecies()
bar = species.EmptySetSpecies()
BB = CombinatorialSpecies()
BB.define(ball + ball*BB + ball*bar*BB)
o = var('o')                                                                  # optional - sage.symbolic
BB.isotypes([o]*3).list()                                                     # optional - sage.symbolic

If we ignore the parentheses, we can read off that the integer compositions are [3], [2, 1], [1, 2], and [1, 1, 1].

class sage.combinat.species.structure.GenericSpeciesStructure(parent, labels, list)#

Bases: CombinatorialObject

This is a base class from which the classes for the structures inherit.

EXAMPLES:

sage: from sage.combinat.species.structure import GenericSpeciesStructure
sage: a = GenericSpeciesStructure(None, [2,3,4], [1,2,3])
sage: a
[2, 3, 4]
sage: a.parent() is None
True
sage: a == loads(dumps(a))
True
from sage.combinat.species.structure import GenericSpeciesStructure
a = GenericSpeciesStructure(None, [2,3,4], [1,2,3])
a
a.parent() is None
a == loads(dumps(a))
change_labels(labels)#

Return a relabelled structure.

INPUT:

  • labels, a list of labels.

OUTPUT:

A structure with the i-th label of self replaced with the i-th label of the list.

EXAMPLES:

sage: P = species.SubsetSpecies()
sage: S = P.structures(["a", "b", "c"])
sage: [s.change_labels([1,2,3]) for s in S]
[{}, {1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3}]
P = species.SubsetSpecies()
S = P.structures(["a", "b", "c"])
[s.change_labels([1,2,3]) for s in S]
is_isomorphic(x)#

EXAMPLES:

sage: S = species.SetSpecies()
sage: a = S.structures([1,2,3]).random_element(); a
{1, 2, 3}
sage: b = S.structures(['a','b','c']).random_element(); b
{'a', 'b', 'c'}
sage: a.is_isomorphic(b)
True
S = species.SetSpecies()
a = S.structures([1,2,3]).random_element(); a
b = S.structures(['a','b','c']).random_element(); b
a.is_isomorphic(b)
labels()#

Returns the labels used for this structure.

Note

This includes labels which may not “appear” in this particular structure.

EXAMPLES:

sage: P = species.SubsetSpecies()
sage: s = P.structures(["a", "b", "c"]).random_element()
sage: s.labels()
['a', 'b', 'c']
P = species.SubsetSpecies()
s = P.structures(["a", "b", "c"]).random_element()
s.labels()
parent()#

Returns the species that this structure is associated with.

EXAMPLES:

sage: L = species.LinearOrderSpecies()
sage: a,b = L.structures([1,2])
sage: a.parent()
Linear order species
L = species.LinearOrderSpecies()
a,b = L.structures([1,2])
a.parent()
class sage.combinat.species.structure.IsotypesWrapper(species, labels, structure_class)#

Bases: SpeciesWrapper

A base class for the set of isotypes of a species with given set of labels. An object of this type is returned when you call the isotypes() method of a species.

EXAMPLES:

sage: F = species.SetSpecies()
sage: S = F.isotypes([1,2,3])
sage: S == loads(dumps(S))
True
F = species.SetSpecies()
S = F.isotypes([1,2,3])
S == loads(dumps(S))
class sage.combinat.species.structure.SimpleIsotypesWrapper(species, labels, structure_class)#

Bases: SpeciesWrapper

Warning

This is deprecated and currently not used for anything.

EXAMPLES:

sage: F = species.SetSpecies()
sage: S = F.structures([1,2,3])
sage: S == loads(dumps(S))
True
F = species.SetSpecies()
S = F.structures([1,2,3])
S == loads(dumps(S))
class sage.combinat.species.structure.SimpleStructuresWrapper(species, labels, structure_class)#

Bases: SpeciesWrapper

Warning

This is deprecated and currently not used for anything.

EXAMPLES:

sage: F = species.SetSpecies()
sage: S = F.structures([1,2,3])
sage: S == loads(dumps(S))
True
F = species.SetSpecies()
S = F.structures([1,2,3])
S == loads(dumps(S))
sage.combinat.species.structure.SpeciesStructure#

alias of GenericSpeciesStructure

class sage.combinat.species.structure.SpeciesStructureWrapper(parent, s, **options)#

Bases: GenericSpeciesStructure

This is a class for the structures of species such as the sum species that do not provide “additional” structure. For example, if you have the sum \(C\) of species \(A\) and \(B\), then a structure of \(C\) will either be either something from \(A\) or \(B\). Instead of just returning one of these directly, a “wrapper” is put around them so that they have their parent is \(C\) rather than \(A\) or \(B\):

sage: X = species.SingletonSpecies()
sage: X2 = X+X
sage: s = X2.structures([1]).random_element(); s
1
sage: s.parent()
Sum of (Singleton species) and (Singleton species)
sage: from sage.combinat.species.structure import SpeciesStructureWrapper
sage: issubclass(type(s), SpeciesStructureWrapper)
True
X = species.SingletonSpecies()
X2 = X+X
s = X2.structures([1]).random_element(); s
s.parent()
from sage.combinat.species.structure import SpeciesStructureWrapper
issubclass(type(s), SpeciesStructureWrapper)

EXAMPLES:

sage: E = species.SetSpecies(); B = E+E
sage: s = B.structures([1,2,3]).random_element()
sage: s.parent()
Sum of (Set species) and (Set species)
sage: s == loads(dumps(s))
True
E = species.SetSpecies(); B = E+E
s = B.structures([1,2,3]).random_element()
s.parent()
s == loads(dumps(s))
canonical_label()#

EXAMPLES:

sage: P = species.PartitionSpecies()
sage: s = (P+P).structures([1,2,3])[1]; s
{{1, 3}, {2}}
sage: s.canonical_label()
{{1, 2}, {3}}
P = species.PartitionSpecies()
s = (P+P).structures([1,2,3])[1]; s
s.canonical_label()
change_labels(labels)#

Return a relabelled structure.

INPUT:

  • labels, a list of labels.

OUTPUT:

A structure with the i-th label of self replaced with the i-th label of the list.

EXAMPLES:

sage: X = species.SingletonSpecies()
sage: X2 = X+X
sage: s = X2.structures([1]).random_element(); s
1
sage: s.change_labels(['a'])
'a'
X = species.SingletonSpecies()
X2 = X+X
s = X2.structures([1]).random_element(); s
s.change_labels(['a'])
transport(perm)#

EXAMPLES:

sage: P = species.PartitionSpecies()
sage: s = (P+P).structures([1,2,3])[1]; s
{{1, 3}, {2}}
sage: s.transport(PermutationGroupElement((2,3)))
{{1, 2}, {3}}
P = species.PartitionSpecies()
s = (P+P).structures([1,2,3])[1]; s
s.transport(PermutationGroupElement((2,3)))
class sage.combinat.species.structure.SpeciesWrapper(species, labels, iterator, generating_series, name, structure_class)#

Bases: CombinatorialClass

This is a abstract base class for the set of structures of a species as well as the set of isotypes of the species.

Note

One typically does not use SpeciesWrapper directly, but instead instantiates one of its subclasses: StructuresWrapper or IsotypesWrapper.

EXAMPLES:

sage: from sage.combinat.species.structure import SpeciesWrapper
sage: F = species.SetSpecies()
sage: S = SpeciesWrapper(F, [1,2,3], "_structures", "generating_series", 'Structures', None)
sage: S
Structures for Set species with labels [1, 2, 3]
sage: S.list()
[{1, 2, 3}]
sage: S.cardinality()
1
from sage.combinat.species.structure import SpeciesWrapper
F = species.SetSpecies()
S = SpeciesWrapper(F, [1,2,3], "_structures", "generating_series", 'Structures', None)
S
S.list()
S.cardinality()
cardinality()#

Returns the number of structures in this set.

EXAMPLES:

sage: F = species.SetSpecies()
sage: F.structures([1,2,3]).cardinality()
1
F = species.SetSpecies()
F.structures([1,2,3]).cardinality()
labels()#

Returns the labels used on these structures. If \(X\) is the species, then labels() returns the preimage of these structures under the functor \(X\).

EXAMPLES:

sage: F = species.SetSpecies()
sage: F.structures([1,2,3]).labels()
[1, 2, 3]
F = species.SetSpecies()
F.structures([1,2,3]).labels()
class sage.combinat.species.structure.StructuresWrapper(species, labels, structure_class)#

Bases: SpeciesWrapper

A base class for the set of structures of a species with given set of labels. An object of this type is returned when you call the structures() method of a species.

EXAMPLES:

sage: F = species.SetSpecies()
sage: S = F.structures([1,2,3])
sage: S == loads(dumps(S))
True
F = species.SetSpecies()
S = F.structures([1,2,3])
S == loads(dumps(S))