File size: 1,171 Bytes
8125804
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
40
41
42
43
44
45
46
47
48
49
50
from __future__ import annotations

from copy import deepcopy

from src.model.anchor_tree_types import AnchorTree, AnchorTreeEdge, AnchorTreeNode, AnchorTreeRelation


def make_anchor_tree(
    *,
    tree_id: str,
    root: AnchorTreeNode,
    nodes: list[AnchorTreeNode],
    edges: list[AnchorTreeEdge],
    domain: str,
    source_kind: str,
) -> AnchorTree:
    all_nodes = {node.node_id: node for node in [root, *nodes]}
    tree = AnchorTree(
        tree_id=tree_id,
        root_id=root.node_id,
        nodes=all_nodes,
        edges=edges,
        domain=domain,
        source_kind=source_kind,
    )
    tree.validate()
    return tree


def clone_tree(tree: AnchorTree) -> AnchorTree:
    return deepcopy(tree)


def attach_child_node(
    tree: AnchorTree,
    *,
    parent_id: str,
    node: AnchorTreeNode,
    relation: AnchorTreeRelation = AnchorTreeRelation.CHILD,
    score: float = 1.0,
) -> AnchorTree:
    updated = clone_tree(tree)
    updated.nodes[node.node_id] = node
    updated.edges.append(
        AnchorTreeEdge(parent_id=parent_id, child_id=node.node_id, relation=relation, score=score)
    )
    updated.validate()
    return updated