Set and Map¶
Domains distributed with Haydi use standard Python types almost in all places
for example: Range creates a domain where elements have type
int, Product and Sequences use tuple as
elements in the resulting domains. The exceptions are Subsets
that use haydi.Set and Mappings with
haydi.Map, even though a natural choice would be a standard set and
dict. The reason is a performance optimization during generation (mainly in
generating Canonical forms).
If you need, both types can be simply converted into the standard ones:
>>> import haydi as hd
>>> a = hd.Range(2)
>>> hd.Subsets(a).map(lambda s: s.to_set()) # Creates standard Python sets
<MapTransformation size=4 {set([]), set([0]), set([0, 1]), set([1])}>
>>> hd.Subsets(a).map(lambda s: s.to_frozenset()) # Creates standard Python frozensets
<MapTransformation size=4 {frozenset([]), frozenset([0]), frozenset([0, , ...}>
>>> hd.Mappings(a, a).map(lambda m: m.to_dict()) # Creates standard Python dicts
<MapTransformation size=4 {{0: 0, 1: 0}, {0: 0, 1: 1}, {0: 1, 1: 0}, {0:, ...}>
Note
Classes Set and Map are not designed for frequent
searching. If you need it, please convert them to set/dict. From this
reasons they do not intentionally implement methods __in__ and
__getitem__ to avoid accident usage theses class instead of
set/dict. For occasional lookup, there are methods contains/get in
these classes.
This is still a subject of discussions if we want to introduce
__in__ and __getitem__ method for these classes.