File size: 833 Bytes
e51ccda
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from __future__ import annotations

from dataclasses import dataclass, field
from enum import Enum
from typing import Sequence

from sgjm.graph.address import Address, Signature


class NodeStatus(str, Enum):
    DRAFT = "draft"
    ACCEPTED = "accepted"
    REJECTED = "rejected"
    COMMITTED = "committed"
    MERGED = "merged"


@dataclass
class Node:
    address: Address
    parents: tuple[Address, ...]
    tokens: tuple[int, ...]
    signature: Signature
    latent: tuple[float, ...] = ()
    status: NodeStatus = NodeStatus.DRAFT
    score: float = 0.0
    depth: int = 0
    metadata: dict = field(default_factory=dict)

    @property
    def is_root(self) -> bool:
        return not self.parents

    @property
    def is_terminal(self) -> bool:
        return self.status in (NodeStatus.COMMITTED, NodeStatus.REJECTED)