summaryrefslogtreecommitdiffstats
path: root/src/act4e_solutions/posets_sum.py
blob: c26a6e53d1fcdf8c18470a3fc75b13952cd772d6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
from typing import Any, overload, Sequence, TypeVar, Tuple

from .sets_sum import MyFiniteSetDisjointUnion

import act4e_interfaces as I


C = TypeVar("C")
E = Tuple[int, C]

class MyFinitePosetDisjointUnion(I.FinitePosetDisjointUnion[C, E]):
    _posets: Sequence[I.FinitePoset[C]]
    _carrier: I.FiniteSetDisjointUnion[C, E]
    def __init__(self, posets: Sequence[I.FinitePoset[C]]):
        self._posets = posets
        self._carrier = MyFiniteSetDisjointUnion(p.carrier() for p in posets)

    def components(self) -> Sequence[I.FinitePoset[C]]:
        return self._posets

    def carrier(self) -> I.FiniteSetDisjointUnion[C, E]:
        return self._carrier

    def holds(self, a: E, b: E):
        ia, va = self._carrier.unpack(a)
        ib, vb = self._carrier.unpack(b)

        if ia != ib:
            return False

        return self._posets[ia].holds(va, vb)


X = TypeVar("X")

class SolFinitePosetConstructionSum(I.FinitePosetConstructionSum):
    def disjoint_union(self, ps: Sequence[I.FinitePoset[X]]) -> I.FinitePosetDisjointUnion[X, Any]:
        return MyFinitePosetDisjointUnion(ps)