Skip to main content

Optimized PyTree Utilities.

Project description

OpTree

Python 3.9+ PyPI GitHub Workflow Status GitHub Workflow Status Codecov Documentation Status Downloads GitHub Repo Stars

Optimized PyTree Utilities.


Table of Contents


Installation

Install from PyPI (PyPI / Status):

pip3 install --upgrade optree

Install from conda-forge (conda-forge):

conda install conda-forge::optree

Install the latest version from GitHub:

pip3 install git+https://github.com/metaopt/optree.git#egg=optree

Or, clone this repo and install manually:

git clone --depth=1 https://github.com/metaopt/optree.git
cd optree

pip3 install .

The following options are available while building the Python C extension from the source:

export CMAKE_COMMAND="/path/to/custom/cmake"
export CMAKE_BUILD_TYPE="Debug"
export CMAKE_CXX_STANDARD="20"  # C++17 is tested on Linux/macOS (C++20 is required on Windows)
export OPTREE_CXX_WERROR="OFF"
export _GLIBCXX_USE_CXX11_ABI="1"
export pybind11_DIR="/path/to/custom/pybind11"
pip3 install .

Compiling from the source requires Python 3.9+, a compiler (gcc / clang / icc / cl.exe) that supports C++20 and a cmake installation.


PyTrees

A PyTree is a recursive structure that can be an arbitrarily nested Python container (e.g., tuple, list, dict, OrderedDict, NamedTuple, etc.) or an opaque Python object. The key concepts of tree operations are tree flattening and its inverse (tree unflattening). Additional tree operations can be performed based on these two basic functions (e.g., tree_map = tree_unflatten ∘ map ∘ tree_flatten).

Tree flattening is traversing the entire tree in a left-to-right depth-first manner and returning the leaves of the tree in a deterministic order.

>>> tree = {'b': (2, [3, 4]), 'a': 1, 'c': 5, 'd': 6}
>>> optree.tree_flatten(tree)
([1, 2, 3, 4, 5, 6], PyTreeSpec({'a': *, 'b': (*, [*, *]), 'c': *, 'd': *}))
>>> optree.tree_flatten(1)
([1], PyTreeSpec(*))
>>> optree.tree_flatten(None)
([], PyTreeSpec(None))
>>> optree.tree_map(lambda x: x**2, tree)
{'b': (4, [9, 16]), 'a': 1, 'c': 25, 'd': 36}

This usually implies that the equal pytrees return equal lists of leaves and the same tree structure. See also section Key Ordering for Dictionaries.

>>> {'a': [1, 2], 'b': [3]} == {'b': [3], 'a': [1, 2]}
True
>>> optree.tree_leaves({'a': [1, 2], 'b': [3]}) == optree.tree_leaves({'b': [3], 'a': [1, 2]})
True
>>> optree.tree_structure({'a': [1, 2], 'b': [3]}) == optree.tree_structure({'b': [3], 'a': [1, 2]})
True
>>> optree.tree_map(lambda x: x**2, {'a': [1, 2], 'b': [3]})
{'a': [1, 4], 'b': [9]}
>>> optree.tree_map(lambda x: x**2, {'b': [3], 'a': [1, 2]})
{'b': [9], 'a': [1, 4]}

To flatten dict and collections.defaultdict objects with the insertion order preserved, use the dict_insertion_ordered context manager:

>>> tree = {'b': (2, [3, 4]), 'a': 1, 'c': None, 'd': 5}
>>> optree.tree_flatten(tree)
(
    [1, 2, 3, 4, 5],
    PyTreeSpec({'a': *, 'b': (*, [*, *]), 'c': None, 'd': *})
)
>>> with optree.dict_insertion_ordered(True, namespace='some-namespace'):
...     optree.tree_flatten(tree, namespace='some-namespace')
(
    [2, 3, 4, 1, 5],
    PyTreeSpec({'b': (*, [*, *]), 'a': *, 'c': None, 'd': *}, namespace='some-namespace')
)

[!TIP]

Since OpTree v0.14.1, a new namespace optree.pytree is introduced as aliases for optree.tree_* functions. The following examples are equivalent to the above:

>>> import optree.pytree as pt
>>> tree = {'b': (2, [3, 4]), 'a': 1, 'c': 5, 'd': 6}
>>> pt.flatten(tree)
([1, 2, 3, 4, 5, 6], PyTreeSpec({'a': *, 'b': (*, [*, *]), 'c': *, 'd': *}))
>>> pt.flatten(1)
([1], PyTreeSpec(*))
>>> pt.flatten(None)
([], PyTreeSpec(None))
>>> pt.map(lambda x: x**2, tree)
{'b': (4, [9, 16]), 'a': 1, 'c': 25, 'd': 36}
>>> pt.map(lambda x: x**2, {'a': [1, 2], 'b': [3]})
{'a': [1, 4], 'b': [9]}
>>> pt.map(lambda x: x**2, {'b': [3], 'a': [1, 2]})
{'b': [9], 'a': [1, 4]}

Since OpTree v0.16.0, a re-export API optree.pytree.reexport(...) is available to create a new module that exports all the optree.pytree APIs with a given namespace. This is useful for downstream libraries to create their own pytree utilities without passing the namespace argument explicitly.

# foo/__init__.py
import optree
pytree = optree.pytree.reexport(namespace='foo')
del optree

# foo/bar.py
from foo import pytree

@pytree.dataclasses.dataclass
class Bar:
    a: int
    b: float

# User code
In [1]: import foo

In [2]: foo.pytree.flatten({'a': 1, 'b': 2, 'c': foo.bar.Bar(3, 4.0)}))
Out[2]:
(
    [1, 2, 3, 4.0],
    PyTreeSpec({'a': *, 'b': *, 'c': CustomTreeNode(Bar[()], [*, *])}, namespace='foo')
)

In [3]: foo.pytree.functools.reduce(lambda x, y: x * y, {'a': 1, 'b': 2, 'c': foo.bar.Bar(3, 4.0)}))
Out[3]: 24.0

Tree Nodes and Leaves

A tree is a collection of non-leaf nodes and leaf nodes, where the leaf nodes are opaque objects having no children to flatten. optree.tree_flatten(...) will flatten the tree and return a list of leaf nodes while the non-leaf nodes will store in the tree structure specification.

Built-in PyTree Node Types

OpTree out-of-box supports the following Python container types in the global registry:

which are considered non-leaf nodes in the tree.

Python objects that their type is not registered will be treated as leaf nodes. The registry lookup uses the is operator to determine whether the type is matched. So subclasses will need to explicitly register in the registry, otherwise, an object of that type will be considered a leaf. The NoneType is a special case discussed in section None is non-leaf Node vs. None is Leaf.

Registering a Container-like Custom Type as Non-leaf Nodes

A container-like Python type can be registered in the type registry with a pair of functions that specify:

  • flatten_func(container) -> (children, metadata, entries): convert an instance of the container type to a (children, metadata, entries) triple, where children is an iterable of subtrees and entries is an iterable of path entries of the container (e.g., indices or keys).
  • unflatten_func(metadata, children) -> container: convert such a pair back to an instance of the container type.

The metadata is some necessary data apart from the children to reconstruct the container, e.g., the keys of the dictionary (the children are values).

The entries can be omitted (only returns a pair) or is optional to implement (returns None). If so, use range(len(children)) (i.e., flat indices) as path entries of the current node. The signature for the flatten function can be one of the following:

  • flatten_func(container) -> (children, metadata, entries)
  • flatten_func(container) -> (children, metadata, None)
  • flatten_func(container) -> (children, metadata)

The following examples show how to register custom types and utilize them for tree_flatten and tree_map. Please refer to section Notes about the PyTree Type Registry for more information.

# Registry a Python type with lambda functions
optree.register_pytree_node(
    set,
    # (set) -> (children, metadata, None)
    lambda s: (sorted(s), None, None),
    # (metadata, children) -> (set)
    lambda _, children: set(children),
    namespace='set',
)

# Register a Python type into a namespace
import torch

class Torch2NumpyEntry(optree.PyTreeEntry):
    def __call__(self, obj):
        assert self.entry == 0
        return obj.cpu().detach().numpy()

    def codify(self, node=''):
        assert self.entry == 0
        return f'{node}.cpu().detach().numpy()'

optree.register_pytree_node(
    torch.Tensor,
    # (tensor) -> (children, metadata)
    flatten_func=lambda tensor: (
        (tensor.cpu().detach().numpy(),),
        {'dtype': tensor.dtype, 'device': tensor.device, 'requires_grad': tensor.requires_grad},
    ),
    # (metadata, children) -> tensor
    unflatten_func=lambda metadata, children: torch.tensor(children[0], **metadata),
    path_entry_type=Torch2NumpyEntry,
    namespace='torch2numpy',
)
>>> tree = {'weight': torch.ones(size=(1, 2)).cuda(), 'bias': torch.zeros(size=(2,))}
>>> tree
{'weight': tensor([[1., 1.]], device='cuda:0'), 'bias': tensor([0., 0.])}

# Flatten without specifying the namespace
>>> optree.tree_flatten(tree)  # `torch.Tensor`s are leaf nodes
([tensor([0., 0.]), tensor([[1., 1.]], device='cuda:0')], PyTreeSpec({'bias': *, 'weight': *}))

# Flatten with the namespace
>>> leaves, treespec = optree.tree_flatten(tree, namespace='torch2numpy')
>>> leaves, treespec
(
    [array([0., 0.], dtype=float32), array([[1., 1.]], dtype=float32)],
    PyTreeSpec(
        {
            'bias': CustomTreeNode(Tensor[{'dtype': torch.float32, 'device': device(type='cpu'), 'requires_grad': False}], [*]),
            'weight': CustomTreeNode(Tensor[{'dtype': torch.float32, 'device': device(type='cuda', index=0), 'requires_grad': False}], [*])
        },
        namespace='torch2numpy'
    )
)

# `entries` are not defined and use `range(len(children))`
>>> optree.tree_paths(tree, namespace='torch2numpy')
[('bias', 0), ('weight', 0)]

# Custom path entry type defines the pytree access behavior
>>> optree.tree_accessors(tree, namespace='torch2numpy')
[
    PyTreeAccessor(*['bias'].cpu().detach().numpy(), (MappingEntry(key='bias', type=<class 'dict'>), Torch2NumpyEntry(entry=0, type=<class 'torch.Tensor'>))),
    PyTreeAccessor(*['weight'].cpu().detach().numpy(), (MappingEntry(key='weight', type=<class 'dict'>), Torch2NumpyEntry(entry=0, type=<class 'torch.Tensor'>)))
]

# Unflatten back to a copy of the original object
>>> optree.tree_unflatten(treespec, leaves)
{'weight': tensor([[1., 1.]], device='cuda:0'), 'bias': tensor([0., 0.])}

Users can also extend the pytree registry by decorating the custom class and defining an instance method tree_flatten and a class method tree_unflatten.

from collections import UserDict

@optree.register_pytree_node_class(namespace='mydict')
class MyDict(UserDict):
    TREE_PATH_ENTRY_TYPE = optree.MappingEntry  # used by accessor APIs

    def __tree_flatten__(self):  # -> (children, metadata, entries)
        reversed_keys = sorted(self.keys(), reverse=True)
        return (
            [self[key] for key in reversed_keys],  # children
            reversed_keys,  # metadata
            reversed_keys,  # entries
        )

    @classmethod
    def __tree_unflatten__(cls, metadata, children):
        return cls(zip(metadata, children))
>>> tree = MyDict(b=4, a=(2, 3), c=MyDict({'d': 5, 'f': 6}))

# Flatten without specifying the namespace
>>> optree.tree_flatten_with_path(tree)  # `MyDict`s are leaf nodes
(
    [()],
    [MyDict(b=4, a=(2, 3), c=MyDict({'d': 5, 'f': 6}))],
    PyTreeSpec(*)
)

# Flatten with the namespace
>>> optree.tree_flatten_with_path(tree, namespace='mydict')
(
    [('c', 'f'), ('c', 'd'), ('b',), ('a', 0), ('a', 1)],
    [6, 5, 4, 2, 3],
    PyTreeSpec(
        CustomTreeNode(MyDict[['c', 'b', 'a']], [CustomTreeNode(MyDict[['f', 'd']], [*, *]), *, (*, *)]),
        namespace='mydict'
    )
)
>>> optree.tree_flatten_with_accessor(tree, namespace='mydict')
(
    [
        PyTreeAccessor(*['c']['f'], (MappingEntry(key='c', type=<class 'MyDict'>), MappingEntry(key='f', type=<class 'MyDict'>))),
        PyTreeAccessor(*['c']['d'], (MappingEntry(key='c', type=<class 'MyDict'>), MappingEntry(key='d', type=<class 'MyDict'>))),
        PyTreeAccessor(*['b'], (MappingEntry(key='b', type=<class 'MyDict'>),)),
        PyTreeAccessor(*['a'][0], (MappingEntry(key='a', type=<class 'MyDict'>), SequenceEntry(index=0, type=<class 'tuple'>))),
        PyTreeAccessor(*['a'][1], (MappingEntry(key='a', type=<class 'MyDict'>), SequenceEntry(index=1, type=<class 'tuple'>)))
    ],
    [6, 5, 4, 2, 3],
    PyTreeSpec(
        CustomTreeNode(MyDict[['c', 'b', 'a']], [CustomTreeNode(MyDict[['f', 'd']], [*, *]), *, (*, *)]),
        namespace='mydict'
    )
)

Notes about the PyTree Type Registry

There are several key attributes of the pytree type registry:

  1. The type registry is per-interpreter-dependent. This means registering a custom type in the registry affects all modules that use OpTree.

[!WARNING] For safety reasons, a namespace must be specified while registering a custom type. It is used to isolate the behavior of flattening and unflattening a pytree node type. This is to prevent accidental collisions between different libraries that may register the same type.

  1. The elements in the type registry are immutable. Users can neither register the same type twice in the same namespace (i.e., update the type registry), nor remove a type from the type registry. To update the behavior of an already registered type, simply register it again with another namespace.

  2. Users cannot modify the behavior of already registered built-in types listed in Built-in PyTree Node Types, such as key order sorting for dict and collections.defaultdict.

  3. Inherited subclasses are not implicitly registered. The registry lookup uses type(obj) is registered_type rather than isinstance(obj, registered_type). Users need to register the subclasses explicitly. To register all subclasses, it is easy to implement with metaclass or __init_subclass__, for example:

    from collections import UserDict
    
    @optree.register_pytree_node_class(namespace='mydict')
    class MyDict(UserDict):
        TREE_PATH_ENTRY_TYPE = optree.MappingEntry  # used by accessor APIs
    
        def __init_subclass__(cls):  # define this in the base class
            super().__init_subclass__()
            # Register a subclass to namespace 'mydict'
            optree.register_pytree_node_class(cls, namespace='mydict')
    
        def __tree_flatten__(self):  # -> (children, metadata, entries)
            reversed_keys = sorted(self.keys(), reverse=True)
            return (
                [self[key] for key in reversed_keys],  # children
                reversed_keys,  # metadata
                reversed_keys,  # entries
            )
    
        @classmethod
        def __tree_unflatten__(cls, metadata, children):
            return cls(zip(metadata, children))
    
    # Subclasses will be automatically registered in namespace 'mydict'
    class MyAnotherDict(MyDict):
        pass
    
    >>> tree = MyDict(b=4, a=(2, 3), c=MyAnotherDict({'d': 5, 'f': 6}))
    >>> optree.tree_flatten_with_path(tree, namespace='mydict')
    (
        [('c', 'f'), ('c', 'd'), ('b',), ('a', 0), ('a', 1)],
        [6, 5, 4, 2, 3],
        PyTreeSpec(
            CustomTreeNode(MyDict[['c', 'b', 'a']], [CustomTreeNode(MyAnotherDict[['f', 'd']], [*, *]), *, (*, *)]),
            namespace='mydict'
        )
    )
    >>> optree.tree_accessors(tree, namespace='mydict')
    [
        PyTreeAccessor(*['c']['f'], (MappingEntry(key='c', type=<class 'MyDict'>), MappingEntry(key='f', type=<class 'MyAnotherDict'>))),
        PyTreeAccessor(*['c']['d'], (MappingEntry(key='c', type=<class 'MyDict'>), MappingEntry(key='d', type=<class 'MyAnotherDict'>))),
        PyTreeAccessor(*['b'], (MappingEntry(key='b', type=<class 'MyDict'>),)),
        PyTreeAccessor(*['a'][0], (MappingEntry(key='a', type=<class 'MyDict'>), SequenceEntry(index=0, type=<class 'tuple'>))),
        PyTreeAccessor(*['a'][1], (MappingEntry(key='a', type=<class 'MyDict'>), SequenceEntry(index=1, type=<class 'tuple'>)))
    ]
    
  4. Be careful about the potential infinite recursion of the custom flatten function. The returned children from the custom flatten function are considered subtrees. They will be further flattened recursively. The children can have the same type as the current node. Users must design their termination condition carefully.

    import numpy as np
    import torch
    
    optree.register_pytree_node(
        np.ndarray,
        # Children are nest lists of Python objects
        lambda array: (np.atleast_1d(array).tolist(), array.ndim == 0),
        lambda scalar, rows: np.asarray(rows) if not scalar else np.asarray(rows[0]),
        namespace='numpy1',
    )
    
    optree.register_pytree_node(
        np.ndarray,
        # Children are Python objects
        lambda array: (
            list(array.ravel()),  # list(1DArray[T]) -> List[T]
            dict(shape=array.shape, dtype=array.dtype)
        ),
        lambda metadata, children: np.asarray(children, dtype=metadata['dtype']).reshape(metadata['shape']),
        namespace='numpy2',
    )
    
    optree.register_pytree_node(
        np.ndarray,
        # Returns a list of `np.ndarray`s without termination condition
        lambda array: ([array.ravel()], array.dtype),
        lambda shape, children: children[0].reshape(shape),
        namespace='numpy3',
    )
    
    optree.register_pytree_node(
        torch.Tensor,
        # Children are nest lists of Python objects
        lambda tensor: (torch.atleast_1d(tensor).tolist(), tensor.ndim == 0),
        lambda scalar, rows: torch.tensor(rows) if not scalar else torch.tensor(rows[0])),
        namespace='torch1',
    )
    
    optree.register_pytree_node(
        torch.Tensor,
        # Returns a list of `torch.Tensor`s without termination condition
        lambda tensor: (
            list(tensor.view(-1)),  # list(1DTensor[T]) -> List[0DTensor[T]] (STILL TENSORS!)
            tensor.shape
        ),
        lambda shape, children: torch.stack(children).reshape(shape),
        namespace='torch2',
    )
    
    >>> optree.tree_flatten(np.arange(9).reshape(3, 3), namespace='numpy1')
    (
        [0, 1, 2, 3, 4, 5, 6, 7, 8],
        PyTreeSpec(
            CustomTreeNode(ndarray[False], [[*, *, *], [*, *, *], [*, *, *]]),
            namespace='numpy1'
        )
    )
    # Implicitly casts `float`s to `np.float64`
    >>> optree.tree_map(lambda x: x + 1.5, np.arange(9).reshape(3, 3), namespace='numpy1')
    array([[1.5, 2.5, 3.5],
           [4.5, 5.5, 6.5],
           [7.5, 8.5, 9.5]])
    
    >>> optree.tree_flatten(np.arange(9).reshape(3, 3), namespace='numpy2')
    (
        [0, 1, 2, 3, 4, 5, 6, 7, 8],
        PyTreeSpec(
            CustomTreeNode(ndarray[{'shape': (3, 3), 'dtype': dtype('int64')}], [*, *, *, *, *, *, *, *, *]),
            namespace='numpy2'
        )
    )
    # Explicitly casts `float`s to `np.int64`
    >>> optree.tree_map(lambda x: x + 1.5, np.arange(9).reshape(3, 3), namespace='numpy2')
    array([[1, 2, 3],
           [4, 5, 6],
           [7, 8, 9]])
    
    # Children are also `np.ndarray`s, recurse without termination condition.
    >>> optree.tree_flatten(np.arange(9).reshape(3, 3), namespace='numpy3')
    Traceback (most recent call last):
        ...
    RecursionError: Maximum recursion depth exceeded during flattening the tree.
    
    >>> optree.tree_flatten(torch.arange(9).reshape(3, 3), namespace='torch1')
    (
        [0, 1, 2, 3, 4, 5, 6, 7, 8],
        PyTreeSpec(
            CustomTreeNode(Tensor[False], [[*, *, *], [*, *, *], [*, *, *]]),
            namespace='torch1'
        )
    )
    # Implicitly casts `float`s to `torch.float32`
    >>> optree.tree_map(lambda x: x + 1.5, torch.arange(9).reshape(3, 3), namespace='torch1')
    tensor([[1.5000, 2.5000, 3.5000],
            [4.5000, 5.5000, 6.5000],
            [7.5000, 8.5000, 9.5000]])
    
    # Children are also `torch.Tensor`s, recurse without termination condition.
    >>> optree.tree_flatten(torch.arange(9).reshape(3, 3), namespace='torch2')
    Traceback (most recent call last):
        ...
    RecursionError: Maximum recursion depth exceeded during flattening the tree.
    

None is Non-leaf Node vs. None is Leaf

The None object is a special object in the Python language. It serves some of the same purposes as null (a pointer does not point to anything) in other programming languages, which denotes a variable is empty or marks default parameters. However, the None object is a singleton object rather than a pointer. It may also serve as a sentinel value. In addition, if a function has returned without any return value or the return statement is omitted, the function will also implicitly return the None object.

By default, the None object is considered a non-leaf node in the tree with arity 0, i.e., a non-leaf node that has no children. This is like the behavior of an empty tuple. While flattening a tree, it will remain in the tree structure definitions rather than in the leaves list.

>>> tree = {'b': (2, [3, 4]), 'a': 1, 'c': None, 'd': 5}
>>> optree.tree_flatten(tree)
([1, 2, 3, 4, 5], PyTreeSpec({'a': *, 'b': (*, [*, *]), 'c': None, 'd': *}))
>>> optree.tree_flatten(tree, none_is_leaf=True)
([1, 2, 3, 4, None, 5], PyTreeSpec({'a': *, 'b': (*, [*, *]), 'c': *, 'd': *}, NoneIsLeaf))
>>> optree.tree_flatten(1)
([1], PyTreeSpec(*))
>>> optree.tree_flatten(None)
([], PyTreeSpec(None))
>>> optree.tree_flatten(None, none_is_leaf=True)
([None], PyTreeSpec(*, NoneIsLeaf))

OpTree provides a keyword argument none_is_leaf to determine whether to consider the None object as a leaf, like other opaque objects. If none_is_leaf=True, the None object will be placed in the leaves list. Otherwise, the None object will remain in the tree structure specification.

>>> import torch

>>> linear = torch.nn.Linear(in_features=3, out_features=2, bias=False)
>>> linear._parameters  # a container has None
OrderedDict({
    'weight': Parameter containing:
              tensor([[-0.6677,  0.5209,  0.3295],
                      [-0.4876, -0.3142,  0.1785]], requires_grad=True),
    'bias': None
})

>>> optree.tree_map(torch.zeros_like, linear._parameters)
OrderedDict({
    'weight': tensor([[0., 0., 0.],
                      [0., 0., 0.]]),
    'bias': None
})

>>> optree.tree_map(torch.zeros_like, linear._parameters, none_is_leaf=True)
Traceback (most recent call last):
    ...
TypeError: zeros_like(): argument 'input' (position 1) must be Tensor, not NoneType

>>> optree.tree_map(lambda t: torch.zeros_like(t) if t is not None else 0, linear._parameters, none_is_leaf=True)
OrderedDict({
    'weight': tensor([[0., 0., 0.],
                      [0., 0., 0.]]),
    'bias': 0
})

Key Ordering for Dictionaries

The built-in Python dictionary (i.e., builtins.dict) is an unordered mapping that holds the keys and values. The leaves of a dictionary are the values. Although since Python 3.6, the built-in dictionary is insertion ordered (PEP 468). The dictionary equality operator (==) does not check for key ordering. To ensure referential transparency that "equal dict" implies "equal ordering of leaves", the order of values of the dictionary is sorted by the keys. This behavior is also applied to collections.defaultdict.

>>> optree.tree_flatten({'a': [1, 2], 'b': [3]})
([1, 2, 3], PyTreeSpec({'a': [*, *], 'b': [*]}))
>>> optree.tree_flatten({'b': [3], 'a': [1, 2]})
([1, 2, 3], PyTreeSpec({'a': [*, *], 'b': [*]}))

If users want to keep the values in the insertion order in pytree traversal, they should use collections.OrderedDict, which will take the order of keys under consideration:

>>> OrderedDict([('a', [1, 2]), ('b', [3])]) == OrderedDict([('b', [3]), ('a', [1, 2])])
False
>>> optree.tree_flatten(OrderedDict([('a', [1, 2]), ('b', [3])]))
([1, 2, 3], PyTreeSpec(OrderedDict({'a': [*, *], 'b': [*]})))
>>> optree.tree_flatten(OrderedDict([('b', [3]), ('a', [1, 2])]))
([3, 1, 2], PyTreeSpec(OrderedDict({'b': [*], 'a': [*, *]})))

To flatten builtins.dict and collections.defaultdict objects with the insertion order preserved, use the dict_insertion_ordered context manager:

>>> tree = {'b': (2, [3, 4]), 'a': 1, 'c': None, 'd': 5}
>>> optree.tree_flatten(tree)
(
    [1, 2, 3, 4, 5],
    PyTreeSpec({'a': *, 'b': (*, [*, *]), 'c': None, 'd': *})
)
>>> with optree.dict_insertion_ordered(True, namespace='some-namespace'):
...     optree.tree_flatten(tree, namespace='some-namespace')
(
    [2, 3, 4, 1, 5],
    PyTreeSpec({'b': (*, [*, *]), 'a': *, 'c': None, 'd': *}, namespace='some-namespace')
)

Since OpTree v0.9.0, the key order of the reconstructed output dictionaries from tree_unflatten is guaranteed to be consistent with the key order of the input dictionaries in tree_flatten.

>>> leaves, treespec = optree.tree_flatten({'b': [3], 'a': [1, 2]})
>>> leaves, treespec
([1, 2, 3], PyTreeSpec({'a': [*, *], 'b': [*]}))
>>> optree.tree_unflatten(treespec, leaves)
{'b': [3], 'a': [1, 2]}
>>> optree.tree_map(lambda x: x, {'b': [3], 'a': [1, 2]})
{'b': [3], 'a': [1, 2]}
>>> optree.tree_map(lambda x: x + 1, {'b': [3], 'a': [1, 2]})
{'b': [4], 'a': [2, 3]}

This property is also preserved during serialization/deserialization.

>>> leaves, treespec = optree.tree_flatten({'b': [3], 'a': [1, 2]})
>>> leaves, treespec
([1, 2, 3], PyTreeSpec({'a': [*, *], 'b': [*]}))
>>> restored_treespec = pickle.loads(pickle.dumps(treespec))
>>> optree.tree_unflatten(treespec, leaves)
{'b': [3], 'a': [1, 2]}
>>> optree.tree_unflatten(restored_treespec, leaves)
{'b': [3], 'a': [1, 2]}

[!NOTE] Note that there are no restrictions on the dict to require the keys to be comparable (sortable). There can be multiple types of keys in the dictionary. The keys are sorted in ascending order by key=lambda k: k first if capable otherwise fallback to key=lambda k: (f'{k.__class__.__module__}.{k.__class__.__qualname__}', k). This handles most cases.

>>> sorted({1: 2, 1.5: 1}.keys())
[1, 1.5]
>>> sorted({'a': 3, 1: 2, 1.5: 1}.keys())
Traceback (most recent call last):
    ...
TypeError: '<' not supported between instances of 'int' and 'str'
>>> sorted({'a': 3, 1: 2, 1.5: 1}.keys(), key=lambda k: (f'{k.__class__.__module__}.{k.__class__.__qualname__}', k))
[1.5, 1, 'a']

Changelog

See CHANGELOG.md.


License

OpTree is released under the Apache License 2.0.

OpTree is heavily based on JAX's implementation of the PyTree utility, with deep refactoring and several improvements. The original licenses can be found at JAX's Apache License 2.0 and Tensorflow's Apache License 2.0.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

optree-0.18.0.tar.gz (165.2 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

optree-0.18.0-pp311-pypy311_pp73-win_amd64.whl (314.8 kB view details)

Uploaded PyPyWindows x86-64

optree-0.18.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (403.6 kB view details)

Uploaded PyPymanylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

optree-0.18.0-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (363.3 kB view details)

Uploaded PyPymanylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

optree-0.18.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl (346.1 kB view details)

Uploaded PyPymacOS 11.0+ ARM64

optree-0.18.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl (371.2 kB view details)

Uploaded PyPymacOS 10.15+ x86-64

optree-0.18.0-cp314-cp314t-win_arm64.whl (358.5 kB view details)

Uploaded CPython 3.14tWindows ARM64

optree-0.18.0-cp314-cp314t-win_amd64.whl (366.5 kB view details)

Uploaded CPython 3.14tWindows x86-64

optree-0.18.0-cp314-cp314t-win32.whl (327.2 kB view details)

Uploaded CPython 3.14tWindows x86

optree-0.18.0-cp314-cp314t-manylinux_2_39_riscv64.whl (387.5 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.39+ riscv64

optree-0.18.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (426.7 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

optree-0.18.0-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl (437.8 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.26+ s390xmanylinux: glibc 2.28+ s390x

optree-0.18.0-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl (438.2 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.26+ ppc64lemanylinux: glibc 2.28+ ppc64le

optree-0.18.0-cp314-cp314t-manylinux_2_26_i686.manylinux_2_28_i686.whl (442.3 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.26+ i686manylinux: glibc 2.28+ i686

optree-0.18.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (386.2 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

optree-0.18.0-cp314-cp314t-macosx_11_0_arm64.whl (387.1 kB view details)

Uploaded CPython 3.14tmacOS 11.0+ ARM64

optree-0.18.0-cp314-cp314t-macosx_10_15_x86_64.whl (415.3 kB view details)

Uploaded CPython 3.14tmacOS 10.15+ x86-64

optree-0.18.0-cp314-cp314-win_arm64.whl (325.0 kB view details)

Uploaded CPython 3.14Windows ARM64

optree-0.18.0-cp314-cp314-win_amd64.whl (322.0 kB view details)

Uploaded CPython 3.14Windows x86-64

optree-0.18.0-cp314-cp314-win32.whl (292.1 kB view details)

Uploaded CPython 3.14Windows x86

optree-0.18.0-cp314-cp314-manylinux_2_39_riscv64.whl (369.2 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.39+ riscv64

optree-0.18.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (413.6 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

optree-0.18.0-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl (426.2 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.26+ s390xmanylinux: glibc 2.28+ s390x

optree-0.18.0-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl (426.2 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.26+ ppc64lemanylinux: glibc 2.28+ ppc64le

optree-0.18.0-cp314-cp314-manylinux_2_26_i686.manylinux_2_28_i686.whl (430.1 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.26+ i686manylinux: glibc 2.28+ i686

optree-0.18.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (370.2 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

optree-0.18.0-cp314-cp314-macosx_11_0_arm64.whl (346.1 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

optree-0.18.0-cp314-cp314-macosx_10_15_x86_64.whl (371.1 kB view details)

Uploaded CPython 3.14macOS 10.15+ x86-64

optree-0.18.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl (345.6 kB view details)

Uploaded CPython 3.14iOS 13.0+ ARM64 Simulator

optree-0.18.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl (339.8 kB view details)

Uploaded CPython 3.14iOS 13.0+ ARM64 Device

optree-0.18.0-cp314-cp314-android_24_x86_64.whl (876.3 kB view details)

Uploaded Android API level 24+ x86-64CPython 3.14

optree-0.18.0-cp314-cp314-android_24_arm64_v8a.whl (876.0 kB view details)

Uploaded Android API level 24+ ARM64 v8aCPython 3.14

optree-0.18.0-cp313-cp313t-win_arm64.whl (351.2 kB view details)

Uploaded CPython 3.13tWindows ARM64

optree-0.18.0-cp313-cp313t-win_amd64.whl (351.8 kB view details)

Uploaded CPython 3.13tWindows x86-64

optree-0.18.0-cp313-cp313t-win32.whl (318.3 kB view details)

Uploaded CPython 3.13tWindows x86

optree-0.18.0-cp313-cp313t-manylinux_2_39_riscv64.whl (387.5 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.39+ riscv64

optree-0.18.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (426.7 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

optree-0.18.0-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl (437.8 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.26+ s390xmanylinux: glibc 2.28+ s390x

optree-0.18.0-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl (438.3 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.26+ ppc64lemanylinux: glibc 2.28+ ppc64le

optree-0.18.0-cp313-cp313t-manylinux_2_26_i686.manylinux_2_28_i686.whl (442.3 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.26+ i686manylinux: glibc 2.28+ i686

optree-0.18.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (386.3 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

optree-0.18.0-cp313-cp313t-macosx_11_0_arm64.whl (387.0 kB view details)

Uploaded CPython 3.13tmacOS 11.0+ ARM64

optree-0.18.0-cp313-cp313t-macosx_10_13_x86_64.whl (415.6 kB view details)

Uploaded CPython 3.13tmacOS 10.13+ x86-64

optree-0.18.0-cp313-cp313-win_arm64.whl (317.5 kB view details)

Uploaded CPython 3.13Windows ARM64

optree-0.18.0-cp313-cp313-win_amd64.whl (314.9 kB view details)

Uploaded CPython 3.13Windows x86-64

optree-0.18.0-cp313-cp313-win32.whl (287.2 kB view details)

Uploaded CPython 3.13Windows x86

optree-0.18.0-cp313-cp313-manylinux_2_39_riscv64.whl (368.2 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.39+ riscv64

optree-0.18.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (414.1 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

optree-0.18.0-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl (423.2 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.26+ s390xmanylinux: glibc 2.28+ s390x

optree-0.18.0-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl (425.0 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.26+ ppc64lemanylinux: glibc 2.28+ ppc64le

optree-0.18.0-cp313-cp313-manylinux_2_26_i686.manylinux_2_28_i686.whl (430.2 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.26+ i686manylinux: glibc 2.28+ i686

optree-0.18.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (368.7 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

optree-0.18.0-cp313-cp313-macosx_11_0_arm64.whl (346.5 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

optree-0.18.0-cp313-cp313-macosx_10_13_x86_64.whl (372.3 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

optree-0.18.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl (346.1 kB view details)

Uploaded CPython 3.13iOS 13.0+ ARM64 Simulator

optree-0.18.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl (340.3 kB view details)

Uploaded CPython 3.13iOS 13.0+ ARM64 Device

optree-0.18.0-cp313-cp313-android_24_x86_64.whl (876.8 kB view details)

Uploaded Android API level 24+ x86-64CPython 3.13

optree-0.18.0-cp313-cp313-android_24_arm64_v8a.whl (876.5 kB view details)

Uploaded Android API level 24+ ARM64 v8aCPython 3.13

optree-0.18.0-cp312-cp312-win_arm64.whl (315.7 kB view details)

Uploaded CPython 3.12Windows ARM64

optree-0.18.0-cp312-cp312-win_amd64.whl (312.4 kB view details)

Uploaded CPython 3.12Windows x86-64

optree-0.18.0-cp312-cp312-win32.whl (286.8 kB view details)

Uploaded CPython 3.12Windows x86

optree-0.18.0-cp312-cp312-manylinux_2_39_riscv64.whl (365.0 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.39+ riscv64

optree-0.18.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (408.2 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

optree-0.18.0-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl (420.8 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.26+ s390xmanylinux: glibc 2.28+ s390x

optree-0.18.0-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl (421.4 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.26+ ppc64lemanylinux: glibc 2.28+ ppc64le

optree-0.18.0-cp312-cp312-manylinux_2_26_i686.manylinux_2_28_i686.whl (425.4 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.26+ i686manylinux: glibc 2.28+ i686

optree-0.18.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (364.4 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

optree-0.18.0-cp312-cp312-macosx_11_0_arm64.whl (342.8 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

optree-0.18.0-cp312-cp312-macosx_10_13_x86_64.whl (369.8 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

optree-0.18.0-cp311-cp311-win_arm64.whl (317.2 kB view details)

Uploaded CPython 3.11Windows ARM64

optree-0.18.0-cp311-cp311-win_amd64.whl (312.2 kB view details)

Uploaded CPython 3.11Windows x86-64

optree-0.18.0-cp311-cp311-win32.whl (283.6 kB view details)

Uploaded CPython 3.11Windows x86

optree-0.18.0-cp311-cp311-manylinux_2_39_riscv64.whl (360.0 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.39+ riscv64

optree-0.18.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (400.8 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

optree-0.18.0-cp311-cp311-manylinux_2_26_s390x.manylinux_2_28_s390x.whl (413.0 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.26+ s390xmanylinux: glibc 2.28+ s390x

optree-0.18.0-cp311-cp311-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl (417.6 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.26+ ppc64lemanylinux: glibc 2.28+ ppc64le

optree-0.18.0-cp311-cp311-manylinux_2_26_i686.manylinux_2_28_i686.whl (420.7 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.26+ i686manylinux: glibc 2.28+ i686

optree-0.18.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (361.6 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

optree-0.18.0-cp311-cp311-macosx_11_0_arm64.whl (337.3 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

optree-0.18.0-cp311-cp311-macosx_10_9_x86_64.whl (363.1 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

optree-0.18.0-cp310-cp310-win_amd64.whl (302.7 kB view details)

Uploaded CPython 3.10Windows x86-64

optree-0.18.0-cp310-cp310-win32.whl (277.7 kB view details)

Uploaded CPython 3.10Windows x86

optree-0.18.0-cp310-cp310-manylinux_2_39_riscv64.whl (348.0 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.39+ riscv64

optree-0.18.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (386.6 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

optree-0.18.0-cp310-cp310-manylinux_2_26_s390x.manylinux_2_28_s390x.whl (397.5 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.26+ s390xmanylinux: glibc 2.28+ s390x

optree-0.18.0-cp310-cp310-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl (401.8 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.26+ ppc64lemanylinux: glibc 2.28+ ppc64le

optree-0.18.0-cp310-cp310-manylinux_2_26_i686.manylinux_2_28_i686.whl (404.2 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.26+ i686manylinux: glibc 2.28+ i686

optree-0.18.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (349.7 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

optree-0.18.0-cp310-cp310-macosx_11_0_arm64.whl (330.5 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

optree-0.18.0-cp310-cp310-macosx_10_9_x86_64.whl (353.3 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

optree-0.18.0-cp39-cp39-win_amd64.whl (309.4 kB view details)

Uploaded CPython 3.9Windows x86-64

optree-0.18.0-cp39-cp39-win32.whl (277.9 kB view details)

Uploaded CPython 3.9Windows x86

optree-0.18.0-cp39-cp39-manylinux_2_39_riscv64.whl (347.8 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.39+ riscv64

optree-0.18.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (386.9 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

optree-0.18.0-cp39-cp39-manylinux_2_26_s390x.manylinux_2_28_s390x.whl (397.6 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.26+ s390xmanylinux: glibc 2.28+ s390x

optree-0.18.0-cp39-cp39-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl (402.4 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.26+ ppc64lemanylinux: glibc 2.28+ ppc64le

optree-0.18.0-cp39-cp39-manylinux_2_26_i686.manylinux_2_28_i686.whl (404.9 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.26+ i686manylinux: glibc 2.28+ i686

optree-0.18.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (349.5 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

optree-0.18.0-cp39-cp39-macosx_11_0_arm64.whl (330.6 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

optree-0.18.0-cp39-cp39-macosx_10_9_x86_64.whl (353.3 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

File details

Details for the file optree-0.18.0.tar.gz.

File metadata

  • Download URL: optree-0.18.0.tar.gz
  • Upload date:
  • Size: 165.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for optree-0.18.0.tar.gz
Algorithm Hash digest
SHA256 3804fb6ddc923855db2dc4805b4524c66e00f1ef30b166be4aadd52822b13e06
MD5 c625a5e11f4079c92ae244a4cba74e0a
BLAKE2b-256 838e09d899ad531d50b79aa24e7558f604980fe4048350172e643bb1b9983aec

See more details on using hashes here.

File details

Details for the file optree-0.18.0-pp311-pypy311_pp73-win_amd64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-pp311-pypy311_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 01b79aaee544adf5bfa573db32b943030dfeb9fd1c6e7a97aa417db56a8127e7
MD5 7ba1070e90197a01152c1c594e5cfff4
BLAKE2b-256 1361016ff1dcf63b97bfd182af8705f156e128a1e3adfcd94a2283fe04cf95d7

See more details on using hashes here.

File details

Details for the file optree-0.18.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ff7326f36ed70d84c3fd62fb39bc6858f699640b8ab238c3cb8dafe1e200af59
MD5 d6db034d48be7a7af7743022eb9bdbfd
BLAKE2b-256 b0c919d5a8d99934f80bfa02d503587a5697a374324f95ccc4c1656a8a74fc3b

See more details on using hashes here.

File details

Details for the file optree-0.18.0-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 10f29662d637b80363dc620da46ddc58def7acf7935e20595b23e216ea912367
MD5 a3bdf6f60221b12c0cad5a3f7c57475f
BLAKE2b-256 505655e565d593d91a47ee70b91b693a763362aafac3bde06288036309c87949

See more details on using hashes here.

File details

Details for the file optree-0.18.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ba23caafd0e0c911bb7eab54e5cf69644af864d153e4b2abdab83ff0ef357ba1
MD5 8906411e68ea3109795de1858e469521
BLAKE2b-256 d2da4ddcf4fbb75c5779f58b1f85657209f5e38eb34d41c038502e1d0bdae68d

See more details on using hashes here.

File details

Details for the file optree-0.18.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 30fefc84975ac41d9075993196c64ce0c240510f0539cff121d63b709e03846f
MD5 bf0e831687df1c8e6319f1db4110bca0
BLAKE2b-256 795d3c654144031d4dc28442bca8343bc02d177ab5da4c38ed521cad59e5d4b0

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp314-cp314t-win_arm64.whl.

File metadata

  • Download URL: optree-0.18.0-cp314-cp314t-win_arm64.whl
  • Upload date:
  • Size: 358.5 kB
  • Tags: CPython 3.14t, Windows ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for optree-0.18.0-cp314-cp314t-win_arm64.whl
Algorithm Hash digest
SHA256 b4da3223c5b4cf694822752d0fbb6bf34c3f41648af1bd1b443cc3d68cc55106
MD5 306eeb055f07cda9ccc59e74fafa12aa
BLAKE2b-256 db6765af89c4a64b13df70dcf9f09fc42623f490e5b4f4854577679e781c5c32

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp314-cp314t-win_amd64.whl.

File metadata

  • Download URL: optree-0.18.0-cp314-cp314t-win_amd64.whl
  • Upload date:
  • Size: 366.5 kB
  • Tags: CPython 3.14t, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for optree-0.18.0-cp314-cp314t-win_amd64.whl
Algorithm Hash digest
SHA256 94983b3aa31ee401d2ac77ba570a3157d83f9508cfbb006095a48770e0a1c5ca
MD5 e3d2db7f994e2a8875617793902fa692
BLAKE2b-256 3584295aa33e8530c72b45592714a5b07b23e178d2df44baa964c8a91226eac4

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp314-cp314t-win32.whl.

File metadata

  • Download URL: optree-0.18.0-cp314-cp314t-win32.whl
  • Upload date:
  • Size: 327.2 kB
  • Tags: CPython 3.14t, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for optree-0.18.0-cp314-cp314t-win32.whl
Algorithm Hash digest
SHA256 e4a468ae1541614b5aa7b4f00254bce005ab7572fbb1fc764af4ee17d90fde7b
MD5 29435ff0e403bc6580a958db1900c9f7
BLAKE2b-256 a0f8b1367b93290b9e1b99a5ad1bbedaf76da62cf81578f452a91bfef5cfd1bb

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp314-cp314t-manylinux_2_39_riscv64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp314-cp314t-manylinux_2_39_riscv64.whl
Algorithm Hash digest
SHA256 a5c213a291c798139ed9ff80aec4bfcd2ac8f001bc015a9cdeb78457e9687dd3
MD5 9241744cc1c877681b4e578d7310964b
BLAKE2b-256 708ae1da179a5ebfdb9e279ae655ec38f19e8893a36193203fd6022a31d573b4

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 51e2cd9ac7fecfd5f6f56ce69f4f805553c226a2744810175959eb408101513c
MD5 66daf5f7a5ed99700c43fb2a0d5fba7b
BLAKE2b-256 e699c1b84be2143df01819818e8c5db0c284ce995a51134030352ade6d9d1d75

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl
Algorithm Hash digest
SHA256 c017539e1196ea08f20aea3a4c473f758149b851678edd3d15773b4326decf83
MD5 3adcc0847e0f6b5e720ecebda2a4e27f
BLAKE2b-256 38831eea2619385bd3ecfda76bb563f4127dc8b4197dcb614eb3f9032c82c2a7

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl
Algorithm Hash digest
SHA256 d569730b2647c51a5ee68d67198aa9a78c7a55563d57b8cc1ca8d8c8377e7621
MD5 de3ae08c0cf6e4a44b24ce970962f54f
BLAKE2b-256 907d015c58cf2b0aa0049ac33e1aa76b1fd4563551aeb9f83b10c2217668c355

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp314-cp314t-manylinux_2_26_i686.manylinux_2_28_i686.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp314-cp314t-manylinux_2_26_i686.manylinux_2_28_i686.whl
Algorithm Hash digest
SHA256 80d971060c888c3989132b7e75dfb50848636d41bc931af1b93fe2019fba469c
MD5 c251f3673b9b42cbdf7746fc9517baba
BLAKE2b-256 eab2d20c302926c6c18c379801a6532c0722f7f1a305b7d5712e437708ebdb42

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 30a2636279bdc805c8e154a0f346bcf704626b831ff44724d305fb72c90b7389
MD5 4c3e4d003c02c62417007d8a394e69ee
BLAKE2b-256 d3ff91b9898b08b6f3187a4c99836648893f68d62f61a304b6f6ec61d3e27a77

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp314-cp314t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp314-cp314t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 07c5f64783ad0f0f80e61c25f276ce79b47deda83ed7956a4a9af6385fe8f60d
MD5 9688f72043ff8b00b3cccfa778a1f46c
BLAKE2b-256 892790de0dcbfdaf82ce616eaa2193a540ec7b4dd1587a5ff0c6a7485c846dd6

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp314-cp314t-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp314-cp314t-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 20536964ba2458f166c1e8ab25951e3fc0a5056b651bd08f16be99bb3ffed54a
MD5 38006cb6c9e38b5bb7a83d6415845aa7
BLAKE2b-256 e5767ba344abd30ce4e3c29d50936a2f28341a772bcebec2948be9915f2a3ece

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp314-cp314-win_arm64.whl.

File metadata

  • Download URL: optree-0.18.0-cp314-cp314-win_arm64.whl
  • Upload date:
  • Size: 325.0 kB
  • Tags: CPython 3.14, Windows ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for optree-0.18.0-cp314-cp314-win_arm64.whl
Algorithm Hash digest
SHA256 89d5156f8a0a3792701e1c31473eb307f0b45696f48dc51d721f1bfe0c3a950f
MD5 9813251c44a276f1ae5e96e6cbcd086e
BLAKE2b-256 39a8481afd23d2e66fddc5891b1540778ebedae90e770fe44c68c9f3dbd9e321

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: optree-0.18.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 322.0 kB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for optree-0.18.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 2b5cfb5fc643f16d3a7d957807e55a937dce07566c49ccc4aa71b01064c56758
MD5 d76e214f25f3a187a36079648ef0ff16
BLAKE2b-256 5e0c87c9ced927a4cda6b99959cc9341e0a1acb4cd6eb49d2ccd7ac57039c63e

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp314-cp314-win32.whl.

File metadata

  • Download URL: optree-0.18.0-cp314-cp314-win32.whl
  • Upload date:
  • Size: 292.1 kB
  • Tags: CPython 3.14, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for optree-0.18.0-cp314-cp314-win32.whl
Algorithm Hash digest
SHA256 f5197f864630162f008f5dfad3fceef32553c0fa7639eee1b8e280d924ed678e
MD5 d43ca289dea1c6834a9288d894c8f469
BLAKE2b-256 d9b0ea9d562ca87f25bb90944eb411d1ac29ec6c7e38cebf2024e8124fd0e31d

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp314-cp314-manylinux_2_39_riscv64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp314-cp314-manylinux_2_39_riscv64.whl
Algorithm Hash digest
SHA256 289b184cc41dfc400a30db6207ec997884d14540aae2cba10cb88dc7ebaae2a1
MD5 a16225519539e3fdd59d5e44319f3747
BLAKE2b-256 5ede71c51bdf6053e6d7cbdf176eb30d7b5c5ad6180eb6e822d13b36b1edecff

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c1f20e8754abe312a701ee00d071ddd8502e9d97ca38fbc56204d14a9ffcb41c
MD5 b242718d1d6374605922023d286a5d2f
BLAKE2b-256 63a60bf029f0bdd05f49548644267fc69574a7ca18735010a86d736e7a1ed03c

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl
Algorithm Hash digest
SHA256 1b75e083137f361377ff8d70df885ab3a1cf8980e4019e3f311237579adadb64
MD5 ecfcb5ca1612c7bd6e5f48e0819b99bf
BLAKE2b-256 e536eedcfcd421801578119ff5fb6731cd50c65f57a729f6f76f8fe6f37d9939

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl
Algorithm Hash digest
SHA256 1f674e34202383f8b42fa9335f13bedfb6b6f019c66e1f41034929e4be203423
MD5 8c1b5c1bdebabd9c31f6c09e5ef040f5
BLAKE2b-256 bf1792d0dade6ff46aebad86ae23ac801251e7de18526eee216986de684c3375

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp314-cp314-manylinux_2_26_i686.manylinux_2_28_i686.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp314-cp314-manylinux_2_26_i686.manylinux_2_28_i686.whl
Algorithm Hash digest
SHA256 9104fc8915890e7292e5833fc677e4749607c67aa3cf8884677267078201c2f3
MD5 9788ac72d2f5f1aa1a2dd50fd69097aa
BLAKE2b-256 f05e0fffd06757494e88b3e5699f6df2da301dd9bf19a4f31c197c585dc5001e

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 cde70c97e4cc4e997e8fda2266e40a9bff7679c72ab4af6e15e81748a12882cc
MD5 f982bc4d1f51d2d192c2643fb1c4b733
BLAKE2b-256 dc338c6efe13c5cccb464bba868203649888dc875d2010c8a1acec0e9af88e37

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0959bac58631e64e2ac6349cc284b37872c24f353b3d73b4682202a431f07d76
MD5 308d31e35e57450f217bcc4ca80a0a9e
BLAKE2b-256 66e145193039b4432f4142eb978c847cd64533c4db7dc5dcdeb406ceac396961

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp314-cp314-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 5e669f98b9af9f66144c7ae09912d0367ac3182abe016f67cdd15cb45e13c923
MD5 3a7f2e81903ebd050568630833cc2618
BLAKE2b-256 8ccd31ca853e5f1e9002789de46e5263a3f23d9f9cb9fa490c8bf97fb02076c1

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl
Algorithm Hash digest
SHA256 7172b16e87c87160475275e4bfaa6e4067ccde184d2cca65ba25a402a8ed7758
MD5 a51855b76d72329b4f1958bc1639696d
BLAKE2b-256 b8b9a4214afaa44ff7d8b2c02ed058b318fcfd73af06daeac45d4845ef26d1b6

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl
Algorithm Hash digest
SHA256 db00c604c1ae452f6092293bf230984d4f6cbb3ad905a9991e8cf680fd7d1523
MD5 802cd9067dd67c92628a6bcea76a40b9
BLAKE2b-256 54f8588807ec9c21bfec2fcf6b3e4f93abac62cad9bc0b8c0e248f1c30d9c160

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp314-cp314-android_24_x86_64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp314-cp314-android_24_x86_64.whl
Algorithm Hash digest
SHA256 895f23a4cd8aee2c2464efdad2d9bde28a2aaabee634c96423a933f40e74a67e
MD5 271bb5e1a80811a0586cbce484ee95d7
BLAKE2b-256 3cda6d524879da8892ea8a2562278d0aca06827e7c053015806c5853bb9c3bd8

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp314-cp314-android_24_arm64_v8a.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp314-cp314-android_24_arm64_v8a.whl
Algorithm Hash digest
SHA256 5b126c34b459ef4f10f3a4d7d222416d9102b3c5a76b39f346c611792f144821
MD5 09de2755b357630ef05d15178c1831e1
BLAKE2b-256 3ef0dabcb70f2065f782e4c2fac18bde75267d24aa5813b58e7ae9e045ecf9f0

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp313-cp313t-win_arm64.whl.

File metadata

  • Download URL: optree-0.18.0-cp313-cp313t-win_arm64.whl
  • Upload date:
  • Size: 351.2 kB
  • Tags: CPython 3.13t, Windows ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for optree-0.18.0-cp313-cp313t-win_arm64.whl
Algorithm Hash digest
SHA256 9460cba62e941626beb75c99a803373b38a52136d5f1932fcdfdcede1df6f2ef
MD5 c6519e57d8bc8c14eb2ec4d0d569fd18
BLAKE2b-256 bc3437f409de017aa06ee98a01ddb8b93960bd29459f01f090cc461a250977d2

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp313-cp313t-win_amd64.whl.

File metadata

  • Download URL: optree-0.18.0-cp313-cp313t-win_amd64.whl
  • Upload date:
  • Size: 351.8 kB
  • Tags: CPython 3.13t, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for optree-0.18.0-cp313-cp313t-win_amd64.whl
Algorithm Hash digest
SHA256 a63df296fec376c5cd08298a85109db4a130f4cc8df15916fc92d44ef6068937
MD5 c5c38231e5751bf9325a592e8cce7754
BLAKE2b-256 b72187a30a42f1c14365099dc2d656c73bef90a2becbaa1249eca09bf4d9277b

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp313-cp313t-win32.whl.

File metadata

  • Download URL: optree-0.18.0-cp313-cp313t-win32.whl
  • Upload date:
  • Size: 318.3 kB
  • Tags: CPython 3.13t, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for optree-0.18.0-cp313-cp313t-win32.whl
Algorithm Hash digest
SHA256 3014537ff7e4e091ee46e57976f7d95c52f66a0e3eb5ebcbe0de0d924504b58e
MD5 a994d17aeb6b5d2da484d295f2dc1c34
BLAKE2b-256 a03b76a1b45688be72e37965aa467296ebbc743786492287d45907e045933625

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp313-cp313t-manylinux_2_39_riscv64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp313-cp313t-manylinux_2_39_riscv64.whl
Algorithm Hash digest
SHA256 571b732229d7b2e7a2215f57586f8ec0140e07c0faea916e456cbbfa819e56cb
MD5 11391a7830c66f152c0f7d016501e1f2
BLAKE2b-256 1eb74156ec100d5539400e85ec213e86e154c396efa6135be277de74e19748e2

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7ae6945f68771b1389ee46a1778e779f4ad76bca9306f3e39eb397f9a0dd2753
MD5 db587271bca1cc893c0bf80068ee86ad
BLAKE2b-256 bec4808b606f840cb53fca2a94cbe82ff26fe23965484dfc4fbb49b6232f990b

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl
Algorithm Hash digest
SHA256 81e755124b77e766166c9d05206b90c68f234f425ad2e3c8a6c96f0db548c67b
MD5 783a76a579014afd26cdd8875a287f40
BLAKE2b-256 470ebb9edf64e79f275e5f59fc3dcc49841147cff81598e99e56413523050506

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl
Algorithm Hash digest
SHA256 446c46c53cb8f13abcc0d7dd1989d59bb059953c122fe9901ef53de7fb38b33e
MD5 75607ca8a5c5ea8600ec3f366d004226
BLAKE2b-256 f3c750bd556ffc76a1cdac1b7460428dee62f8359b60ed07c9846eab0acb5696

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp313-cp313t-manylinux_2_26_i686.manylinux_2_28_i686.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp313-cp313t-manylinux_2_26_i686.manylinux_2_28_i686.whl
Algorithm Hash digest
SHA256 a479fa25b6e2430e530d00f0c27a55e15ecb9de8ad2d0aec3d40b680e2d6df64
MD5 be1e80bc09b95df9698f20c1b03fea0a
BLAKE2b-256 762614ed2ff6a69490754446910280a8d0195c489e9fe610d37046b254971627

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 5bc1221068a58175e0ad62afc199893f77c653206673a5552992a604c66fb77e
MD5 e60796d27e1cdee9903c9ec0f39d4897
BLAKE2b-256 ec306ce07f763b6c0d967a2d683a486eb4450ec053aeae9731133dba600232b2

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp313-cp313t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp313-cp313t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b8adc912ecb6e4fd9df227ded66efaa6702f46a98e1403554be3c9c51d0ca920
MD5 094c99c9ad2574a0b6e38e2b8070a22b
BLAKE2b-256 e2d1de1d6d8654d4765a439f27a155d098092ec8670039e2e0ec8383383a2fe7

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp313-cp313t-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp313-cp313t-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 27b1d0cadcf4627c98abbbdce912dbc2243f5687f3c7df39963b793c89321c65
MD5 4beb37f51e7c8c2e68510290578b1914
BLAKE2b-256 44c92009e027f500fb38920d349523dd06b5714687905be24fe06bab90082706

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp313-cp313-win_arm64.whl.

File metadata

  • Download URL: optree-0.18.0-cp313-cp313-win_arm64.whl
  • Upload date:
  • Size: 317.5 kB
  • Tags: CPython 3.13, Windows ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for optree-0.18.0-cp313-cp313-win_arm64.whl
Algorithm Hash digest
SHA256 8a4ca121b6fc6b04300fa225fe6c31897e424db0d92691875af326f8c4e1cead
MD5 64bf4fb999638417e0bd4d92e7fb89c7
BLAKE2b-256 bd85e59302d4286552d2694b118e6f5a886490cfd939751c2011b2d3638b2d02

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: optree-0.18.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 314.9 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for optree-0.18.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 5b75e32c191e4b8cf42a8aa854ed264df82936136c0bcad77be44605da41cdfc
MD5 2e3f5cc8d874e7fc0b15d46b747efcb1
BLAKE2b-256 7f926e803aa6bf441fae18874f1953e656e179d402b7cbc00c33ae68f0b632db

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp313-cp313-win32.whl.

File metadata

  • Download URL: optree-0.18.0-cp313-cp313-win32.whl
  • Upload date:
  • Size: 287.2 kB
  • Tags: CPython 3.13, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for optree-0.18.0-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 8b9ad4a01a1346b11acc574b7f932dea1a7c7ab31d93546a7540a1f02b3e724a
MD5 de659e3ecabe84e38e8edbcca63f61b8
BLAKE2b-256 16b67dfeb866a56f478103faaede5488e55f03916fa707de716ead34dd6f2c3f

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp313-cp313-manylinux_2_39_riscv64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp313-cp313-manylinux_2_39_riscv64.whl
Algorithm Hash digest
SHA256 9d4b9d8c7e9335120ecf222d817699d17de743ad118080fb40467c367f009143
MD5 54fbd35a4bc52443073931c32017e03e
BLAKE2b-256 5d8029a767bff7413aa593075477a9d17a05d5098bfc0878c087e6b76a3b15df

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 328857d7a35129904b21164f6b0c2ff1d728ad1f5838589c5f437a16c94213c8
MD5 455c51dce88c657208b607ad6b8676af
BLAKE2b-256 19680a761a4f1b2e56ffbf3f223e967074c1331404f6dfb2b2cda6ecf62f4653

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl
Algorithm Hash digest
SHA256 1db0a6497203a13063a8f044ae751dd5d8253cb815359270c38de0e4c9f8bed5
MD5 0640fb7b3697ed99e790e8dfdfd80f75
BLAKE2b-256 4a820ab26372377ba1a422a6f38d8237bb2d061dcd23be85bc3ed77404f7b05c

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl
Algorithm Hash digest
SHA256 0d25941de1acba176305dbdeb931dea6143b30d64ebdc5bfea2bfc12ef9e2b0a
MD5 c29c3e181a57b55429d21fb40c6a2336
BLAKE2b-256 94079c63a8cad90993848ac6cae5162e2e40f62e9a0738cb522972662ef3c7ab

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp313-cp313-manylinux_2_26_i686.manylinux_2_28_i686.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp313-cp313-manylinux_2_26_i686.manylinux_2_28_i686.whl
Algorithm Hash digest
SHA256 cbb083a15ea968ad99e7da17d24632348d69e26534e83c69941f3020ed7536eb
MD5 fb60e9cb37252cb0c3984dfee6415f52
BLAKE2b-256 e16d9a3399af22aea044a58e1734257b575b9b17eb67c2c6fcbbb194268e6946

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 27611c6c122745a003b5be7aedba49ef86e9fef46d743c234596de0bde6dc679
MD5 15710e93f901e4aaca792d483502e917
BLAKE2b-256 2422ae957579e22d53d4d24de6bad0a3b3811612fd70a8ecd0c85c81253f22e3

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fa8e3878a1857761d64f08a23b32140d29754a53f85f7c87186ced2b5b1b49cb
MD5 793c93585e5b3f2e8bfd2c454248fd08
BLAKE2b-256 096751acf67b1b9850e990a1a9b3fa0afcb5bbe9d645b0b6b8be5b3f2dca8f04

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 71ca2fcad8972ba56d6cfffbcd962f45f5d4bc04182f23d66154b38c2eb37de3
MD5 d38dd57e4094b23b08cf87fc07117314
BLAKE2b-256 5b7c9ed10c406028c6b215cd26be4a7afd711a323fd98f531432c1d2921f188b

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl
Algorithm Hash digest
SHA256 6fc9f8acde3bb561b2034e96079507fbe6d4624058fe204161eb8ef29f961296
MD5 6bd4fbd7886a59554dd38fe510775322
BLAKE2b-256 10e1ea857ed58f36c7d2071aef8f67ca0c911e45ded8cb482636185e842550ae

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl
Algorithm Hash digest
SHA256 385bd727cc7bd3c01bd6204028ac2adce8a8f622c296053d9df434aa0e30b01f
MD5 a9ef452b2e0c9052b416270a23cb1263
BLAKE2b-256 006ac0f03b83fe888af829591561af398bb7bbe1ea770c7e7475b4d464b4dd7c

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp313-cp313-android_24_x86_64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp313-cp313-android_24_x86_64.whl
Algorithm Hash digest
SHA256 c8841d44f3648b0662e99fc39ef8c248726ddfb4d1bfce4bdba982e51bb7e3f8
MD5 db38089197be98ca6749a8baffcb4b3f
BLAKE2b-256 c8bb413263435c557193c436d977689d1c560a08e362f5bca29e3d62b093412a

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp313-cp313-android_24_arm64_v8a.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp313-cp313-android_24_arm64_v8a.whl
Algorithm Hash digest
SHA256 8d88c00c70b5914904feaf8f505f3512c2f3f4493dbbd93951fcdddc85dcfe8c
MD5 5a2dae3b2dc1a68871e168e4699efcf6
BLAKE2b-256 746057874760770dba39e799c88505898b7441786cea24d78bfe0a171e893212

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp312-cp312-win_arm64.whl.

File metadata

  • Download URL: optree-0.18.0-cp312-cp312-win_arm64.whl
  • Upload date:
  • Size: 315.7 kB
  • Tags: CPython 3.12, Windows ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for optree-0.18.0-cp312-cp312-win_arm64.whl
Algorithm Hash digest
SHA256 4eb146711d4cd0876bf93e0118d3e74050b6f633d756c269ce7cda907281b499
MD5 7b26cf9a7cd8bf0a3ffff344729fdfa2
BLAKE2b-256 91ba0559af098b33103bc65ba9d0c38454e21c142279b913c0b87a89c59c520d

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: optree-0.18.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 312.4 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for optree-0.18.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 89e81afb11792d13d3777b503c6f21ec17b1a3b7de69cde1ae2c5471bcdcd4a0
MD5 a05345065d62563b5c8e15841101ba44
BLAKE2b-256 5d95a487d5c93dcb50d768c4cd7d17476b4ce4360c5943bb7251d1e26d38e5cf

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp312-cp312-win32.whl.

File metadata

  • Download URL: optree-0.18.0-cp312-cp312-win32.whl
  • Upload date:
  • Size: 286.8 kB
  • Tags: CPython 3.12, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for optree-0.18.0-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 cfa2e16993ba47e671a4e7ee1ad805f67b8d6744eb30a9d27ea0b07b3b7a22ed
MD5 dece10d209be634fc30efd6d62d8d539
BLAKE2b-256 5f09a71dbc096e8195d0e0fe990b394884d061938e0b918b61d16d48d817c0d5

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp312-cp312-manylinux_2_39_riscv64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp312-cp312-manylinux_2_39_riscv64.whl
Algorithm Hash digest
SHA256 d2844478690b5892159df0b2500e9d146dc8d3aa5b44e4564d05787b7330eca3
MD5 9b676dc732f295a2f419c09578dd8d42
BLAKE2b-256 2e71ff4b053ad1242f3d0b8792caa786c1c0138c1fb3d0c0a3720ccc21725739

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a74c45f04def041504bd21682eaf7f359f1a50dc7cf42b548b6f19aab50596bd
MD5 f79d85d31d0a20bce8541756454bd7fc
BLAKE2b-256 029cc38b861e504829e0dcbed2e2b5bc865a98fb7c655e2ddd2bf8e1fd6ae712

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl
Algorithm Hash digest
SHA256 79bbe14d6cad81f5840958589daa1b836864ada40031712a446dce8129917efd
MD5 286e425753e1d7f657e6a1037e502a15
BLAKE2b-256 6548febb5976fa4f37a805809757b050d95effb25a17d3fec439349d18f5d451

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl
Algorithm Hash digest
SHA256 02d9999840fabef85a6b22e757f336d5591f712f99c710d8b232d52e53115314
MD5 15302d8cfe88759bb36100d764cb763d
BLAKE2b-256 d014523cfb3a139df0d2a064b38497c7ee6e49edac6e07c777d2069cffd8545c

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp312-cp312-manylinux_2_26_i686.manylinux_2_28_i686.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp312-cp312-manylinux_2_26_i686.manylinux_2_28_i686.whl
Algorithm Hash digest
SHA256 8a2003fab79694e04b5f260628511e441c248b46a9fc46138e2424038ac04ada
MD5 234d21a524b6b20db3ab1cfe00bffb67
BLAKE2b-256 c8322049f9597ae75a6a1b9c872ffcc31d96ebebf62ff1b20160eb972aea5456

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 057b983a9526645133553184bed7090bb07855df986abd9e99c456922045c6bc
MD5 17b6f3fc3b5cf4c25df77cca90986a6d
BLAKE2b-256 79afc002cc41f6eba05fddcd6435e7c4ccc037a39a345de824d1a515386b52ee

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e28024e6e343353285cf99ae9c74210f0e89e47b2f0f3af7c72c4a9e89dc3ebc
MD5 599ae58efffdb892c5f256205531eed1
BLAKE2b-256 d560e643c3ab2cea904d24e56ab0060c905443ceac716e542392ad8db87f09ef

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 f02faeda66d531dc5f5356589afcf2a6bc41c8d00bc903efab60f9a2182b140d
MD5 820f403e86771ad6669d1ab37408ef30
BLAKE2b-256 d79de32dba0876d6514b40cd30e57938e3605b7e07d827ac617f072ff64d9cff

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp311-cp311-win_arm64.whl.

File metadata

  • Download URL: optree-0.18.0-cp311-cp311-win_arm64.whl
  • Upload date:
  • Size: 317.2 kB
  • Tags: CPython 3.11, Windows ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for optree-0.18.0-cp311-cp311-win_arm64.whl
Algorithm Hash digest
SHA256 9b1e7e8f9ddc85f05d542b74157bdb73ed0e49aded67d1775f721fcd6eb9be94
MD5 ac534df9413075d66da059cad0220d7a
BLAKE2b-256 64afa98364b1b27516942db07d9841d8ac2d7ba96039bcd8ed496f7b3f297dc4

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: optree-0.18.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 312.2 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for optree-0.18.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 86f5bf05ad236f666e5395e989d6ac2cbfd02556526703e6c6f0a594c7fa081f
MD5 de1b25a29c03ecfe3a92c21dc2b2a33e
BLAKE2b-256 d5a391942b7e6e365f4e05d196dbbb52909aae11f1e2f4b4c8aee5b506f93877

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp311-cp311-win32.whl.

File metadata

  • Download URL: optree-0.18.0-cp311-cp311-win32.whl
  • Upload date:
  • Size: 283.6 kB
  • Tags: CPython 3.11, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for optree-0.18.0-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 056894ce6242cd1c7fed71325a7d9f633b2d3b4420c52af48f6a0c4560d74ca1
MD5 340735aab1c9d39f7d07619cd7c2b8fa
BLAKE2b-256 73f2f5c5758e5db9d1b52e7b7809dcf876f071f64ec03bbd6007eee633bf0027

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp311-cp311-manylinux_2_39_riscv64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp311-cp311-manylinux_2_39_riscv64.whl
Algorithm Hash digest
SHA256 382e5ca02cbd5b20d713d4da189a8613f828832e2af57ccbe04a9c6b0bd9497e
MD5 82f3587dc83913c88ca6e480b11646a2
BLAKE2b-256 e542f17e2977ecacdbca50c888731c4f0488f4d499fca1c48c3063bff0d5303b

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b0986ff1267a3b44d3ed76c3efb8b7239371444143f6e0d79f9dd23dbe02c7f9
MD5 66729d75312d53144ab94f49e37342e7
BLAKE2b-256 2a6f7f2238ec5e9d33e56252c30880bb8f44aec1415474b62b9e33b38594953d

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp311-cp311-manylinux_2_26_s390x.manylinux_2_28_s390x.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp311-cp311-manylinux_2_26_s390x.manylinux_2_28_s390x.whl
Algorithm Hash digest
SHA256 efd162e3bfc7812d75ebf2d0fb2783daee2407a92155af8a90650a6b0fa9342e
MD5 ec78eceb01747d7bd085be3eaea8b75c
BLAKE2b-256 95ccbb0607eb8d20cf80ea6b122c059954fb525bbbb7150d650fd87696e4d141

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp311-cp311-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp311-cp311-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl
Algorithm Hash digest
SHA256 8a901666afc2d7a8d0c20decc8079763e3313457ee67210382162d90163c0007
MD5 f9e5b05c74558e43957be4ca836924cc
BLAKE2b-256 0d06fc7aea4d6c72c4e0f42c157183b3e91c615fdc15da5a5e4e5f8b596a24f3

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp311-cp311-manylinux_2_26_i686.manylinux_2_28_i686.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp311-cp311-manylinux_2_26_i686.manylinux_2_28_i686.whl
Algorithm Hash digest
SHA256 1545c68299c0ce600e4ea1bc9112765dc4afe9a0b8ab43f955df6566bf78db42
MD5 fcdb1001e7e8db99a99a620f217ebfa4
BLAKE2b-256 bd325a7b5a441d82b44c6d2b31ad14f7b1a4d3be7afcc38437d07762212bc9c6

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 4cc92339899acb685ee718fd22b25069dfa7be038c63274c54481d54ccc2f9e2
MD5 0e4611b54850cbd15c2526f601846af1
BLAKE2b-256 5ed73045564c1183c7b7cfb32d11a6250fbe9f904f723c02c80a91f71c150b78

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 72fa79be4d6515682417f103ae759a22345439eb1319886be936029215ee00dc
MD5 075a61676ce4fbe26cf7013b65800d48
BLAKE2b-256 d4f65377f265a8dcd61edabf8b87b657d78fca9051eeaf311ed77f73b43526a9

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 80f28e4666aad66e5e20bdc2c47b5bf320250bb5407b3a39dfb1772787a7068f
MD5 95e303c08a8d7d33c502bbab63d9bcc1
BLAKE2b-256 aab266c12a8707722bad5f25cd917d528796544fc9045c5933532f5db071cb02

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: optree-0.18.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 302.7 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for optree-0.18.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 0e0dbe995241efe70cfb522e89c1a7c968216926725a0e5e20cc72bd5d0311b1
MD5 5f1a4a4cedfe63d4173627900d72b823
BLAKE2b-256 ee53cf4e66ac4f134c2211a6f3f04e9d3a98effb6229316bcdadc3d3a9247362

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp310-cp310-win32.whl.

File metadata

  • Download URL: optree-0.18.0-cp310-cp310-win32.whl
  • Upload date:
  • Size: 277.7 kB
  • Tags: CPython 3.10, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for optree-0.18.0-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 090a3f0ccafa0fe99d71e7d974ae52ff966ac26c409ec41f96556b96646054ef
MD5 80db7a22a158759b4e5842a6fd45a6ad
BLAKE2b-256 bf7d72bc9147ed59a6a1cab4e0c43a27d6542029a66c46c5301d05f990dd1991

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp310-cp310-manylinux_2_39_riscv64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp310-cp310-manylinux_2_39_riscv64.whl
Algorithm Hash digest
SHA256 55a2ccd121fccc9df961e982db2f4e8f2b4f7015e814ef70b1140514cdffe214
MD5 f6dc25c38f6403e2fd81f789b4c8e7b5
BLAKE2b-256 a82f32575d5ac11993c19a6b60f6e15cafcc807adabf92caf06824bc3b5d50f9

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 66f142c743732cd4e630ea84415f654a00c792793c7f80d4511167f0f89796a6
MD5 ca7748d025023b66ac0df43a1e3ef754
BLAKE2b-256 668ebdda357f31e2b7c80b61b9785e6dea25e94c01e7237c7a8b1af38f369ee4

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp310-cp310-manylinux_2_26_s390x.manylinux_2_28_s390x.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp310-cp310-manylinux_2_26_s390x.manylinux_2_28_s390x.whl
Algorithm Hash digest
SHA256 f81f5340c8df50662abaf753ab07095901e40b934efb27da50032a4ae71c5a97
MD5 4032878683a60bf17cf74774c9c1c746
BLAKE2b-256 0b97c449712ccb50af3cb2608718e503e31b259aa55de40ee83bebb159b07593

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp310-cp310-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp310-cp310-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl
Algorithm Hash digest
SHA256 ea357657143f364a764b63b2b1ce12d77156d48a1f32def990b696d755acb629
MD5 e484a59f60a9b3e37e9b9e4b4e9ed785
BLAKE2b-256 66af044080368dc8ab809c5b089ad3132e7775043c5a8a165465df1f0c99dd62

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp310-cp310-manylinux_2_26_i686.manylinux_2_28_i686.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp310-cp310-manylinux_2_26_i686.manylinux_2_28_i686.whl
Algorithm Hash digest
SHA256 daab231cf768937ce4675376ea3e214d399116d9867a6737372c31c58630bdfc
MD5 99324d8a243a350be7007cf7f8008885
BLAKE2b-256 b94f7d54f0eeea24f5893422d65fce835d80e644ebac8a4570d762f994cfe97c

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 e058cc51d9d57b45801060af9f74765b95bedfc59fd6df1c7489ae0825126be5
MD5 6d2229f8d30feafaa1d04fdc1fad7c71
BLAKE2b-256 7393463a531b863bffae92d6d1c7857f655234f12ad46fe088bf5bd5cd37cd67

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ad428ccdb2a40804919880dfe8d2a3021fd4418be15ea7ecb8434ab249badf9f
MD5 dac70054bc4fd7180b0f049385ea0330
BLAKE2b-256 73baf89cd7fe3fca9f434b6cd6ba80716f1ad59f40453482c04d6887e5c516de

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 1f19867b02a547fc9f11d27c0413e7483cef89699e16f3b9e8af73a9b25e6061
MD5 84d8942054ba3eb9e80e4ac001f85a8a
BLAKE2b-256 b94522dfc0a3a8ca568c2702d725cdce85e2e1767d4241f2ac7d28c518ce7019

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: optree-0.18.0-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 309.4 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for optree-0.18.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 7699957183f8d45402edd6266e175510317f5fcd7f0e623510f2eb7e1ebfc667
MD5 8f8a2a8333fac85034d7c06919912110
BLAKE2b-256 ba81d419aa8ad240878e934e88546b51e0764faf0d68caf055fb3c53f90c2e16

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp39-cp39-win32.whl.

File metadata

  • Download URL: optree-0.18.0-cp39-cp39-win32.whl
  • Upload date:
  • Size: 277.9 kB
  • Tags: CPython 3.9, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for optree-0.18.0-cp39-cp39-win32.whl
Algorithm Hash digest
SHA256 31539dec60af84e16e99574634811d38e34e1fb381f40d6f489a2e582bf41f03
MD5 f4c6eb84f4b8dcaa044db3d2587eb6e6
BLAKE2b-256 f2fa07a4b30a5e8b268c2f0e083812c568e3db9abf4392ea2d1611716737474a

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp39-cp39-manylinux_2_39_riscv64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp39-cp39-manylinux_2_39_riscv64.whl
Algorithm Hash digest
SHA256 b7aa0de08bbbfcef6e49c107f9f397f5d4742548500f16e3e6c5e0b9e4ff0faa
MD5 423aceaeaab2286aa1a4bc08c2368542
BLAKE2b-256 c694da38e68e20fb34737d83808b2ad05422496f05ab98c550af6cebabdaadc4

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 56bb19ff827c9a443202b52bf103705ce96ef14d045e0a30d0d7ee7dbcef6a0d
MD5 ec69194e567d31cbe6fa33852adabd91
BLAKE2b-256 25f03d322678cf6e691e8c044153506b699c6886df4f13adb4d885cc8922cdf4

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp39-cp39-manylinux_2_26_s390x.manylinux_2_28_s390x.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp39-cp39-manylinux_2_26_s390x.manylinux_2_28_s390x.whl
Algorithm Hash digest
SHA256 b45d7172c67fc8d2b69f77b384998b39793ee91f8b3b46c609297b781fb7eea5
MD5 67fe09c0c2ec933925881697565ca1af
BLAKE2b-256 dad404c5c3a978db8e8ab2f75c27cfdce69dd8098a4f19daf0de2288ba11745f

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp39-cp39-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp39-cp39-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl
Algorithm Hash digest
SHA256 bda4572392ac1dff3fc67b6d9a4b1084e1637972e8135ad3788b4ce7cf0a90f5
MD5 bae44c3cdd9b33276a9be4d72f0b2964
BLAKE2b-256 e74e2b05367bc3a86179772bd1545647521254d00a10b2b546c9abea54ad646e

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp39-cp39-manylinux_2_26_i686.manylinux_2_28_i686.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp39-cp39-manylinux_2_26_i686.manylinux_2_28_i686.whl
Algorithm Hash digest
SHA256 30f95279188f6b9300e17c1557989baa991c2d6f519013bd8fea13462a0e6a45
MD5 72770e1576b1965200fc9d3ca61fe422
BLAKE2b-256 b8261c3b2a77a0dbd58d9488ddabd66bcf9745e9eb64922433ed42f0224752e8

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 d20765efa494a80a8fd91c4de8890f34de8e9f234da5516e8f34f55703cfb93d
MD5 fd8f5f21caee0aa8cbc8e45ed0c04987
BLAKE2b-256 791c8782c71b73db1d217b18f62cda888f6f976662ed630caa61fe9dd6fa2e8a

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 421b839c7ff30df5791e66c89b2e9c2f68191dd6a5d6927c32bcc6b887090df8
MD5 417981cdd7c90d87e34f6ed036b2774c
BLAKE2b-256 e55384bcac1e05ea49a5bfa3d52712fb788b507c2248a9d4266939d4c1d0188a

See more details on using hashes here.

File details

Details for the file optree-0.18.0-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for optree-0.18.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 f04286908654ffb05455254ebf72fe69473fc4560fc7ea49410df94dea6783a2
MD5 8c3b874230e68ece4bdd45e5e2aa2859
BLAKE2b-256 836358efd0916d8ccddfb5f786aa67c68937512e11d066eb424a5a9451e72fb3

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page