
    $Sh5;                       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r,dd1limjZjmkZk dd2lmlZlmmZm dd3lnmoZo  eod4          Zp emd5          Zq G d6 d7e          Zrer G d8 d9er          Zsdd:dCd@ZtdS dd:dDdBZtdS )Ea  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                  l     e Zd ZU dZded<   dddddd fdZedd            ZddZddZ	ddZ
 xZS ) ReexportedModulez2A module that re-exports APIs from another module.str__doc__N)doc__all____dir__extra_membersname	namespaceoriginal_ModuleTypera   
str | Nonerb   Iterable[str] | Nonerc   rd   dict[str, Any] | NonereturnNonec              8   |pd|j          d| d|d}t                                          ||           |d |j        D             }t	          |          }|d |                                D             }t	          |                              |          }|r@|                                D ]\  }}	t          | ||	           |	                    |           || _
        || _        || _        t          |          | _        t          |          | _        d S )NzRe-exports :mod:`z` as :mod:`z` with namespace :const:`z`.c                    h | ]
}|d k    |S )r1    .0ns     S/var/www/html/movieo_spanner_bot/venv/lib/python3.11/site-packages/optree/pytree.py	<setcomp>z,ReexportedModule.__init__.<locals>.<setcomp>   s    FFFQa:ooqooo    c                H    h | ]}|                     d           |dk    | S )_r1   )
startswithrq   s     rt   ru   z,ReexportedModule.__init__.<locals>.<setcomp>   s5    bbbQALL<M<MbRSWaRaRaqRaRaRarv   )__name__super__init__rb   setrc   intersectionitemssetattrupdate_ReexportedModule__namespace_ReexportedModule__original_ReexportedModule__all_setsorted_ReexportedModule__all_ReexportedModule__dir)selfre   rf   rg   ra   rb   rc   rd   keyvalue	__class__s             rt   r|   zReexportedModule.__init__   sE     
6 1 6 6d 6 6&/6 6 6 	 	s###?FF("2FFFGg,,?bb("2"2"4"4bbbGg,,++G44 	*+1133 * *
Uc5))))NN=)))$" G__
G__


rv   	list[str]c                   | j         S z7Return the list of attributes available in this module.)r   r   s    rt   rb   zReexportedModule.__all__   s     zrv   c               4    | j                                         S r   )r   copyr   s    rt   rc   zReexportedModule.__dir__   s    z   rv   rX   c                   || j         v rQt          | j        |          }t          j        |          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__r   AttributeErrorrz   )r   re   attrs      rt   __getattr__zReexportedModule.__getattr__   s~    4>!!4?D11D"4(( /((..D$%%%KRt}RR$RRSSSrv   funcCallable[_P, _T]c               ,    t          j                  }d|j        vr!t          j                  dfd            }nt          j                   j        d	dfd            }j        r)j                            dd j        d          |_        |                     fd|j                                        D                       |_	        t          t          dd                    r                     j                  |_        |S )z0Re-export a function with the default namespace.rf   args_P.argskwargs	_P.kwargsrl   r\   c                      | i |S Nrp   )r   r   r   s     rt   wrappedz.ReexportedModule.__reexport__.<locals>.wrapped   s    tT,V,,,rv   )rf   r_   c                     |d| i|S )Nrf   rp   )rf   r   r   r   s      rt   r   z.ReexportedModule.__reexport__.<locals>.wrapped   s     tTAYA&AAArv   z2(default: :const:`''`, i.e., the global namespace)z(default: :const:`z`)c                `    g | ]*}|j         d k    r|n|                    j                  +S )rf   )default)re   replacer   )rr   pr   s     rt   
<listcomp>z1ReexportedModule.__reexport__.<locals>.<listcomp>   sJ        ;..AAAIIdFVI4W4W  rv   )
parametersgetN)r   r   r   r   rl   r\   )r   r   rf   r_   r   r   rl   r\   )r   	signaturer   
_functoolswrapsr   r`   r   values__signature__callabler   r   r   )r   r   sigr   s   ``  rt   r   zReexportedModule.__reexport__   sn    &&cn,,d##- - - - - $#- - d## "&!1B B B B B B B $#B | "&,"6"6H?)9???# # %(KK    ^2244   %0 % %G! GD%..// 	6++DH55GKrv   )re   r_   rf   r_   rg   rh   ra   ri   rb   rj   rc   rj   rd   rk   rl   rm   )rl   r   )re   r_   rl   rX   )r   r   rl   r   )rz   
__module____qualname__r`   __annotations__r|   propertyrb   rc   r   r   __classcell__)r   s   @rt   r^   r^      s         <<LLL (,(,/3"% "% "% "% "% "% "% "%H    X! ! ! !T T T T! ! ! ! ! ! ! !rv   r^   c                     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_   r0   rh   	functoolsdataclassesztype[PyTreeSpec]r/   ztype[PyTreeKind]r.   ztype[PyTreeEntry]r   N).rz   r   r   r   r/   r.   r   staticmethodr2   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   rP   r   rQ   rR   rS   rT   rU   r*   rp   rv   rt   r   r      s            '1
1111'1
1111)44444,w''(L):;; ,-B C C L++	|D!!f%% L++	U## L++	,w''l3|D!!$]33%n55(L):;;)\*<==$]33 L++	 L++	$]33".,/F"G"G&2l3N&O&O#'<(899'<(899$]33".,/F"G"G&2l3N&O&O#f%%l3l3l3l3l3(L):;;$]33*l+>??&,77!-.D!E!Erv   r   )modulerf   r_   r   ri   rl   c                     t          d          )zFRe-export a pytree utility module with the given namespace as default.z1reexport() is not available in type checking mode)NotImplementedError)rf   r   s     rt   r1   r1     s    !"UVVVrv   rh   c           	     l   ddl m} | |u rd} n(t          | t                    st	          d| d          |u	 t          j        d          pd}nX# t          $ rK 	 t          j        d          j	        
                    d	d          }n# t          t          f$ r d}Y nw xY wY nw xY w| d
}|r,t          d |                    d          D                       st          d|          || d| dfD ]#}|t
          j        v rt          d|d          $t          | d| t                     }t          | d| t"                    }t          || t
          j        t$                   t&          ||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__rz   z.pytreec              3  >   K   | ]}|                                 V  d S r   )isidentifier)rr   parts     rt   	<genexpr>zreexport.<locals>.<genexpr>j  s.      !T!T$$"3"3"5"5!T!T!T!T!T!Trv   zinvalid module name: z.dataclassesz
.functoolsr   z already exists)rf   rg   )r0   r   r   )rf   rg   rd   )optree.registryr   
isinstancer_   	TypeError_sys_getframemodulenamer   	_getframe	f_globalsr   
ValueError_allsplitmodulesr^   r   r   rz   r0   )rf   r   GLOBAL_NAMESPACEcaller_modulemodule_namereexported_dataclassesreexported_functoolsmods           rt   r1   r1   %  sb   f 	KJJJJJ(((IIIs++ 	SQ9QQQRRR>/ $ 8 ; ; Iz! / / //$(N1$5$5$?$C$CJPZ$[$[MM&
3 / / /$.MMM/	/ &...F 	AT!T!T&,,sBSBS!T!T!TTT 	A?V??@@@"v$;$;$;=R=R=RS 	K 	KKdl** !I;!I!I!IJJJ + "2### "
 "
 "

  0!!! 
  
  

 '7\(+*51 		'
 	'
 	'
  #V0F,,,-.B***+
s5   A 
B%-B	B%	BB%BB%$B%)rf   r_   r   ri   rl   r   )rf   r_   r   ri   rl   rh   )ur`   
__future__r   r   r   inspectr   sysr   builtinsr   r   typesr   rh   typingr   _TYPE_CHECKINGoptree.dataclassesr   optree.functoolsoptree.accessorsr   
optree.opsr   r:   r	   r
   rQ   r   rI   r   rJ   r   rL   r   rK   r   rH   r   r2   r   rR   r   r4   r   r3   r   r;   r   r6   r   r7   r   r<   r   r=   r   r@   r   rA   r   r>   r   r?   r   rO   r   rP   r   rC   r    r9   r!   rM   r"   rB   r#   r8   r$   rN   r%   rD   r&   rE   r'   rG   r(   rF   r)   r5   r   r*   r+   rS   r,   rT   r-   rU   optree.typingr.   r/   optree.versionr0   rb   collections.abcrV   rW   rX   rY   typing_extensionsrZ   r[   r\   r^   r   r1   rp   rv   rt   <module>r      s   $ # " " " " "                         + + + + + + 2 2 2 2 2 2 ( ( ( ( ( ( $ $ $ $ $ $ ( ( ( ( ( ( 2 2 2 2 2 2 & & & & & & & & & & & & @ @ @ @ @ @ : : : : : : V V V V V V N N N N N N @ @ @ @ @ @ . . . . . . B B B B B B J J J J J J B B B B B B . . . . . . ( ( ( ( ( ( , , , , , , & & & & & & ( ( ( ( ( ( B B B B B B D D D D D D : : : : : : < < < < < < & & & & & & & & & & & & 2 2 2 2 2 2 * * * * * * , , , , , , : : : : : : 2 2 2 2 2 2 & & & & & & 2 2 2 2 2 2 : : : : : : V V V V V V N N N N N N 2 2 2 2 2 2 2 2 2 2 2 2 A A A A A A M M M M M M E E E E E E 0 0 0 0 0 0 0 0 5 5 5 5 5 5+ + +\  22222222########++++++	4B	B] ] ] ] ]{ ] ] ]@  Z-F -F -F -F -F!1 -F -F -F^ :> W W W W W W W W :> c c c c c c c crv   