o
    2h5;                     @  s  d Z ddlmZ ddlZddlZddlZddl	m
Z ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ
 dd
lmZ ddlmZ ddlmZ  ddlm!Z" ddlm#Z$ ddlm%Z& ddlm'Z( ddlm)Z* ddlm+Z, ddlm-Z. ddlm/Z0 ddlm1Z2 ddlm3Z4 ddlm5Z6 ddlm7Z8 ddlm9Z: ddlm;Z< ddlm=Z> ddlm?Z@ ddlmAZB ddlmCZD ddlmEZF dd lmGZH dd!lmIZJ dd"lmKZL dd#lmMZN dd$lmOZP dd%lmQZR dd&lmSZT dd'lmUZV dd(lmWZX dd)lmYZZ dd*l[m\Z\ dd+l[m]Z^ dd,l[m_Z` dd-l[maZb dd.lcmdZdmeZe dd/lfmgZg g d0ZherOdd1limjZjmkZk dd2lmlZlmmZm dd3lnmoZo eod4Zpemd5ZqG d6d7 d7eZrerlG d8d9 d9erZsdd:dDd@dAZtdS dd:dEdCdAZtdS )Fa  Utilities for working with ``PyTree``\s.

The :mod:`optree.pytree` namespace contains aliases of ``optree.tree_*`` utilities.

>>> import optree.pytree as pytree
>>> tree = {'b': (2, [3, 4]), 'a': 1, 'c': None, 'd': 5}
>>> leaves, treespec = pytree.flatten(tree)
>>> leaves, treespec  # doctest: +IGNORE_WHITESPACE
(
    [1, 2, 3, 4, 5],
    PyTreeSpec({'a': *, 'b': (*, [*, *]), 'c': None, 'd': *})
)
>>> tree == pytree.unflatten(treespec, leaves)
True

.. versionadded:: 0.14.1
    )annotationsN)all)
ModuleType)TYPE_CHECKING)PyTreeEntry)tree_accessors)tree_all)tree_any)tree_broadcast_common)tree_broadcast_map) tree_broadcast_map_with_accessor)tree_broadcast_map_with_path)tree_broadcast_prefix)tree_flatten)tree_flatten_one_level)tree_flatten_with_accessor)tree_flatten_with_path)tree_is_leaf)	tree_iter)tree_leaves)tree_map)	tree_map_)tree_map_with_accessor)tree_map_with_accessor_)tree_map_with_path)tree_map_with_path_)tree_max)tree_min)tree_partition)
tree_paths)tree_reduce)tree_replace_nones)tree_structure)tree_sum)tree_transpose)tree_transpose_map) tree_transpose_map_with_accessor)tree_transpose_map_with_path)tree_unflatten)dict_insertion_ordered)register_pytree_node)register_pytree_node_class)unregister_pytree_node)
PyTreeKind
PyTreeSpec)__version__)*reexportr.   r-   r   flattenflatten_with_pathflatten_with_accessor	unflatteniterleaves	structurepaths	accessorsis_leafmapmap_map_with_pathmap_with_path_map_with_accessormap_with_accessor_replace_nones	partition	transposetranspose_maptranspose_map_with_pathtranspose_map_with_accessorbroadcast_prefixbroadcast_commonbroadcast_mapbroadcast_map_with_pathbroadcast_map_with_accessorreducesummaxminr   anyflatten_one_levelregister_noderegister_node_classunregister_noder)   )CallableIterable)AnyTypeVar)	ParamSpec_P_Tc                      sd   e Zd ZU dZded< dddddd! fddZed"ddZd"ddZd#ddZ	d$dd Z
  ZS )%ReexportedModulez2A module that re-exports APIs from another module.str__doc__N)doc__all____dir__extra_membersname	namespaceoriginal_ModuleTyper_   
str | Noner`   Iterable[str] | Nonera   rb   dict[str, Any] | NonereturnNonec         
        s   |pd|j  d| d|d}t || |d u r"dd |jD }t|}|d u r3dd | D }t||}|rP| D ]
\}}	t| ||	 q@|	| || _
|| _|| _t|| _t|| _d S )NzRe-exports :mod:`z` as :mod:`z` with namespace :const:`z`.c                 S  s   h | ]}|d kr|qS )r0    .0nrl   rl   H/var/www/html/chatgem/venv/lib/python3.10/site-packages/optree/pytree.py	<setcomp>   s    z,ReexportedModule.__init__.<locals>.<setcomp>c                 S  s"   h | ]}| d s|dkr|qS )_r0   )
startswithrm   rl   rl   rp   rq      s   " )__name__super__init__r`   setra   intersectionitemssetattrupdate_ReexportedModule__namespace_ReexportedModule__original_ReexportedModule__all_setsorted_ReexportedModule__all_ReexportedModule__dir)
selfrc   rd   re   r_   r`   ra   rb   keyvalue	__class__rl   rp   rv      s*   

zReexportedModule.__init__	list[str]c                C  s   | j S z7Return the list of attributes available in this module.)r   r   rl   rl   rp   r`      s   zReexportedModule.__all__c                C  s
   | j  S r   )r   copyr   rl   rl   rp   ra      s   
zReexportedModule.__dir__rW   c                C  sP   || j v rt| j|}t|r| |}t| || |S td| jd|)z-Get an attribute from the re-exported module.module z has no attribute )	r~   getattrr}   _inspect
isfunction__reexport__rz   AttributeErrorrt   )r   rc   attrrl   rl   rp   __getattr__   s   


zReexportedModule.__getattr__funcCallable[_P, _T]c                  s   t  }d|jvrt d fdd	}n1t jd
d fdd	} jr7 jddjd|_|jfdd|j D d|_	t
t ddrW j|_|S )z0Re-export a function with the default namespace.rd   args_P.argskwargs	_P.kwargsrj   r[   c                    s    | i |S Nrl   )r   r   r   rl   rp   wrapped   s   z.ReexportedModule.__reexport__.<locals>.wrapped)rd   r]   c                   s    |d| i|S )Nrd   rl   )rd   r   r   r   rl   rp   r      s   z2(default: :const:`''`, i.e., the global namespace)z(default: :const:`z`)c                   s(   g | ]}|j d kr|n|j jdqS )rd   )default)rc   replacer|   )rn   pr   rl   rp   
<listcomp>   s    z1ReexportedModule.__reexport__.<locals>.<listcomp>)
parametersgetN)r   r   r   r   rj   r[   )r   r   rd   r]   r   r   rj   r[   )r   	signaturer   
_functoolswrapsr|   r^   r   values__signature__callabler   r   r   )r   r   sigr   rl   )r   r   rp   r      s(   


zReexportedModule.__reexport__)rc   r]   rd   r]   re   rf   r_   rg   r`   rh   ra   rh   rb   ri   rj   rk   )rj   r   )rc   r]   rj   rW   )r   r   rj   r   )rt   
__module____qualname__r^   __annotations__rv   propertyr`   ra   r   r   __classcell__rl   rl   r   rp   r\      s   
 	$


r\   c                   @  sz  e Zd ZU ded< ded< ded< eZded< eZded	< eZd
ed< eeZee	Z	ee
Z
eeZeeZeeZeeZeeZeeZeeZeeZeeZeeZeeZeeZeeZeeZeeZeeZeeZeeZeeZeeZeeZee Z ee!Z!ee"Z"ee#Z#ee$Z$ee%Z%ee&Z&ee'Z'ee(Z(ee)Z)ee*Z*ee+Z+ee,Z,ee-Z-dS )ReexportedPyTreeModuler]   r/   rf   	functoolsdataclassesztype[PyTreeSpec]r.   ztype[PyTreeKind]r-   ztype[PyTreeEntry]r   N).rt   r   r   r   r.   r-   r   staticmethodr1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   r   rP   rQ   rR   rS   rT   r)   rl   rl   rl   rp   r      sZ   
 r   )modulerd   r]   r   rg   rj   c                 C  s   t d)zFRe-export a pytree utility module with the given namespace as default.z1reexport() is not available in type checking mode)NotImplementedError)rd   r   rl   rl   rp   r0     s   r0   rf   c                 C  st  ddl m} | |u rd} nt| tstd| d|du rPz	tdp%d}W n# tyJ   ztdj	
d	d}W n ttfyG   d}Y nw Y nw | d
}|r^tdd |dD setd||| d| dfD ]}|tjv rtd|dqpt| d| td}t| d| td}t|| tjt t||dd}|tj|< |tj| d< |tj| d< |S )ab  Re-export a pytree utility module with the given namespace as default.

        >>> import optree
        >>> pytree = optree.pytree.reexport(namespace='my-pkg', module='my_pkg.pytree')
        >>> pytree.flatten({'a': 1, 'b': 2})
        ([1, 2], PyTreeSpec({'a': *, 'b': *}))

        This function is useful for downstream libraries that want to re-export the pytree utilities
        with their own namespace:

        .. code-block:: python

            # 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

        .. versionadded:: 0.16.0

        Args:
            namespace (str): The namespace to use in the re-exported module.
            module (str, optional): The name of the re-exported module.
                If not provided, defaults to ``<caller_module>.pytree``. The caller module is determined
                by inspecting the stack frame.

        Returns:
            The re-exported module.
        r   )__GLOBAL_NAMESPACE z$The namespace must be a string, got .N   __main__rt   z.pytreec                 s  s    | ]}|  V  qd S r   )isidentifier)rn   partrl   rl   rp   	<genexpr>j  s    zreexport.<locals>.<genexpr>zinvalid module name: z.dataclassesz
.functoolsr   z already exists)rd   re   )r/   r   r   )rd   re   rb   )optree.registryr   
isinstancer]   	TypeError_sys_getframemodulenamer   	_getframe	f_globalsr   
ValueError_allsplitmodulesr\   r   r   rt   r/   )rd   r   GLOBAL_NAMESPACEcaller_modulemodule_namereexported_dataclassesreexported_functoolsmodrl   rl   rp   r0   %  s\   3




)rd   r]   r   rg   rj   r   )rd   r]   r   rg   rj   rf   )ur^   
__future__r   r   r   inspectr   sysr   builtinsr   r   typesr   rf   typingr   _TYPE_CHECKINGoptree.dataclassesr   optree.functoolsoptree.accessorsr   
optree.opsr   r9   r   r	   rP   r
   rH   r   rI   r   rK   r   rJ   r   rG   r   r1   r   rQ   r   r3   r   r2   r   r:   r   r5   r   r6   r   r;   r   r<   r   r?   r   r@   r   r=   r   r>   r   rN   r   rO   r   rB   r   r8   r    rL   r!   rA   r"   r7   r#   rM   r$   rC   r%   rD   r&   rF   r'   rE   r(   r4   r   r)   r*   rR   r+   rS   r,   rT   optree.typingr-   r.   optree.versionr/   r`   collections.abcrU   rV   rW   rX   typing_extensionsrY   rZ   r[   r\   r   r0   rl   rl   rl   rp   <module>   s~   .`/