From e04c0dd3bc4cba706392028d5d0c6ea7cc7e41cb Mon Sep 17 00:00:00 2001 From: Tom Date: Tue, 15 Apr 2025 14:43:21 +0100 Subject: [PATCH] Add tests --- src/python/qubed/Qube.py | 5 +++++ src/python/qubed/metadata.py | 41 ++++++++++++++++++++++++++++++++++++ tests/test_metadata.py | 0 3 files changed, 46 insertions(+) create mode 100644 src/python/qubed/metadata.py create mode 100644 tests/test_metadata.py diff --git a/src/python/qubed/Qube.py b/src/python/qubed/Qube.py index 6e5547d..cbfe7da 100644 --- a/src/python/qubed/Qube.py +++ b/src/python/qubed/Qube.py @@ -17,6 +17,7 @@ import numpy as np from frozendict import frozendict from . import set_operations +from .metadata import from_nodes from .node_types import NodeData, RootNodeData from .tree_formatters import ( HTML, @@ -111,6 +112,10 @@ class Qube: return from_json(json) + @classmethod + def from_nodes(cls, nodes: dict[str, dict], add_root: bool = True): + return from_nodes(cls, nodes, add_root) + def to_json(self) -> dict: def to_json(node: Qube) -> dict: return { diff --git a/src/python/qubed/metadata.py b/src/python/qubed/metadata.py new file mode 100644 index 0000000..4719d1c --- /dev/null +++ b/src/python/qubed/metadata.py @@ -0,0 +1,41 @@ +from typing import TYPE_CHECKING, Iterator + +import numpy as np + +from .value_types import QEnum + +if TYPE_CHECKING: + from .qube import Qube + + +def make_node( + cls, + key: str, + values: Iterator, + shape: list[int], + children: "tuple[Qube]", + metadata: dict[str, np.ndarray] | None = None, +): + return cls.make( + key=key, + values=QEnum(values), + metadata={k: np.array(v).reshape(shape) for k, v in metadata.items()} + if metadata is not None + else {}, + children=children, + ) + + +def from_nodes(cls, nodes, add_root=True): + shape = [len(n["values"]) for n in nodes.values()] + nodes = nodes.items() + *nodes, (key, info) = nodes + root = make_node(shape=shape, children=(), key=key, **info) + + for key, info in reversed(nodes): + shape.pop() + root = make_node(shape=shape, children=(root,), key=key, **info) + + if add_root: + return cls.root_node(children=(root,)) + return root diff --git a/tests/test_metadata.py b/tests/test_metadata.py new file mode 100644 index 0000000..e69de29