Partially ordered set
Elements
Partially ordered elements implements the 6 classical comparison operation:
\(<\)
\(\leq\)
\(>\)
\(\geq\)
\(=\)
\(\neq\)
They can be filtered using some special functions.
Integer example
The Integer
class in the examples folder implements a partially ordered relation between positive integers using the divisor of notion.
To import the Integer
class:
[1]:
from galactic.examples.arithmetic import Integer
Integer(12)
[1]:
3 is lesser than 6:
[2]:
Integer(3) <= Integer(6)
[2]:
True
2 and 3 are incomparable:
[3]:
Integer(2) <= Integer(3)
[3]:
False
[4]:
Integer(3) <= Integer(2)
[4]:
False
1 is lesser than all the other numbers (1 is a divisor of all numbers) and 0 is greater than all other numbers (all numbers are divisors of 0):
[5]:
Integer(1) <= Integer(6)
[5]:
True
[6]:
Integer(6) <= Integer(0)
[6]:
True
[7]:
from galactic.algebras.poset import top
elements = [Integer(6), Integer(24), Integer(13)]
top(elements)
[7]:
<odict_iterator at 0x7fd72c1caf90>
Note that the result is a python iterator. To get the list:
[8]:
display(*top(elements))
An analog operation is available to get the bottom elements:
[9]:
from galactic.algebras.poset import bottom
display(*bottom(elements))
It’s possible to get the elements greater or lower than a given limit:
[10]:
from galactic.algebras.poset import upper_limit
display(*upper_limit(iterable=elements, limit=Integer(6)))
[11]:
from galactic.algebras.poset import lower_limit
display(
*lower_limit(
iterable=elements,
limit=Integer(12),
strict=True
)
)
Color example
The Color
class in the examples folder implements a partially ordered relation between colors.
To import the Color
class:
[12]:
from galactic.examples.color import Color
[13]:
Color(red=1.0, green=0.5)
[13]:
[14]:
Color(red=1.0, green=1.0)
[14]:
The orange color is less or equal than the yellow color:
[15]:
Color(red=1.0, green=0.5) <= Color(red=1.0, green=1.0)
[15]:
True
[16]:
Color(red=0.5, green=1.0)
[16]:
Collections
A poset is a set or partially ordered elements.
Integer example
[17]:
from galactic.algebras.poset import \
PartiallyOrderedSet, HasseDiagram
from galactic.examples.arithmetic import IntegerRenderer
poset = PartiallyOrderedSet[Integer](
domain = [
Integer(24),
Integer(18),
Integer(9),
Integer(6),
Integer(3),
Integer(2)
]
)
poset have all classical python operations on sets:
[18]:
HasseDiagram[Integer](poset, domain_renderer=IntegerRenderer())
[18]:
[19]:
len(poset)
[19]:
16
[20]:
display(*poset.cover)
(Integer(2), Integer(6))
(Integer(3), Integer(9))
(Integer(3), Integer(6))
(Integer(6), Integer(24))
(Integer(6), Integer(18))
(Integer(9), Integer(18))
[21]:
Integer(3) in poset.domain
[21]:
True
[22]:
display(*(poset.domain & {Integer(9), Integer(6), Integer(5)}))
[23]:
display(*(poset.domain | {Integer(9), Integer(6), Integer(5)}))
[24]:
poset.extend(
[
Integer(9),
Integer(6),
Integer(5)
]
)
HasseDiagram[Integer](poset, domain_renderer=IntegerRenderer())
[24]:
[25]:
poset.extend([Integer(10)])
HasseDiagram[Integer](poset, domain_renderer=IntegerRenderer())
[25]:
[26]:
poset.domain >= {Integer(9), Integer(6)}
[26]:
True
From a poset, several additional methods can be applied:
get the top or the bottom elements from the poset;
get the descendants or the ascendants of an element;
get the successors and predecessors of an element;
get the filter and an ideal of an element.
[27]:
display(*poset.top)
[28]:
display(*poset.bottom)
[29]:
display(*poset.predecessors(Integer(18)))
[30]:
display(*poset.cover.predecessors(Integer(18)))
[31]:
display(*poset.successors(Integer(6)))
[32]:
display(*poset.cover.successors(Integer(6)))
[33]:
HasseDiagram[Integer](
poset,
domain_renderer=IntegerRenderer()
)
[33]:
[34]:
HasseDiagram[Integer](
poset.ideal(Integer(18)),
domain_renderer=IntegerRenderer()
)
[34]:
[35]:
HasseDiagram[Integer](
poset.filter(Integer(3)),
domain_renderer=IntegerRenderer()
)
[35]:
[36]:
HasseDiagram[Integer](
poset.filter(Integer(3)).ideal(Integer(18)),
domain_renderer=IntegerRenderer()
)
[36]:
[37]:
HasseDiagram[Integer](
poset.ideal(Integer(18)).filter(Integer(3)),
domain_renderer=IntegerRenderer()
)
[37]:
Color example
Using colors, you can can test the poset collections:
[38]:
from galactic.algebras.poset import PartiallyOrderedSet
from galactic.examples.color import ColorRenderer
colors = PartiallyOrderedSet[Color](
domain = [
Color(red=1.0),
Color(red=1.0, green=1.0),
Color(red=0.5),
Color(red=0.5, green=0.5),
Color(green=1.0, blue=0.5),
Color(green=1.0, blue=1.0)
]
)
[39]:
HasseDiagram[Color](
colors,
domain_renderer=ColorRenderer()
)
[39]:
[40]:
len(colors)
[40]:
12
[41]:
display(*colors)
(Color(red=1.0, green=1.0, blue=0.0), Color(red=1.0, green=1.0, blue=0.0))
(Color(red=0.0, green=1.0, blue=1.0), Color(red=0.0, green=1.0, blue=1.0))
(Color(red=0.0, green=1.0, blue=0.5), Color(red=0.0, green=1.0, blue=1.0))
(Color(red=0.0, green=1.0, blue=0.5), Color(red=0.0, green=1.0, blue=0.5))
(Color(red=0.5, green=0.5, blue=0.0), Color(red=1.0, green=1.0, blue=0.0))
(Color(red=0.5, green=0.5, blue=0.0), Color(red=0.5, green=0.5, blue=0.0))
(Color(red=0.5, green=0.0, blue=0.0), Color(red=1.0, green=1.0, blue=0.0))
(Color(red=0.5, green=0.0, blue=0.0), Color(red=0.5, green=0.5, blue=0.0))
(Color(red=0.5, green=0.0, blue=0.0), Color(red=0.5, green=0.0, blue=0.0))
(Color(red=0.5, green=0.0, blue=0.0), Color(red=1.0, green=0.0, blue=0.0))
(Color(red=1.0, green=0.0, blue=0.0), Color(red=1.0, green=1.0, blue=0.0))
(Color(red=1.0, green=0.0, blue=0.0), Color(red=1.0, green=0.0, blue=0.0))
[42]:
display(*colors.cover)
(Color(red=0.0, green=1.0, blue=0.5), Color(red=0.0, green=1.0, blue=1.0))
(Color(red=0.5, green=0.5, blue=0.0), Color(red=1.0, green=1.0, blue=0.0))
(Color(red=0.5, green=0.0, blue=0.0), Color(red=1.0, green=0.0, blue=0.0))
(Color(red=0.5, green=0.0, blue=0.0), Color(red=0.5, green=0.5, blue=0.0))
(Color(red=1.0, green=0.0, blue=0.0), Color(red=1.0, green=1.0, blue=0.0))
[43]:
colors.domain >= {
Color(green=1.0, blue=0.5),
Color(green=1.0, blue=1.0)
}
[43]:
True
[44]:
display(*colors.top)
[45]:
display(*colors.bottom)
[46]:
Color(red=0.5)
[46]:
[47]:
display(*colors.successors(Color(red=0.5)))
[48]:
display(*colors.cover.successors(Color(red=0.5)))
[49]:
Color(red=1.0)
[49]:
[50]:
display(*colors.predecessors(Color(red=1.0)))
[51]:
display(*colors.cover.predecessors(Color(red=1.0)))