Hello, treepie nodes

%xmode Verbose
Exception reporting mode: Verbose
import jax

import treepie as tpy
from treepie import Aux, Node

Dataclasses

class Foo(tpy.Dataclass):
    x: Node[int]
    y: Aux[bool]
foo = Foo(1, True)

assert foo.x == 1
assert foo.y == True

print(foo)
Foo(x=1, y=True)
leaves, treedef = jax.tree.flatten(foo)

print(f"{leaves = }\n{treedef = }")
leaves = [1]
treedef = PyTreeDef(CustomNode(Foo[True], [*]))
print(jax.tree.unflatten(treedef, leaves))
Foo(x=1, y=True)

Frozen sequences

frozen_seq = tpy.FrozenSeq([2, True, None])

assert frozen_seq[0] == 2
assert frozen_seq[1] == True
assert frozen_seq[2] == None

print(frozen_seq)
FrozenSeq([2, True, None])
leaves, treedef = jax.tree.flatten(frozen_seq)

print(f"{leaves = }\n{treedef = }")
leaves = [2, True]
treedef = PyTreeDef(CustomNode(FrozenSeq[], [*, *, None]))
print(jax.tree.unflatten(treedef, leaves))
FrozenSeq([2, True, None])

Frozen mappings

frozen_map = tpy.FrozenMap({"a": 2, "b": True, "c": None})

assert frozen_map["a"] == 2
assert frozen_map["b"] == True
assert frozen_map["c"] == None

print(frozen_map)
FrozenMap({'a': 2, 'b': True, 'c': None})
leaves, treedef = jax.tree.flatten(frozen_map)

print(f"{leaves = }\n{treedef = }")
leaves = [2, True]
treedef = PyTreeDef(CustomNode(FrozenMap['a', 'b', 'c'], [*, *, None]))
print(jax.tree.unflatten(treedef, leaves))
FrozenMap({'a': 2, 'b': True, 'c': None})