
    ukii                    l   U d dl mZ d dlZd dlmZmZmZmZ d dlZd dl	Z	d dl	m
Z
 d dlZd dlZd dlZd dlZd dlmZmZmZmZmZmZmZmZ d dlZd dlZd dlmZ d dlmZ  d dlm!Z"  ejF                  e$      Z%eZ&eZ' ed	      Z( ed
      Z) ed      Z* ed      Z+er(ednd       Z,edod       Z,edpd       Z,edqd       Z,d Z,ne"jX                  Z,er(edrd       Z-edsd       Z-edtd       Z-edud       Z-d Z-ne"jZ                  Z-er(edvd       Z.edwd       Z.edxd       Z.edyd       Z.d Z.ne"j\                  Z.	 	 dzdZ/	 	 d{dZ0d|dZ1d}dZ2d}d Z3d~d!Z4	 	 	 	 	 	 dd"Z5	 	 	 	 	 	 	 	 dd#Z6	 	 	 	 	 	 	 	 	 	 	 	 dd$Z7dd%Z8dd&Z9e9Z: e;       Z<dd'Z=d( Z>d)e?d*<    e
e"j                  d+      ZA	 	 	 	 	 	 dd,ZBddd.ZC ej                         ZEd/e?d0<   dd1ZFd2 ZG eCd3      ZHd4 ZI	 	 d	 dd6Z ej                  d-d-d-7       G d8 d9             ZK G d: d;      ZL eL       ZM eN       ZOd<e?d=<   d> ZPd5d-d?	 	 	 dd@ZQ G dA dB      ZR G dC dD      ZS G dE dF      ZTddGZUdddHZVddIZWddJZXdddKZYddLZZddMZ[	 	 d	 	 	 	 	 	 	 ddNZ\dO Z]ddPZ^ddQZ_ddRZ` G dS dT      ZadU Zb G dV dW      ZcdX ZddY ZeddZZf G d[ d\ee(         Zg G d] d^      Zhdd_Zidd`ZjddaZkdddbZl G dc ddej                        Zn G de dfeng      ZodZpdhe?di<   ddjZqe"j                  ZrddkZs ete"dl      re"j                  ZuydddmZuy)    )annotationsN)CallableIterableIteratorSequence)partial)AnyGenericSupportsIndexTypeTypeVaroverloadTYPE_CHECKINGcast)config)weakref_lru_cache)utilsTT1T2T3c                    y N )__arg1s    H/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/jax/_src/util.pysafe_zipr   4   s    <?    c                    y r   r   )r   __arg2s     r   r   r   6   s    VYr   c                    y r   r   )r   r    __arg3s      r   r   r   8   s    psr   c                    y r   r   )r   r    r"   __arg4argss        r   r   r   :   s	     PSr   c                 D    | st        d      t        t        | ddi      S )af  
    Like builtin :func:`zip`, but with additional safety checks.

    The differences from :func:`zip` are:

    - :func:`safe_zip` checks that at least one argument is provided.
    - :func:`safe_zip` checks that all arguments have the same length.
    - :func:`safe_zip` returns an eagerly-evaluated list instead of a
      lazily-evaluated iterator.
    z&safe_zip requires at least 1 argument.strictT)	TypeErrorlistzip)r%   s    r   r   r   =   s(     >??T'$'((r   c                    y r   r   fr   s     r   safe_mapr.   S   s    JMr   c                    y r   r   r-   r   r    s      r   r.   r.   V   s    dgr   c                    y r   r   r-   r   r    r"   s       r   r.   r.   Y   s	     Br   c                    y r   r   r-   r   r    r"   r$   r%   s         r   r.   r.   \   s	     WZr   c           	         t        t        t         |            }t        |d         }|dd  D ]1  }t        |      |k(  rJ dt        t        t        |                     t        t        | g|       S )Nr      zlength mismatch: )r)   maplen)r-   r%   nargs       r   r.   r.   _   sr    D$ DDGAABx GX]F/Sd^0D/EFF]GAr   c                    y r   r   r,   s     r   foreachr<   j   s    HKr   c                    y r   r   r0   s      r   r<   r<   m   s    ber   c                    y r   r   r2   s       r   r<   r<   p   s    |r   c                    y r   r   r4   s         r   r<   r<   s   s	     UXr   c                    t        | g|  y r   )r.   )r-   r%   s     r   r<   r<   v   s    Qr   c                    g }g }| D ]'  \  }}|j                  |       |j                  |       ) t        |      t        |      fS )z2Unzip sequence of length-2 tuples into two tuples.appendtuple)xysxsysxys        r   unzip2rJ   ~   sL    
 "" daIIaLIIaL 
rE"I	r   c                    g }g }g }| D ]9  \  }}}|j                  |       |j                  |       |j                  |       ; t        |      t        |      t        |      fS )z4Unzip sequence of length-3 tuples into three tuples.rB   )xyzsrF   rG   zsrH   rI   zs          r   unzip3rO      sd    
 """ gaAIIaLIIaLIIaL 
rE"IuRy	((r   c                L    t        |       } |D ]
  \  }}|| |<    t        |       S )z Substitute values within a list.)r)   rD   )lstreplaceivs       r   subvalsrU      s1    S	# daCF	sr   c                    t        |       } g }|D ]  }|j                  | d|        | |d }  |j                  |        |S )0Split list into sublists of the specified sizes.N)r)   rC   r%   nslistsr9   s       r   
split_listr[      sO    	d$
% a	LLbq8D ,,t	,r   c                    t        |       } t        |      t        |       k(  rt        d |D              sJ g }|D ]  }|j	                  | d|        | |d }  |S )rW   c              3  &   K   | ]	  }|d k\    yw)r   Nr   ).0r9   s     r   	<genexpr>z%split_list_checked.<locals>.<genexpr>   s     %9a1f%9s   N)r)   sumr8   allrC   rX   s       r   split_list_checkedrb      sf    	d$	RCI	#%9b%9"99	9
% a	LLbq8D 
,r   c                    t        |       t        |      k(  sJ g g f}t        | |      D ]  \  }}||   j                  |        |S )z*Partition a list into two based on a mask.)r8   r*   rC   )bslrZ   brH   s        r   partition_listrg      sO    	RCF		$&8%"aj da	!HOOA	,r   c                V   t        |       t        |      k(  r#t        |       t        |       z
  t        |      k(  sJ t        |      t        |      }}| D cg c]  }|rt        |      n
t        |       }}t	               }t        ||      t        ||      cxu r|u sJ  J |S c c}w )z0Merge the elements of two lists based on a mask.)r`   r8   iternextobject)rd   l0l1i0i1rf   outsentinels           r   merge_listsrr      s    
 
RCG	B#b' 1SW <<	<8T"Xb"=?@AR483@#@X(	b(	tB1	=X	==	==	=	* As   B&c                    t        |      }| D cg c]  }|||   n
t        |       }}t               }t        ||      |u sJ |S c c}w r   )ri   rj   rk   )subssrcbasebase_rS   rp   rq   s          r   	subs_listrx      sX     t*%;?@a1=Qd5k	1@#@X(	eX	(	**	*	* 	As   Ac                    t        |       t        |      k(  sJ t        |      }t        | |      D cg c]  \  }}|||   n|||   n
t        |        }}}t	               }	t        ||	      |	u sJ |S c c}}w r   )r8   ri   r*   rj   rk   )
subs1subs2src1src2rv   rw   f1f2rp   rq   s
             r   
subs_list2r      s     
Us5z	!!	!
t*%$'u$5	7 R ^bR^b	e
 	7# 	7X(	eX	(	**	*	*		7s   #A6c                j    t        |       } |D cg c]  }| j                  |       }}| rJ |S c c}w r   )dictpop)dctnamesnamerQ   s       r   
split_dictr      s7    S	##()4)#).	* 	*s   0c                R    t        t        j                  j                  |             S )z&Concatenates/flattens a list of lists.)r)   itchainfrom_iterable)rF   s    r   concatenater      s    	bhh$$R(	))r   c           
         t        |       }|D cg c]$  }t        |      D cg c]  }t        |       c}& }}}t        |t              t        u sJ |S c c}w c c}}w )zpSplits `xs` into subsequences of lengths `ns`.

  Unlike `split_list`, the `sum(ns)` must be equal to `len(xs)`.)ri   rangerj   _unflatten_done)rF   rY   xs_iterr9   _unflatteneds         r   	unflattenr      sV     H'<>?qq2A$w-2?+?	g	'?	::	:	 3?s   AAAAc                @     t        |       t        t        |             S )zCurries arguments of f, returning a function on any remaining arguments.

  For example:
  >>> f = lambda x, y, z, w: x * y + z * w
  >>> f(2,3,4,5)
  26
  >>> curry(f)(2)(3, 4, 5)
  26
  >>> curry(f)(2, 3)(4, 5)
  26
  >>> curry(f)(2, 3, 4, 5)()
  26
  )wrapsr   r-   s    r   curryr      s     
q''1%	&&r   z$Callable[[Iterable[Any]], list[Any]]toposortparentsc                    t        t        | |            t        |      D cg c]
  \  }}|s	| }}}t        |      D cg c]
  \  }}|r	| }}}fd}|||fS c c}}w c c}}w )Nc                    g }D ]7  }|r|j                  | d          | dd  } |j                  |d          |dd  }9 |rJ | rJ |S Nr   r6   )rC   )new_lhsnew_rhsrp   ssidess       r   mergezsplit_merge.<locals>.merge  sg    
C 	


71:!"+

71:!"+ ;;Jr   )r)   r7   r*   )	predicaterF   rH   r   lhsrhsr   r   s          @r   split_merger     so     s9b!
"%2u~+tq!+#+2u~/tq!Q/#/ 
c5 	,/s   
A#A#
A)A)Tc                b     |r%t        |      r|nt        j                   fd}|S  fd}|S )Nc                     t        j                         fd       t        j                          fd       }j                  |_        j                  |_        t        |t                      |S )Nc                     |i |S r   r   )r   r%   kwargsr-   s      r   cachedz#cache.<locals>.wrap.<locals>.cached$  s    $!&!!r   c                 j    t         j                  j                  r | i |S          g| i |S r   )r   check_tracer_leaksvalue)r%   r   r   r-   trace_contexts     r   wrapperz$cache.<locals>.wrap.<locals>.wrapper(  s9    $$**D#F#
#mo7777r   )	functools	lru_cacher   cache_clear
cache_inforegister_cachestr)r-   r   r   max_sizer   s   ` @r   wrapzcache.<locals>.wrap#  sn    8$" %" q8 8
 #..g!,,gWc!f%nr   c                h     t        j                        |       }t        |t        |              |S r   )r   r   r   r   )r-   r   r   s     r   r   zcache.<locals>.wrap3  s-    -	##H-a0gWc!f%nr   )callabler   r   )r   trace_context_in_keyr   r   s   `  @r   cacher     s8    -56J-K) .. ( 
+	 
+r   z#weakref.WeakKeyDictionary[Any, str]_cachesc                    |t         | <   y)a$  Registers a cache with JAX's cache management.

  Args:
    cache: an object supporting `cache_clear()`, `cache_info()`, and
      `cache_keys()`, like the result of `functools.lru_cache()`.
    for_what: a string to identify what this cache is used for. This is
       used for debugging.
  N)r   )r   for_whats     r   r   r   =  s     '%.r   c                 h    t        t        j                               D ]  } | j                           y r   )r)   r   keysr   )r   s    r   clear_all_cachesr   H  s(    GLLN# e	r   )r   c                      y r   r   r   r   r   _ignorer   N  s    dr      c                    t        j                  |rt        j                  nt        | |      }t        |t        |              |S )a  
  Least recently used cache decorator with weakref support.

  The cache will take a weakref to the first argument of the wrapped function
  and strong refs to all other arguments. In all other respects it should
  behave similar to `functools.lru_cache`. The cache is thread local.
  )_weakref_lru_cacher   r   r   r   r   r   )callmaxsizer   cached_calls       r   r   r   P  s;     #442fw+ c$i(	r   )frozenslotsweakref_slotc                      e Zd ZU ded<   y)MultiWeakRefCacheKeyztuple[weakref.ref, ...]weakrefsN)__name__
__module____qualname____annotations__r   r   r   r   r   `  s    ##r   r   c                      e Zd Zy)MultiWeakRefPlaceholderN)r   r   r   r   r   r   r   r   e  s    r   r   z	set[Type]weakref_cache_key_typesc                >    t        |       xs t        |       t        v S r   )r   typer   )rT   s    r   is_weakref_cache_key_typer   m  s    	!	<a$;;<r   )r   r   c                  	
 i i 	d	fdd
fd
	 	 	 	 d	fdd	 fd}t        j                  |rt        j                  nt        ||      t        t                      t        j                         
fd       }j                  |_	        j                  |_
        j                  |_        |_        	|_        |S )
aa  
    Least recently used cache decorator with weakref support.

    Similar to `weakref_lru_cache`, except that it keeps weak references
    to all positional and keyword arguments for which
    `is_weakref_cache_key_type()` is true, and strong references to
    other arguments. The cache entry is removed if any of the weakref
    arguments dies.
    c                    j                  | t                     }|D ]  }	 |=  	 | = y # t        $ r Y w xY w# t        $ r Y y w xY wr   )getsetKeyError)wrkey_idskey_id	id_to_keyweakref_to_key_idss      r   remove_weakrefz/multi_weakref_lru_cache.<locals>.remove_weakref  sg    "&&r351g &	
r"  	
	  s   ,; 	88	AAc           	        t        |       t        u rt        fd| D              S t        |       t        u r+| j                         D ci c]  \  }}| |       c}}S t	        |       rj                  |        t        S | S c c}}w )Nc              3  0   K   | ]  } |        y wr   r   )r^   v1accweakrefs_to_sentinels     r   r_   zHmulti_weakref_lru_cache.<locals>.weakrefs_to_sentinel.<locals>.<genexpr>  s     ?r)"c2?s   )r   rD   r   itemsr   rC   _multi_weakref_placeholder)rT   r   kr   r   s    `  r   r   z5multi_weakref_lru_cache.<locals>.weakrefs_to_sentinel  sw    	aE	?Q???7d?>?ggiHUQ'C00HH$Q'

1)) Is   B	c           
     j   t        |       t        u rt        fd| D              S t        |       t        u r,| j                         D ci c]  \  }}| |       c}}S | t        u r=t              })j                  |t                     j                          |       S | S c c}}w )Nc              3  2   K   | ]  } |        y wr   r   )r^   r   r   r   sentinel_to_referrentss     r   r_   zJmulti_weakref_lru_cache.<locals>.sentinel_to_referrents.<locals>.<genexpr>  s     H+BF;Hs   )	r   rD   r   r   r   rj   
setdefaultr   add)rT   r   r   r   r   r   r   r   s    ``   r   r   z7multi_weakref_lru_cache.<locals>.sentinel_to_referrents  s     
aE	HaHHH7d?WWY(Ar )"b&99 ( 	(**"X

'
'CE
2
6
6v
>t(s   B/c                   t        | t              r3t        |       }| |<    ||ft        | j                        |      \  }}n9| t
        u r|}|}n, ||ft        t        j                  |       g      d       \  }} |i |S r   )
isinstancer   idri   r   r   weakrefref)	keyr%   r   r   	orig_argsorig_kwargsr   r   r   s	         r   
cache_missz+multi_weakref_lru_cache.<locals>.cache_miss  s    	C-	.C	&!76ND."8	;,,	!76ND'++c"2!34d"<	;9,,,r   c                 H   g } | |f|      \  }}t        |      }|dk(  r 	t        g| i |S |dk(  r 	|d   g|i |S t        |      D ci c]  }|t        j                  |
       c}t        t        fd|D                    } 	|g|i |S c c}w )Nr   r6   c              3  (   K   | ]	  }|     y wr   r   )r^   rT   value_to_weakrefs     r   r_   z;multi_weakref_lru_cache.<locals>.wrapper.<locals>.<genexpr>  s!      2I67 3C12E 2Is   )r   )r8   r   r   r   r   r   rD   )r   r   acc_weakrefsr%   r   nr_weakrefsrT   r   r   r   r   r   s           @r   r   z(multi_weakref_lru_cache.<locals>.wrapper  s     "l)9k*B*68ldF%k		5 6%6)46 	6!<? , ,$*, 	, &)%68 ! w{{1n== 8"E 2I;G2I -I J30000	8s   B)r   zweakref.ref)r   z	list[Any])r   zIterator[weakref.ref]r   
int | None)r   z4MultiWeakRefCacheKey | MultiWeakRefPlaceholder | Any)r   r   r   r   r   r   r   r   r   r   r   
cache_keys_multi_weakref_id_to_key_multi_weakref_to_key_ids)r   r   r   r   r   r   r   r   r   r   r   s   `    @@@@@@r   multi_weakref_lru_cacher  q  s      24I 79
	#8'1"-" %66 4'GK ;D	*__T1 1& %//G%11G$//G'0G$(:G%Nr   c                      e Zd ZdgZd Zd Zy)
Unhashablevalc                    || _         y r   r  selfr  s     r   __init__zUnhashable.__init__  	    DHr   c                4    | j                   |j                   k(  S r   r	  r  others     r   __eq__zUnhashable.__eq__      88uyy  r   N)r   r   r   	__slots__r  r  r   r   r   r  r    s    g)!r   r  c                  $    e Zd ZdgZd Zd Zd Zy)Hashabler  c                    || _         y r   r	  r
  s     r   r  zHashable.__init__  r  r   c                ,    t        | j                        S r   )hashr  r  s    r   __hash__zHashable.__hash__  s    >r   c                4    | j                   |j                   k(  S r   r	  r  s     r   r  zHashable.__eq__  r  r   Nr   r   r   r  r  r  r  r   r   r   r  r    s    g)!r   r  c                  $    e Zd ZdgZd Zd Zd Zy)
WrapKwArgsr  c                    || _         y r   r	  r
  s     r   r  zWrapKwArgs.__init__  r  r   c           	     z    t        t        d t        | j                  j	                               D                    S )Nc              3  *   K   | ]  \  }}||f  y wr   r   )r^   r   rT   s      r   r_   z&WrapKwArgs.__hash__.<locals>.<genexpr>  s     BAq!fBs   )r  rD   sortedr  r   r  s    r   r  zWrapKwArgs.__hash__  s(    B0@)ABBCCr   c                4    | j                   |j                   k(  S r   r	  r  s     r   r  zWrapKwArgs.__eq__  r  r   Nr  r   r   r   r  r    s    g)D!r   r  c                    |  d| dS )N()r   )transform_namer   s     r   	wrap_namer(    s    1TF!	$$r   c                r    t        | dd       }||S t        | t              rt        | j                        S |S )Nr   )getattrr   r   fun_namefunc)fundefault_namer   s      r   r+  r+    s:    	j$	'$	KWCHHr   c                    t        | dd       }||S t        | t              rt        | j                        S t        |       S )Nr   )r*  r   r   fun_qual_namer,  r+  )r-  	qual_names     r   r0  r0    s?    c>40)W""	#r   c                    t        j                  |       } | | cxk  r|k  sn t        d|  d|       | dk  r| |z   } | S )z?Canonicalize an axis in [-num_dims, num_dims) to [0, num_dims).zaxis z) is out of bounds for array of dimension r   )operatorindex
ValueError)axisnum_dimss     r   canonicalize_axisr8    sM    		$
d	%X	%
uTF"KH:V
WW	AX(?D	+r   c                    | t        t                    S t        | t              rFt        fd| D              } |s.t	        t        |             t	        |       k7  rt        d|        | S t        |       fS )Nc              3  6   K   | ]  }t        |        y wr   )r8  )r^   rS   ndims     r   r_   z*canonicalize_axis_tuple.<locals>.<genexpr>%  s     :"1d+:s   zrepeated axis: )rD   r   r   r   r8   r   r5  r8  )r6  r;  allow_duplicates    ` r   canonicalize_axis_tupler=  !  sn    	\th:T::Ds3t9~T:/00KdD)++r   c                   ||k(  r| S t        |t              r|f}t        |t              r|f}|D cg c]  }t        || j                         }}|D cg c]  }t        || j                         }}t	        t        j                  |             D cg c]	  }||vs| }}t        t        ||            D ]  \  }}|j                  ||        | j                  |      S c c}w c c}w c c}w r   )
r   intr8  r;  r   npr"  r*   insert	transpose)rH   ru   dstarS   permdr   s           r   moveaxisrG  ,  s    CZHS&CS&C/23!	1aff	%3#3/23!	1aff	%3#32771:&	7!3,!	7$	7Sc]# daKK1	
T	 	43	7s   C$C)	C.C.c                    |  |z   S r   r   )rH   rI   s     r   ceil_of_ratiorI  :  s    27r   c                      d fd}|S )zs
  Like functools.wraps, but with finer-grained control over the name and docstring
  of the resulting function.
  c                   	 t              }t        dd      xs d}| j                  j                  t        di              t        di       | _        |nj                  |      | _        t        dd      | _        |n j
                  d
||d| _        t        d	| j                        | _	        | _
        | S # t        $ r Y | S w xY w)N__doc__ __dict__r   )r-  r   z<unknown module>)r-  docr   r   )r+  r*  rN  updater   formatr   r   rL  r   __wrapped__	Exception)r-  r   rO  docstrr   namestrwrappeds      r   r   zwraps.<locals>.wrapperH  s    gdGY+1rc	ll'':r:;#G->Cc$_T'..T.2Jclw6HIcn"NS'&--DDcDVD 
k .#,,Gcco J  
Js   CC 	CC)r-  r   returnr   r   )rV  rU  rT  r   r   s   ```` r   r   r   >  s      
.r   c                D    t        dt        |       j                         )NzUnhandled case: )AssertionErrorr   r   )rH   s    r   assert_unreachablerZ  \  s     )$q'*:*:);<==r   c                p    d|cxk  rt        |       k  sn J |t        |       f       | d | |fz   | |d  z   S Nr   r8   tidxr  s      r   tuple_insertra  _  sD    	
c	SV	*c3q6]*		
4CC6	AcdG	##r   c                n    d|cxk  rt        |       k  sn J |t        |       f       | d | | |dz   d  z   S r   r]  )r_  r`  s     r   tuple_deleterc  c  sA    	
c	CF	)S#a&M)		
4C1S1WX;	r   c                v    d|cxk  rt        |       k  sn J |t        |       f       | d | |fz   | |dz   d  z   S r   r]  r^  s      r   tuple_updatere  g  sH    	
c	CF	)S#a&M)		
4CC6	Ac!efI	%%r   c                  .    e Zd ZdZd Zd Zd Zd Zd Zy)HashableFunctiona
  Decouples function equality and hash from its identity.

  Local lambdas and function defs are reallocated on each function call, making
  the functions created on different calls compare as unequal. This breaks our
  caching logic, which should really only care about comparing the semantics and
  not actual identity.

  This class makes it possible to compare different functions based on their
  semantics. The parts that are taken into account are: the bytecode of the
  wrapped function (which is cached by the CPython interpreter and is stable
  across the invocations of the surrounding function), and `closure` which
  should contain all values in scope that affect the function semantics. In
  particular `closure` should contain all elements of the function closure, or
  it should be possible to derive the relevant elements of the true function
  closure based solely on the contents of the `closure` argument (e.g. in case
  some closed-over values are not hashable, but are entirely determined by
  hashable locals).
  c                     || _         || _        y r   r-   closure)r  r-   rj  s      r   r  zHashableFunction.__init__  s    DFDLr   c                    t        |      t        u xrH | j                  j                  |j                  j                  k(  xr | j                  |j                  k(  S r   )r   rg  r-   __code__rj  r  s     r   r  zHashableFunction.__eq__  sH    K++ *FFOOuww///*LLEMM)+r   c                X    t        | j                  j                  | j                  f      S r   )r  r-   rl  rj  r  s    r   r  zHashableFunction.__hash__  s    $,,/00r   c                &     | j                   |i |S r   r   r  r%   r   s      r   __call__zHashableFunction.__call__  s    4664"6""r   c                P    d| j                   j                   d| j                   dS )Nz
<hashable z with closure=>)r-   r   rj  r  s    r   __repr__zHashableFunction.__repr__  s$    (t||nAFFr   N)	r   r   r   rL  r  r  r  rp  rs  r   r   r   rg  rg  k  s!    &+
1#Gr   rg  c                      fdS )Nc                    t        |       S r   )rg  ri  s    r   <lambda>z&as_hashable_function.<locals>.<lambda>  s    #Aw/ r   r   )rj  s   `r   as_hashable_functionrw    s	    	//r   c                  $    e Zd Zd Zd Zd Zd Zy)HashablePartialc                .    || _         || _        || _        y r   r-   r%   r   )r  r-   r%   r   s       r   r  zHashablePartial.__init__  s    DFDIDKr   c                    t        |      t        u xrc | j                  j                  |j                  j                  k(  xr4 | j                  |j                  k(  xr | j
                  |j
                  k(  S r   )r   ry  r-   rl  r%   r   r  s     r   r  zHashablePartial.__eq__  s`    K?* DFFOOuww///DII#D(,u||(CEr   c                    t        t        | j                  j                         d             }t	        | j
                  j                  | j                  |f      S )Nc                    | d   S r\  r   )kvs    r   rv  z*HashablePartial.__hash__.<locals>.<lambda>  s
    be r   )r   )rD   r"  r   r   r  r-   rl  r%   )r  r   s     r   r  zHashablePartial.__hash__  s?    6$++++-3CDEF$))V455r   c                \     | j                   g | j                  |i | j                  |S r   r{  ro  s      r   rp  zHashablePartial.__call__  s-    466=499=t=t{{=f==r   N)r   r   r   r  r  r  rp  r   r   r   ry  ry    s    
E
6>r   ry  c                x    	 t        j                  |       }d}|r ||       S  |      S # t        $ r d}Y w xY w)NFT)r3  r4  r(   )r6  if_posif_namedposnameds        r   maybe_named_axisr    sG    
..
CE !$1fSk1 
 Es   + 99c                    t         j                  j                  rdg}	 |j                  | d   d    d| d   d           | dd D ]  \  }}|j                  d| d|         	 |j                  d       t
        j                  d	j                  |             yy# t        $ r-}|j                  d       |j                  |        Y d}~hd}~ww xY w)
zFormat and log `pairs` if config.jax_distributed_debug is enabled.

  Args:
    pairs: A sequence of label/value pairs to log. The first pair is treated as
    a heading for subsequent pairs.
  z
DISTRIBUTED_DEBUG_BEGINr   z: r6   Nz  z!DISTRIBUTED_DEBUG logging failed!DISTRIBUTED_DEBUG_END
)r   distributed_debugr   rC   rS  loggerwarningjoin)pairslineslabelr   es        r   distributed_debug_logr    s     ##()ElleAhqk]"U1Xa[M23) ,,%r%5'*+,
 
LL()
NN499U#$ $  ll67llaSs   AB 	C&#CCc                H    t         j                  |       j                         S )zbReturns unique elements from `it` in the order of occurrence.

  The elements must be hashable.
  )r   fromkeysr   )r   s    r   stable_uniquer    s    
 
r				!!r   c                  P    e Zd ZU ded<   ded<   d ZddZddZddZdd	Zdd
Z	y)
OrderedSetzset[T]elts_setlist[T]	elts_listc                0    t               | _        g | _        y r   )r   r  r  r  s    r   r  zOrderedSet.__init__  s    EDMDNr   c                    || j                   vr7| j                   j                  |       | j                  j                  |       y y r   )r  r   r  rC   r  elts     r   r   zOrderedSet.add  s7    
$--
mm
nnC   r   c                4    |D ]  }| j                  |        y r   )r   )r  eltsr  s      r   rP  zOrderedSet.update  s     
hhqkr   c                ,    t        | j                        S r   )ri   r  r  s    r   __iter__zOrderedSet.__iter__  s    r   c                ,    t        | j                        S r   )r8   r  r  s    r   __len__zOrderedSet.__len__  s    t~~r   c                    || j                   v S r   )r  r  s     r   __contains__zOrderedSet.__contains__  s    $--r   N)r  r   rW  None)r  zSeq[T]rW  r  )rW  zIterator[T])rW  r?  )r  r   rW  bool)
r   r   r   r   r  r   rP  r  r  r  r   r   r   r  r    s,    !
  r   r  c                  4    e Zd ZU ded<   ded<   d Zd Zd Zy)	HashableWrapperr	   rH   r   r  c                N    || _         t        |      | _        y #  d | _        Y y xY wr   )rH   r  )r  rH   s     r   r  zHashableWrapper.__init__  s    DF!WDIs    	$c                \    | j                   | j                   S t        | j                        S r   )r  r   rH   r  s    r   r  zHashableWrapper.__hash__  s"    		-499=2dff:=r   c                    t        |t              sy| j                  | j                  |j                  k(  S | j                  |j                  u S )NF)r   r  r  rH   r  s     r   r  zHashableWrapper.__eq__  s=    e_- $		 5466UWWL466UWW;LLr   N)r   r   r   r   r  r  r  r   r   r   r  r    s    &>Mr   r  c                    t        | t              rt        t        |       j                  S t        | t        j
                        r| j                  S | S r   )r   propertyr   fgetr   cached_propertyr,  r   s    r   _original_funcr    s=    8!!!!!Y../66M	
(r   c                     d fd}|S )Nc                    | _         | S r   )r   )r,  modules    r   r   zset_module.<locals>.wrapper  s    doKr   )r,  r   rW  r   r   )r  r   s   ` r   
set_moduler    s     
.r   c                      fd}|S )zEA decorator replacing a Python class with its C++ version at runtime.c                    | S h d}| j                   j                         D ]-  \  }}||vst        t        |      d      r!t	        ||       / | j
                  _        S )N>   rL  rN  r   _use_cpp)rN  r   hasattrr  setattrrL  )clsexclude_methods	attr_nameattrcpp_clss       r   r   zuse_cpp_class.<locals>.wrapper  sg    j;O<<--/ ,	4	/	)~d+Z8
'9d
+,
 kkGONr   r   )r  r   s   ` r   use_cpp_classr    s     
.r   c                H     t         t              st        d       fd}|S )zKA decorator excluding methods from the set that are forwarded to C++ class.z``is_enabled`` must be a boolc                0    rt        |       }d|_        | S )NT)r  r  )r-   original_func
is_enableds     r   	decoratorz!use_cpp_method.<locals>.decorator  s    $Q'm#mHr   )r   r  r(   )r  r  s   ` r   use_cpp_methodr    s&    	J	%
3
44
 
r   c                  F    e Zd ZdZd Zej                  Zej                  Zy)StrictABCMetaa%  A variant of `abc.ABCMeta` which does not allow virtual subclasses.

  Virtual subclasses support require `abc.ABCMeta` to roundtrip through
  pure Python when doing instance/subclass checking. This if fine for ABCs
  which need virtual subclasses, but is wasteful for the ones which don't.
  c                     ~t        |  d      )Nz$ does not support virtual subclasses)NotImplementedError)r  subclasss     r   registerzStrictABCMeta.register*  s    
%IJ
KKr   N)r   r   r   rL  r  r   __instancecheck____subclasscheck__r   r   r   r  r  #  s'    L ,,,,r   r  c                      e Zd ZdZy)	StrictABCr   N)r   r   r   r  r   r   r   r  r  2  s    )r   r  )	metaclasszCallable | Nonetest_event_listenerc                *    t         sy t        | g|  y r   )r  )r   r%   s     r   
test_eventr  8  s    	
d"T"r   c                    d}| dk  ryt        t        j                  t        j                  | d            t	        |      dz
        }| d|z  z  }|d||    dS )N)rM  KMGr   r   z0.00Bi  r6   z.2fB)minmathfloorlogr8   )	num_bytesprefixesexponentscaled_values       r   pprint_bytesr  @  sb    %(!^DHHY56H8IJ(dHn-,hx01	33r   install_failure_signal_handlerc                     y r   r   )call_previous_handlers    r   r  r  K  s    r   )r   Iterable[T1]rW  zlist[tuple[T1]])r   r  r    Iterable[T2]rW  zlist[tuple[T1, T2]])r   r  r    r  r"   Iterable[T3]rW  zlist[tuple[T1, T2, T3]])
r   Iterable[Any]r    r  r"   r  r$   r  rW  zlist[tuple[Any, ...]])r-   zCallable[[T1], T]r   r  rW  r  )r-   zCallable[[T1, T2], T]r   r  r    r  rW  r  )
r-   zCallable[[T1, T2, T3], T]r   r  r    r  r"   r  rW  r  )r-   zCallable[..., T]r   r  r    r  r"   r  r$   r  rW  r  )r-   zCallable[[T1], Any]r   r  rW  r  )r-   zCallable[[T1, T2], Any]r   r  r    r  rW  r  )
r-   zCallable[[T1, T2, T3], Any]r   r  r    r  r"   r  rW  r  )r-   zCallable[..., Any]r   r  r    r  r"   r  r$   r  rW  r  )rE   zIterable[tuple[T1, T2]]rW  z%tuple[tuple[T1, ...], tuple[T2, ...]])rL   zIterable[tuple[T1, T2, T3]]rW  z5tuple[tuple[T1, ...], tuple[T2, ...], tuple[T3, ...]])rQ   Sequence[T]rR   zIterable[tuple[int, T]]rW  tuple[T, ...])r%   r  rY   Sequence[int]rW  list[list[T]])rd   Sequence[bool]re   r  rW  ztuple[list[T], list[T]])rd   r  rl   Sequence[T1]rm   zSequence[T2]rW  zlist[T1 | T2])rt   Sequence[int | None]ru   r  rv   r  rW  r  )rz   r  r{   r  r|   r  r}   r  rv   r  rW  r  )r   zdict[T1, T2]r   r  rW  zlist[T2])rF   zIterable[Sequence[T]]rW  r  )rF   Iterable[T]rY   r  rW  r  )r   zCallable[[T], bool]rF   r  rW  zFtuple[list[T], list[T], Callable[[Sequence[T], Sequence[T]], list[T]]])i   T)r   zbool | Callable)r   r	   r   r   )r   T)r   r   r   r  )r'  r   r   r   rW  r   )z<unnamed function>)r-  r   r.  r   rW  r   )r-  r   rW  r   )r6  r   r7  r?  rW  r?  )F)r6  zint | Sequence[int] | Noner;  r?  r<  r  rW  ztuple[int, ...])rH   Arrayru   int | Sequence[int]rC  r  rW  r  )rH   r?  rI   r?  rW  r?  )NN)rV  r   rU  
str | NonerT  r  rW  Callable[[T], T])r_  r  r`  r?  r  r   rW  r  )r_  r  r`  r?  rW  r  )r   r  rW  r  )r-   r   rW  r   )r  r   rW  r  )r  z	type[Any]rW  zCallable[[type[T]], type[T]])T)r  r  rW  r  )r   r   rW  r  )r  zint | floatrW  r   )r  r  )v
__future__r   abccollections.abcr   r   r   r   dataclassesr   r   	itertoolsr   loggingr  r3  typingr	   r
   r   r   r   r   r   r   r   numpyr@  jax._srcr   jax._src.libr   r   r   jaxlib_utils	getLoggerr   r  Seqr  r   r   r   r   r   r.   r<   rJ   rO   rU   r[   rb   rg   rr   rx   r   r   r   flattenrk   r   r   r   r   topological_sortr   r   r   WeakKeyDictionaryr   r   r   memoizer   	dataclassr   r   r   r   r   r   r  r  r  r  r(  r+  r0  r8  r=  rG  rI  r   rZ  ra  rc  re  rg  rw  ry  r  r  r  r  r  r  r  r  r  ABCMetar  r  r  r  Mutexr  r  r  r   r   r   <module>r     s   # 
 B B        ^ ^ ^    @ .			8	$ 	CLT]T]T]  ? ?Y Ys s S  S) ""(  M Mg g B  B Z  Z ""(K Ke e  X  X
   '
	.
)	>)
 
 
 #

%08C

(<


(
0;
 
* ('  / .<00)<" L.8 0Iw/H/H/J	, J	 
 .237,0  d$TB$ $ C$  56  &)U  *= #'mm !m`! !
! 
!
! 
!%	,  
 <>$&$G $GL0> >$2%("   6M M&	-CKK --  (, _ +#
 	4 <9:#/#N#N 	r   