r"""Node in the proof state graph. Can be Point, Line, Circle, etc. Each node maintains a merge history to other nodes if they are (found out to be) equivalent a -> b - \ c -> d -> e -> f -> g d.merged_to = e d.rep = g d.merged_from = {a, b, c, d} d.equivs
| 22 | |
| 23 | |
| 24 | class Node: |
| 25 | r"""Node in the proof state graph. |
| 26 | |
| 27 | Can be Point, Line, Circle, etc. |
| 28 | |
| 29 | Each node maintains a merge history to |
| 30 | other nodes if they are (found out to be) equivalent |
| 31 | |
| 32 | a -> b - |
| 33 | \ |
| 34 | c -> d -> e -> f -> g |
| 35 | |
| 36 | d.merged_to = e |
| 37 | d.rep = g |
| 38 | d.merged_from = {a, b, c, d} |
| 39 | d.equivs = {a, b, c, d, e, f, g} |
| 40 | """ |
| 41 | |
| 42 | def __init__(self, name: str = '', graph: Any = None): |
| 43 | self.name = name or str(self) |
| 44 | self.graph = graph |
| 45 | |
| 46 | self.edge_graph = {} |
| 47 | # Edge graph: what other nodes is connected to this node. |
| 48 | # edge graph = { |
| 49 | # other1: {self1: deps, self2: deps}, |
| 50 | # other2: {self2: deps, self3: deps} |
| 51 | # } |
| 52 | |
| 53 | self.merge_graph = {} |
| 54 | # Merge graph: history of merges with other nodes. |
| 55 | # merge_graph = {self1: {self2: deps1, self3: deps2}} |
| 56 | |
| 57 | self.rep_by = None # represented by. |
| 58 | self.members = {self} |
| 59 | |
| 60 | self._val = None |
| 61 | self._obj = None |
| 62 | |
| 63 | self.deps = [] |
| 64 | |
| 65 | # numerical representation. |
| 66 | self.num = None |
| 67 | self.change = set() # what other nodes' num rely on this node? |
| 68 | |
| 69 | def set_rep(self, node: Node) -> None: |
| 70 | if node == self: |
| 71 | return |
| 72 | self.rep_by = node |
| 73 | node.merge_edge_graph(self.edge_graph) |
| 74 | node.members.update(self.members) |
| 75 | |
| 76 | def rep(self) -> Node: |
| 77 | x = self |
| 78 | while x.rep_by: |
| 79 | x = x.rep_by |
| 80 | return x |
| 81 |
nothing calls this directly
no outgoing calls
no test coverage detected