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') # needs sage.symbolic
sage: BB.isotypes([o]*3).list() # needs sage.symbolic
[o*(o*o), o*((o*{})*o), (o*{})*(o*o), (o*{})*((o*{})*o)]
>>> from sage.all import *
>>> ball = species.SingletonSpecies()
>>> bar = species.EmptySetSpecies()
>>> BB = CombinatorialSpecies()
>>> BB.define(ball + ball*BB + ball*bar*BB)
>>> o = var('o') # needs sage.symbolic
>>> BB.isotypes([o]*Integer(3)).list() # needs 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') # needs sage.symbolic BB.isotypes([o]*3).list() # needs 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)[source]¶
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.all import * >>> from sage.combinat.species.structure import GenericSpeciesStructure >>> a = GenericSpeciesStructure(None, [Integer(2),Integer(3),Integer(4)], [Integer(1),Integer(2),Integer(3)]) >>> a [2, 3, 4] >>> a.parent() is None True >>> 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)[source]¶
Return a relabelled structure.
INPUT:
labels
– list of labels
OUTPUT:
A structure with the
-th label ofself
replaced with the -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}]
>>> from sage.all import * >>> P = species.SubsetSpecies() >>> S = P.structures(["a", "b", "c"]) >>> [s.change_labels([Integer(1),Integer(2),Integer(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)[source]¶
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
>>> from sage.all import * >>> S = species.SetSpecies() >>> a = S.structures([Integer(1),Integer(2),Integer(3)]).random_element(); a {1, 2, 3} >>> b = S.structures(['a','b','c']).random_element(); b {'a', 'b', 'c'} >>> 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()[source]¶
Return 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']
>>> from sage.all import * >>> P = species.SubsetSpecies() >>> s = P.structures(["a", "b", "c"]).random_element() >>> s.labels() ['a', 'b', 'c']
P = species.SubsetSpecies() s = P.structures(["a", "b", "c"]).random_element() s.labels()
- parent()[source]¶
Return 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
>>> from sage.all import * >>> L = species.LinearOrderSpecies() >>> a,b = L.structures([Integer(1),Integer(2)]) >>> 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)[source]¶
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
>>> from sage.all import * >>> F = species.SetSpecies() >>> S = F.isotypes([Integer(1),Integer(2),Integer(3)]) >>> 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)[source]¶
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
>>> from sage.all import * >>> F = species.SetSpecies() >>> S = F.structures([Integer(1),Integer(2),Integer(3)]) >>> 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)[source]¶
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
>>> from sage.all import * >>> F = species.SetSpecies() >>> S = F.structures([Integer(1),Integer(2),Integer(3)]) >>> S == loads(dumps(S)) True
F = species.SetSpecies() S = F.structures([1,2,3]) S == loads(dumps(S))
- sage.combinat.species.structure.SpeciesStructure[source]¶
alias of
GenericSpeciesStructure
- class sage.combinat.species.structure.SpeciesStructureWrapper(parent, s, **options)[source]¶
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
of species and , then a structure of will either be either something from or . Instead of just returning one of these directly, a “wrapper” is put around them so that they have their parent is rather than or :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
>>> from sage.all import * >>> X = species.SingletonSpecies() >>> X2 = X+X >>> s = X2.structures([Integer(1)]).random_element(); s 1 >>> s.parent() Sum of (Singleton species) and (Singleton species) >>> from sage.combinat.species.structure import SpeciesStructureWrapper >>> 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
>>> from sage.all import * >>> E = species.SetSpecies(); B = E+E >>> s = B.structures([Integer(1),Integer(2),Integer(3)]).random_element() >>> s.parent() Sum of (Set species) and (Set species) >>> 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()[source]¶
EXAMPLES:
sage: P = species.PartitionSpecies() sage: s = (P+P).structures([1,2,3])[1]; s # needs sage.libs.flint {{1, 3}, {2}} sage: s.canonical_label() # needs sage.libs.flint {{1, 2}, {3}}
>>> from sage.all import * >>> P = species.PartitionSpecies() >>> s = (P+P).structures([Integer(1),Integer(2),Integer(3)])[Integer(1)]; s # needs sage.libs.flint {{1, 3}, {2}} >>> s.canonical_label() # needs sage.libs.flint {{1, 2}, {3}}
P = species.PartitionSpecies() s = (P+P).structures([1,2,3])[1]; s # needs sage.libs.flint s.canonical_label() # needs sage.libs.flint
- change_labels(labels)[source]¶
Return a relabelled structure.
INPUT:
labels
– list of labels
OUTPUT:
A structure with the
-th label ofself
replaced with the -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'
>>> from sage.all import * >>> X = species.SingletonSpecies() >>> X2 = X+X >>> s = X2.structures([Integer(1)]).random_element(); s 1 >>> s.change_labels(['a']) 'a'
X = species.SingletonSpecies() X2 = X+X s = X2.structures([1]).random_element(); s s.change_labels(['a'])
- transport(perm)[source]¶
EXAMPLES:
sage: P = species.PartitionSpecies() sage: s = (P+P).structures([1,2,3])[1]; s # needs sage.libs.flint {{1, 3}, {2}} sage: s.transport(PermutationGroupElement((2,3))) # needs sage.groups sage.libs.flint {{1, 2}, {3}}
>>> from sage.all import * >>> P = species.PartitionSpecies() >>> s = (P+P).structures([Integer(1),Integer(2),Integer(3)])[Integer(1)]; s # needs sage.libs.flint {{1, 3}, {2}} >>> s.transport(PermutationGroupElement((Integer(2),Integer(3)))) # needs sage.groups sage.libs.flint {{1, 2}, {3}}
P = species.PartitionSpecies() s = (P+P).structures([1,2,3])[1]; s # needs sage.libs.flint s.transport(PermutationGroupElement((2,3))) # needs sage.groups sage.libs.flint
- class sage.combinat.species.structure.SpeciesWrapper(species, labels, iterator, generating_series, name, structure_class)[source]¶
Bases:
Parent
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
orIsotypesWrapper
.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.all import * >>> from sage.combinat.species.structure import SpeciesWrapper >>> F = species.SetSpecies() >>> S = SpeciesWrapper(F, [Integer(1),Integer(2),Integer(3)], "_structures", "generating_series", 'Structures', None) >>> S Structures for Set species with labels [1, 2, 3] >>> S.list() [{1, 2, 3}] >>> 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()[source]¶
Return the number of structures in this set.
EXAMPLES:
sage: F = species.SetSpecies() sage: F.structures([1,2,3]).cardinality() 1
>>> from sage.all import * >>> F = species.SetSpecies() >>> F.structures([Integer(1),Integer(2),Integer(3)]).cardinality() 1
F = species.SetSpecies() F.structures([1,2,3]).cardinality()
- labels()[source]¶
Return the labels used on these structures. If
is the species, thenlabels()
returns the preimage of these structures under the functor .EXAMPLES:
sage: F = species.SetSpecies() sage: F.structures([1,2,3]).labels() [1, 2, 3]
>>> from sage.all import * >>> F = species.SetSpecies() >>> F.structures([Integer(1),Integer(2),Integer(3)]).labels() [1, 2, 3]
F = species.SetSpecies() F.structures([1,2,3]).labels()
- class sage.combinat.species.structure.StructuresWrapper(species, labels, structure_class)[source]¶
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
>>> from sage.all import * >>> F = species.SetSpecies() >>> S = F.structures([Integer(1),Integer(2),Integer(3)]) >>> S == loads(dumps(S)) True
F = species.SetSpecies() S = F.structures([1,2,3]) S == loads(dumps(S))