
    ukiA                       d dl mZ d dlmZ d dlmZ d dlZd dlm	Z	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 d dlmZmZmZmZ eecZZeecZZe	Z e	Z!e	Z"e	Z#ejH                  Z%ejH                  Z&ejN                  Z(ejR                  Z) G d dejT                        Z+ G d dejH                        Z, G d dejH                        Z-d?dZ.d Z/d Z0d Z1d Z2 ed       G d de(             Z3 G d de-      Z4 G d d e5      Z6 G d! d"e6#      Z7 e.e7d$         G d% d&ejp                        Z9 e9       Z:ejv                  jy                  e9        G d' d(e+      Z= e=d)      Z> G d* d+e+      Z? e?d,      Z@ G d- d.e+      ZA eAd/      ZB G d0 d1      ZCd2 ZD ejT                  d3      ZEdeE_F        d4 eE_G        eEj                  d5        ZId6 ZJeJeE_K        d7 ZLeLej                  eE<   d8 ZNd9 ZOeNej                  eE<    ejT                  d:      ZQdeQ_F        d; eQ_G        eQj                  d<        ZRd= ZSeSej                  eQ<   d> ZUeUej                  eE<   y)@    )annotations)	dataclass)partialN)AnyHashable)core)dtypes)effects)ad)batching)ad_util)safe_zipsafe_map
split_list)tree_flattentree_unflattentree_leavestree_mapc                  :    e Zd Zd Zd	dZd	dZd Zd Zd Zd Z	y)
HiPrimitivec                    || _         | j                  t        j                  | <   | j                  t        j
                  | <   y N)namejvpr   primitive_jvps	transposeprimitive_transposes)selfr   s     I/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/jax/_src/hijax.py__init__zHiPrimitive.__init__/   s1    DI"hhBd$(NNBD!    c                     yNT )r   avalsparamss      r   is_highzHiPrimitive.is_high4   s    r!   c                     y)NFr$   )r   r&   s     r   is_effectfulzHiPrimitive.is_effectful7   s    r!   c                    J d       Nzmust overrider$   )r   	arg_avalsr&   s      r   abstract_evalzHiPrimitive.abstract_eval;       !/!5r!   c                    J d|         )Nzmust override for r$   )r   lotypes_wrapped_in_hitypesr&   s      r   to_lojaxzHiPrimitive.to_lojax?   s    -&tf--5r!   c                    J d       r+   r$   )r   primalstangentsr&   s       r   r   zHiPrimitive.jvpC   r.   r!   c                    J d       r+   r$   )r   argsr&   s      r   r   zHiPrimitive.transposeF   r.   r!   Nreturnbool)
__name__
__module____qualname__r    r'   r)   r-   r1   r   r   r$   r!   r   r   r   .   s%    3
".""r!   r   c                  X    e Zd ZdZdZd Zd ZddZddZddZ	ddZ
dd	Zdd
ZddZy)HiTypeTFc                    J d       r+   r$   r   s    r   __hash__zHiType.__hash__O       3O3Ur!   c                    J d       r+   r$   r   others     r   __eq__zHiType.__eq__P       88%r!   c                    J d       r+   r$   r@   s    r   lo_tyzHiType.lo_tyS   r.   r!   c                    J d       r+   r$   )r   hi_vals     r   	lower_valzHiType.lower_valW   r.   r!   c                    J d       r+   r$   )r   lo_valss     r   	raise_valzHiType.raise_valY   r.   r!   c                    J d       r+   r$   r@   s    r   to_tangent_avalzHiType.to_tangent_aval]   r.   r!   c                "    | j                         S r   rQ   r@   s    r   to_cotangent_avalzHiType.to_cotangent_avalb       !!r!   c                    J d       r+   r$   r@   s    r   vspace_zerozHiType.vspace_zerof   r.   r!   c                    J d       r+   r$   )r   xys      r   
vspace_addzHiType.vspace_addi   r.   r!   N)r8   list[core.AbstractValue])rK   HiValr8   list[LoVal])rN   LoValr8   r]   r8   r>   )r8   r]   )rY   r]   rZ   r]   r8   r]   )r:   r;   r<   r'   has_qddrA   rF   rI   rL   rO   rQ   rT   rW   r[   r$   r!   r   r>   r>   J   s7    '' 48""""
"""r!   r>   c                      e Zd ZdZdZ ej                  ej                        Zd Z	d Z
ddZd ZddZddZddZdd	Zdd
Zy)MutableHiTypeTc                    J d       r+   r$   r@   s    r   rA   zMutableHiType.__hash__r   rB   r!   c                    J d       r+   r$   rD   s     r   rF   zMutableHiType.__eq__s   rG   r!   c                    J d       r+   r$   )r   states     r   	lo_ty_qddzMutableHiType.lo_ty_qddv   r.   r!   c                    J d       )Nz,mutable hitypes should use lo_ty_qdd insteadr$   r@   s    r   rI   zMutableHiType.lo_tyx   s    @@@5r!   c                    J d       r+   r$   )r   rg   valss      r   new_from_lovalzMutableHiType.new_from_loval|   r.   r!   c                    J d       r+   r$   )r   rg   vals      r   
read_lovalzMutableHiType.read_loval~   r.   r!   c                    J d       r+   r$   )r   rg   rn   rN   s       r   update_from_lovalzMutableHiType.update_from_loval   r.   r!   c                    J d       r+   r$   r@   s    r   rQ   zMutableHiType.to_tangent_aval   r.   r!   c                "    | j                         S r   rS   r@   s    r   rT   zMutableHiType.to_cotangent_aval   rU   r!   N)rg   QDDr8   r\   )rg   rt   rk   r_   r8   r]   )rg   rt   rn   r]   r8   r^   )rg   rt   rn   r]   rN   r_   r8   Noner`   )r:   r;   r<   r'   ra   r   aval_methodcur_qdd
type_staterA   rF   rh   rI   rl   ro   rq   rQ   rT   r$   r!   r   rc   rc   l   sN    ''t-* 48"A""""
"r!   rc   c                R    |t         j                  | <   d t        j                  | <   y )Nc                    | S r   r$   )rY   s    r   <lambda>z!register_hitype.<locals>.<lambda>   s    ! r!   )r   pytype_aval_mappingsr	   canonicalize_value_handlers)val_cls	typeof_fns     r   register_hityper      s"    '0$G$0;&$$W-r!   c                ,    t        j                  |       S r   )r   rv   )fs    r   hijax_methodr      s    			!	r!   c                 L    t        d       \  \   } t        j                  |       S Ntreedef)r   	new_box_pbindr   s    r   new_boxr      s!    T"+"g		((r!   c                    t        j                  |       }t        j                  | t	        |j
                              }t        |j                  |      S )Nr%   )r   rw   	box_get_pr   tuple
leaf_avalsr   r   )boxtys	leaf_valss      r   box_getr      s<    S#nnScnn(=n>)	Y	//r!   c                R    t        |      \  }}t        j                  | g|d|i y )Nr   )r   	box_set_pr   )r   rn   leavesr   s       r   box_setr      s&     %/&'../v/w/r!   T)frozenc                  .    e Zd ZU ded<   ded<   d Zd Zy)BoxTypeStateztuple[core.AbstractValue, ...]r   	PyTreeDefr   c                f    t        d | j                  D              }t        || j                        S )Nc              3  <   K   | ]  }|j                           y wr   rS   .0as     r   	<genexpr>z.BoxTypeState.to_tangent_qdd.<locals>.<genexpr>   s     Dqq((*D   r   r   r   r   )r   r   s     r   to_tangent_qddzBoxTypeState.to_tangent_qdd   s'    DDOODDJ
DLL11r!   c                f    t        d | j                  D              }t        || j                        S )Nc              3  <   K   | ]  }|j                           y wr   )	normalizer   s     r   r   z)BoxTypeState.normalize.<locals>.<genexpr>   s     >q{{}>r   r   )r   
leaf_typess     r   r   zBoxTypeState.normalize   s'    >doo>>J
DLL11r!   N)r:   r;   r<   __annotations__r   r   r$   r!   r   r   r      s    ,,22r!   r   c                      e Zd ZdZ ej
                  e      Z ej
                  e      Z	d Z
d ZdddZd ZddZddZddZd	 Zy
)BoxTyTc                     t        t              S r   )hashr   r@   s    r   rA   zBoxTy.__hash__   s    T%[(r!   c                "    t        |t              S r   )
isinstancer   rD   s     r   rF   zBoxTy.__eq__   s    *UE"::r!   c                     y)Nr   r$   )r   short_dtypes_s      r   	str_shortzBoxTy.str_short   s    r!   c                p    |j                   D cg c]  }|j                         D ]  }|  c}}S c c}}w r   )r   rI   )r   	box_statetrI   s       r   rh   zBoxTy.lo_ty_qdd   s.    $//GaQWWYGEEGEGGGs   2c                2   t        |      }|j                  D cg c]<  } |j                  t        j                  |t        |j                                      > }}t        |d       J t        j                  t        |j                  |            S c c}w r   )iterr   rO   itislicelenrI   nextBox_newr   r   )r   r   rN   lo_vals_hi_tyhi_valss         r   rl   zBoxTy.new_from_loval   s    G}H%002 u		(C4F GH 2G 2$'''88N9#4#4g>??2s   ABc                    t        t        |            \  }}||j                  k(  sJ t        |j                  |      D cg c]  \  }}|j                  |      D ]  }|  c}}}S c c}}}w r   )r   r   r   zipr   rL   )r   r   r   r   r   r   rK   lo_vals           r   ro   zBoxTy.read_loval   sy    %gcl3Iwi'''''(+I,@,@)(L 3 3}uf//&13  3F 3 3 3s   "A*c                "   t        |      }|j                  D cg c]<  } |j                  t        j                  |t        |j                                      > }}t        |d       J t        |t        |j                  |             y c c}w r   )r   r   rO   r   r   r   rI   r   r   r   r   )r   r   r   rN   r   r   r   s          r   rq   zBoxTy.update_from_loval   s~    G}H%002 u		(C4F GH 2G 2$'''C	 1 17;<2s   ABc                    t               S r   r   r@   s    r   rQ   zBoxTy.to_tangent_aval   s	    7Nr!   N)F)r8   str)r   r   r8   r   )r   r   r8   list)r   r   r8   ru   )r:   r;   r<   ra   r   rv   r   getr   setrA   rF   r   rh   rl   ro   rq   rQ   r$   r!   r   r   r      sU    ' 	!#!# ):H@3=r!   r   c                       e Zd Z fdZ xZS )_BoxMetac                    t         |   |      xs? t        |t        j                        xr# t        t        j
                  |      t              S r   )super__instancecheck__r   r   Tracertypeofr   )r   instance	__class__s     r   r   z_BoxMeta.__instancecheck__   s@    G%h/ 5x- 5t{{8,e46r!   )r:   r;   r<   r   __classcell__r   s   @r   r   r      s    6 6r!   r   c                  \     e Zd ZdZd	dZe fd       Zd Zd Zd Z	e
d        Zd Z xZS )
r   Nc                r    t        d       \  \   }t        j                  |      }|j                  |       |S r   )r   r   r   r   )clsinit_valr   r   s       r   __new__zBox.__new__   s1    t$KB
...
)CGGHJr!   c                4    t         |   |       }||_        |S r   )r   r   _val)r   r   newr   s      r   r   zBox._new   s    
'/#
CCHJr!   c                    t        |       S r   )r   r@   s    r   r   zBox.get   s    4=r!   c                    t        | |       y r   )r   )r   rn   s     r   r   zBox.set   s    D#r!   c                "    | j                         S r   )rx   r@   s    r   rw   zBox.cur_qdd   s    ??r!   c                    t               S r   r   r@   s    r   tyzBox.ty   s	    7Nr!   c                    t        | j                        \  }}t        t        t        j
                  |            }t        ||      S r   )r   r   r   mapr   r   r   )r   r   r   r   s       r   rx   zBox.type_state  s6    "499-OFGs4;;/0J
G,,r!   r   )r:   r;   r<   r   r   classmethodr   r   r   rw   propertyr   rx   r   r   s   @r   r   r      sI    	$  
  -r!   r   )	metaclassc                    | j                   S r   )r   )bs    r   r{   r{   	  s
    qtt r!   c                      e Zd Zy)	BoxEffectN)r:   r;   r<   r$   r!   r   r   r     s    r!   r   c                  ,    e Zd ZddZd Zd Zd Zd Zy)NewBoxc                    yr#   r$   )r   r   s     r   r'   zNewBox.is_high  s    r!   c                   t        d       \  }}t        t        |      |      }t        j                  t               |      t        hfS r   )r   r   r   r   AvalQDDr   
box_effect)r   r   r   qdds       r   r-   zNewBox.abstract_eval  s:    "4(OFG
uV}g
.C<<%
|33r!   c               ,    t         j                  d       S r   )r   r   )r   r   s     r   r1   zNewBox.to_lojax  s    88D>r!   c                   J r   r$   )r   r3   r4   r   s       r   r   z
NewBox.jvp      5r!   c                   J r   r$   r   r   r6   s      r   r   zNewBox.transpose  r   r!   Nr7   )r:   r;   r<   r'   r-   r1   r   r   r$   r!   r   r   r     s    44
r!   r   r   c                  0    e Zd ZdZddZd Zd Zd Zd Zy)	BoxSetTc                    yr#   r$   )r   r   r   s      r   r'   zBoxSet.is_high$  s    $r!   c               ^    |j                   j                  t        ||             g t        hfS r   )mutable_qddupdater   r   )r   box_tyr   r   s       r   r-   zBoxSet.abstract_eval&  s*    
l:w?@
|r!   c               (    t        ||      |_        g S r   )r   r   )r   r   r   r   s       r   r1   zBoxSet.to_lojax*  s    gv.CHIr!   c                   |^}}|^}}t        |      t        j                  u rt        d      t	        j
                  |g|d|i t	        j
                  |g|d|i g g fS )NzLcan't differentiate Box.set operation, did you forget jax.lax.stop_gradient?r   )typer   Zero	Exceptionr   r   )r   r3   r4   r   r   rk   box_dotval_dotss           r   r   z
BoxSet.jvp.  sl    JC$!GhG}$ > ? ?NN3//w/NN77X7w7r6Mr!   c                   J r   r$   r   s      r   r   zBoxSet.transpose8  r   r!   Nr7   )	r:   r;   r<   multiple_resultsr'   r-   r1   r   r   r$   r!   r   r   r   !  s    >r!   r   r   c                  (    e Zd ZdZd Zd Zd Zd Zy)BoxGetTc                   |t         hfS r   )r   )r   r   r%   s      r   r-   zBoxGet.abstract_eval@  s    :,r!   c               ,    t        |j                        S r   )r   r   )r   r   r%   s      r   r1   zBoxGet.to_lojaxC  s    sxx  r!   c                   ||c\  }\  }t         j                  ||      t         j                  |t        d |D                    fS )Nr   c              3  <   K   | ]  }|j                           y wr   rS   r   s     r   r   zBoxGet.jvp.<locals>.<genexpr>J  s     )M!!*;*;*=)Mr   )r   r   r   )r   r3   r4   r%   r   r  s         r   r   z
BoxGet.jvpF  sG     (FSJWnnSn&nnWE)Mu)M$MnN r!   c                    J r   r$   )r   r6   s     r   r   zBoxGet.transposeM  r   r!   N)r:   r;   r<   r  r-   r1   r   r   r$   r!   r   r
  r
  =  s    !r!   r
  r   c                  t    e Zd ZU ded<   ded<   ded<   d Zd Zd	 Zd
 Zd Zd Z	d Z
d Zd Zd Zd Zd Zy)VJPHiPrimitiveztuple[PyTreeOfAvals, ...]in_avalsPyTreeOfAvalsout_avalzdict[str, Hashable]r&   c                $   t        | d      st        d      t        | d      st        d      t        | d      st        d      t        |       j                  t        j                  ur=t        |       j
                  t        j
                  urt        dt        |        d      t        | j                        \  | _        | _	        t        | j                        \  | _        | _        | j                  j                  | j                         y )	Nr  z,subclass __init__ should set `self.in_avals`r  z,subclass __init__ should set `self.out_aval`r&   z*subclass __init__ should set `self.params`	subclass z8 should not override both `vjp_bwd` and `vjp_bwd_retval`)hasattrAttributeErrorr  vjp_bwdr  vjp_bwd_retvalr   r  in_avals_flatin_treer  out_avals_flatout_tree__dict__r   r&   r@   s    r   r    zVJPHiPrimitive.__init__Y  s    4$IJJ4$IJJ4"GHHT
."8"88T
!!)F)FFYtDzl 3< < = ='3DMM'B$D)5dmm)D&DMM%r!   c                2    t        dt        |        d      )Nr  z must implement `expand`NotImplementedErrorr  r   r6   s     r   expandzVJPHiPrimitive.expandi  s    
	$t*5MN
OOr!   c                2    t        dt        |        d      )Nfor grad support, subclass z must implement `vjp_fwd`r!  r#  s     r   vjp_fwdzVJPHiPrimitive.vjp_fwdl  s%    
 ;DJ< H4 4 5 5r!   c                D    | j                  ||      }t        d ||       y )Nc                $    | j                  |      S r   )accum)acc	leaf_grads     r   r{   z(VJPHiPrimitive.vjp_bwd.<locals>.<lambda>r  s    CIIi$8 r!   )r  r   )r   resoutgrad
arg_accums	args_grads        r   r  zVJPHiPrimitive.vjp_bwdp  s!    ##C1I8*iPr!   c                2    t        dt        |        d      )Nr&  z- must implement `vjp_bwd` or `vjp_bwd_retval`r!  )r   r-  r.  s      r   r  zVJPHiPrimitive.vjp_bwd_retvalt  s)    
 ;DJ< HH H I Ir!   c                2    t        dt        |        d      )Nzfor vmap support, subclass z must implement `batch`r!  )r   	axis_datar6   dimss       r   batchzVJPHiPrimitive.batchy  s%    
 ;DJ< H2 2 3 3r!   c                2    t        dt        |        d      )Nzfor jvp support, subclass z must implement `jvp`r!  )r   r3   r4   s      r   r   zVJPHiPrimitive.jvp}  s%    
 :4:, G0 0 1 1r!   c                    t        | j                  |      }t        j                  |d| i}t	        | j
                  |      S )Nprim)tree_leaves_checkedr  call_hi_primitive_pr   r   r  )r   r6   	args_flatans_flats       r   __call__zVJPHiPrimitive.__call__  s8    #DLL$7I"''>>H$--22r!   c                     y r   r$   )r   arg_tyss     r   checkzVJPHiPrimitive.check  s    
r!   c                N    | j                   j                   d| j                   dS )N[])r   r:   r&   r@   s    r   __repr__zVJPHiPrimitive.__repr__  s$    nn%%&a}A66r!   c                    t        | j                  j                  t        | j                  j                               f      S r   )r   r   r:   r   r&   itemsr@   s    r   rA   zVJPHiPrimitive.__hash__  s.    ((%0A0A0C*DEFFr!   c                d    t        |       t        |      u xr | j                  |j                  k(  S r   )r  r&   rD   s     r   rF   zVJPHiPrimitive.__eq__  s'    :e$D)DDr!   N)r:   r;   r<   r   r    r$  r'  r  r  r5  r   r=  r@  rD  rA   rF   r$   r!   r   r  r  T  sU    %%
& P5QI
313
7GEr!   r  c                0    t        |      \  }}|| k(  sJ |S r   )r   )treedef_expectedtree	flat_valstreedef_actuals       r   r9  r9    s&    *40)^	+	++	+	r!   call_hi_primitivec                     yr#   r$   )r8  r6   s     r   r{   r{         r!   c                    | j                   S r   )r  )r8  _argss     r    _call_hi_primitive_abstract_evalrR    s    			r!   c                t    t        | j                  |      }t        | j                   | j                  |       S r   )r   r  r9  r  r$  )r8  r;  r6   s      r   _call_hi_primitive_to_lojaxrT    s.    	i	0$	T]]KDKK,>	??r!   c                    t        |j                  |      }t        |j                  |      }|j                  | ||      \  }}t        |j                  |      }|j                  j                  |      }||fS r   )r   r  r5  r9  r  flatten_up_to)r3  r;  	dims_flatr8  r6   r4  ansr<  s           r   _call_hi_primitive_batcherrY    sg    	i	0$	i	0$jjD$/)#t 4(mm))$/)	9	r!   c                   t        |j                  |      } |j                  | \  }}t        |j                  |      }|D cg c]  }d }}|||t        t        ||       fS c c}w r#   )r   r  r'  r9  r  r   fake_linear_op)	
nz_in_flatr8  r;  r6   rX  	residualsr<  r   nzs_outs	            r   _call_hi_primitive_linearizer_    sh    	i	0$4<<&.#y !4(#$aT$'$
GYj(Q	RR %s   	A#c                    t        |      \  }}t        |      \  }}t        j                  g |||t        |      | dS )N)residuals_treer\  r8  )r   call_hi_primitive_linearized_pr   r   )r8  r\  rsr4   residuals_flatra  tangents_flatr   s           r   r[  r[    sY    #/#3 ..!(+-	'	,	, 
N
N%
N#j0A
N Nr!   call_hi_primitive_linearizedc                     yr#   r$   )r8  r6   r   s      r   r{   r{     rO  r!   c                \    | j                   D cg c]  }|j                          c}S c c}w r   )r  rQ   )r8  ra  r\  rQ  r   s        r   +_call_hi_primitive_linearized_abstract_evalri    s%    '+':':	;!!


	;;	;s   )c               p   t        ||j                  g      \  }}t        ||      }t        |      }|D 	cg c]#  }	|	rt	        |      nt        j                         % }}	t	        |d       J t        |j                  |      }
t        |j                  |       } |j                  ||g|
 }|J y c c}	w r   )
r   
num_leavesr   r   r   r   	NullAccumr  r  r  )cts_flatr8  ra  r\  r6   rd  accums_flatr]  accums_flat_nzaccumsctsnones                r   '_call_hi_primitive_linearized_transposert    s     *4.2K2K1L M.+^^<)k",HRS"rl#r||~=S+S	lD	!	))	)$,,4&t}}h/#	i	.v	.$	 Ts   (B3c                   t        |j                  |       } t        |j                  |      }|j                  | |      \  }}t        |j                  |      }|j                  j                  |      }||fS r   )r   r  r   r9  r  rV  )r3   r4   r8  out_primalsout_tangentsout_primals_flatout_tangents_flats          r   _call_hi_primitive_jvprz    si    4<<1'DLL(3(#xx:+|(Dmm11,?	,	,,r!   )r8   ru   )W
__future__r   dataclassesr   	functoolsr   	itertoolsr   typingr   r   jax._srcr   r	   r
   jax._src.interpretersr   r   r   jax._src.utilr   r   r   jax._src.tree_utilr   r   r   r   r   
unsafe_mapr   
unsafe_zipr  r   r_   r]   AbstractValueTyLoTypeQuasiDynamicDatart   ShapedArray	Primitiver   r>   rc   r   r   r   r   r   r   r   r  r   r   Effectr   r   control_flow_allowed_effectsadd_typer   r   r   r   r
  r   r  r9  r:  r  r'   def_abstract_evalrR  rT  r1   rY  fancy_primitive_batchersr_  r[  primitive_linearizationsrb  ri  rt  fancy_transposesrz  r   r$   r!   r   <module>r     s   # !        $ *  8 8 R RCZCZ	
 
			
"$.. "8 "T  "D "D&&  "D<)0
0 $
23 
2 
2'M 'T6t 6!-H !-F ^ $ $ $[
  $ $ - -i 8[   9	[ 2 9	[ $ 9	
=E =E~
 %dnn%89 '+  $6  && '@  ;   :T ! !"5 6SN 4P  / 0!/0N!O 26  /)F  &11< 2<	 7^  2 3- *@  % &r!   