
    uki#                    f   d dl mZ d dlm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mZmZmZmZmZmZ  ej>                  e         ej>                  e        ejB                  e"cZ"Z#ejH                  e%cZ%Z& G d dejN                        Z(ejR                  	 	 	 	 d&d       Z* e*e	jV                  jX                  d          Z+ejZ                   G d d             Z.d Z/d Z0d'dZ1d Z2d Z3	 	 	 	 d(dZ4	 	 	 	 d)dZ5 G d de
jl                        Z7d  Z8d! Z9d" Z: e7d#      Z;e8e
jx                  e;<   e9ejz                  e;<    ej|                  e; ej~                  e:d$%              ej                  e;       y)*    )annotations)CallableN)Any)ad_util)api_util)core)custom_api_util)linear_util)source_info_util)traceback_util)util)ad)mlir)partial_eval)pxla)tree_flattentree_leavestree_maptree_structuretreedef_tupletree_unflatten	PyTreeDefc                      e Zd ZdZd Zy)
StoreEqualzFStores an unchanging value. Checks empty reads and unequal overwrites.c                    | j                   t        j                  ur4|| j                   k7  r%t        j                  d| j                    d|       || _         y )Nz Store assignment mismatch, from z to )_vallu_EMPTY_STORE_VALUEStoreException)selfvals     T/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/jax/_src/custom_transpose.pystorezStoreEqual.store2   sO    yy---#2B,TYYKtC5
AC CDI    N)__name__
__module____qualname____doc__r#    r$   r"   r   r   0   s
    Nr$   r   c                L    t               fd}|j                  | |      |fS )Nc                      j                   S N)r!   )	out_stores   r"   <lambda>z)transformation_with_aux.<locals>.<lambda><   s    imm r$   )r   wrap)genfungen_static_args	out_thunkr-   s       @r"   transformation_with_auxr4   8   s)     l)#)	#		2I	==r$   c                  r    e Zd ZU ded<   dZded<   d	dZej                  Zd
dZ	e
j                  d        Zy)custom_transposer   r1   NzCallable | None	transposec                >    t        j                  | |       || _        y r,   )	functoolsupdate_wrapperr1   )r    r1   s     r"   __init__zcustom_transpose.__init__J   s    T3'DHr$   c                    || _         |S r,   )r7   )r    r7   s     r"   def_transposezcustom_transpose.def_transposeP   s    DNr$   c                    t        |      \  }}t        |      \  }}t        ||f      \  }}t        t        j                  | j                  t        j                  d| j                  ||fi             |      \  }	}
t        |      \  }}t        j                  | j                  t        j                  d| j                  ||fi             }t        j                  |	g||t        |      |||d}t        ||      S )Nzcustom_transpose fun
debug_infozcustom_transpose transpose_fun)r7   	out_typeslin_treeres_treeout_tree)r   flatten_fun_nokwargsr   	wrap_initr1   r   r@   r7   custom_transpose_pbindtupler   )r    rA   res_arglin_arg_rC   rB   	args_flatin_treeflat_fun	out_tree2out_types_flatrD   transpose_wrappedout_flats                  r"   __call__zcustom_transpose.__call__T   s   w'KAxw'KAx%w&89Iw /
HH**+A488,3W+=rC	D 	Hi  ,I6NH&&'G'+~~(/';RA_
 "&&x :) :1B16~1F080808:H (H--r$   )r1   r   )r7   r   )r%   r&   r'   __annotations__r7   r;   r	   forward_attr__getattr__r=   r   api_boundaryrT   r)   r$   r"   r6   r6   E   sB    -#)_#  ,,+ . .r$   r6   c                6    t        || g|j                  z        S r,   )r   
num_leaves)xtreedefs     r"   	tree_fillr]   u   s    	!w'9'9!9	::r$   c                ,    t        | t        |            S r,   )r]   r   )r[   trees     r"   tree_fill_liker`   x   s    	1nT*	++r$   c                @    t        d|       }t        t        |||      S )Nr   is_leaf)r]   r   r`   )full_treedefr_   rc   	full_trees       r"   tree_broadcastrf   {   s    <()	.$	7	CCr$   c                p    t        d|       } t        d|      }	 t        d ||        y# t        $ r Y yw xY w)Nr   c                    | S r,   r)   )r[   ys     r"   r.   z#is_treedef_prefix.<locals>.<lambda>   s    ! r$   FT)r]   r   
ValueError)entireprefixs     r"   is_treedef_prefixrm      sD    Q&Q&^VV, 
 
 s   ) 	55c                    t        | dd      S )Nr%   z<unnamed transpose rule>)getattr)rules    r"   	rule_namerq      s    	z#=	>>r$   c                    t        ||      s8| j                  r| j                  j                  nd}t        d| d| d|       y )Nz	<unknown>zstructure of custom transpose rule's output does not prefix-match structure of primal function's linear inputs under custom transpose rule (z).
Transpose rule output: z
Linear primal inputs: )rm   r@   func_src_info	TypeError)rp   rB   rule_out_treerq   s       r"   check_transpose_rule_treesrv      sZ     
8]	315--kI
	""+ -""/ 1!!)
		,- - 
4r$   c                     |        \  t        j                  t        j                        d      fd}t	        j
                  |j                  j                        S )Nr)   c                p    t        | |f      } t        j                        g | }t        |      S r,   )r   r   jaxpr_as_funr   )rJ   ct_outrM   ct_insrB   transpose_conststranspose_jaxprs       r"   r7   z,make_transpose_from_thunk.<locals>.transpose   s?    Wf-.I/T/N1ANINF(F++r$   r?   )r   ClosedJaxprpeconvert_constvars_jaxprr   rF   jaxprr@   )thunkrB   r7   r|   r}   s    ` @@r"   make_transpose_from_thunkr      sT    &+g#/#$$  127/, 
iO,A,A,L,L	MMr$   c                  *    e Zd ZdZdZdZd Zd Zd Zy)CustomTransposePrimitiveFTc                &     | j                   |i |S r,   )
_true_bind)r    argsparamss      r"   rH   zCustomTransposePrimitive.bind   s    4??D+F++r$   c                @    |d   |dd  }} |j                   | ||fi |S )Nr      )process_custom_transpose)r    trace	call_argsr   calltracerss         r"   bind_with_tracez(CustomTransposePrimitive.bind_with_trace   s1    aL)AB-'D)5))$gHHHr$   c                \   d|v rd|v sJ t        |      }t        |j                  d      |d         |d<   |j                  d      }t        j                  t        j                  |      |j                  j                        }n"d|v sJ t        |      }|j                  d      }|g|fS )N
call_jaxprtranspose_jaxpr_thunkrB   r7   r?   r   )	dictr   popr   rF   r   ry   r   r@   )r    r   
new_paramsr   r   s        r"   get_bind_paramsz(CustomTransposePrimitive.get_bind_params   s    v$...#'<j 9
..0
1
Z
 !"j &0^^L%Aj\\$++J7%/%5%5%@%@Bd F"""#'<j^^F#d6:r$   N)	r%   r&   r'   call_primitivemap_primitivemultiple_resultsrH   r   r   r)   r$   r"   r   r      s"    .-,Ir$   r   c               *    ~~|t         j                  fS r,   )r   
no_effects)rL   rA   in_atomsr   s       r"   custom_transpose_typecheckr      s    	DOO	##r$   c                  d|v rd|v sJ t        |d   |      }nd|v sJ |d   }t        ||f      }t        ||      \  }	}
t        d t	        |	      D              sJ | D cg c]>  }t        |      t        j                  u rt        j                  |j                        n|@ } }t        ||       }|j                  |	|      }t        ||t        |             t        ||d       }t               t        fd|
|t         j"                        }t%        |      \  }}d g|j&                  z  |D cg c]
  }|u rd n| c}z   S c c}w c c}w )	Nr   r   r   r7   c              3  H   K   | ]  }t        j                  |         y wr,   )r   is_undefined_primal).0r[   s     r"   	<genexpr>z2custom_transpose_transpose_rule.<locals>.<genexpr>   s     Iq''**Is    "c                
    | d u S r,   r)   )r[   s    r"   r.   z1custom_transpose_transpose_rule.<locals>.<lambda>   s
    a4i r$   rb   c                    || S |S r,   r)   )lctzeros     r"   r.   z1custom_transpose_transpose_rule.<locals>.<lambda>   s    "*$ B r$   )r   r   r   allr   typer   Zerozeros_like_avalavalcall_wrappedrv   r   rf   objectr   r   r   r   rZ   )ctsrA   rC   rB   rD   r   r   r7   call_in_treerJ   rK   r   rz   ct_linct_lin_flatrL   r   s                   @r"   custom_transpose_transpose_ruler      sr    &6!!!)&'3I V{#I(34, $L$7'7	IK4HI	II	I 	 .2"X-E	 	 	)2	M 	# 	(C(&!!'62&Y.2HI(F4GH&
 
$NVR-C-CE&  '.+q
(%%	%k(Zt)C(Z	ZZ	 )[s   $AE7Ec                2     t        j                  |       | S r,   )r   ry   )r   r   r   s      r"   custom_transpose_loweringr      s    	&		:	&	--r$   custom_transpose_callT)r   )r1   lu.WrappedFunreturnztuple[lu.WrappedFun, Any]r,   )rp   r   rB   r   ru   r   )r   r   rB   r   r   r   )A
__future__r   collections.abcr   r9   typingr   jax._srcr   r   r   r	   r
   r   r   r   r   jax._src.interpretersr   r   r   r   r   jax._src.tree_utilr   r   r   r   r   r   r   register_exclusion__file__safe_mapmap
unsafe_mapsafe_zipzip
unsafe_zipStorer   curryr4   rE   r   register_custom_decorator_typer6   r]   r`   rf   rm   rq   rv   r   	Primitiver   r   r   r   rG   custom_typechecksprimitive_transposesregister_lowering	lower_fun register_initial_style_primitiver)   r$   r"   <module>r      s   # $      $ & % #  $ & 4 &+ + +
 $  # #H - ! ! !( + --Z--Z
  >>2K> > /!!&&q)+  //*. *. 0*.^;,D?
-)2
-.7
-	N(1	N6C	Nt~~ @$
#[L. ..EF -G  ) *.M  * +   DNN,tDF & % %&8 9r$   