o
    "j.                     @   s	  d dl Z d dlZd dlZd dlZd dlZddlmZ ddlmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z' ddl(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3 ddl4m5Z5m6Z6 dd Z7d	d
 Z8dd Z9dd Z:dd Z;	 e*ddd Z<e*ddd Z=e*ddd Z>e*ddd Z?e*ddd Z@e*d d!d" ZAe*d#d$d% ZBe*d&d'd( ZCe*d)d*d+ ZDe*d,d-d. ZEe*d/d0d1 ZFe*d2d3d4 ZGe*d5d6d7 ZHe*d8	d]d9d:ZIe*d;d<d= ZJe*d>d?d@ ZKe*dAdBdC ZLe*dDdEdF ZMe*dGdHdI ZNe*dJdKdL ZOe*dMdNdO ZPe*dPdQdR ZQe*dSdTdU ZRe*dVdWdX ZSe*dYdZd[ ZTe*d\d]d^ ZUe*d_d`da ZVe*dbdcdd ZWe*dedfdg ZXe*dhdidj ZYe*dkdldm ZZe*dndodp Z[e*dqdrds Z\e*dtdudv Z]e*dwdxdy Z^e*dzd{d| Z_e*d}d~d Z`e*ddd Zae*ddd Zbe*ddd Zce*ddd Zde*ddd Zee*ddd Zfe+ddd Zge+ddd Zhe+ddd Zie+ddd Zje+ddd Zke+ddd Zle+ddd Zme+ddd Zne+ddd Zoe+ddd Zpe+ddd Zqe+ddd Zre+ddd Zse+ddd Zte+ddd Zue+ddd Zve+dddĄ Zwe+dŃddǄ Zxe+dȃddʄ Zye+d˃dd̈́ Zze+d΃ddЄ Z{e+dуddӄ Z|e+dԃddք Z}e+d׃ddل Z~e+dڃdd܄ Ze+d݃dd߄ Ze+ddd Ze+ddd Ze+ddd Ze+ddd Ze+ddd Ze+ddd Ze+ddd Ze+ddd Ze+ddd Ze)ddd Ze)ddd Ze)ddd  Ze)ddd Ze)ddd Ze)ddd Ze)ddd Ze)dd	d
 Ze)ddd Ze)ddd Ze)ddd Ze)ddd Ze)ddd Ze)ddd Ze)ddd Ze)ddd Ze)dŃdd Ze)dȃdd Ze)d˃dd  Ze)d΃d!d" Ze)dуd#d$ Ze)dԃd%d& Ze)d׃d'd( Ze)dd)d* Ze)dd+d, Ze)dd-d. Ze)dd/d0 Ze)dd1d2 Ze)dd3d4 Ze)dd5d6 Ze)dd7d8 Ze)dd9d: Ze,dd;d< Ze,dd=d> Ze,dd?d@ Ze,ddAdB Ze,ddCdD Ze,ddEdF Ze,ddGdH Ze,ddIdJ Ze,dŃdKdL Ze,dȃdMdN Ze,d˃dOdP Ze,d΃dQdR Ze,dуdSdT Ze,dԃdUdV Ze,d׃dWdX Ze,ddYdZ Ze,dd[d\ ZdS (^      N   )primops)!add	bernoulli	broadcastconcatcosdiveqerfexp
fill_constgathergegtlogmatmulmulneneg
reduce_sumreshapersqrtscatter_addselect	set_valuesinslice_assignslice_selectsplitsqrtsubtanh	transposeuniform_random)REGISTER_JVPREGISTER_ORIG2PRIMREGISTER_PRIM2ORIGREGISTER_TRANSPOSE	lookup_fn
lookup_jvplookup_orig2primlookup_prim2origlookup_transposeop_position_inputsop_position_output)INT_DTYPE_2_STRINGget_output_var_listc                 G      t | j}|| g|R  S N)r+   typeopargsZ
_lowerrule r8   c/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddle/incubate/autograd/primrules.py
_orig2primI      
r:   c                 G   r2   r3   )r,   r4   r5   r8   r8   r9   
_prim2origN   r;   r<   c                 G   r2   r3   )r*   r4   )r6   r7   Z_jvpruler8   r8   r9   _jvpS   r;   r=   c                 G   s   t | j}|| |g|R  S r3   )r-   r4   )r6   Zdot_checkerr7   Z_transposeruler8   r8   r9   
_transposeX   s   
r>   c                 O   s   t | j}||i |}|S r3   )r)   r4   )r6   r7   kwargsfnZout_dotr8   r8   r9   
linear_jvp]   s   
rA   Zelementwise_addc                 C   $   |j |j krt||j d}t||S Nshape)rE   r   r   r6   xyr8   r8   r9   elementwise_add_orig2prim      
rI   Zelementwise_subc                 C   rB   rC   )rE   r   r!   rF   r8   r8   r9   elementwise_sub_orig2prim   rJ   rK   Zelementwise_mulc                 C   rB   rC   )rE   r   r   rF   r8   r8   r9   elementwise_mul_orig2prim   rJ   rL   Zelementwise_divc                 C   &   |j |j krt||j d}t||S rC   )rE   r   r   r	   rF   r8   r8   r9   elementwise_div_orig2prim      rN   r"   c                 C      t |S r3   )r"   r6   rG   r8   r8   r9   tanh_orig2prim      rR   r   c                 C   rP   r3   )r   rQ   r8   r8   r9   sin_orig2prim   rS   rT   r   c                 C   rP   r3   )r   rQ   r8   r8   r9   cos_orig2prim   rS   rU   r   c                 C   rP   r3   )r   rQ   r8   r8   r9   exp_orig2prim   rS   rV   r   c                 C   rP   r3   )r   rQ   r8   r8   r9   erf_orig2prim   rS   rW   absc                 C   
   t |S r3   )r   rX   rQ   r8   r8   r9   abs_orig2prim      
rZ   r   c                 C   rP   r3   )r   rQ   r8   r8   r9   log_orig2prim   rS   r\   Zfill_zeros_likec                 C   s   t d|j|jdS N        valuerE   dtype)r   rE   ra   rQ   r8   r8   r9   fill_zeros_like_orig2prim   s   rb   Zfill_any_likec                 C   sH   |  ddkrt|  d|j|jdS t|  d|jt|  ddS )Nra   r`   r_   )attrr   rE   ra   paddlerQ   r8   r8   r9   fill_any_like_orig2prim   s   rf   Zfill_constantc                 C   s:   |s|s|r
t dt| d| dt| ddS )NzKfill_const_orig2prim currently not support Tensor input of shape and value.r`   rE   ra   r_   )	TypeErrorr   rd   re   ra   )r6   Zshape_tensorZshape_tensor_listZvalue_tensorr8   r8   r9   fill_const_orig2prim   s   rh   sumc                 C   s(   |d }|dd  D ]}t ||}q
|S )Nr   r   )r   )r6   xsZx0rG   r8   r8   r9   sum_orig2prim   s   rk   Zindex_selectc                 C   s   t ||| ddS )Ndim)indextensoraxis)r   rd   r6   index_trG   r8   r8   r9   index_select_orig2prim      rq   scalec                 C   sb   |d u rt |j|j| dd}t |j|j| dd}| dr)tt|||S tt|||S )Nrs   rE   ra   r`   biasZbias_after_scale)r   rE   ra   rd   r   r   )r6   Zscale_trG   Zbias_tr8   r8   r9   scale_orig2prim   s   
rv   assignc                 C   s   t |j|jdd}t||S )Nr^   rt   )r   rE   ra   r   )r6   rG   Zzero_tr8   r8   r9   assign_orig2prim   s   
rx   r    c                 C   rP   r3   )r    rQ   r8   r8   r9   sqrt_orig2prim  rS   ry   r   c                 C   rP   r3   )r   rQ   r8   r8   r9   rsqrt_orig2prim  rS   rz   Z	matmul_v2c                 C   s   dd }t |jdk rt |jdk sJ dt |jdkr(t|d|jd gd}t |jdkr:t||jd dgd}| drHt|||jd	}| d
rVt|||jd	}t||S )Nc                 S   s.   t tt| }|d |d |d< |d< |S )Nrc   )listrangelen)rE   retr8   r8   r9   trans  s   z"matmul_v2_orig2prim.<locals>.trans   z4Do not support multi batchsize dimensions currently.r   r   rD   Ztrans_xrn   Ztrans_y)r~   rE   r   rd   r#   r   )r6   rG   rH   r   r8   r8   r9   matmul_v2_orig2prim  s   


r   Zreshape2c                 C   sL   |d u sJ d|d u sJ dt | \}}t||jdt|j|jddfS )Nz6Can not lower reshape2 into prim ops with shapetensor.z:Can not lower reshape2 into prim ops with shapetensorlist.rD   r^   rt   )r1   r   rE   r   ra   )r6   shape_tshape_tlrG   rH   Zxshaper8   r8   r9   reshape2_orig2prim"  s   


r   r   c                 C   s"   |d u sJ dt || ddS )Nz3Can not lower concat into prim ops with axistensor.rn   r   )r   rd   )r6   Zaxis_trj   r8   r8   r9   concat_orig2prim0  s   r   slicec                 C   s   |d u sJ d|d u sJ d|d u sJ d|d u s J d|  d}|  d}dd |D }|  d	}	t|||||	d
}
|  drOt|
t| d jd}
|
S )Nz5Can not lower concat into prim ops with startstensor.z3Can not lower concat into prim ops with endstensor.z9Can not lower concat into prim ops with startstensorlist.z7Can not lower concat into prim ops with endstensorlist.startsendsc                 S   s   g | ]}d qS r   r8   ).0_r8   r8   r9   
<listcomp>D  s    z#slice_orig2prim.<locals>.<listcomp>axes)r   r   stridesrn   Zdecrease_axisr   rD   )rd   r   r   r1   rE   )r6   Zends_tZends_tlrG   Zstarts_tZ	starts_tlr   r   r   rn   rH   r8   r8   r9   slice_orig2prim6  s$   






r   Zsigmoidc                 C   s4   t td|j|jdttd|j|jdtt|S N      ?r_   )r	   r   rE   ra   r   r   r   rQ   r8   r8   r9   sigmoid_orig2primL  s   r   Zp_normc                 C   s   dd }|  dsJ dt|jdkrt|||jgd}t|  dd d	k r5ttt||d
gdS t|  dd d	k rJtt|d
gdS t	d)Nc                 S   s   d}| D ]}|| }q|S )Nr   r8   )rE   nsr8   r8   r9   num_elV  s   
z p_norm_orig2prim.<locals>.num_elZasvectorz5Only support lower pnorm when asvector=True currentlyr   rD   Zporder       @gh㈵>r   r   r   z'Only support lower l2/l1 norm currently)
rd   r~   rE   r   rX   r    r   r   r   RuntimeError)r6   rG   r   r8   r8   r9   p_norm_orig2primT  s   r   castc                 C   s   t |t| dS )NZ	out_dtype)r   r   re   ra   rd   rQ   r8   r8   r9   cast_orig2primj     r   wherec                 C   s   t |||S r3   )r   r6   	conditionrG   rH   r8   r8   r9   select_orig2primp     r   equalc                 C   rB   rC   )rE   r   r
   rF   r8   r8   r9   equal_orig2primu  rJ   r   	not_equalc                 C   rB   rC   )rE   r   r   rF   r8   r8   r9   ne_orig2prim|  rJ   r   greater_thanc                 C   rB   rC   )rE   r   r   rF   r8   r8   r9   gt_orig2prim  rJ   r   greater_equalc                 C   rB   rC   )rE   r   r   rF   r8   r8   r9   ge_orig2prim  rJ   r   Zelementwise_powc                 C   s*   |j |j krt||j d}t||}|S rC   )rE   r   r   pow)r6   rG   rH   zr8   r8   r9   elementwise_pow_orig2prim  s   r   r   c                 C   s   t |t| d|j|jS )Nfactor)r   r   r   rd   rE   ra   rF   r8   r8   r9   pow_orig2prim  s   r   squarec                 C   rY   r3   )r   r   rQ   r8   r8   r9   square_orig2prim  r[   r   Zelementwise_maxc                 C   rM   rC   )rE   r   r   maxrF   r8   r8   r9   elementwise_max_orig2prim  rO   r   Zgeluc                 C   s   |  drEttd|j|jttd|j|jttttdtj	 |j|jt|ttd|j|jt
|td|j|j}t||S tttd|j|j|ttd|j|jtt|tdtd |j|jS )	NZapproximateg      ?r      gHm?g      @r   r   )rd   r   r   rE   ra   r   r"   mathr    pir   r   r   )r6   rG   Zcdfr8   r8   r9   gelu_orig2prim  s:   

"r   Zdropoutc                 C   s   |d u sJ dt |j|j| dd}| ddkrG| ds=tt||td| d |j|j}tj|t	j
d|fS tj|t	j
d|fS | dd	krx| ds`tj|t	j
dt||fS tj|t	j
dt|td| d |j|jfS td
)Nz4Can not lower dropout into prim ops with seedtensor.Zdropout_prob)rE   ra   pZdropout_implementationZupscale_in_trainis_testr   )ra   Zdowngrade_in_inferzXUnsupported dropout_implementation, only support upscale_in_train and downgrade_in_infer)r   rE   ra   rd   r	   r   r   r   r   re   Zuint8r   )r6   Zseed_trG   maskoutr8   r8   r9   dropout_orig2prim  s*   


r   r$   c                 C   sZ   |s|rt d| d}| d}| d}t| d}| d}t|||||dS )NzZuniform_random_orig2prim currently not support ShapeTensor input or ShapeTensorList input.minr   seedra   rE   rD   )rg   rd   re   ra   r$   )r6   r   r   Z	min_valueZ	max_valuer   ra   rE   r8   r8   r9   uniform_random_orig2prim  s   



r   r   c                 C   s<   |  drttdt|jn|  d}t|||  ddS )N
reduce_allr   rl   keep_dimrn   keepdim)rd   tupler}   r~   rE   r   r6   rG   r   r8   r8   r9   reduce_sum_orig2prim  
   r   Zreduce_meanc                 C   s<   |  drttdt|jn|  d}t|||  dS )Nr   r   rl   r   )rd   r   r}   r~   rE   r   meanr   r8   r8   r9   reduce_mean_orig2prim  r   r   
batch_normc                 C   s   |  d}|  d}|  d}	|  d}
|  d}|  d}t| jdkr'd nt| d }|
d	v r3dnt|jd }|	r?| p@|}tj||||||||||d

S )Nmomentumepsilonr   data_layoutuse_global_statstrainable_statistics   r   )ZNCNCLZNCHWZNCHWD)epsr   use_run_statreserve_space)rd   r~   Zoutput_namesr1   rE   r   r   )r6   ru   Zrun_meanZmomentum_tensorrs   Zrun_varrG   r   r   r   r   r   r   r   Zfeature_axisr   r8   r8   r9   batch_norm_orig2prim  s.   





r   sizec                 C   s   t ttj|jdtjS )Nr8   )r   	functoolsreduceoperatorr   rE   re   Zint64rQ   r8   r8   r9   size_orig2prim.  s   r   Zadd_pc                 C      t ||S r3   )re   r   rF   r8   r8   r9   add_prim2orig4  r   r   Zsub_pc                 C   r   r3   )re   subtractrF   r8   r8   r9   sub_prim2orig9  r   r   Zrsqrt_pc                 C   rY   r3   )re   r   rQ   r8   r8   r9   rsqrt_prim2orig>  r[   r   Zmul_pc                 C   r   r3   )re   multiplyrF   r8   r8   r9   mul_prim2origC  r   r   Zdiv_pc                 C   r   r3   )re   dividerF   r8   r8   r9   div_prim2origH  r   r   Zsqrt_pc                 C   rY   r3   )re   r    rQ   r8   r8   r9   sqrt_prim2origM  r[   r   Ztanh_pc                 C   rY   r3   )re   r"   rQ   r8   r8   r9   tanh_prim2origR  r[   r   Zsin_pc                 C   rY   r3   )re   r   rQ   r8   r8   r9   sin_prim2origW  r[   r   Zcos_pc                 C   rY   r3   )re   r   rQ   r8   r8   r9   cos_prim2orig\  r[   r   Zexp_pc                 C   rY   r3   )re   r   rQ   r8   r8   r9   exp_prim2origa  r[   r   Zerf_pc                 C   rY   r3   )re   r   rQ   r8   r8   r9   erf_prim2origf  r[   r   Zabs_pc                 C   rY   r3   )re   rX   rQ   r8   r8   r9   abs_prim2origk  r[   r   Zlog_pc                 C   rY   r3   )re   r   rQ   r8   r8   r9   log_prim2origp  r[   r   Z	reshape_pc                 C      t j|| ddS NrE   rD   )re   r   rd   rQ   r8   r8   r9   reshape_prim2origu  rr   r   Zbroadcast_pc                 C   r   r   )re   Zbroadcast_tord   rQ   r8   r8   r9   broadcast_prim2origz  rr   r   Ztranspose_pc                 C   r   )Nrn   )perm)re   r#   rd   rQ   r8   r8   r9   transpose_prim2orig  rr   r   Zsplit_pc                 C   s4   |  d}t|dkr|d }tj|||  ddS )Nnum_or_sectionsr   r   rn   r   rn   )rd   r~   re   r   )r6   rG   r   r8   r8   r9   split_prim2orig  s   
r   Zconcat_pc                 C   r   Nrn   r   )re   r   rd   )r6   rj   r8   r8   r9   concat_prim2orig  rr   r   Zreduce_sum_pc                 C   s   t j|| d| ddS Nrn   r   r   )re   ri   rd   rQ   r8   r8   r9   reduce_prim2orig  s   r   Zmatmul_pc                 C   r   r3   )re   r   rF   r8   r8   r9   matmul_prim2orig  r   r   Zslice_select_pc                 C   s,   t j|| d| d| d| ddS )Nrn   r   r   r   )r   r   r   r   )re   Zstrided_slicerd   rQ   r8   r8   r9   slice_select_prim2orig  s   r   Zslice_assign_pc              	   C   s8   t |}t||| d| d| d| d|dS )Nrn   r   r   r   )rn   r   r   r   r   )re   rw   r   rd   )r6   rG   rH   Zx_copyr8   r8   r9   slice_assign_prim2orig  s   
r   Zgather_pc                 C   s   t j||| ddS r   )re   r   rd   ro   r8   r8   r9   gather_prim2orig  s   r   Zscatter_add_pc                 C   sD   |  ddksJ dtj||jd}tj|||dd}t||S )Nrn   r   zOnly support axis==0 currently)rG   ra   F)rG   indexZupdates	overwrite)rd   re   Z
zeros_likera   Zscatterr   )r6   rp   rG   rH   zerostmpr8   r8   r9   scatter_add_prim2orig  s   r  Zfill_constant_pc                 C   s&   t j| d| dt| d dS )NrE   r`   ra   rE   Z
fill_valuera   )re   fullrd   r0   r6   r8   r8   r9   fill_constant_prim2orig  s
   r  Zbernoulli_pc                 C   s0   t j| d| dt| d d}t |S )NrE   r   ra   r  )re   r  rd   r0   r   )r6   tr8   r8   r9   bernoulli_prim2orig  s   
r  Zuniform_random_pc                 C   s6   t j| dt| d | d| d| ddS )NrE   ra   r   r   r   )rE   ra   r   r   r   )re   uniformrd   r0   r  r8   r8   r9   uniform_random_prim2orig  s   r	  Zselect_pc                 C   s   t |||S r3   )re   r   r   r8   r8   r9   select_prim2orig  s   r
  Zeq_pc                 C   r   r3   )re   r   rF   r8   r8   r9   eq_prim2orig  r   r  Zgt_pc                 C   r   r3   )re   r   rF   r8   r8   r9   gt_prim2orig  r   r  Zge_pc                 C   r   r3   )re   r   rF   r8   r8   r9   ge_prim2orig  r   r  Zne_pc                 C   r   r3   )re   r   rF   r8   r8   r9   ne_prim2orig  r   r  Zpow_pc                 C   r   r3   )re   r   rF   r8   r8   r9   pow_prim2orig  r   r  Zmax_pc                 C   r   r3   )re   maximumrF   r8   r8   r9   max_prim2orig  r   r  Zcast_pc                 C   s   t |t | dS )Nra   )re   r   ra   rd   rQ   r8   r8   r9   cast_prim2orig  r   r  c                 C   s$   |d u r|S |d u r|S t | ||S r3   )rA   r6   x_doty_dotr8   r8   r9   add_jvp
  s
   r  c                 C   s(   |d u rt |S |d u r|S t| ||S r3   )r   rA   r  r8   r8   r9   sub_jvp  s
   r  c                 C   sh   |d u r
|d u r
d S t | \}}|d u rt||S |d u r"t||S t||t||}}t||}|S r3   )r.   r   r   )r6   r  r  rG   rH   t1t2z_dotr8   r8   r9   mul_jvp  s   


r  c                 C   s~   |d u r
|d u r
d S t | \}}|d u rt||S |d u r*ttt||t||S t||}tt||t||}t||S r3   )r.   r	   r   r   r!   r6   r  r  rG   rH   r  r  r8   r8   r9   div_jvp-  s   


r  c                 C   s:   |d u rd S t | }td|j|jd}t|t||}|S )Nr   r_   )r/   r   rE   ra   r	   r   )r6   r  rH   c2r  r8   r8   r9   sqrt_jvp<  s   r  c                 C   s@   |d u rd S t | }td|j|jd}t|t|t||}|S r   )r/   r   rE   ra   r   r!   )r6   r  rH   c1r  r8   r8   r9   tanh_jvpF  s   r!  c                 C   s$   |d u rd S t | \}t|t|S r3   )r.   r   r   r6   r  rG   r8   r8   r9   sin_jvpP     
r#  c                 C   s(   |d u rd S t | \}t|tt|S r3   )r.   r   r   r   r"  r8   r8   r9   cos_jvpX  s   
r%  c                 C   s   |d u rd S t | }t||S r3   )r/   r   r6   r  rH   r8   r8   r9   exp_jvp`  s   
r'  c                 C   sZ   |d u rd S t | \}ttdttj |j|jt|tt	t
|td|j|jS )Nr   )r.   r   r   r   r    r   rE   ra   r   r   r   r   r"  r8   r8   r9   erf_jvph  s   
$r(  c                 C   s8   |d u rd S t | \}tt|td|j|j|t|S )Nr^   )r.   r   r   r   rE   ra   r   r"  r8   r8   r9   abs_jvps  s   
"r)  c                 C   s    |d u rd S t | \}t||S r3   r.   r	   r"  r8   r8   r9   log_jvp{  s   

r+  c                 C   $   |d u rd S |  d}t| ||dS r   rd   rA   r6   r  rE   r8   r8   r9   reshape_jvp  r$  r/  c                 C   r,  r   r-  r.  r8   r8   r9   broadcast_jvp  r$  r0  c                 C   r,  r   r-  )r6   r  rn   r8   r8   r9   transpose_jvp  r$  r1  c                 C   0   |d u rd S |  d}|  d}t| |||dS )Nr   rn   r   r-  )r6   r  r   rn   r8   r8   r9   	split_jvp  
   

r3  c                 C   r,  r   r-  )r6   Zxs_dotrn   r8   r8   r9   
concat_jvp  r$  r5  c                 C   r2  r   r-  )r6   r  rn   r   r8   r8   r9   reduce_sum_jvp  r4  r6  c                 C   sb   |d u r
|d u r
d S t | \}}|d u rt||S |d u r"t||S t||}t||}t||S r3   )r.   r   r   r  r8   r8   r9   
matmul_jvp  s   




r7  c                 C   sH   |d u r|S |  d}|  d}|  d}|  d}t| |||||dS )Nrn   r   r   r   rn   r   r   r   r-  )r6   r  rn   r   r   r   r8   r8   r9   slice_select_jvp  s   



r9  c           	      C   s   t | \}}|d us|d usJ d| d}| d}| d}| d}|d u r<t| td|j|jd|||||dS |d u rRt| |td|j|jd||||dS tt| td|j|jd|||||dt| |td|j|jd||||dS )	Nz0x_dot and y_dot can't be None at the same time. rn   r   r   r   r^   r_   r8  )r.   rd   rA   r   rE   ra   r   )	r6   r  r  rG   rH   rn   r   r   r   r8   r8   r9   slice_assign_jvp  s`   



			r:  c                 C   s2   |d u rd S t | \}}| d}t| |||dS r   r.   rd   rA   )r6   r  rm   r   rn   r8   r8   r9   
gather_jvp  s
   
r<  c                 C   s6   |d u rd S t | \}}}| d}t| ||||dS r   r;  )r6   r  r  r   rm   rn   r8   r8   r9   scatter_add_jvp  s
   
r=  c                 C   sb   |d u r
|d u r
d S t | \}}}|d u rtd|j|jd}|d u r+td|j|jd}t|||S r]   r.   r   rE   ra   r   )r6   Zcond_dotr  r  condrG   rH   r8   r8   r9   
select_jvp  s   r@  c                 C   6   |d u r
|d u r
d S t | \}}td|j|jd}|S r]   r.   r   rE   ra   r6   r  r  rG   r   r  r8   r8   r9   eq_jvp$  
   rD  c                 C   rA  r]   rB  rC  r8   r8   r9   gt_jvp-  rE  rF  c                 C   rA  r]   rB  rC  r8   r8   r9   ge_jvp6  rE  rG  c                 C   rA  r]   rB  rC  r8   r8   r9   ne_jvp?  rE  rH  c           
         s    fdd} d u r|d u rd S t | \}}t| }|d u r#|||S  d u r1t|tt||S |||t|tt||}}t||}	|	S )Nc                    s\   t d|j|jd}t d|j|jd}t||}t||t||}t t|t| |}|S )Nr^   r_   r   )	r   rE   ra   r
   r   r!   r   r   r   )rG   rH   Zzero_yZone_yr?  Znew_yr  r  r8   r9   _compute_t1J  s   
zpow_jvp.<locals>._compute_t1)r.   r/   r   r   r   )
r6   r  r  rJ  rG   rH   r   r  r  r  r8   rI  r9   pow_jvpH  s   	
 
rK  c                 C   s   |d u r
|d u r
d S t | \}}t| }td|j|jd}|d u r*tt||||S |d u r7tt||||S tt||||S r]   )r.   r/   r   rE   ra   r   r
   )r6   r  r  rG   rH   r   Zz_zerosr8   r8   r9   max_jvpb  s   rL  c                 C   s   t | }t||jS r3   )r/   r   r   ra   r&  r8   r8   r9   cast_jvpv  s   rM  c                 C   sH   |d u rd S t | }t| }td|j|jd}t|tt|||}|S )Ng       r_   )r/   r.   r   rE   ra   r   r	   )r6   r  rH   rG   r  r  r8   r8   r9   	rsqrt_jvp|  s   rN  c                 C   sb   t | \}}||s||sJ d|| d|| d||r#|nd }||r+|nd }||fS Nz>(check_dot(x) or check_dot(y)) must be True, but check_dot(x)= and check_dot(y)=.)r.   r6   	check_dotz_barrG   rH   x_bary_barr8   r8   r9   add_transpose  s   rW  c                 C   sf   t | \}}||s||sJ d|| d|| d||r#|nd }||r-t|nd }||fS rO  )r.   r   rR  r8   r8   r9   sub_transpose  s   rX  c                 C   s^   t | \}}||||A sJ d|| d|| d||r(t||d fS d t||fS )N=(check_dot(x) ^ check_dot(y)) must be True, but check_dot(x)=rP  rQ  )r.   r   )r6   rS  rT  rG   rH   r8   r8   r9   mul_transpose  s   rZ  c                 C   s:   t | \}}||rJ d||rt||nd }|d fS )Nzcheck_dot(y) must be Falser*  )r6   rS  rT  rG   rH   rU  r8   r8   r9   div_transpose  s   r[  c                 C   s(   t | \}||sJ dt||jdS )Ncheck_dot(x) must be TruerD   )r.   r   rE   r6   rS  rV  rG   r8   r8   r9   reshape_transpose  s   
r^  c                    st   t | \}||sJ dt|jt|j  tt } fddt|jD }||7 }t||dd}t||jS )Nr\  c                    s    g | ]\}}|d kr | qS r   r8   )r   ir   batr8   r9   r     s     z'broadcast_transpose.<locals>.<listcomp>Fr   )r.   r~   rE   r|   r}   	enumerater   r   )r6   rS  rV  rG   rn   r   r   r8   r`  r9   broadcast_transpose  s   
rc  c                 C   sT   t | \}||sJ d| d}tdd t|D }dd |D }t||dS )Nr\  rn   c                 s   s    | ]	\}}||fV  qd S r3   r8   )r   r_  kr8   r8   r9   	<genexpr>  s    z&transpose_transpose.<locals>.<genexpr>c                 S   s   g | ]\}}|qS r8   r8   )r   rd  r_  r8   r8   r9   r     s    z'transpose_transpose.<locals>.<listcomp>r   )r.   rd   sortedrb  r#   )r6   rS  rV  rG   rn   Z	reorderedr8   r8   r9   transpose_transpose  s   

rg  c                 C   s,   t | \}||sJ dt|| ddS )Nr\  rn   r   )r.   r   rd   )r6   rS  Zys_barrG   r8   r8   r9   split_transpose  s   
rh  c                    sp   t | \}t|tjs|g}|D ]
}||sJ dq| d  fdd|D }t|dkr1|S t|| dS )Nr\  rn   c                    s   g | ]}|j   qS r8   rD   )r   rG   r   r8   r9   r     s    z$concat_transpose.<locals>.<listcomp>r   r   )r.   
isinstancetypingSequencerd   r~   r   )r6   rS  rV  rj   rG   sectionsr8   r   r9   concat_transpose  s   

rm  c                    sZ   t | \}||sJ d| d t fddt|jD }t||d}t||jdS )Nr\  rn   c                 3   s$    | ]\}}| v rd n|V  qdS )r   Nr8   )r   r_  r   r   r8   r9   re    s   " z'reduce_sum_transpose.<locals>.<genexpr>rD   )r.   rd   r   rb  rE   r   r   )r6   rS  rV  rG   rE   r  r8   rn  r9   reduce_sum_transpose  s   

ro  c                 C   s   t | \}}||||A sJ d|| d|| dt|jdkr(ddgng d}||r;t|t||dd fS d tt||d|fS )	NrY  rP  rQ  r   r   r   )r   r   r   r   )r.   r~   rE   r   r#   )r6   rS  rT  rG   rH   rn   r8   r8   r9   matmul_transpose  s   rp  c           	      C   sh   t | \}||sJ dtd|j|jd}| d}| d}| d}| d}t||||||dS )	Nr\  r^   r_   rn   r   r   r   r8  )r.   r   rE   ra   rd   r   )	r6   rS  rV  rG   r   rn   r   r   r   r8   r8   r9   slice_select_transpose  s   




rq  c           
      C   s   t | \}}||||A sJ d|| d|| dtd|j|jd}| d}| d}| d}| d	}	||rJt||||||	d
d fS d t|||||	d
fS )NrY  rP  rQ  r^   r_   rn   r   r   r   r8  )r.   r   rE   ra   rd   r   r   )
r6   rS  rT  rG   rH   r   rn   r   r   r   r8   r8   r9   slice_assign_transpose  s6   




rr  c           	      C   sR   t | \}}||sJ d| d}td|j|j}t||||d}d }||fS )Nr\  rn   r^   r   )r.   rd   r   rE   ra   r   )	r6   rS  rV  rG   rm   rn   r   rU  indextensor_barr8   r8   r9   gather_transpose.  s   
rt  c                 C   s   t | \}}}||r||sJ d|| d|| d| d}td|j|jd}t||||d}t|||d}	d }
||	|
fS )Nz?(check_dot(x) and check_dot(y)) must be True, but check_dot(x)=rP  rQ  rn   r^   r_   r   )r.   rd   r   rE   ra   r   r   )r6   rS  rT  rG   rH   rm   rn   r   rU  rV  rs  r8   r8   r9   scatter_add_transpose9  s   

ru  c                 C   s   t | \}}}||s'||s'||s'J d|| d|| d|| dtd|j|jd}td|j|jd}||rFtd|j|jdnd }||rRt|||nd }	||r^t|||nd }
||	|
fS )NzRcheck_dot(cond) ^ (check_dot(x) ^ check_dot(y)) must be True, but check_dot(cond)=z, check_dot(x)=rP  rQ  r^   r_   r>  )r6   rS  rT  r?  rG   rH   Zzeros_xZzeros_yZcond_barrU  rV  r8   r8   r9   select_transposeH  s&   
rv  c                 C   s   t | \}t||jS r3   )r.   r   r   ra   r]  r8   r8   r9   cast_transpose^  s   
rw  )NNN)r   r   r   rj  re    r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   Zprimregr%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   utilsr0   r1   r:   r<   r=   r>   rA   rI   rK   rL   rN   rR   rT   rU   rV   rW   rZ   r\   rb   rf   rh   rk   rq   rv   rx   ry   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r	  r
  r  r  r  r  r  r  r  r  r  r  r  r  r!  r#  r%  r'  r(  r)  r+  r/  r0  r1  r3  r5  r6  r7  r9  r:  r<  r=  r@  rD  rF  rG  rH  rK  rL  rM  rN  rW  rX  rZ  r[  r^  rc  rg  rh  rm  ro  rp  rq  rr  rt  ru  rv  rw  r8   r8   r8   r9   <module>   s  4#




































!


	
	
 

















	









	










	
			
3		
