+
    –°³jÝ ã                  óÚ  € ^ RI Ht ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHtH	t	H
t
 ^ RIt^ RIt^ RIHt ^ RIHtHtHt ^RIHt ^RIHt ^RIHtHt ^R	IHt ^R
IHt ^RI H!t!H"t"H#t#H$t$H%t% ^RI&H't'H(t(H)t)  ! R R]%4      t*]*! 4       PV                  t,]
'       d   ^ RI-H.t.H/t/ ^RI0H1t1 ^RI2H3t3 ^RI4H5t5 Rt6]Pn                  Pq                  ]9R4      t: ! R R4      t; ! R R]<4      t= ! R R]$4      t>]P~                   ! R R4      4       t@]P~                   ! R R4      4       tA]P~                   ! R R 4      4       tB]P~                   ! R! R"4      4       tC ! R# R$](4      tD ! R% R&])4      tER# )'é    )ÚannotationsN)ÚAnyÚcastÚTYPE_CHECKING)Ú
OrderedSet)ÚMaxÚMinÚModularIndexing)Úconfig©Útorch_dtype_to_jax)Úget_fused_kernel_nameÚget_kernel_metadata)ÚV)ÚBlockPatternMatcher)ÚBackendFeatureÚCSEVariableÚIndentedBufferÚOpOverridesÚPythonPrinter)ÚIterationRangesEntryÚ
SIMDKernelÚSIMDSchedulingc                  ó>   € ] tR t^#tRtR R ltR R ltR R ltRtR	# )
ÚPallasPrinterzG
Custom sympy printer for Pallas that handles JAX-specific constructs.
c               ó    € V ^8„  d   QhRRRR/# ©é   Úexprú
sympy.ExprÚreturnÚstr© )Úformats   "Ú_/home/luca/screen-checking/.venv/lib/python3.14/site-packages/torch/_inductor/codegen/pallas.pyÚ__annotate__ÚPallasPrinter.__annotate__(   s   € ÷ +ñ + ð +°ñ +ó    c                óæ   € V P                  VP                  ^ ,          4      pV P                  VP                  ^,          4      pV P                  VP                  ^,          4      pRV RV RV R2# )z!Convert sympy Where to jnp.where.ú
jnp.where(ú, Ú))ÚdoprintÚargs)Úselfr   ÚcÚpÚqs   &&   r%   Ú_print_WhereÚPallasPrinter._print_Where(   s_   € à�L‰L˜Ÿ™ 1�Ó&ˆØ�L‰L˜Ÿ™ 1�Ó&ˆØ�L‰L˜Ÿ™ 1�Ó&ˆØ˜A˜3˜b   2 a S¨Ð*Ð*r(   c               ó    € V ^8„  d   QhRRRR/# r   r#   )r$   s   "r%   r&   r'   /   ó   € ÷ ñ ˜zð ¨cñ r(   c                ó¦   € VP                    Uu. uF  q P                  V4      NK  	  ppV^ ,          pVR,           F  pRV RV R2pK  	  V# u upi )z7Convert sympy Min to jnp.minimum for JAX compatibility.ºé   NNújnp.minimum(r+   r,   ©r.   r-   ©r/   r   Úargr.   Úresults   &&   r%   Ú
_print_MinÚPallasPrinter._print_Min/   óX   € à-1¯YªYÓ7©Y c—‘˜SÖ!©YˆÐ7Ø�a•ˆØ˜—8�8ˆCØ# F 8¨2¨c¨U°!Ð4ŠFñ àˆùò	 8ó   �Ac               ó    € V ^8„  d   QhRRRR/# r   r#   )r$   s   "r%   r&   r'   7   r6   r(   c                ó¦   € VP                    Uu. uF  q P                  V4      NK  	  ppV^ ,          pVR,           F  pRV RV R2pK  	  V# u upi )z7Convert sympy Max to jnp.maximum for JAX compatibility.r8   újnp.maximum(r+   r,   r;   r<   s   &&   r%   Ú
_print_MaxÚPallasPrinter._print_Max7   rA   rB   r#   N)	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r3   r?   rF   Ú__static_attributes__r#   r(   r%   r   r   #   s   † ñõ+õ÷ñ r(   r   )ÚCallableÚSequence)ÚIRNode)ÚReductionType)ÚBaseSchedulerNodeÚmainÚkernel_codec                  ó8   € ] tR t^StRtRR R lltRR/R ltRtR# )	ÚPallasKernelWrapperz6Wrapper to provide .run() interface for Pallas kernelsNc               ó    € V ^8„  d   QhRRRR/# )r   Ú	kernel_fnzCallable[..., Any]Úkernel_pathú
str | Noner#   )r$   s   "r%   r&   Ú PallasKernelWrapper.__annotate__V   s   € ÷ Dñ DÐ"4ð DÀ:ñ Dr(   c                	óJ   € Wn         W n        \        P                  R V4       R# )zPallas kernel path: %sN)rX   rY   Úkernel_code_logÚinfo)r/   rX   rY   s   &&&r%   Ú__init__ÚPallasKernelWrapper.__init__V   s   € Ø"ŒØ&ÔÜ×ÑÐ5°{ÖCr(   Ústreamc               ó*   € V P                   ! VRV/VB # )zõ
Execute the Pallas kernel.

Args:
    *args: Arguments to pass to the kernel function
    stream: CUDA stream to pass to the kernel function
    **kwargs: Additional keyword arguments for the kernel

Returns:
    Result of the kernel execution
ra   )rX   )r/   ra   r.   Úkwargss   &$*,r%   ÚrunÚPallasKernelWrapper.run[   s   € ð �~Š~˜tÐ=¨FÐ=°fÑ=Ð=r(   )rX   rY   ©N)rH   rI   rJ   rK   rL   r_   rd   rM   r#   r(   r%   rV   rV   S   s   † Ù@÷Dð
> ÷ >ð >r(   rV   c                  ó   € ] tR t^jtRtRtR# )ÚUnsupportedzJException raised when an operation is not supported by the Pallas backend.r#   N)rH   rI   rJ   rK   rL   rM   r#   r(   r%   rh   rh   j   s   † ÝTr(   rh   c                  óè	  € ] tR t^ntRt]R R l4       t]R R l4       t]R R l4       t]R R	 l4       t	]R
 R l4       t
]R R l4       t]R R l4       t]R R l4       t]R R l4       t]R R l4       t]R R l4       t]R R l4       t]R R l4       t]R R l4       t]R R l4       t]R  R! l4       t]R" R# l4       t]R$ R% l4       t]R& R' l4       t]R( R) l4       t]R* R+ l4       t]R, R- l4       t]R. R/ l4       t]R0 R1 l4       t]R2 R3 l4       t]R4 R5 l4       t]R6 R7 l4       t ]R8 R9 l4       t!]R: R; l4       t"]R< R= l4       t#]R> R? l4       t$]RæRA RB ll4       t%]RC RD l4       t&]RE RF l4       t']RG RH l4       t(]RI RJ l4       t)]RK RL l4       t*]RM RN l4       t+]RO RP l4       t,]RQ RR l4       t-]RS RT l4       t.]RU RV l4       t/]RW RX l4       t0]RY RZ l4       t1]R[ R\ l4       t2]R] R^ l4       t3]R_ R` l4       t4]Ra Rb l4       t5]Rc Rd l4       t6]Re Rf l4       t7]Rg Rh l4       t8]Ri Rj l4       t9]Rk Rl l4       t:]Rm Rn l4       t;]Ro Rp l4       t<]Rq Rr l4       t=]Rs Rt l4       t>]Ru Rv l4       t?]Rw Rx l4       t@]Ry Rz l4       tA]R{ R| l4       tB]R} R~ l4       tC]CtD]R R€ l4       tE]R� R‚ l4       tF]Rƒ R„ l4       tG]R… R† l4       tH]R‡ Rˆ l4       tI]R‰ RŠ l4       tJ]R‹ RŒ l4       tK]R� RŽ l4       tL]R� R� l4       tM]R‘ R’ l4       tN]R“ R” l4       tO]R• R– l4       tP]NtQ]R— R˜ l4       tR]OtS]R™ Rš l4       tT]R› Rœ l4       tU]R� Rž l4       tV]UtW]VtX]RŸ R  l4       tY]R¡ R¢ l4       tZ]R£ R¤ l4       t[]R¥ R¦ l4       t\]R§ R¨ l4       t]]R© Rª l4       t^]R« R¬ l4       t_]R­ R® l4       t`]R¯ R° l4       ta]R± R² l4       tb]R³ R´ l4       tc]Rµ R¶ l4       td]R· R¸ l4       te]R¹ Rº l4       tf]R» R¼ l4       tg]R½ R¾ l4       th]R¿ RÀ l4       ti]RÁ RÂ l4       tj]RÃ RÄ l4       tk]RÅ RÆ l4       tl]RÇ RÈ l4       tm]RÉ RÊ l4       tn]RË RÌ l4       to]RÍ RÎ l4       tp]RÏ RÐ l4       tq]RÑ RÒ l4       tr]RÓ RÔ l4       ts]RÕ RÖ l4       tt]R× RØ l4       tu]RÙ RÚ l4       tv]RÛ RÜ l4       tw]RÝ RÞ l4       tx]Rß Rà l4       ty]Rá Râ l4       tz]Rã Rä l4       t{Råt|R@# )çÚPallasKernelOverrideszš
Map element-wise ops to JAX/Pallas operations.

For now, we use the default Python operators which are compatible
with JAX numpy broadcasting semantics.
c               ó    € V ^8„  d   QhRRRR/# ©r   Úxr"   r!   r#   )r$   s   "r%   r&   Ú"PallasKernelOverrides.__annotate__x   ó   € ÷ ñ ˆsð �sñ r(   c                	ó   € R V  R2# )zjnp.sin(r,   r#   ©rm   s   &r%   ÚsinÚPallasKernelOverrides.sinv   ó   € ð ˜!˜˜AˆÐr(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   }   ro   r(   c                	ó   € R V  R2# )zjnp.cos(r,   r#   rq   s   &r%   ÚcosÚPallasKernelOverrides.cos{   rt   r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   ‚   ro   r(   c                	ó   € R V  R2# )zjnp.tan(r,   r#   rq   s   &r%   ÚtanÚPallasKernelOverrides.tan€   rt   r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   ‡   ó   € ÷  ñ  �ð  ˜ñ  r(   c                	ó   € R V  R2# )z	jnp.sinh(r,   r#   rq   s   &r%   ÚsinhÚPallasKernelOverrides.sinh…   ó   € ð ˜1˜#˜QÐÐr(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   Œ   r~   r(   c                	ó   € R V  R2# )z	jnp.cosh(r,   r#   rq   s   &r%   ÚcoshÚPallasKernelOverrides.coshŠ   r‚   r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   ‘   r~   r(   c                	ó   € R V  R2# )z	jnp.tanh(r,   r#   rq   s   &r%   ÚtanhÚPallasKernelOverrides.tanh�   r‚   r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   –   ó   € ÷ "ñ "�ð "˜ñ "r(   c                	ó   € R V  R2# )zjnp.arcsin(r,   r#   rq   s   &r%   ÚasinÚPallasKernelOverrides.asin”   ó   € ð ˜Q˜C˜qÐ!Ð!r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   ›   rŒ   r(   c                	ó   € R V  R2# )zjnp.arccos(r,   r#   rq   s   &r%   ÚacosÚPallasKernelOverrides.acos™   r�   r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn       rŒ   r(   c                	ó   € R V  R2# )zjnp.arctan(r,   r#   rq   s   &r%   ÚatanÚPallasKernelOverrides.atanž   r�   r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   ¥   ro   r(   c                	ó   € R V  R2# )zjnp.exp(r,   r#   rq   s   &r%   ÚexpÚPallasKernelOverrides.exp£   rt   r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   ©   r~   r(   c                	ó   € R V  R2# )z	jnp.exp2(r,   r#   rq   s   &r%   Úexp2ÚPallasKernelOverrides.exp2¨   ó   € à˜1˜#˜QÐÐr(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   ­   ó   € ÷ !ñ !�ð !˜ñ !r(   c                	ó   € R V  R2# )z
jnp.expm1(r,   r#   rq   s   &r%   Úexpm1ÚPallasKernelOverrides.expm1¬   ó   € à˜A˜3˜aÐ Ð r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   ²   ro   r(   c                	ó   € R V  R2# )zjnp.log(r,   r#   rq   s   &r%   ÚlogÚPallasKernelOverrides.log°   rt   r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   ¶   r£   r(   c                	ó   € R V  R2# )z
jnp.log10(r,   r#   rq   s   &r%   Úlog10ÚPallasKernelOverrides.log10µ   r§   r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   º   r~   r(   c                	ó   € R V  R2# )z	jnp.log2(r,   r#   rq   s   &r%   Úlog2ÚPallasKernelOverrides.log2¹   r¡   r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   ¾   r£   r(   c                	ó   € R V  R2# )z
jnp.log1p(r,   r#   rq   s   &r%   Úlog1pÚPallasKernelOverrides.log1p½   r§   r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   Ã   r~   r(   c                	ó   € R V  R2# )z	jnp.sqrt(r,   r#   rq   s   &r%   ÚsqrtÚPallasKernelOverrides.sqrtÁ   r‚   r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   È   s   € ÷ %ñ %�ð %˜ñ %r(   c                	ó   € R V  R2# )zjax.lax.rsqrt(r,   r#   rq   s   &r%   ÚrsqrtÚPallasKernelOverrides.rsqrtÆ   s   € ð   ˜s !Ð$Ð$r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   Í   ro   r(   c                	ó   € R V  R2# )zjnp.abs(r,   r#   rq   s   &r%   ÚabsÚPallasKernelOverrides.absË   rt   r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   Ñ   s   € ÷ ñ ˆsð �sñ r(   c                	ó   € R V  R2# )z(-r,   r#   rq   s   &r%   ÚnegÚPallasKernelOverrides.negÐ   s   € à�A�3�aˆyÐr(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   Ö   r£   r(   c                	ó   € R V  R2# )z
jnp.floor(r,   r#   rq   s   &r%   ÚfloorÚPallasKernelOverrides.floorÔ   ó   € ð ˜A˜3˜aÐ Ð r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   Û   r~   r(   c                	ó   € R V  R2# )z	jnp.ceil(r,   r#   rq   s   &r%   ÚceilÚPallasKernelOverrides.ceilÙ   r‚   r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   à   r£   r(   c                	ó   € R V  R2# )z
jnp.trunc(r,   r#   rq   s   &r%   ÚtruncÚPallasKernelOverrides.truncÞ   rÌ   r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   å   r£   r(   c                	ó   € R V  R2# )z
jnp.round(r,   r#   rq   s   &r%   ÚroundÚPallasKernelOverrides.roundã   rÌ   r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   é   s   € ÷ &ñ &�3ð &˜3ñ &r(   c                	ó   € R V  R2# )zjax.nn.sigmoid(r,   r#   rq   s   &r%   ÚsigmoidÚPallasKernelOverrides.sigmoidè   ó   € à    1Ð%Ð%r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   í   s   € ÷ &ñ &�ð &˜ñ &r(   c                	ó   € R V  R2# )rE   z, 0)r#   rq   s   &r%   ÚreluÚPallasKernelOverrides.reluì   s   € à˜a˜S Ð%Ð%r(   c               ó$   € V ^8„  d   QhRRRRRR/# ©r   Úar"   Úbr!   r#   )r$   s   "r%   r&   rn   ñ   s!   € ÷ &ñ &ˆsð &�sð &˜sñ &r(   c                	ó   € R V  RV R2# )z
jnp.power(r+   r,   r#   ©rä   rå   s   &&r%   ÚpowÚPallasKernelOverrides.powð   s   € à˜A˜3˜b   1Ð%Ð%r(   c               ó$   € V ^8„  d   QhRRRRRR/# rã   r#   )r$   s   "r%   r&   rn   ö   ó!   € ÷ (ñ (�3ð (˜3ð ( 3ñ (r(   c                	ó   € R V  RV R2# )rE   r+   r,   r#   rç   s   &&r%   ÚmaximumÚPallasKernelOverrides.maximumô   ó   € ð ˜a˜S  1 # QÐ'Ð'r(   c               ó$   € V ^8„  d   QhRRRRRR/# rã   r#   )r$   s   "r%   r&   rn   û   rë   r(   c                	ó   € R V  RV R2# )r:   r+   r,   r#   rç   s   &&r%   ÚminimumÚPallasKernelOverrides.minimumù   rï   r(   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Úcondr"   rä   rå   r!   r#   )r$   s   "r%   r&   rn      s(   € ÷ .ñ .�Cð .˜Cð . Cð .¨Cñ .r(   c                	ó   € R V  RV RV R2# )r*   r+   r,   r#   )rõ   rä   rå   s   &&&r%   ÚwhereÚPallasKernelOverrides.whereþ   s   € ð ˜D˜6  A 3 b¨¨¨1Ð-Ð-r(   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Úmaskr"   ÚbodyzCallable[[], str]ÚotherÚfloatr!   r#   )r$   s   "r%   r&   rn     s)   € ÷ ;ñ ;�Sð ;Ð 1ð ;¸%ð ;ÀCñ ;r(   c                ó  € V! 4       p\        V\        4      '       dT   \        P                  ! V4      '       d   RpM?\        P                  ! V4      '       d   V^ 8”  d   RMRpM\        V4      pM\        V4      pRV  RV RV R2# )zr
Computes body, but only uses the result where mask is true.
Where mask is false, uses the 'other' value instead.
újnp.nanújnp.infú-jnp.infr*   r+   r,   )Ú
isinstancerý   ÚmathÚisnanÚisinfÚrepr)rú   rû   rü   r>   Ú	other_strs   &&&  r%   ÚmaskedÚPallasKernelOverrides.masked  su   € ñ “ˆä�eœU×#Ò#Ü�zŠz˜%× Ò Ø%‘	Ü—’˜E×"Ò"Ø).°¬™I¸
‘	ä  ›K‘	ä˜U›ˆIà˜D˜6  F 8¨2¨i¨[¸Ð:Ð:r(   Nc          
     ó,   € V ^8„  d   QhRRRRRRRRR	R/# )
r   rm   r"   Údtypeútorch.dtypeÚ	src_dtypeztorch.dtype | NoneÚuse_compute_typesÚboolr!   r#   )r$   s   "r%   r&   rn     s:   € ÷ 7ñ 7Øð7àð7ð &ð7ð  ð	7ð
 
ñ7r(   c                	óÎ   € V\         P                  8X  d>   \        P                  P	                  4       P
                  R 8X  d   \         P                  p\        V4      pRV  RV R2# )Útpuzjnp.asarray(ú	).astype(r,   )ÚtorchÚint64r   ÚgraphÚget_current_device_or_throwÚtypeÚint32r   )rm   r  r  r  Ú	jax_dtypes   &&&& r%   Úto_dtypeÚPallasKernelOverrides.to_dtype  sS   € ð ”E—K‘KÔ¤A§G¡G×$GÑ$GÓ$I×$NÑ$NÐRWÔ$WÜ—K‘KˆEÜ& uÓ-ˆ	à˜a˜S 	¨)¨°AÐ6Ð6r(   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rm   r"   r  r  r  r!   r#   )r$   s   "r%   r&   rn   &  s/   € ÷ fñ f˜Cð f¨ð fÀð fÐPSñ fr(   c                óF   € \        V4      p\        V4      pRV  RV RV R2# )z=Bitcast a value from one dtype to another with the same size.z)jax.lax.bitcast_convert_type(jnp.asarray(r  z), r,   r   )rm   r  r  r  Újax_src_dtypes   &&&  r%   Úto_dtype_bitcastÚ&PallasKernelOverrides.to_dtype_bitcast%  s7   € ô ' uÓ-ˆ	Ü*¨9Ó5ˆà:¸1¸#¸YÀ}ÀoÐUXÐYbÐXcÐcdÐeÐer(   c               ó$   € V ^8„  d   QhRRRRRR/# ©r   r   r    r  r  r!   r"   r#   )r$   s   "r%   r&   rn   .  s!   € ÷ :ñ :˜ð :¨Kð :¸Cñ :r(   c                ó  € ^RI Hp \        P                  P                  P                  \        P                  P                  V 4      4       \        P                  P                  V 4      p\        P                  P                  V4      p\        P                  P                  V4      p\        P                  P                  P                  \        P                  P                  WR! V 4      R7      p\        P                  Wa4      # )z>Convert a sympy expression to a JAX array indexing expression.)Úget_bounds_index_expr)Úbounds)Úutilsr$  r   ÚkernelÚused_iter_varsÚupdateÚ_get_used_iter_varsÚprepare_indexingÚrename_indexingÚkexprÚcseÚgenerateÚcomputerj   r  )r   r  r$  ÚpreparedÚrenamedÚidx_strÚvars   &&     r%   Ú
index_exprÚ PallasKernelOverrides.index_expr-  s³   € õ 	2ô 	
�‰×Ñ×&Ñ&¤q§x¡x×'CÑ'CÀDÓ'IÔJô —8‘8×,Ñ,¨TÓ2ˆÜ—(‘(×*Ñ*¨8Ó4ˆÜ—(‘(—.‘. Ó)ˆÜ�h‰h�l‰l×#Ñ#Ü�H‰H×Ñ˜gÐ.CÀDÓ.Ið $ó 
ˆô %×-Ñ-¨cÓ9Ð9r(   c               ó$   € V ^8„  d   QhRRRRRR/# r"  r#   )r$   s   "r%   r&   rn   ?  s!   € ÷ =ñ =˜ð =¨Kð =¸Cñ =r(   c                	ó,   € \         P                  W4      # rf   )rj   r5  )r   r  s   &&r%   Ú
value_exprÚ PallasKernelOverrides.value_expr>  s   € ô %×/Ñ/°Ó<Ð<r(   c               ó    € V ^8„  d   QhRRRR/# )r   r  r  r!   r"   r#   )r$   s   "r%   r&   rn   E  s   € ÷ 6ñ 6˜[ð 6¨Sñ 6r(   c                ó"  € \        V4      pV\        P                  8X  d   V '       d   R# R# \        V \        4      '       dF   \
        P                  ! V 4      '       d   R# \
        P                  ! V 4      '       d   V ^ 8”  d   R# R# RV  RV R2# )	z/Convert a constant value to JAX representation.ÚTrueÚFalserÿ   r   r  z
jnp.array(z, dtype=r,   )r   r  r  r  rý   r  r  r  )Úvalr  r  s   && r%   ÚconstantÚPallasKernelOverrides.constantD  sw   € ô ' uÓ-ˆ	Ø”E—J‘JÔß �6Ð- gÐ-ä�cœ5×!Ò!Ü�zŠz˜#�ŠÙ Ü�zŠz˜#�ŠØ$'¨!¤G�yÐ;°Ð;Ø˜C˜5 ¨¨°1Ð5Ð5r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   S  r~   r(   c                	ó   € R V  R2# )z	jnp.real(r,   r#   rq   s   &r%   ÚrealÚPallasKernelOverrides.realR  r¡   r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   W  r~   r(   c                	ó   € R V  R2# )z	jnp.imag(r,   r#   rq   s   &r%   ÚimagÚPallasKernelOverrides.imagV  r¡   r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   [  r~   r(   c                	ó   € R V  R2# )z	jnp.conj(r,   r#   rq   s   &r%   ÚconjÚPallasKernelOverrides.conjZ  r¡   r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   _  r£   r(   c                	ó   € R V  R2# )z
jnp.angle(r,   r#   rq   s   &r%   ÚangleÚPallasKernelOverrides.angle^  r§   r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   c  s   € ÷ Eñ E˜ð E ñ Er(   c                ó   € RV  RV  R2# )z8View complex tensor as real tensor with extra dimension.zjnp.stack([jnp.real(z), jnp.imag(z)], axis=-1)r#   rq   s   &r%   Úview_as_realÚ"PallasKernelOverrides.view_as_realb  s   € ð & a S¨°Q°C°|ÐDÐDr(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   h  s   € ÷ 3ñ 3˜3ð 3 3ñ 3r(   c                ó   € RV  RV  R2# )z#View real tensor as complex tensor.Ú(z[..., 0] + 1j * z	[..., 1])r#   rq   s   &r%   Úview_as_complexÚ%PallasKernelOverrides.view_as_complexg  s   € ð �1�#Ð% a S¨	Ð2Ð2r(   c               ó$   € V ^8„  d   QhRRRRRR/# rã   r#   )r$   s   "r%   r&   rn   n  ó!   € ÷ ñ ˆcð �cð ˜cñ r(   c                	ó   € R V  RV R2# )rX  z == r,   r#   rç   s   &&r%   ÚeqÚPallasKernelOverrides.eqm  ó   € à�1�#�T˜!˜˜AˆÐr(   c               ó$   € V ^8„  d   QhRRRRRR/# rã   r#   )r$   s   "r%   r&   rn   r  r\  r(   c                	ó   € R V  RV R2# )rX  z != r,   r#   rç   s   &&r%   ÚneÚPallasKernelOverrides.neq  r`  r(   c               ó$   € V ^8„  d   QhRRRRRR/# rã   r#   )r$   s   "r%   r&   rn   v  ó!   € ÷ ñ ˆcð �cð ˜cñ r(   c                	ó   € R V  RV R2# )rX  z < r,   r#   rç   s   &&r%   ÚltÚPallasKernelOverrides.ltu  ó   € à�1�#�S˜˜˜1ˆ~Ðr(   c               ó$   € V ^8„  d   QhRRRRRR/# rã   r#   )r$   s   "r%   r&   rn   z  r\  r(   c                	ó   € R V  RV R2# )rX  z <= r,   r#   rç   s   &&r%   ÚleÚPallasKernelOverrides.ley  r`  r(   c               ó$   € V ^8„  d   QhRRRRRR/# rã   r#   )r$   s   "r%   r&   rn   ~  rf  r(   c                	ó   € R V  RV R2# )rX  z > r,   r#   rç   s   &&r%   ÚgtÚPallasKernelOverrides.gt}  rj  r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   ƒ  r£   r(   c                	ó   € R V  R2# )z
jnp.isnan(r,   r#   rq   s   &r%   r  ÚPallasKernelOverrides.isnan�  rÌ   r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   ˆ  r£   r(   c                	ó   € R V  R2# )z
jnp.isinf(r,   r#   rq   s   &r%   r  ÚPallasKernelOverrides.isinf†  rÌ   r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   Œ  s   € ÷ $ñ $�Cð $˜Cñ $r(   c                	ó   € R V  R2# )zjnp.isfinite(r,   r#   rq   s   &r%   ÚisfiniteÚPallasKernelOverrides.isfinite‹  s   € à˜q˜c Ð#Ð#r(   c               ó$   € V ^8„  d   QhRRRRRR/# rã   r#   )r$   s   "r%   r&   rn   �  r\  r(   c                	ó   € R V  RV R2# )rX  z >= r,   r#   rç   s   &&r%   ÚgeÚPallasKernelOverrides.ge�  r`  r(   c               ó$   € V ^8„  d   QhRRRRRR/# rã   r#   )r$   s   "r%   r&   rn   –  ó!   € ÷ ,ñ ,�sð ,˜sð , sñ ,r(   c                	ó   € R V  RV R2# )zjnp.logical_and(r+   r,   r#   rç   s   &&r%   Úlogical_andÚ!PallasKernelOverrides.logical_and”  ó   € ð " !  B q c¨Ð+Ð+r(   c               ó$   € V ^8„  d   QhRRRRRR/# rã   r#   )r$   s   "r%   r&   rn   ›  ó!   € ÷ +ñ +�cð +˜cð + cñ +r(   c                	ó   € R V  RV R2# )zjnp.logical_or(r+   r,   r#   rç   s   &&r%   Ú
logical_orÚ PallasKernelOverrides.logical_or™  s   € ð !   2 a S¨Ð*Ð*r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   Ÿ  ó   € ÷ 'ñ '�sð '˜sñ 'r(   c                	ó   € R V  R2# )zjnp.logical_not(r,   r#   rq   s   &r%   Úlogical_notÚ!PallasKernelOverrides.logical_notž  ó   € à! !  AÐ&Ð&r(   c               ó$   € V ^8„  d   QhRRRRRR/# rã   r#   )r$   s   "r%   r&   rn   ¤  r‚  r(   c                	ó   € R V  RV R2# )zjnp.logical_xor(r+   r,   r#   rç   s   &&r%   Úlogical_xorÚ!PallasKernelOverrides.logical_xor¢  r†  r(   c               ó$   € V ^8„  d   QhRRRRRR/# rã   r#   )r$   s   "r%   r&   rn   ª  s!   € ÷ (ñ (�ð (˜ð ( ñ (r(   c                	ó   € R V  RV R2# )zjnp.arctan2(r+   r,   r#   rç   s   &&r%   Úatan2ÚPallasKernelOverrides.atan2¨  rï   r(   c               ó$   € V ^8„  d   QhRRRRRR/# rã   r#   )r$   s   "r%   r&   rn   ¯  ó!   € ÷ &ñ &�ð &˜ð & ñ &r(   c                	ó   € R V  RV R2# )z
jnp.hypot(r+   r,   r#   rç   s   &&r%   ÚhypotÚPallasKernelOverrides.hypot­  ó   € ð ˜A˜3˜b   1Ð%Ð%r(   c               ó$   € V ^8„  d   QhRRRRRR/# rã   r#   )r$   s   "r%   r&   rn   ´  s!   € ÷ %ñ %�ð %˜ð % ñ %r(   c                	ó   € R V  RV R2# )z	jnp.fmod(r+   r,   r#   rç   s   &&r%   ÚfmodÚPallasKernelOverrides.fmod²  s   € ð ˜1˜#˜R ˜s !Ð$Ð$r(   c               ó$   € V ^8„  d   QhRRRRRR/# rã   r#   )r$   s   "r%   r&   rn   ¸  ó!   € ÷ *ñ *�Sð *˜Sð * Sñ *r(   c                	ó   € R V  RV R2# )zjnp.remainder(r+   r,   r#   rç   s   &&r%   Ú	remainderÚPallasKernelOverrides.remainder·  s   € à ˜s " Q C qÐ)Ð)r(   c               ó$   € V ^8„  d   QhRRRRRR/# rã   r#   )r$   s   "r%   r&   rn   ½  s&   € ÷ eñ e�Cð e˜Cð e Cñ er(   c                	ó&   € R V  RV RV  RV RV  R2# )z
(jnp.sign(z) * jnp.sign(z) * (jnp.abs(z) // jnp.abs(z))).astype(ú.dtype)r#   rç   s   &&r%   ÚtruncdivÚPallasKernelOverrides.truncdiv»  s.   € ð
 ˜A˜3˜m¨A¨3¨m¸A¸3¸mÈAÈ3ÈkÐZ[ÐY\Ð\cÐdÐdr(   c               ó$   € V ^8„  d   QhRRRRRR/# rã   r#   )r$   s   "r%   r&   rn   Ã  s!   € ÷ ñ �Cð ˜Cð  Cñ r(   c                	ó   € R V  RV R2# )rX  z // r,   r#   rç   s   &&r%   ÚfloordivÚPallasKernelOverrides.floordivÂ  r`  r(   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rm   r"   Úmin_valÚmax_valr!   r#   )r$   s   "r%   r&   rn   Ç  s(   € ÷ 6ñ 6�ð 6˜sð 6¨Sð 6°Sñ 6r(   c                	ó   € R V  RV RV R2# )z	jnp.clip(r+   r,   r#   )rm   r³  r´  s   &&&r%   ÚclampÚPallasKernelOverrides.clampÆ  s   € à˜1˜#˜R ˜y¨¨7¨)°1Ð5Ð5r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   Ï  s   € ÷ @ñ @�ð @˜ñ @r(   c                	ó   € R V  RV  R2# )zjnp.where(jnp.isnan(z), 0.0, jnp.sign(ú))r#   rq   s   &r%   ÚsignÚPallasKernelOverrides.signÍ  s   € ð & a SÐ(9¸!¸¸BÐ?Ð?r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   Õ  s   € ÷ #ñ #�3ð #˜3ñ #r(   c                	ó   € R V  R2# )zjnp.signbit(r,   r#   rq   s   &r%   ÚsignbitÚPallasKernelOverrides.signbitÓ  s   € ð ˜a˜S Ð"Ð"r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   Û  s   € ÷ -ñ -ˆsð -�sñ -r(   c                	ó   € R V  R2# )zjax.scipy.special.erf(r,   r#   rq   s   &r%   ÚerfÚPallasKernelOverrides.erfÙ  s   € ð (¨ s¨!Ð,Ð,r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   ß  s   € ÷ .ñ .�ð .˜ñ .r(   c                	ó   € R V  R2# )zjax.scipy.special.erfc(r,   r#   rq   s   &r%   ÚerfcÚPallasKernelOverrides.erfcÞ  s   € à(¨¨¨1Ð-Ð-r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   ä  s   € ÷ 0ñ 0�#ð 0˜#ñ 0r(   c                	ó   € R V  R2# )zjax.scipy.special.erfinv(r,   r#   rq   s   &r%   ÚerfinvÚPallasKernelOverrides.erfinvâ  s   € ð +¨1¨#¨QÐ/Ð/r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   é  s   € ÷ 1ñ 1�#ð 1˜#ñ 1r(   c                	ó   € R V  R2# )zjax.scipy.special.gammaln(r,   r#   rq   s   &r%   ÚlgammaÚPallasKernelOverrides.lgammaç  s   € ð ,¨A¨3¨aÐ0Ð0r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   í  s   € ÷ 1ñ 1�3ð 1˜3ñ 1r(   c                	ó   € R V  R2# )zjax.scipy.special.digamma(r,   r#   rq   s   &r%   ÚdigammaÚPallasKernelOverrides.digammaì  s   € à+¨A¨3¨aÐ0Ð0r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   ñ  ó   € ÷ 	
ñ 	
�Sð 	
˜Sñ 	
r(   c                	ó   € R V  RV  RV  R2# )r*   z>.astype(jnp.float64) == 0.0, 1.0, jax.scipy.special.bessel_jn(z&.astype(jnp.float64), v=0)[0]).astype(r«  r#   rq   s   &r%   Ú	bessel_j0ÚPallasKernelOverrides.bessel_j0ð  ó+   € ð ˜˜ð +Ø+,¨#ð .Ø�c˜ð"ð	
r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   ý  rÖ  r(   c                	ó   € R V  RV  RV  R2# )r*   z>.astype(jnp.float64) == 0.0, 0.0, jax.scipy.special.bessel_jn(z&.astype(jnp.float64), v=1)[1]).astype(r«  r#   rq   s   &r%   Ú	bessel_j1ÚPallasKernelOverrides.bessel_j1ü  rÚ  r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   	  ó   € ÷ Bñ B˜cð B cñ Br(   c                	ó   € R V  RV  R2# )újax.lax.bessel_i0e(ú) * jnp.exp(jnp.abs(rº  r#   rq   s   &r%   Úmodified_bessel_i0Ú(PallasKernelOverrides.modified_bessel_i0  ó   € ð % Q CÐ';¸A¸3¸bÐAÐAr(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn     rà  r(   c                	ó   € R V  RV  R2# )újax.lax.bessel_i1e(rã  rº  r#   rq   s   &r%   Úmodified_bessel_i1Ú(PallasKernelOverrides.modified_bessel_i1  ræ  r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn     s   € ÷ Añ A˜sð A sñ Ar(   c                	ó   € R V  RV  RV  R2# )r*   z == 0.0, 1.0, jnp.sin(z) / r,   r#   rq   s   &r%   Úspherical_bessel_j0Ú)PallasKernelOverrides.spherical_bessel_j0  s    € ð ˜A˜3Ð4°Q°C°t¸A¸3¸aÐ@Ð@r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn     ó   € ÷ *ñ *ˆsð *�sñ *r(   c                	ó   € R V  R2# )râ  r,   r#   rq   s   &r%   Úi0eÚPallasKernelOverrides.i0e  ó   € ð % Q C qÐ)Ð)r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   $  rñ  r(   c                	ó   € R V  R2# )ré  r,   r#   rq   s   &r%   Úi1eÚPallasKernelOverrides.i1e#  rõ  r(   c               ó$   € V ^8„  d   QhRRRRRR/# ©r   rm   r"   Úyr!   r#   )r$   s   "r%   r&   rn   )  s!   € ÷ 7ñ 7�Cð 7˜Cð 7 Cñ 7r(   c                	ó   € R V  RV R2# )zjax.scipy.special.gammainc(r+   r,   r#   ©rm   rü  s   &&r%   ÚgammaincÚPallasKernelOverrides.gammainc(  s   € ð -¨Q¨C¨r°!°°AÐ6Ð6r(   c               ó$   € V ^8„  d   QhRRRRRR/# rû  r#   )r$   s   "r%   r&   rn   /  s!   € ÷ 8ñ 8�Sð 8˜Sð 8 Sñ 8r(   c                	ó   € R V  RV R2# )zjax.scipy.special.gammaincc(r+   r,   r#   rþ  s   &&r%   Ú	gammainccÚPallasKernelOverrides.gammaincc.  s   € ð .¨a¨S°°1°#°QÐ7Ð7r(   c               ó$   € V ^8„  d   QhRRRRRR/# rû  r#   )r$   s   "r%   r&   rn   8  s&   € ÷ Jñ J�Sð J˜Sð J Sñ Jr(   c                	ó   € R V  RV R2# )zjax.scipy.special.polygamma(z.astype(jnp.int32), r,   r#   rþ  s   &&r%   Ú	polygammaÚPallasKernelOverrides.polygamma7  s   € ð .¨a¨SÐ0DÀQÀCÀqÐIÐIr(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   >  s   € ÷ /ñ /�ð /˜ñ /r(   c                	ó   € R V  R2# )zjax.scipy.special.ndtri(r,   r#   rq   s   &r%   ÚndtriÚPallasKernelOverrides.ndtri=  s   € ð *¨!¨¨AÐ.Ð.r(   c               ó$   € V ^8„  d   QhRRRRRR/# rû  r#   )r$   s   "r%   r&   rn   C  s!   € ÷ 3ñ 3�ð 3˜ð 3 ñ 3r(   c                	ó   € R V  RV R2# )zjax.scipy.special.zeta(r+   r,   r#   rþ  s   &&r%   ÚzetaÚPallasKernelOverrides.zetaB  s   € ð )¨¨¨2¨a¨S°Ð2Ð2r(   c               ó$   € V ^8„  d   QhRRRRRR/# rû  r#   )r$   s   "r%   r&   rn   H  s!   € ÷ 4ñ 4�ð 4˜ð 4 ñ 4r(   c                	ó   € R V  RV R2# )zjax.scipy.special.xlogy(r+   r,   r#   rþ  s   &&r%   ÚxlogyÚPallasKernelOverrides.xlogyG  s   € ð *¨!¨¨B¨q¨c°Ð3Ð3r(   c               ó$   € V ^8„  d   QhRRRRRR/# rû  r#   )r$   s   "r%   r&   rn   M  s!   € ÷ 6ñ 6�3ð 6˜3ð 6 3ñ 6r(   c                	ó   € R V  RV R2# )zjax.scipy.special.xlog1py(r+   r,   r#   rþ  s   &&r%   Úxlog1pyÚPallasKernelOverrides.xlog1pyL  s   € ð ,¨A¨3¨b°°°1Ð5Ð5r(   c               ó$   € V ^8„  d   QhRRRRRR/# ©r   rm   r"   Únr!   r#   )r$   s   "r%   r&   rn   S  s!   € ÷ 
ñ 
 #ð 
¨#ð 
°#ñ 
r(   c                	ó>   € R V  RV RV  RV  RV RV  RV RV RV  R	2# )
újnp.where(jnp.abs(z) <= 1, jnp.cos(z * jnp.arccos(jnp.clip(z, -1, 1))), jnp.where(z > 1, jnp.cosh(z * jnp.arccosh(jnp.maximum(z, 1.0))), ((-1.0) ** z) * jnp.cosh(z * jnp.arccosh(jnp.maximum(-z
, 1.0)))))r#   ©rm   r  s   &&r%   Úchebyshev_polynomial_tÚ,PallasKernelOverrides.chebyshev_polynomial_tQ  s[   € ð !  ð $Ø�cÐ0°°ð 4Ø˜ð Ø�sÐ5°a°Sð 9Ø˜˜M¨!¨Ð,HÈÈÈ:ð	Wð	
r(   c               ó$   € V ^8„  d   QhRRRRRR/# r  r#   )r$   s   "r%   r&   rn   b  s!   € ÷ 
ñ 
 #ð 
¨#ð 
°#ñ 
r(   c                	óÒ   € R P                  . RNV  NRNV NRNV  NRNV  NRNV  NRNV  NRNV NRNV NR	NV  NR
NV  NRNV  NRNV NRNV NRNV NRNV NRNV  NR
NV  NRN4      # )Ú r  z) < 1, jnp.sin((z + 1) * jnp.arccos(jnp.clip(z&, -1, 1))) / jnp.sqrt(jnp.maximum(1 - z**2, 1e-10)), jnp.where(z >= 1, jnp.where(ú == 1, z + 1.0, jnp.sinh((z  + 1) * jnp.arccosh(jnp.maximum(z , 1.0))) / jnp.sqrt(jnp.maximum(z**2 - 1, 1e-10))), jnp.where(z == -1, ((-1.0) ** ú) * (z + 1.0), ((-1.0) ** z) * jnp.sinh((z! + 1) * jnp.arccosh(jnp.maximum(-z**2 - 1, 1e-10)))))©Újoinr  s   &&r%   Úchebyshev_polynomial_uÚ,PallasKernelOverrides.chebyshev_polynomial_u`  sˆ  € ÷	;ó 	;Ð ð 	;  ð 	;ð $ð 	;Ø�sð	;Ø6ð	;Ø78°cð	;ð:(ð	;à() sð	;ð+ð	;ð ˜ð	;ðð	;ð ˜ð		;ð #ð		;ð $% #ð		;ð&ð		;ð
 ˜ð	;ð
 <ð	;ð
 =>¸3ð	;ð
?$ð	;ð %& 3ð	;ð'ð	;ð ˜ð	;ð /ð	;ð 01¨cð	;ð 27ð	;ð 89°cð	;ð:ð	;ð ˜ð	;ð +ð	;ð ,-¨#ð	;ð .Oð	;ð PQÈcð	;ðR$ð	;ð %& 3ð	;ð ':ô	;ð	
r(   c               ó$   € V ^8„  d   QhRRRRRR/# r  r#   )r$   s   "r%   r&   rn   x  ó!   € ÷ 
ñ 
 #ð 
¨#ð 
°#ñ 
r(   c                	ó  € R P                  . RNV NRNV  NRNV NRNV  NRNV NRNV  NRNV  NRNV NRNV  NR	NV  NR
NV  NRNV NRNV  NRNV  NRNV  NRNV  NRNV NRNV  NRNV  NRNV  NRNV  NRNV  NRNV  NRN4      # )r#  r*   ú == 0, jnp.ones_like(ú), jnp.where(ú	 == 1, 2*ú - 1, jnp.where(ú	 == 2, 4*z**2 - 2*ú	 == 3, 8*z**3 - 4*ú**2 - 4*ú + 1, jnp.where(ú
 == 4, 16*z**4 - 8*ú	**3 - 12*z**2 + 4*ú
 == 5, 32*z	**5 - 16*ú	**4 - 32*z	**3 + 12*ú**2 + 6*z - 1, jnp.zeros_like(ú)))))))r&  r  s   &&r%   Úchebyshev_polynomial_vÚ,PallasKernelOverrides.chebyshev_polynomial_vv  ó
  € ÷)ó )ˆjð )˜˜ð )Ð0ð )°°ð )ð 4ð )Ø˜ð)Ø$ð)Ø%& Cð)ð(ð)à˜ð)à$ð)à%& Cð)à'/ð)à01¨sð)ð3ð)ð ˜ð)ð %ð)ð &' Cð)ð (0ð)ð 12¨sð)ð 3;ð)ð <=¸#ð)ð>ð)ð ˜ð	)ð &ð	)ð '( Sð	)ð )1ð	)ð 23°ð	)ð 4=ð	)ð >?¸Cð	)ð @Hð	)ð IJÀsð	)ðKð	)ð
 ˜ð)ð
 &ð)ð
 '( Sð)ð
 )2ð)ð
 34°ð)ð
 5>ð)ð
 ?@¸Sð)ð
 AJð)ð
 KLÈð)ð
 MUð)ð
 VWÐTWð)ð
Xð)ð  ˜Sð)ð !(ô)ð	
r(   c               ó$   € V ^8„  d   QhRRRRRR/# r  r#   )r$   s   "r%   r&   rn   ‰  r+  r(   c                	ó  € R P                  . RNV NRNV  NRNV NRNV  NRNV NRNV  NRNV  NRNV NR	NV  NR
NV  NRNV  NRNV NRNV  NRNV  NRNV  NRNV  NRNV NRNV  NRNV  NRNV  NRNV  NRNV  NRNV  NRN4      # )r#  r*   r-  r.  r/  r4  r1  z**2 + 2*r0  r2  z**3 + 4*r3  r5  z**4 + 8*r6  r7  z	**5 + 16*r8  r9  z + 1, jnp.zeros_like(r:  r&  r  s   &&r%   Úchebyshev_polynomial_wÚ,PallasKernelOverrides.chebyshev_polynomial_w‡  r=  r(   c               ó$   € V ^8„  d   QhRRRRRR/# r  r#   )r$   s   "r%   r&   rn   š  ó&   € ÷ Qñ Q¨#ð Q°#ð Q¸#ñ Qr(   c                	ó6   € \         P                  R V  R2V4      # ©z(2 * z - 1))rj   r  r  s   &&r%   Úshifted_chebyshev_polynomial_tÚ4PallasKernelOverrides.shifted_chebyshev_polynomial_t˜  ó    € ô %×;Ñ;¸eÀAÀ3ÀeÐ<LÈaÓPÐPr(   c               ó$   € V ^8„  d   QhRRRRRR/# r  r#   )r$   s   "r%   r&   rn   Ÿ  rC  r(   c                	ó6   € \         P                  R V  R2V4      # rE  )rj   r(  r  s   &&r%   Úshifted_chebyshev_polynomial_uÚ4PallasKernelOverrides.shifted_chebyshev_polynomial_u�  rH  r(   c               ó$   € V ^8„  d   QhRRRRRR/# r  r#   )r$   s   "r%   r&   rn   ¤  rC  r(   c                	ó6   € \         P                  R V  R2V4      # rE  )rj   r;  r  s   &&r%   Úshifted_chebyshev_polynomial_vÚ4PallasKernelOverrides.shifted_chebyshev_polynomial_v¢  rH  r(   c               ó$   € V ^8„  d   QhRRRRRR/# r  r#   )r$   s   "r%   r&   rn   ©  rC  r(   c                	ó6   € \         P                  R V  R2V4      # rE  )rj   r@  r  s   &&r%   Úshifted_chebyshev_polynomial_wÚ4PallasKernelOverrides.shifted_chebyshev_polynomial_w§  rH  r(   c               ó$   € V ^8„  d   QhRRRRRR/# r  r#   )r$   s   "r%   r&   rn   ®  s!   € ÷ 
ñ 
 ð 
¨ð 
°ñ 
r(   c                	óÒ   € R P                  . RNV NRNV  NRNV NRNV  NRNV NRNV  NRNV NRNV  NR	NV  NRNV NR
NV  NRNV  NRNV NRNV  NRNV  NRNV  NRNV  NRN4      # )r#  r*   r-  r.  z == 1, 2 * ú, jnp.where(z == 2, 4 * z**2 - 2, jnp.where(z == 3, 8 * z**3 - 12 * z == 4, 16 * z**4 - 48 * z**2 + 12, jnp.where(z == 5, 32 * z**5 - 160 * z**3 + 120 * ú, jnp.zeros_like(r:  r&  r  s   &&r%   Úhermite_polynomial_hÚ*PallasKernelOverrides.hermite_polynomial_h¬  s~  € ÷)ó )ˆjð )˜˜ð )Ð0ð )°°ð )ð 4ð )Ø˜ð)Ø&ð)Ø'( cð)ð*ð)à˜ð)à&ð)à'( cð)ð*ð)ð ˜ð)ð 'ð)ð () cð)ð *5ð)ð 67°Cð)ð8ð)ð ˜ð	)ð (ð	)ð )* sð	)ð +6ð	)ð 78°Sð	)ð9ð	)ð
 ˜ð)ð
 (ð)ð
 )* sð)ð
 +7ð)ð
 89°cð)ð
 :Fð)ð
 GHÀSð)ð
Ið)ð  ˜Sð)ð !(ô)ð	
r(   c               ó$   € V ^8„  d   QhRRRRRR/# r  r#   )r$   s   "r%   r&   rn   Á  ó!   € ÷ 
ñ 
 ð 
¨ð 
°ñ 
r(   c                	óÒ   € R P                  . RNV NRNV  NRNV NRNV  NRNV NRNV  NRNV NRNV  NR	NV  NRNV NR
NV  NRNV  NRNV NRNV  NRNV  NRNV  NRNV  NRN4      # )r#  r*   r-  r.  r$  rW  z == 2, z**2 - 1, jnp.where(z == 3, ú
**3 - 3 * z == 4, z
**4 - 6 * z**2 + 3, jnp.where(z == 5, z**5 - 10 * ú**3 + 15 * rX  r:  r&  r  s   &&r%   Úhermite_polynomial_heÚ+PallasKernelOverrides.hermite_polynomial_he¿  s}  € ÷)ó )ˆjð )˜˜ð )Ð0ð )°°ð )ð 4ð )Ø˜ð)Ø"ð)Ø#$ #ð)ð&ð)à˜ð)à"ð)à#$ #ð)ð&ð)ð ˜ð)ð #ð)ð $% #ð)ð &0ð)ð 12¨sð)ð3ð)ð ˜ð	)ð #ð	)ð $% #ð	)ð &0ð	)ð 12¨sð	)ð3ð	)ð
 ˜ð)ð
 #ð)ð
 $% #ð)ð
 &1ð)ð
 23°ð)ð
 4?ð)ð
 @A¸cð)ð
Bð)ð  ˜Sð)ð !(ô)ð	
r(   c               ó$   € V ^8„  d   QhRRRRRR/# r  r#   )r$   s   "r%   r&   rn   Ð  r\  r(   c                	ó  € R P                  . RNV NRNV  NRNV NRNV  NRNV NRNV  NRNV  NRNV NR	NV  NR
NV  NRNV  NRNV NRNV  NRNV  NRNV  NRNV  NRNV NRNV  NRNV  NRNV  NRNV  NRNV  NRNV  NRN4      # )r#  r*   r-  r.  z == 1, 1 - rW  z == 2, (r3  z + 2) / 2, jnp.where(z	 == 3, (-z**3 + 9*z	**2 - 18*z + 6) / 6, jnp.where(z == 4, (z	**4 - 16*z	**3 + 72*z	**2 - 96*z + 24) / 24, jnp.where(z	 == 5, (-z	**5 + 25*z
**4 - 200*z
**3 + 600*z
**2 - 600*z + 120) / 120, jnp.zeros_like(r:  r&  r  s   &&r%   Úlaguerre_polynomial_lÚ+PallasKernelOverrides.laguerre_polynomial_lÎ  s	  € ÷)ó )ˆjð )˜˜ð )Ð0ð )°°ð )ð 4ð )Ø˜ð)Ø&ð)Ø'( cð)ð*ð)à˜ð)à#ð)à$% 3ð)à&.ð)à/0¨cð)ð2ð)ð ˜ð)ð %ð)ð &' Cð)ð (0ð)ð 12¨sð)ð 3<ð)ð =>¸3ð)ð?ð)ð ˜ð	)ð $ð	)ð %& 3ð	)ð '0ð	)ð 12¨sð	)ð 3<ð	)ð =>¸3ð	)ð ?Hð	)ð IJÀsð	)ðKð	)ð
 ˜ð)ð
 %ð)ð
 &' Cð)ð
 (1ð)ð
 23°ð)ð
 4>ð)ð
 ?@¸Sð)ð
 AKð)ð
 LMÈ#ð)ð
 NXð)ð
 YZÐWZð)ð
[ð)ð  ˜Sð)ð !(ô)ð	
r(   c               ó$   € V ^8„  d   QhRRRRRR/# r  r#   )r$   s   "r%   r&   rn   ß  r\  r(   c                	óÒ   € R P                  . RNV NRNV  NRNV NRNV  NRNV NRNV  NRNV NRNV  NR	NV  NR
NV NRNV  NRNV  NRNV NRNV  NRNV  NRNV  NRNV  NRN4      # )r#  r*   r-  r.  r$  rW  z == 2, (3 * z**2 - 1) / 2, jnp.where(z == 3, (5 * r^  z) / 2, jnp.where(z == 4, (35 * z**4 - 30 * z**2 + 3) / 8, jnp.where(z == 5, (63 * z**5 - 70 * r_  z) / 8, jnp.zeros_like(r:  r&  r  s   &&r%   Úlegendre_polynomial_pÚ+PallasKernelOverrides.legendre_polynomial_pÝ  s~  € ÷)ó )ˆjð )˜˜ð )Ð0ð )°°ð )ð 4ð )Ø˜ð)Ø"ð)Ø#$ #ð)ð&ð)à˜ð)à'ð)à() sð)ð+ð)ð ˜ð)ð (ð)ð )* sð)ð +5ð)ð 67°Cð)ð8ð)ð ˜ð	)ð )ð	)ð *+¨ð	)ð ,7ð	)ð 89°cð	)ð:ð	)ð
 ˜ð)ð
 )ð)ð
 *+¨ð)ð
 ,7ð)ð
 89°cð)ð
 :Eð)ð
 FGÀCð)ð
Hð)ð  ˜Sð)ð !(ô)ð	
r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   î  s   € ÷ &ñ &�cð &˜cñ &r(   c                	ó   € R V  R2# )zjnp.reciprocal(r,   r#   rq   s   &r%   Ú
reciprocalÚ PallasKernelOverrides.reciprocalí  rÝ   r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   ò  s   € ÷ "ñ "�#ð "˜#ñ "r(   c                	ó   € R V  R2# )zjnp.square(r,   r#   rq   s   &r%   ÚsquareÚPallasKernelOverrides.squareñ  s   € à˜Q˜C˜qÐ!Ð!r(   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rä   r"   rå   r0   r!   r#   )r$   s   "r%   r&   rn   ÷  s(   € ÷ *ñ *ˆsð *�sð *˜sð * sñ *r(   c                ó   € RV  RV RV R2# )z�Fused multiply-add: a * b + c

JAX doesn't have jnp.fma, so we use the unfused version.
The compiler may still fuse this on supported hardware.
z((r%  z) + (rº  r#   )rä   rå   r0   s   &&&r%   ÚfmaÚPallasKernelOverrides.fmaö  s   € ð �A�3�e˜A˜3˜e A 3 bÐ)Ð)r(   c               ó$   € V ^8„  d   QhRRRRRR/# rã   r#   )r$   s   "r%   r&   rn     s!   € ÷ )ñ )�Cð )˜Cð ) Cñ )r(   c                	ó   € R V  RV R2# )zjnp.copysign(r+   r,   r#   rç   s   &&r%   ÚcopysignÚPallasKernelOverrides.copysignÿ  s   € ð ˜q˜c  A 3 aÐ(Ð(r(   c               ó$   € V ^8„  d   QhRRRRRR/# rã   r#   )r$   s   "r%   r&   rn     r¥  r(   c                	ó   € R V  RV R2# )zjnp.nextafter(r+   r,   r#   rç   s   &&r%   Ú	nextafterÚPallasKernelOverrides.nextafter  s   € ð   ˜s " Q C qÐ)Ð)r(   c               ó$   € V ^8„  d   QhRRRRRR/# rã   r#   )r$   s   "r%   r&   rn     r›  r(   c                	ó   € R V  RV R2# )z
jnp.ldexp(r+   r,   r#   rç   s   &&r%   ÚldexpÚPallasKernelOverrides.ldexp	  rŸ  r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn     r£   r(   c                	ó   € R V  R2# )z
jnp.frexp(r,   r#   rq   s   &r%   ÚfrexpÚPallasKernelOverrides.frexp  rÌ   r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn     r~   r(   c                	ó   € R V  R2# )z	jnp.modf(r,   r#   rq   s   &r%   ÚmodfÚPallasKernelOverrides.modf  r¡   r(   c               ó$   € V ^8„  d   QhRRRRRR/# rã   r#   )r$   s   "r%   r&   rn     r‚  r(   c                	ó   € R V  RV R2# )zjnp.bitwise_and(r+   r,   r#   rç   s   &&r%   Úbitwise_andÚ!PallasKernelOverrides.bitwise_and  ó   € à! !  B q c¨Ð+Ð+r(   c               ó$   € V ^8„  d   QhRRRRRR/# rã   r#   )r$   s   "r%   r&   rn     rˆ  r(   c                	ó   € R V  RV R2# )zjnp.bitwise_or(r+   r,   r#   rç   s   &&r%   Ú
bitwise_orÚ PallasKernelOverrides.bitwise_or  ó   € à    2 a S¨Ð*Ð*r(   c               ó$   € V ^8„  d   QhRRRRRR/# rã   r#   )r$   s   "r%   r&   rn   !  r‚  r(   c                	ó   € R V  RV R2# )zjnp.bitwise_xor(r+   r,   r#   rç   s   &&r%   Úbitwise_xorÚ!PallasKernelOverrides.bitwise_xor   rŽ  r(   c               ó    € V ^8„  d   QhRRRR/# rl   r#   )r$   s   "r%   r&   rn   %  r�  r(   c                	ó   € R V  R2# )zjnp.bitwise_not(r,   r#   rq   s   &r%   Úbitwise_notÚ!PallasKernelOverrides.bitwise_not$  r‘  r(   c               ó$   € V ^8„  d   QhRRRRRR/# rã   r#   )r$   s   "r%   r&   rn   )  rˆ  r(   c                	ó   € R V  RV R2# )zjnp.left_shift(r+   r,   r#   rç   s   &&r%   Ú
left_shiftÚ PallasKernelOverrides.left_shift(  r“  r(   c               ó$   € V ^8„  d   QhRRRRRR/# rã   r#   )r$   s   "r%   r&   rn   -  r‚  r(   c                	ó   € R V  RV R2# )zjnp.right_shift(r+   r,   r#   rç   s   &&r%   Úright_shiftÚ!PallasKernelOverrides.right_shift,  rŽ  r(   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Únamer"   Úoffsetr!   r#   )r$   s   "r%   r&   rn   2  s&   € ÷ Cñ C˜ð C Sð C¨Sñ Cr(   c                ó¶   € \         P                  P                  P                  RV4      pR\         P                  P                  P	                  V 4       RV R2# )z)Load the random seed value from a buffer.Úload_seed_offsetrX  z[0] + r,   )r   r'  r.   Úseed_offsetÚinput)r¥  r¦  r©  s   && r%   Ú	load_seedÚPallasKernelOverrides.load_seed1  sH   € ô
 —h‘h—m‘m×/Ñ/Ð0BÀFÓKˆØ”1—8‘8—=‘=×&Ñ& tÓ,Ð-¨V°K°=ÀÐBÐBr(   c               ó$   € V ^8„  d   QhRRRRRR/# ©r   Úseedr"   r¦  r!   r#   )r$   s   "r%   r&   rn   :  s!   € ÷ 
ñ 
�3ð 
 ð 
¨ñ 
r(   c                ó   € RV  RV RV R2# )z¼Generate uniform random numbers in [0, 1).

Uses JAX's threefry2x32 PRNG directly for vectorized random generation.
The seed provides the base key, offset provides per-element uniqueness.
zWjax.vmap(lambda o: jax.random.uniform(jax.random.fold_in(jax.random.PRNGKey(jnp.uint32(ú8)), jnp.uint32(o)), (), dtype=jnp.float32))(jnp.asarray(ú!).flatten()).reshape(jnp.asarray(ú).shape)r#   ©r¯  r¦  s   &&r%   ÚrandÚPallasKernelOverrides.rand9  s,   € ð@Ø@D¸vð FØ"˜8Ð#DÀVÀHÈHðVð	
r(   c               ó$   € V ^8„  d   QhRRRRRR/# r®  r#   )r$   s   "r%   r&   rn   J  s!   € ÷ 
ñ 
�Cð 
 ð 
¨ñ 
r(   c                ó   € RV  RV RV R2# )zºGenerate standard normal random numbers.

Uses JAX's threefry2x32 PRNG directly for vectorized random generation.
The seed provides the base key, offset provides per-element uniqueness.
zVjax.vmap(lambda o: jax.random.normal(jax.random.fold_in(jax.random.PRNGKey(jnp.uint32(r±  r²  r³  r#   r´  s   &&r%   ÚrandnÚPallasKernelOverrides.randnI  s,   € ð@Ø@D¸vð FØ"˜8Ð#DÀVÀHÈHðVð	
r(   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )r   r¯  r"   r¦  ÚlowÚhighr!   r#   )r$   s   "r%   r&   rn   Y  s/   € ÷ 
ñ 
˜ð 
 Sð 
¨sð 
¸#ð 
À#ñ 
r(   c                ó&   € RV  RV RV RV RV R2# )z,Generate random int64 values in [low, high).zWjax.vmap(lambda o: jax.random.randint(jax.random.fold_in(jax.random.PRNGKey(jnp.uint32(z)), jnp.uint32(o)), (), r+   z , dtype=jnp.int64))(jnp.asarray(r²  r³  r#   )r¯  r¦  r¼  r½  s   &&&&r%   Ú	randint64ÚPallasKernelOverrides.randint64X  s>   € ð
@Ø@D¸vÐE]Ð^aÐ]bÐbdÐeiÐdjð kØ"˜8Ð#DÀVÀHÈHðVð	
r(   r#   )NT)}rH   rI   rJ   rK   rL   Ústaticmethodrr   rw   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  r5  r9  r@  rD  rH  rL  rP  rT  rY  r^  rc  rh  rm  rq  r  r  r{  r  r„  rŠ  r�  r”  r˜  r�  r¢  r§  r¬  r°  r¶  Úclipr»  r¿  rÃ  rÇ  rË  rÏ  rÓ  rØ  rÝ  rä  rê  rî  Úi0ró  Úi1rø  rÿ  r  ÚigammaÚigammacr  r  r  r  r  r  r(  r;  r@  rF  rK  rO  rS  rY  r`  rd  rh  rl  rp  rt  rx  r|  r€  r„  rˆ  rŒ  r‘  r–  rš  rž  r¢  r«  rµ  r¹  r¿  rM   r#   r(   r%   rj   rj   n   s	  † ñð ôó ðð ôó ðð ôó ðð ô ó ð ð ô ó ð ð ô ó ð ð ô"ó ð"ð ô"ó ð"ð ô"ó ð"ð ôó ðð ô ó ð ð ô!ó ð!ð ôó ðð ô!ó ð!ð ô ó ð ð ô!ó ð!ð ô ó ð ð ô%ó ð%ð ôó ðð ôó ðð ô!ó ð!ð ô ó ð ð ô!ó ð!ð ô!ó ð!ð ô&ó ð&ð ô&ó ð&ð ô&ó ð&ð ô(ó ð(ð ô(ó ð(ð ô.ó ð.ð ô;ó ð;ð& ö7ó ð7ð ôfó ðfð ô:ó ð:ð  ô=ó ð=ð
 ô6ó ð6ð ô ó ð ð ô ó ð ð ô ó ð ð ô!ó ð!ð ôEó ðEð ô3ó ð3ð
 ôó ðð ôó ðð ôó ðð ôó ðð ôó ðð ô!ó ð!ð ô!ó ð!ð ô$ó ð$ð ôó ðð ô,ó ð,ð ô+ó ð+ð ô'ó ð'ð ô,ó ð,ð ô(ó ð(ð ô&ó ð&ð ô%ó ð%ð ô*ó ð*ð ôeó ðeð
 ôó ðð ô6ó ð6ð €Dð ô@ó ð@ð ô#ó ð#ð ô-ó ð-ð ô.ó ð.ð ô0ó ð0ð ô1ó ð1ð ô1ó ð1ð ô	
ó ð	
ð ô	
ó ð	
ð ôBó ðBð
 ôBó ðBð
 ôAó ðAð
 
€Bàô*ó ð*ð 
€Bàô*ó ð*ð ô7ó ð7ð
 ô8ó ð8ð €Fà€GàôJó ðJð
 ô/ó ð/ð ô3ó ð3ð ô4ó ð4ð ô6ó ð6ð ô
ó ð
ð ô
ó ð
ð( ô
ó ð
ð ô
ó ð
ð ôQó ðQð ôQó ðQð ôQó ðQð ôQó ðQð ô
ó ð
ð" ô
ó ð
ð ô
ó ð
ð ô
ó ð
ð ô&ó ð&ð ô"ó ð"ð ô*ó ð*ð ô)ó ð)ð ô*ó ð*ð ô&ó ð&ð ô!ó ð!ð ô ó ð ð ô,ó ð,ð ô+ó ð+ð ô,ó ð,ð ô'ó ð'ð ô+ó ð+ð ô,ó ð,ð ôCó ðCð ô
ó ð
ð ô
ó ð
ð ô
ó ô
r(   rj   c                  óX   € ] tR tRt$ RtR]R&   R]R&   R]R&   R]R	&   R]R
&   R]R&   RtR# )Ú_IndirectAccessInfoic  z=Describes a detected indirect (data-dependent) buffer access.r"   Útable_paramÚtable_buf_nameÚtupleÚtable_shapeÚintÚindirect_dimÚindirect_varÚindices_paramr#   N©rH   rI   rJ   rK   rL   Ú__annotations__rM   r#   r(   r%   rÈ  rÈ  c  s)   ‡ áGàÓØÓØÓØÓØÓØ×r(   rÈ  c                  ó0   € ] tR tRt$ RtR]R&   R]R&   RtR# )	Ú_BufferIndexingio  zHEncapsulates index string and flattening requirements for buffer access.r"   Ú	index_strr  Úneeds_flattenr#   NrÑ  r#   r(   r%   rÔ  rÔ  o  s   ‡ áRàƒNØ×r(   rÔ  c                  óD   € ] tR tRt$ RtR]R&   R]R&   R]R&   R	]R
&   RtR# )Ú_BroadcastedIterVariw  zFEncapsulates information needed to codegen a broadcasted iteration varrÍ  Úidxúsympy.SymbolÚvar_symr   Úentryú
int | NoneÚ
length_valr#   NrÑ  r#   r(   r%   rØ  rØ  w  s   ‡ áPð 
ƒHØÓØÓØ×r(   rØ  c                  óÐ   € ] tR tRt$ Rt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tR# ) Ú_CodegenContexti‚  z@Bundles local state shared across codegen_kernel helper methods.r   Úcoder"   Úkernel_namer  Úis_tpuÚinterpret_is_cpuÚinterpret_literalú	list[str]Úkernel_paramsÚpure_out_paramsÚoutput_paramsÚsize_var_paramszdict[str, str]Úoutput_buffer_lookupúdict[str, bool]Úaliasable_flagsÚalias_paramsÚpointer_tailÚkernel_input_paramsÚfull_kernel_paramszOrderedSet[str]Únon_alias_out_setú	list[int]Úcopy_output_indicesúlist[tuple[int, int]]Úalias_pairsr#   NrÑ  r#   r(   r%   rà  rà  ‚  sp   ‡ áJà
ÓØÓØƒLØÓØÓØÓØÓØÓØÓØ(Ó(Ø$Ó$ØÓØÓØ"Ó"Ø!Ó!Ø&Ó&Ø"Ó"Ø&×&r(   rà  c                  óœ  a € ] tR tRt$ Rt]t]tR]	R&   V 3R lt
R R ltR R	 ltR
 R ltR R ltR R ltR R ltR R ltR R ltR R ltR R lt]R R l4       tR R lt]R R l4       tR  R! ltR" R# ltR$ R% lt]R& R' l4       tR( R) lt]R* R+ l4       t]R, R- l4       t]R. R/ l4       t R0 R1 lt!R2 R3 lt"R4 R5 lt#R6 R7 lt$R8 R9 lt%R: R; lt&R< R= lt'R> R? lt(R@ RA lt)RB RC lt*RD RE lt+RF RG lt,]RH RI l4       t-RJ RK lt.RL RM lt/RN RO lt0RP RQ lt1RR RS lt2RT RU lt3RV RW lt4RX RY lt5RZ R[ lt6R\ R] lt7RŸR^ R_ llt8R` Ra lt9]:Pv                  Rb Rc l4       t<Rd Re lt=]:Pv                  RŸRf Rg ll4       t>]R Rh Ri ll4       t?R¡Rj Rk llt@Rl Rm ltARn Ro ltBRp Rq ltC]Rr Rs l4       tDRt Ru ltERŸRv Rw lltF]Rx Ry l4       tGRz R{ ltHR| R} ltIR~ R ltJR€ R� ltKR‚ Rƒ ltLR„ R… ltMR† R‡ ltN]Rˆ R‰ l4       tORŠ R‹ ltPRŒ R� ltQRŽ R� ltRR� R‘ ltSR’ R“ ltTR” R• ltUR– R— ltVR˜ R™ ltW]Rš R› l4       tXRŸRœ R� lltYRžtZV ;t[# )¢ÚPallasKerneliš  z±Pallas kernel codegen for TPU and GPU (Mosaic backend).

Generates Python code that defines a Pallas kernel and a host entrypoint,
compiled and loaded via async_compile.pallas.
zCallable[[sympy.Expr], str]r-  c                	óä  <€ \         SV `  ! V/ VB  \        P                  P	                  4       pVP
                  R 8H  V n        VP
                  R8H  V n        V P                  V n        . V n	        / V n
        \        4       V n        / V n        / V n        RV n        RV n        . V n        V P$                  P'                  4        FE  pVP(                  P*                   F(  pV P"                  P-                  VP.                  4       K*  	  KG  	  \        4       V n        \        4       V n        RV n        / V n        \        4       V n        RV n        / V n        / V n        VP
                  R8H  V n        R# )Úcudar  NF) Úsuperr_   r   r  r  r  Úis_gpurã  Úuse_emit_pipelineÚstore_with_outputÚload_index_exprsr   Úoutputs_need_readÚpermuted_input_buffersÚcollapsed_reshape_inputsÚcollapsed_output_shapeÚ_cpu_max_grid_productÚ_output_buffer_namesÚfeaturesÚscheduler_nodesÚread_writesÚwritesÚappendr¥  r(  Útile_relative_iter_varsÚhas_flatten_indexingÚstrided_input_buffersÚflatten_indexed_buffersÚindirect_accessÚ_cse_to_paramÚ_param_to_graph_name)r/   r.   rc   ÚdeviceÚsnodeÚdepÚ	__class__s   &*,   €r%   r_   ÚPallasKernel.__init__¤  sB  ø€ Ü‰Ò˜$Ð) &Ò)ä—‘×4Ñ4Ó6ˆØ—k‘k VÑ+ˆŒØ—k‘k UÑ*ˆŒð "&§¡ˆÔà8:ˆÔà79ˆÔä2<³,ˆÔàBDˆÔ#ØDFˆÔ%Ø>BˆÔ#Ø15ˆÔ"ð 02ˆÔ!Ø—]‘]×2Ñ2Ö4ˆEØ×(Ñ(×/Ô/�Ø×)Ñ)×0Ñ0°·±Ö:ó 0ñ 5ô 9C»ˆÔô BLÃˆÔ$à$)ˆÔ!ð
 MOˆÔ"ô 9C»ˆÔ$à;?ˆÔØ-/ˆÔØ46ˆÔ!Ø—k‘k UÑ*ˆŽr(   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   r   r    ÚsizeÚlowerr  Úupperr!   ÚNoner#   )r$   s   "r%   r&   ÚPallasKernel.__annotate__Ô  s4   € ÷ 8ñ 8Øð8Ø&0ð8Ø9=ð8ØFJð8à	ñ8r(   c                ó   € R# )z)Check array bounds for indirect indexing.Nr#   )r/   r   r  r  r  s   &&&&&r%   Úcheck_boundsÚPallasKernel.check_boundsÔ  s   ‚ r(   c               ó    € V ^8„  d   QhRRRR/# ©r   Úindexr    r!   r"   r#   )r$   s   "r%   r&   r  Û  s   € ÷ !>ñ !> Jð !>°3ñ !>r(   c                óÄ   € V P                  V4      p\        V\        P                  4      '       d   R# VP                  '       d   \        V4      # V P                  V4      # )a¾  
Convert an index expression to a string suitable for Pallas indexing.

Pallas operates on full arrays, so we need to convert index expressions
to JAX array slicing. For example:
- x0 -> "..." (contiguous access, full array)
- 2*x0 -> "::2" (strided access with stride 2)
- 2*x0 + 1 -> "1::2" (strided access with offset 1, stride 2)

Args:
    index: The indexing expression to convert

Returns:
    The indexing string to use in generated code
ú...)r+  r  ÚsympyÚSymbolÚ
is_Integerr"   Ú_convert_to_jax_slice)r/   r"  Úprepared_indexs   && r%   Ú_get_index_strÚPallasKernel._get_index_strÛ  sT   € ð" ×.Ñ.¨uÓ5ˆô �n¤e§l¡l×3Ò3ÙØ×&×&Ð&ä�~Ó&Ð&ð ×-Ñ-¨nÓ=Ð=r(   c               ó    € V ^8„  d   QhRRRR/# r!  r#   )r$   s   "r%   r&   r  þ  s   € ÷ bñ b¨:ð b¸#ñ br(   c                ó\  € V P                   '       g   R# V P                  V4      pVP                  \        4      '       d<   V P                  P                  V P                  V4      4       V P                  V4      # \        P                  P                  P                  V4      pV P                  V4      pV P                  P                  V4       \        V4      ^ 8X  d   \        V4      # \        V4      ^8X  Ed*   \        \        V4      4      p\         P"                  ! W4      p\         P$                  ! WC4      pVe¤   W,
          p\        P                  P                  P                  V4      pV^ 8  d   V P                  V4      # V^ 8X  d   R# V^8w  d   V P                  V4      #  \'        V4      pV^ 8  d   V P                  V4      #  T P                  T4       R2# W,
          p\        P                  P                  P                  V4      pV^ 8X  d	   WC8X  d   R# R# \        V4      ^8”  dO   RpV F:  p\         P"                  ! W4      p\         P$                  ! WC4      pV^8w  g   K8  Rp M	  V'       d   R# R# R#   \(        \*        3 d    T P                  T4      u # i ; i)a  
Convert a sympy index expression to JAX slice notation.

Handles common patterns like:
- stride*var -> ::stride
- stride*var + offset -> offset::stride

For more complex patterns, falls back to explicit indexing.
Uses BlockPatternMatcher for robust pattern matching.
r$  z::1TF)Úrange_treesr,  Úhasr
   r(  r)  r*  r-  r   r  ÚsizevarsÚsimplifyÚlenr"   ÚnextÚiterr   Úget_subexpr_involving_symbolÚmatch_affine_block_exprrÍ  Ú	TypeErrorÚ
ValueError)	r/   r"  Ú	used_varsr4  Úvar_exprÚstrider¦  Ú
offset_valÚall_unit_strides	   &&       r%   r(  Ú"PallasKernel._convert_to_jax_sliceþ  s[  € ð ××ÐÙð ×$Ñ$ UÓ+ˆð �9‰9”_×%Ò%à×Ñ×&Ñ& t×'?Ñ'?ÀÓ'FÔGð —:‘:˜eÓ$Ð$ô —‘× Ñ ×)Ñ)¨%Ó0ˆà×,Ñ,¨UÓ3ˆ	ð 	×Ñ×"Ñ" 9Ô-äˆy‹>˜QÔä�u“:ÐÜ�‹^˜qÕ ä”t˜I“Ó'ˆCô +×GÒGÈÓSˆHô )×@Ò@ÀÓOˆFàÒ!ØÕ)�ÜŸ™×)Ñ)×2Ñ2°6Ó:�à˜A”:ØŸ:™: eÓ,Ð,à˜Q”;Ù ð ˜Q”;ØŸ:™: eÓ,Ð,ð-Ü!$ V£�JØ! A”~Ø#Ÿz™z¨%Ó0Ð0ð &ð
 Ÿ*™* VÓ,Ð-¨SÐ1Ð1ð Õ)�ÜŸ™×)Ñ)×2Ñ2°6Ó:�Ø˜Q”; 8¤?á ñ, ô+ �‹^˜aÔð #ˆOÛ �Ü.×KÒKÈEÓW�Ü,×DÒDÀXÓS�Ø˜Q–;Ø&+�OÙñ !÷ áñ ñ øôA "¤:Ð.ô -ØŸ:™: eÓ,Ò,ð-ús   Æ,"J Ê"J+Ê*J+c               ó    € V ^8„  d   QhRRRR/# r!  r#   )r$   s   "r%   r&   r  b  s   € ÷ ñ ¨Zð ¸Cñ r(   c                óÎ   € VP                   pV P                  4       pW#,          pWB8w  d   \        RV 24      hV P                  P	                  V4       V P                  V4      pV# )a~  
Generate JAX code to compute an index array for strided/complex indexing patterns.

For expressions like `2 * x3 + 32 * x2 + 256 * x1 + 1024 * x0`, we generate
code that computes the flattened index array using broadcasting.

The iteration variables (x0, x1, x2, x3) are already defined as jnp.arange arrays
in the kernel. We just need to convert the sympy expression to JAX code.
z9Pallas backend does not yet support mixed index pattern: )Úfree_symbolsÚ_get_iter_varsrh   r(  r)  r-  )r/   r"  rA  Ú	iter_varsr9  rÕ  s   &&    r%   Ú_generate_strided_indexÚ$PallasKernel._generate_strided_indexb  sr   € ð ×)Ñ)ˆØ×'Ñ'Ó)ˆ	ð !Õ,ˆ	ØÔ$ÜØKÈEÈ7ÐSóð ð
 	×Ñ×"Ñ" 9Ô-ð —J‘J˜uÓ%ˆ	ð Ðr(   c               ó   € V ^8„  d   QhRR/# )r   r!   r   r#   )r$   s   "r%   r&   r  €  s   € ÷ 8ñ 8 
ñ 8r(   c                óH   € \        V P                  P                  4       4      # )z*Get the set of iteration variable symbols.)r   Úrange_tree_nodesÚkeys)r/   s   &r%   rB  ÚPallasKernel._get_iter_vars€  s   € ä˜$×/Ñ/×4Ñ4Ó6Ó7Ð7r(   c               ó    € V ^8„  d   QhRRRR/# )r   r"  r    r!   r   r#   )r$   s   "r%   r&   r  „  s   € ÷ :ñ :¨ð :¸
ñ :r(   c                óD   € VP                   V P                  4       ,          # )z4Get iteration variables used in an index expression.)rA  rB  ©r/   r"  s   &&r%   r*  Ú PallasKernel._get_used_iter_vars„  s   € à×!Ñ! D×$7Ñ$7Ó$9Õ9Ð9r(   c               ó    € V ^8„  d   QhRRRR/# ©r   r"  r    r!   r  r#   )r$   s   "r%   r&   r  ˆ  s   € ÷ 5ñ 5¨ð 5¸ñ 5r(   c                ó6   € \        V P                  V4      4      # )z7Check if index expression contains iteration variables.)r  r*  rM  s   &&r%   Ú_has_iteration_varsÚ PallasKernel._has_iteration_varsˆ  s   € ä�D×,Ñ,¨UÓ3Ó4Ð4r(   c               ó    € V ^8„  d   QhRRRR/# )r   r"  r    r!   zlist[sympy.Symbol]r#   )r$   s   "r%   r&   r  Œ  s   € ÷ Kñ K¨
ð KÐ7Iñ Kr(   c                óˆ   € VP                    Uu. uF'  p\        V4      P                  R4      '       g   K%  VNK)  	  up# u upi )zDGet list of indirect variable symbols (tmp*) in an index expression.Útmp)rA  r"   Ú
startswith)r/   r"  Úss   && r%   Ú_get_indirect_varsÚPallasKernel._get_indirect_varsŒ  s5   € à ×-Ò-ÓJÑ-�a´°Q³×1BÑ1BÀ5×1I—�Ñ-ÑJÐJùÒJs   �"?¶?c               ó    € V ^8„  d   QhRRRR/# rP  r#   )r$   s   "r%   r&   r  �  s   € ÷ 7ñ 7¨
ð 7°tñ 7r(   c                ó<   € \        V P                  V4      4      ^ 8„  # )z6Check if index expression contains indirect variables.)r2  rY  rM  s   &&r%   Ú_has_indirect_varsÚPallasKernel._has_indirect_vars�  s   € ä�4×*Ñ*¨5Ó1Ó2°QÑ6Ð6r(   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r"  r    r¥  r"   r!   z!list[tuple[int, int, int]] | Noner#   )r$   s   "r%   r&   r  ”  s)   € ÷ Iñ IØðIØ'*ðIà	*ñIr(   c                óÌ  € V P                  V4      '       g   VP                  \        4      '       d   R# W P                  9   d   R# V P	                  V4      pVf   R# Vw  rE  pV Uu. uF  q`P                  V4      NK  	  pp\        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       d   R# \        \        \        ,          V4      p\        V4      p	V	^ 8X  d   R# V P                  V4      p
V P                  V4      pV'       g   R# \        V	4       Uu. uF  p^^ .NK	  	  pp/ p\        P                  P                   P#                  V4      pV EF#  p\$        P&                  ! Wï4      p\$        P(                  ! VV4      pVf    R# V P                  V4      pVe   V^ 8:  d    R# Rp\        V	4       FE  pV
V,          ^ 8X  d   K  VV
V,          ,          ^ 8X  g   K*  VV
V,          ,          pV^8¼  g   KC  Tp M	  Vf    R# VV
V,          ,          pV^8  g   VV,          V,          ^ 8w  d    R# VVV,          ^ &   VWß&   \        P                  P                   P#                  VV,
          4      pEK&  	  V P                  V4      pVf   R# V^ 8  d   R# \        V	4       F=  pV
V,          ^ 8”  g   K  VV
V,          ,          VV,          ^&   VV
V,          ,          pK?  	  V^ 8w  d   R# \*        ;QJ d    R V 4       F  '       d   K   RM	  RM! R V 4       4      '       d   R# . p^p\        V	4       F_  pVV,          w  ppVV,          pVV,          pVV,          V,          pVV8¼  d    R# VVV,
          ,          pVP-                  VVV34       Ka  	  V P/                  V4      w  ppVV8w  d   R# VP1                  4        Fz  w  ppWðP2                  9  d    R# V P                  V P2                  V,          P4                  4      pVf    R# VV,          w  p p!p"VV,          V ,          V",
          p#VV#8w  g   Ky   R# 	  V# u upi u upi )aÇ  Decompose a flat index into per-dimension (stride, offset, skip) triples.

Given flat index like ``64*x0 + 2*x1 + 5`` and buffer shape ``(32, 64)``
with C-contiguous strides ``[64, 1]``:
  - x0 coefficient 64 / buffer_stride[0]=64 -> dim 0: stride=1
  - x1 coefficient 2 / buffer_stride[1]=1  -> dim 1: stride=2
  - constant 5: dim 0 gets 5//64=0, dim 1 gets 5//1=5
  - dim 1 offset 5 with stride 2: skip=5//2=2, offset=5%2=1

Returns per-dim ``[(stride, offset, skip), ...]`` where:
  - stride: access stride on this dim (1 = contiguous)
  - offset: static index into the stride dim (0 <= offset < stride)
  - skip: number of stride-blocks to skip at the start of this dim
Returns None if decomposition fails.
Nc              3  óB   "  € T F  qR J ;'       g    V^ 8*  x € K  	  R # 5irf   r#   ©Ú.0rX  s   & r%   Ú	<genexpr>Ú9PallasKernel._decompose_strided_access.<locals>.<genexpr>´  s#   é € Ð>Ñ,= q�Dˆy×"Ð"˜A ™FÔ"Ó,=ùs   ‚‘TFc              3  ó0   "  € T F  w  rV^8H  x € K  	  R# 5i©r9   Nr#   )rc  rX  Ú_s   &  r%   rd  re  ÷  s   é € Ð)¡&™$˜!ˆq�AŽv£&ùs   ‚)r]  r/  r
   r  Ú_get_buffer_infoÚ	_safe_intÚanyr   ÚlistrÍ  r2  Ú_c_contiguous_stridesr*  Úranger   r  r0  r1  r   r5  r6  Úallr
  Ú _compute_output_numel_from_indexÚitemsrH  Úlength)$r/   r"  r¥  r^   rh  Úbuf_sizerX  Úbuf_shape_or_noneÚ	buf_shapeÚndimÚ	c_stridesr9  r>   Ú
var_to_dimÚ	remainingr4  r:  ÚcoeffÚ	coeff_intÚdimÚdÚper_dim_strider<  Ú
decomposedÚoutput_numel_expectedr;  Ú
raw_offsetr¦  ÚskipÚn_blocksÚoutput_numelÚ	var_rangeÚstride_dÚ	_offset_dÚskip_dÚeffective_sizes$   &&&                                 r%   Ú_decompose_strided_accessÚ&PallasKernel._decompose_strided_access”  sõ  € ð$ ×"Ñ" 5×)Ò)¨U¯Y©Y´×-GÒ-GÙð ×/Ñ/Ô/Ùà×$Ñ$ TÓ*ˆØŠ<ÙØ#Ñˆ�Q˜˜1á8@ÓA¹°1Ÿ^™^¨AÖ.¹ÐÐAß‹3Ñ>Ñ,=Ó>�3�3Š3Ñ>Ñ,=Ó>×>Ò>ÙÜ#¤D¬¥IÐ/@ÓAˆ	Ü�9‹~ˆØ�1Œ9Ùà×.Ñ.¨yÓ9ˆ	ð ×,Ñ,¨UÓ3ˆ	ßÙô 49¸´;Ó"?±;¨a A q£6±;ˆÐ"?à.0ˆ
ä—G‘G×$Ñ$×-Ñ-¨eÓ4ˆ	ÜˆCÜ*×GÒGÈ	ÓWˆHÜ'×?Ò?ÀÈ#ÓNˆEØŠ}ÚØŸ™ uÓ-ˆIØÒ  I°¤NÚð ˆCÜ˜4–[�Ø˜Q•< 1Ô$ÙØ˜y¨�|Õ+¨qÖ0Ø%.°)¸Aµ,Õ%>�NØ%¨Ö*Ø˜Ùñ !ð Š{Úà&¨)°C­.Õ8ˆNØ Ô! Y¨s¥^°nÕ%DÈÔ%IÚà+ˆF�3�K˜‰NØ!ˆJ‰OÜŸ™×(Ñ(×1Ñ1°)¸hÕ2FÓG‹Iñ9 ð@ —^‘^ IÓ.ˆ
ØÒÙØ˜Œ>ÙÜ�t–ˆAØ˜�|˜aÖØ)¨Y°q­\Õ9��q•	˜!‘Ø'¨)°A­,Õ6’
ñ ð ˜Œ?Ù÷
 ‹3Ñ)¡&Ó)�3�3Š3Ñ)¡&Ó)×)Ò)Ùð
 24ˆ
Ø !ÐÜ�t–ˆAØ!'¨¥ÑˆF�JØ &Õ(ˆFØ Õ'ˆDØ  •| vÕ-ˆHØ�xÔÚØ! X°¥_Õ4Ð!Ø×Ñ˜v v¨tÐ4Ö5ñ ð ×?Ñ?ÀÓF‰ˆ�aØÐ0Ô0Ùð #×(Ñ(Ö*‰HˆC�Ø×/Ñ/Ô/ÚØŸ™ t×'<Ñ'<¸SÕ'A×'HÑ'HÓIˆIØÒ ÚØ*4°S­/Ñ'ˆH�i Ø& s�^¨xÕ7¸&Õ@ˆNØ˜NÖ*Úñ +ð ÐùòU Bùò  #@s   Á)QÄ(Q!c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úbufr"   Údecompzlist[tuple[int, int, int]]r!   r#   )r$   s   "r%   r&   r     s"   € ÷ 	,ñ 	, ð 	,Ð-Gð 	,ÈCñ 	,r(   c                óÖ   € . pV FK  w  r4pV^8X  d   VP                  R4       K   VP                  R4       VP                  \        V4      4       KM  	  V  RRP                  V4       R2# )z?Build ``buf[:, :, offset]`` for strided dims, ``:`` for others.Ú:Ú[r+   Ú])r
  r"   r'  )r�  rŽ  Úpartsr;  r¦  Ú_skips   &&    r%   Ú_strided_load_exprÚPallasKernel._strided_load_expr  sf   € ð ˆÛ%+Ñ!ˆF˜EØ˜Œ{Ø—‘˜SÖ!à—‘˜SÔ!Ø—‘œS ›[Ö)ñ &,ð ��a˜Ÿ	™	 %Ó(Ð)¨Ð+Ð+r(   c               ó$   € V ^8„  d   QhRRRRRR/# )r   rá  r   Úparamsræ  r!   r  r#   )r$   s   "r%   r&   r  +  s)   € ÷ (Sñ (SØ"ð(SØ,5ð(Sà	ñ(Sr(   c           
     óÀ  € V EFÖ  pV P                  V4      pVe   W@P                  9  d   K+  V P                  V,          pV P                  V4      pVf   KU  Vw  rx  p. p	\        V4       F„  w  p
w  r¼pV P	                  WŠ,          4      pVf    K�  V^8”  d=   V	P                  \        Wë,          4      4       V	P                  \        V4      4       Kj  V	P                  \        V4      4       K†  	  VP                  V RV RRP                  V	4       R24       \        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       g   EKW  . pV FN  w  r¼pV^8X  d   VP                  R	4       K   TP                  V^ 8”  d   V R	2MR	4       VP                  R	4       KP  	  VP                  V RV R
RP                  V4       R24       EKÙ  	  R# )zéEmit reshape + optional slice for strided input parameters.

For each strided param, reshapes ``(M, N)`` to ``(M, N/stride, stride)``
and, when ``skip > 0``, slices off leading blocks so the remaining
elements align with the output.
Nú = ú	.reshape(r+   r,   c              3  ó2   "  € T F  w   rV^ 8„  x € K  	  R# 5i©r   Nr#   )rc  rh  r‚  s   &  r%   rd  Ú9PallasKernel._codegen_strided_reshapes.<locals>.<genexpr>K  s   é € Ð:±'¡J A q�t˜a–x³'ùs   ‚TFr�  r‘  r’  )
Ú_param_to_buf_namer  ri  Ú	enumeraterj  r
  r"   Ú	writeliner'  rk  )r/   rá  r˜  ÚparamÚbuf_nameÚstridesr^   rh  rs  Únew_shape_partsr}  r;  Ú_offsetr”  r|  Úslice_partsr‚  s   &&&              r%   Ú_codegen_strided_reshapesÚ&PallasKernel._codegen_strided_reshapes+  s®  € ô ˆEØ×.Ñ.¨uÓ5ˆHØÒ 8×3MÑ3MÔ#MÙØ×0Ñ0°Õ:ˆGØ×(Ñ(¨Ó2ˆDØŠ|ÙØ#'Ñ ˆA˜˜A˜qØ)+ˆOÜ/8¸Ö/AÑ+�Ñ+�F UØ—n‘n X¥[Ó1�Ø’;ÚØ˜A”:Ø#×*Ñ*¬3¨s­}Ó+=Ô>Ø#×*Ñ*¬3¨v«;Ö7à#×*Ñ*¬3¨s«8Ö4ñ 0Bð —‘Ø�g˜S   y°·±¸?Ó1KÐ0LÈAÐNô÷ “3Ñ:±'Ó:—3—3’3Ñ:±'Ó:×:Õ:Ø-/�KÛ18Ñ-˜¨Ø! Qœ;Ø'×.Ñ.¨sÖ3à'×.Ñ.¸TÀA¼X°$°°q©zÈ3ÔOØ'×.Ñ.¨sÖ3ñ 29ð —N‘N e W¨C°¨w°a¸¿	¹	À+Ó8NÐ7OÈqÐ#Q×Ró? r(   c               ó    € V ^8„  d   QhRRRR/# )r   r  rÍ  r!   úlist[int] | Noner#   )r$   s   "r%   r&   r  V  s   € ÷ ñ ¨Cð Ð4Dñ r(   c                ó*  € \        V RR 4      ! 4       pVf   R# \        VRR4      pVe   \        V4      V8w  d   R# . pV FN  p\        V\        \        P
                  34      '       d   \        V4      MRpVf    R# VP                  V4       KP  	  V# )z5Extract actual output buffer strides from its layout.Ú
get_layoutc                 ó   € R # rf   r#   r#   r(   r%   Ú<lambda>Ú6PallasKernel._get_actual_out_strides.<locals>.<lambda>X  ó   € ¹r(   Nr;  )Úgetattrr2  r  rÍ  r%  ÚIntegerr
  )Úout_bufr  ÚlayoutÚ
stride_rawr¤  rX  Úvs   &&     r%   Ú_get_actual_out_stridesÚ$PallasKernel._get_actual_out_stridesU  s‰   € ô ˜ ,±Ô=Ó?ˆØŠ>ÙÜ˜V X¨tÓ4ˆ
ØÒ¤ Z£°AÔ!5ÙØˆÛˆAÜ$ Q¬¬e¯m©mÐ(<×=Ò=”�A”À4ˆAØŠyÚØ�N‰N˜1Öñ	 ð
 ˆr(   c               ó    € V ^8„  d   QhRRRR/# )r   Úorderedrl  r!   zdict | Noner#   )r$   s   "r%   r&   r  f  s   € ÷  ñ  ¨Tð  °kñ  r(   c                ó°  € / p. pV FT  pV P                   V,          pVP                  pWb9  d   . W&&   VP                  V4       W&,          P                  V4       KV  	  . p\        V4       F  pVP	                  W&,          4       K  	  / p^p	V FB  pV P                  V P                   V,          P                  4      p
V
f    R# W˜V&   Wš,          p	KD  	  V# )aß  Compute store-side linearization coefficients from range tree nesting.

The tree structure encodes the output iteration order: later
trees (prefix ``x``) are innermost, earlier trees (``y``, ``z``)
are outer.  Within a tree, dict order goes inner-to-outer.
The innermost variable gets coefficient 1; each successive
variable (moving outward) multiplies by the previous range.

Returns ``{sympy.Symbol: int}`` mapping each RT var to its store
coefficient, or ``None`` on failure.
N)rH  Úprefixr
  ÚreversedÚextendrj  rr  )r/   r»  Úprefix_groupsÚprefix_orderr·  Únoder1   Úinner_to_outerÚcoeffsrz  Úszs   &&         r%   Ú_compute_store_coeffsÚ"PallasKernel._compute_store_coeffsf  sÕ   € ð *,ˆØ"$ˆÛˆAØ×(Ñ(¨Õ+ˆDØ—‘ˆAØÔ%Ø#%�Ñ Ø×#Ñ# AÔ&ØÕ×#Ñ# AÖ&ñ ð  "ˆÜ˜,Ö'ˆAØ×!Ñ! -Õ"2Ö3ñ (àˆØˆÛˆAØ—‘ × 5Ñ 5°aÕ 8× ?Ñ ?Ó@ˆBØŠzÚØ�1‰IØ�KŠEñ  ð ˆr(   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r¥  r"   r"  r    r!   ztuple[int, ...] | Noner#   )r$   s   "r%   r&   r  ˆ  s)   € ÷ hñ hØðhØ *ðhà	ñhr(   c                óÖ	  € V P                  V4      pV'       g   R# Vw  rE rFV Uu. uF  qpP                  V4      NK  	  pp\        V4      ^8  g   RV9   d   R# \        \        \
        ,          V4      p	V'       g   R# V P                  V4      p
V P                  P                  4        UUu. uF#  w  r{Wz9   g   K  VP                  '       d   K!  VNK%  	  ppp\        V4      \        V	4      8w  Ed‘   \        V	4      p\        V4      ^8X  Eds   V P                  V P                  V^ ,          ,          P                  4      \        P                  ! V	4      8X  Ed&   V P                  V	4      pV P                   EF  p\        P                   P#                  V4      pVf   K)  VP%                  4        Uu. uF  qpP                  V4      NK  	  pp\&        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       g   \        V4      V8w  d   K¢  V P)                  VV4      pVf    R# V P+                  VV4      pVf    R# \	        V4      \	        \-        V4      4      8X  d    R# \/        V4      u # 	  R# V Uu. uF<  pV P1                  \        P                   P2                  P5                  V4      V4      NK>  	  pp\6        ;QJ d    R V 4       F  '       d   K   RM	  RM! R V 4       4      '       g   R# \        \        \
        ,          V4      p\        V4      pV P                  V	4      pV P9                  V4      pVEew   V P                   EFe  p\        P                   P#                  V4      pVf   K)  VP%                  4        Uu. uF  qpP                  V4      NK  	  pp\&        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       g   \        V4      V8w  d   K¢  V P)                  VV4      pVe®   T P+                  V Uu. uF  pVV,          NK  	  upV4      pV P+                  \	        V4      V4      pVef   Veb   ^ .V,          p\-        V4       F  pVV,          VVV,          &   K  	  \	        V4      \	        \-        V4      4      8X  d    R# \/        V4      u #  R# 	  R# u upi u uppi u upi u upi u upi u upi )aº  Return permutation for a full-array load, or None.

Computes the permutation by mapping each range-tree variable to
both an output dimension (via store coefficients + actual output
strides) and an input dimension (via load coefficients + input
C-contiguous strides).  The permutation is then:

    perm[out_dim] = in_dim   for each RT variable

Using actual output strides (not C-contiguous) is critical: the
scheduler may choose a non-standard output layout (e.g. column-
major) to optimise for transposed inputs.

When all dimensions collapse to a single flat RT variable (e.g.
(2,2,2,2,2) with all dims size 2), infers the permutation
directly from output strides vs input C-contiguous strides.
Nc              3  ó(   "  € T F  qR J x € K
  	  R # 5irf   r#   rb  s   & r%   rd  Ú:PallasKernel._get_full_load_permutation.<locals>.<genexpr>½  s   é € Ð8©i¨ �9«iùó   ‚TFc              3  ó\   "  € T F"  p\        V\        4      ;'       d    V^ 8„  x € K$  	  R# 5ir�  ©r  rÍ  ©rc  r0   s   & r%   rd  rË  Ï  s&   é € ÐD¹°A”:˜a¤Ó%×/Ð/¨!¨a©%Ô/»ùó   ‚,ž,c              3  ó(   "  € T F  qR J x € K
  	  R # 5irf   r#   rb  s   & r%   rd  rË  Þ  s   é € Ð4©) Q˜D•y«)ùrÌ  )ri  rj  r2  r   rl  rÍ  r*  rH  rq  Úis_reductionrr  r  Úprodrm  r  r   r  Ú
get_bufferÚget_sizerk  r¸  Ú_map_coeffs_to_dimsrn  rË  Ú_get_index_coefficientr0  r1  ro  rÆ  )r/   r¥  r"  r^   rh  rs  Úis_contiguousrX  Úin_shape_rawÚin_shapeÚ	iter_usedÚer»  r  Ú
in_stridesÚout_namer´  Ú	out_shapeÚactualÚpermr·  Ú
coeffs_rawrÄ  Ústore_coeffsÚ	rt_to_outÚrt_to_inÚks   &&&                        r%   Ú_get_full_load_permutationÚ'PallasKernel._get_full_load_permutationˆ  s'  € ð( ×$Ñ$ TÓ*ˆßÙØ+/Ñ(ˆ�Q˜Ù3;Ó<±8¨aŸ™ qÖ)±8ˆÐ<Üˆ|Ó˜qÔ  D¨LÔ$8ÙÜ"¤4¬¥9¨lÓ;ˆßÙð ×,Ñ,¨UÓ3ˆ	ð ×-Ñ-×3Ñ3Ô5ô
á5‘�Ø‰~ô à&'§n¥n÷ ˆAÙ5ð 	ñ 
ô
 ˆw‹<œ3˜x›=Õ(ô
 �H“ˆAÜ�7‹|˜qÕ  T§^¡^Ø×%Ñ% g¨a¥jÕ1×8Ñ8ó&ä—’˜8Ó$õ&%ð "×7Ñ7¸ÓA�
Ø $× 9Õ 9�HÜŸg™g×0Ñ0°Ó:�GØ’Ù Ø<C×<LÑ<LÔ<NÓ OÑ<N°q§¡°Ö!2Ñ<N�IÐ Oß“sÑ8©iÓ8—s—s’sÑ8©iÓ8×8Ò8¼CÀ	»NÈaÔ<OÙ Ø!×9Ñ9¸'À1ÓE�FØ’~Øñ ð  ×3Ñ3°F¸JÓG�DØ’|Øñ ô ˜D“z¤T¬%°«(£^Ô3Ú#Ü  ›;Ò&ñ# !:ñ$ ñ ó
á�ð ×'Ñ'¬¯©×(8Ñ(8×(AÑ(AÀ%Ó(HÈ!ÖLÙð 	ð 
÷ ‹sÑD¹ÓD�s�sŠsÑD¹ÓD×DÒDÙÜ ¤¤c¥¨JÓ7ˆä�‹LˆØ×/Ñ/°Ó9ˆ
Ø×1Ñ1°'Ó:ˆð Ó#Ø ×5Õ5�ÜŸ'™'×,Ñ,¨XÓ6�Ø’?ÙØ8?×8HÑ8HÔ8JÓKÑ8J°1Ÿ^™^¨AÖ.Ñ8J�	ÐKß“3Ñ4©)Ó4—3—3’3Ñ4©)Ó4×4Ò4¼¸I»È!Ô8KÙà×5Ñ5°g¸qÓA�ØÒ%Ø $× 8Ñ 8Ù29Ó:±'¨Q˜ aŸ˜±'Ñ:¸Fó!�Ið  $×7Ñ7¼¸V»ÀjÓQ�HØ Ò,°Ò1EØ !˜s Q�w˜Ü!& q¦˜AØ19¸!µ˜D ¨1¥Ó.ñ "*ä ›:¬¬e°A«h«Ô7Ú#'Ü$ T›{Ò*Øáñ/ 6ñ. ùòa =ùó
ùò& !Pùò
ùò$ Lùò ;s0   ¦SÂ-
SÂ<SÃSÆ4SÊASÎS!Ð'S&
c               ó$   € V ^8„  d   QhRRRRRR/# )r   r¥  r"   r"  r    r!   z.tuple[tuple[int, ...], tuple[int, ...]] | Noner#   )r$   s   "r%   r&   r  ò  s)   € ÷ rñ rØðrØ *ðrà	7ñrr(   c                óT
  € V P                  V4      pV'       g   R# Vw  rE rFV Uu. uF  qpP                  V4      NK  	  pp\        V4      ^8  g   RV9   d   R# \        \        \
        ,          V4      p	V'       g   R# V P                  V4      p
V P                  P                  4        UUu. uF#  w  r{Wz9   g   K  VP                  '       d   K!  VNK%  	  ppp\        V4      pV^8  g   V\        V	4      8¼  d   R# V Uu. uF.  qàP                  V P                  V,          P                  4      NK0  	  ppRV9   d   R# \        \        \
        ,          V4      p\        P                  ! V4      \        P                  ! V	4      8w  d   R# V P                  V	V4      pVf   R# ^ .V,          p^p\        V^,
          RR4       F  pVVV&   VVV,          ,          pK  	  \        P                   P"                  P%                  V4      pV Uu. uF  qàP'                  VV4      NK  	  pp\(        ;QJ d    R V 4       F  '       d   K   RM	  RM! R V 4       4      '       g   R# \        \        \
        ,          V4      p\+        V4       UUu/ uF  w  pqwVbK
  	  ppp. pV F,  pVP-                  V4      pVf    R# VP/                  V4       K.  	  V P1                  V4      pVf   R# V P2                   EF  p\        P                   P5                  V4      pVf   K)  VP7                  4        Uu. uF  qpP                  V4      NK  	  pp\8        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       g   \        V4      ^8  d   K¢  \        \        \
        ,          V4      p \        P                  ! V 4      \        P                  ! V	4      8w  d   Kî  V P                  V \	        V4      4      p!V!f   EK  ^ .V,          p"^p\        V^,
          RR4       F  pVV"V&   VV!V,          ,          pK  	  \+        V"4       U#Uu/ uF  w  p#qwV#bK
  	  p$p#p. p%V F4  pV$P-                  VV,          4      p#V#f     R# V%P/                  V#4       K6  	  ^ .V,          p&\        V4       F  p'VV',          V&V%V',          &   K  	  V&\	        \        V4      4      8X  d    R# \;        V4      \;        V&4      3u # 	  R# u upi u uppi u upi u upi u uppi u upi u upp#i )a“  Handle permutation when range tree has collapsed dimensions.

When simplify_and_reorder merges contiguous dims, the range tree
has fewer variables than the buffer's rank.  This method detects
the permutation in the collapsed space and returns
(collapsed_input_shape, perm) so the caller can generate:
    jnp.permute_dims(load.reshape(collapsed_shape), perm)

Uses index coefficients on both sides: load-index coefficients
map vars to collapsed input dims, and store-side coefficients
(derived from the range tree nesting) map vars to collapsed
output dims.  Both sets of strides are always unique, so
matching is unambiguous even with duplicate group sizes.
Nc              3  ó\   "  € T F"  p\        V\        4      ;'       d    V^ 8„  x € K$  	  R# 5ir�  rÎ  rÏ  s   & r%   rd  Ú?PallasKernel._get_collapsed_load_permutation.<locals>.<genexpr>/  s&   é € ÐG¹°A”:˜a¤Ó%×/Ð/¨!¨a©%Ô/»ùrÐ  FTc              3  ó(   "  € T F  qR J x € K
  	  R # 5irf   r#   rb  s   & r%   rd  rì  E  s   é € Ð4¡m ˜•9£mùrÌ  éÿÿÿÿ)ri  rj  r2  r   rl  rÍ  r*  rH  rq  rÒ  rr  r  rÓ  Ú_group_dims_to_rangesrn  r   r  r0  r1  r×  ro  r   Úgetr
  rÆ  r  rÔ  rÕ  rk  rË  )(r/   r¥  r"  r^   rh  rs  rØ  rX  rÙ  rÚ  rÛ  rÜ  r»  r  r·  Ú
ranges_rawÚrangesÚ	in_groupsÚcollapsed_in_stridesr;  ÚiÚ
simplifiedÚin_coeffs_rawÚ	in_coeffsÚin_stride_to_dimÚvar_to_in_dimrz  r|  rã  rÞ  r´  Úout_shape_rawrß  Ú
out_groupsÚcollapsed_out_stridesÚjÚout_stride_to_dimÚvar_to_out_dimrá  ræ  s(   &&&                                     r%   Ú_get_collapsed_load_permutationÚ,PallasKernel._get_collapsed_load_permutationò  s�  € ð" ×$Ñ$ TÓ*ˆßÙØ+/Ñ(ˆ�Q˜Ù3;Ó<±8¨aŸ™ qÖ)±8ˆÐ<Üˆ|Ó˜qÔ  D¨LÔ$8ÙÜ"¤4¬¥9¨lÓ;ˆßÙà×,Ñ,¨UÓ3ˆ	ð ×-Ñ-×3Ñ3Ô5ô
á5‘�Ø‰~ô à&'§n¥n÷ ˆAÙ5ð 	ñ 
ô
 �‹LˆØˆqŒ5�Aœ˜X›Ô&ÙÙOVÓWÉwÈ!—n‘n T×%:Ñ%:¸1Õ%=×%DÑ%DÖEÉwˆ
ÐWØ�:ÔÙÜ ¤¤c¥¨JÓ7ˆÜ�9Š9�VÓ¤§	¢	¨(Ó 3Ô3Ùð ×.Ñ.¨x¸Ó@ˆ	ØÒÙð !"˜s Q�wÐØˆÜ�q˜1•u˜b "Ö%ˆAØ&,Ð  Ñ#Ø�i •lÕ"ŠFñ &ô —W‘W×%Ñ%×.Ñ.¨uÓ5ˆ
ÙMTÓUÉWÈ×4Ñ4°ZÀÖCÉWˆÐUß‹sÑG¹ÓG�s�sŠsÑG¹ÓG×GÒGÙÜ#¤D¬¥I¨}Ó=ˆ	ä-6Ð7KÔ-LÔMÑ-L¡T Q¨˜qšDÑ-LÐÑMØˆÛˆEØ"×&Ñ& uÓ-ˆCØŠ{ÚØ× Ñ  Ö%ñ	 ð ×1Ñ1°'Ó:ˆØÒÙð ×1Õ1ˆHÜ—g‘g×(Ñ(¨Ó2ˆGØŠÙØ8?×8HÑ8HÔ8JÓKÑ8J°1Ÿ^™^¨AÖ.Ñ8JˆMÐKß‹sÑ4¡mÓ4�s�sŠsÑ4¡mÓ4×4Ò4¼¸MÓ8JÈQÔ8NÙÜ#'¬¬S­	°=Ó#AˆIÜ�yŠy˜Ó#¤t§y¢y°Ó':Ô:ÙØ×3Ñ3°I¼tÀI»ÓOˆJØÒ!Úð &' C¨!¥GÐ!ØˆFÜ˜1˜q�5 " bÖ)�Ø+1Ð% aÑ(Ø˜* Q�-Õ'’ñ *ô 3<Ð<QÔ2RÔ SÑ2R©$¨!¨Q A¢Ñ2RÐÑ SØˆNÛ�Ø%×)Ñ)¨,°q­/Ó:�Ø’9ÛØ×%Ñ% aÖ(ñ	 ð �3˜•7ˆDÜ˜1–X�Ø*7¸Õ*:��^ AÕ&Ó'ñ à”tœE !›H“~Ô%ÚÜ˜)Ó$¤e¨D£kÐ2Ò2ñG 2ñH ùò{ =ùó
ùò Xùò. Vùó
 Nùò" Lùó" !Ts5   ¦TÂ-
T	Â<T	ÃT	Ä4TÈTÊTÌ1TÑT$c               ó$   € V ^8„  d   QhRRRRRR/# )r   Údimsró  rò  r!   r«  r#   )r$   s   "r%   r&   r  g  s"   € ÷ ñ  Ið °yð ÐEUñ r(   c                ó\  € \        V4      p. p^p\        \        V 4      ^,
          RR4       FH  pW@V,          ,          p VP                  V4      pTP                  T4       TP                  T4       ^pKJ  	  V^8w  g	   V'       d   R# VP                  4        V#   \         d     K}  i ; i)z…Group consecutive dims (right-to-left) to match range values.

Returns collapsed shape (left-to-right) or None if no valid grouping.
Nrî  )rl  rn  r2  r"  r8  r
  ÚpopÚreverse)r  rò  Ú	availableÚgroupsÚproductrõ  rÙ  s   &&     r%   rï  Ú"PallasKernel._group_dims_to_rangesf  s¡   € ô ˜“Lˆ	ØˆØˆÜ”s˜4“y 1•} b¨"Ö-ˆAØ˜A•wÕˆGðØ—o‘o gÓ.�ð �M‰M˜'Ô"Ø�M‰M˜#ÔØŠGñ .ð �aŒ<Ÿ9ÙØ�‰ÔØˆøô ô Úðús   Á BÂB+Â*B+c               ó    € V ^8„  d   QhRRRR/# )r   r"  r    r!   rÔ  r#   )r$   s   "r%   r&   r  }  s   € ÷ Uñ U Zð U°Oñ Ur(   c                óÞ  € V P                  V4      pV P                  V4      pV'       d%   V'       d   \        V P                  V4      RR7      # V'       d   \        V P	                  V4      RR7      # V P                  V4      pVP                  \        4      ;'       d    VR8g  pV'       g6   VR8w  d/   RV9   g(   VP                  R4      P                  4       '       g   Rp\        WER7      # )z@Get the index expression string and whether it needs flattening.T©rÕ  rÖ  Fr$  ú::Ú-)
r]  rR  rÔ  Ú_handle_mixed_indexingr-  r*  r/  r
   ÚlstripÚisdigit)r/   r"  Úhas_indirectÚhas_iter_varsrÕ  rÖ  s   &&    r%   Ú_get_index_exprÚPallasKernel._get_index_expr}  sÉ   € à×.Ñ.¨uÓ5ˆØ×0Ñ0°Ó7ˆçŸMÜ"Ø×5Ñ5°eÓ<ÈDôð ÷ Ü"¨T¯Z©Z¸Ó->ÈeÔTÐTà×+Ñ+¨EÓ2ˆIð "ŸI™I¤oÓ6×MÐM¸9ÈÑ;MˆM÷ ! Y°%Ô%7à 	Ô)¨Y×-=Ñ-=¸cÓ-B×-JÑ-J×-LÒ-LØ$(�MÜ"¨YÔTÐTr(   c               ó    € V ^8„  d   QhRRRR/# )r   r?  r   r!   rÝ  r#   )r$   s   "r%   r&   r  –  s   € ÷ ñ �sð ˜zñ r(   c                óJ   €  \        V 4      #   \        \        3 d     R# i ; i)z0Convert value to int, returning None on failure.N)rÍ  r7  r8  )r?  s   &r%   rj  ÚPallasKernel._safe_int•  s'   € ð	Ü�s“8ˆOøÜœ:Ð&ô 	Úð	ús   ‚
 �"¡"c               ó    € V ^8„  d   QhRRRR/# )r   Úshaperó  r!   r#   )r$   s   "r%   r&   r  ž  s   € ÷ ñ  Yð °9ñ r(   c                ó°   € \        V 4      p^.V,          p\        V^,
          RR4       F(  pW#^,           ,          W^,           ,          ,          W#&   K*  	  V# )z0Return C-contiguous strides for the given shape.rî  )r2  rn  )r  r  r¤  rõ  s   &   r%   rm  Ú"PallasKernel._c_contiguous_strides�  sL   € ô �‹JˆØ�#˜•'ˆÜ�q˜1•u˜b "Ö%ˆAØ  Q¥�¨%°Aµ­,Õ6ˆG‹Jñ &àˆr(   c               ó$   € V ^8„  d   QhRRRRRR/# )r   rÄ  ró  r¤  r!   r«  r#   )r$   s   "r%   r&   r  §  s"   € ÷ ñ  Ið ¸	ð ÐFVñ r(   c                óü   € / p\        V4       F  w  r4WB9   d    R# W2V&   K  	  . pV  F,  pVP                  V4      pVf    R# VP                  V4       K.  	  \        \	        V4      4      \        V 4      8w  d   R# V# )zÂMap coefficient values to dimension indices via stride matching.

Returns a list where entry k is the dimension whose stride equals
coeffs[k], or None if the mapping is ambiguous or incomplete.
N)r   rð  r
  r2  r   )rÄ  r¤  Ústride_to_dimr}  rX  Úmappingr0   s   &&     r%   rÖ  Ú PallasKernel._map_coeffs_to_dims¦  s€   € ð )+ˆÜ˜gÖ&‰DˆAØÔ!ÚØ ˜!Óñ 'ð  ˆÛˆAØ×!Ñ! !Ó$ˆAØŠyÚØ�N‰N˜1Öñ	 ô
 Œz˜'Ó"Ó#¤s¨6£{Ô2ÙØˆr(   c               ó    € V ^8„  d   QhRRRR/# )r   Úctxrà  r!   ztuple[bool, bool]r#   )r$   s   "r%   r&   r  ¼  s   € ÷ &ñ &¨/ð &Ð>Oñ &r(   c                ó  € RpVP                   P                  4        Fi  p\        P                  P	                  V4      pVf   RpK*  VP                  4        F+  pV P                  V4      pV^ 8X  d	   RV3u u # Ve   K)  RpK-  	  Kk  	  RV3# )z9Return whether an output has a zero or unknown dimension.FT)rë  Úvaluesr   r  Útry_get_bufferrÕ  rj  )r/   r%  Úhas_unknown_dimr£  r�  r|  Údim_ints   &&     r%   Ú_zero_dim_output_flagsÚ#PallasKernel._zero_dim_output_flags¼  sˆ   € àˆØ×0Ñ0×7Ñ7Ö9ˆHÜ—'‘'×(Ñ(¨Ó2ˆCØŠ{Ø"&�ÙØ—|‘|–~�ØŸ.™.¨Ó-�Ø˜a”<Ø Ð0Ô0Ø”?Ø&*’Oó &ñ :ð �oÐ%Ð%r(   c               ó   € V ^8„  d   QhRR/# )r   r!   útuple[int, ...]r#   )r$   s   "r%   r&   r  Ì  s   € ÷ dñ d _ñ dr(   c                ó´	  aaaaa€ V P                   '       g   R
# V P                  P                  4        UUu. uF  w  rVP                  '       g   K  VNK  	  pppV P                  P                  4        UUu. uF  w  rVP                  '       d   K  VNK  	  pppV'       d	   V'       g   R
# V P	                  4       pV'       d   V^8:  d   R
# V P                   P                  4        EF4  w  rgV P                  V4      pVf   K  Vw  ršr›p	\        V
4      oS^8  d   K7  V Uu. uF  qÀP                  V4      NK  	  pp\        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       d   K’  \        \        \        ,          V4      oTpV F  pVP                  V^ 4      pK  	  \        4       o\        P                  P!                  V4       F[  pVP"                  '       d   K  VP%                  4       w  pp	V P                  V4      pVf   KA  V^ 8”  g   KJ  SP'                  V4       K]  	  S'       g   EK]  \)        VV3R l\+        S4       4       4      pV'       g   EK‡  \        S4      ^8”  dc   \        S4      \        V4      8X  dG   \        V4      ^8”  d7   \,        ;QJ d    . V3R lV 4       F  NK  	  5u # ! V3R lV 4       4      u # EKù  \/        \1        S4      4      oV^,
          S,          o\2        ;QJ d/    V3R l\+        S^,
          4       4       F  '       d   K   RM$	  RM ! V3R l\+        S^,
          4       4       4      pV'       dP   VR	,          pTpV^ 8”  d!   SSV^,
          ,          8”  d   V^,          pK'  \        \+        VV^,           4      4      pM3\)        VVV3R l\+        S4       4       4      pV'       g   \        V4      p\,        ;QJ d    . V3R lV 4       F  NK  	  5u # ! V3R lV 4       4      u # 	  \/        \1        V P                   P5                  4       4      4      pVP7                  V^ ,          4      pV^ 8w  d   V P                  V4      M^oSf   ^oVP7                  V^ ,          4      pV^ 8w  d   V P                  V4      M^pVf   ^pSV8”  d   R# R
# u uppi u uppi u upi )a8  Determine which axes of the loaded array are reduction axes.

Finds the innermost reduction stride from the load index
expression, then walks outward through the buffer's dims
using stride ratios until the accumulated product reaches
red_numel.  Falls back to stride-direction analysis for
gather/flatten loads.
c              3  ó(   "  € T F  qR J x € K
  	  R # 5irf   r#   rb  s   & r%   rd  Ú3PallasKernel._get_reduction_axes.<locals>.<genexpr>ê  s   é € Ð6¡o ˜•9£oùrÌ  TFc              3  óH   <"  € T F  pSV,          S9   g   K  Vx € K  	  R # 5irf   r#   )rc  rõ  Úr_coeffsr¤  s   & €€r%   rd  r1  ÿ  s   øé € Ð@™I�q¨°­°xÑ)?—’›Iùs   ƒ"˜
"c              3  ó4   <"  € T F  qS,
          x € K  	  R # 5irf   r#   ©rc  rõ  Únds   & €r%   rd  r1  	  s   øé € Ð 9±¨A R§¢³ùó   ƒc              3  óX   <"  € T F  pSV,          SV^,           ,          8„  x € K!  	  R# 5irg  r#   )rc  rõ  r¤  s   & €r%   rd  r1    s"   øé € ÐSÁ]À ¨¥
¨W°Q¸µU­^Ö ;Ã]ùs   ƒ'*c              3  óv   <"  € T F.  pSSV,          8:  g   K  SV,          SS,           8  g   K*  Vx € K0  	  R # 5irf   r#   )rc  rõ  Úr_strideÚspanr¤  s   & €€€r%   rd  r1    s;   øé € ð á&˜Ø 7¨1¥:Ñ-ô à29¸!µ*¸tÀh½Ñ2N÷ ’AÛ&ùs   ƒ9˜9¯
9c              3  ó4   <"  € T F  qS,
          x € K  	  R # 5irf   r#   r5  s   & €r%   rd  r1  "  s   øé € Ð.© A˜RŸš«ùr7  rî  )rî  ©r   )rÿ  rH  rq  rÒ  Ú_compute_reduction_numelri  r2  rj  rk  r   rl  rÍ  Úsubsr   r%  ÚAddÚ	make_argsÚ	is_numberÚas_coeff_MulÚaddÚsortedrn  rË  r3  r4  ro  r'  rz  ) r/   r·  rÜ  Úr_varsÚpw_varsÚ	red_numelr£  Ú
load_indexr^   rh  rs  Úactual_stridesrX  Ústrides_or_noneÚr_onlyÚpvÚtermrz  r0   ÚmatchedrØ  ÚinnerÚstartÚaxesÚr_coeffÚpw_coeffÚ	pw_strider6  r3  r:  r;  r¤  s    &                          @@@@@r%   Ú_get_reduction_axesÚ PallasKernel._get_reduction_axesÌ  sÆ  ü€ ð ×$×$Ð$ØˆLà $× 5Ñ 5× ;Ñ ;Ô =ÔPÑ =™˜ÀÇÅ—!�!Ñ =ˆÑPØ!%×!6Ñ!6×!<Ñ!<Ô!>ÔUÑ!>™˜ÀaÇnÅn—1�1Ñ!>ˆÑUßŸWØˆLà×1Ñ1Ó3ˆ	ß˜I¨œNØˆLà$(×$9Ñ$9×$?Ñ$?×$AÑ ˆHØ×(Ñ(¨Ó2ˆDØŠ|ÙØ04Ñ-ˆA˜¨AÜ�X“ˆBØ�AŒvÙÙ:HÓI¹.°QŸ~™~¨aÖ0¹.ˆOÐIß‹sÑ6¡oÓ6�s�sŠsÑ6¡oÓ6×6Ò6ÙÜ!%¤d¬3¥i°Ó!AˆGð  ˆFÛ�ØŸ™ R¨Ó+’ñ ä(2«ˆHÜŸ	™	×+Ñ+¨FÖ3�Ø—>—>�>ÙØ×,Ñ,Ó.‘��qØ—N‘N 5Ó)�Ø”= Q¨¦UØ—L‘L –Oñ 4÷ Úô Ý@œE "œIÓ@óˆG÷ Úô
 �8‹}˜qÔ Ü�x“=¤C¨£LÔ0´S¸³[À1´_ß œ5Ô 9±Ó 9Ÿ5Ò9˜5Ô 9±Ó 9Ó9Ò9Úô œD ›NÓ+ˆHØ •M XÕ-ˆDß›CÔSÄUÈ2ÐPQÍ6Ä]ÓSŸCŸCšCÔSÄUÈ2ÐPQÍ6Ä]ÓSÓSˆMßà ��Ø�Ø˜a”i D¨7°5¸1µ9Õ+=Ô$=Ø˜Q•J’EÜœE %¨°­Ó3Ó4‘ô ö ä" 2œYóó �÷
 Ü ›=�Dß”5Ô.©Ó.—5Ò.�5Ô.©Ó.Ó.Ò.ñC %BôH œ$˜t×4Ñ4×;Ñ;Ó=Ó>Ó?ˆ
Ø×"Ñ" 6¨!¥9Ó-ˆØ.5¸¬l�4—>‘> 'Ô*ÀˆØÒØˆHØ×#Ñ# G¨A¥JÓ/ˆØ08¸A´�D—N‘N 8Ô,À1ˆ	ØÒØˆIØ�iÔØˆKØˆùóq QùÛUùò  Js   ·S	ÁS	Á8SÂSÄ$Sc               ó    € V ^8„  d   QhRRRR/# )r   Úprefixesr   r!   rÝ  r#   )r$   s   "r%   r&   r  2  s   € ÷ 	ñ 	¨jð 	¸Zñ 	r(   c                ó¢   € ^pV FF  pW0P                   9   g   K  V P                  V P                   V,          4      pVf    R# W$,          pKH  	  V# )zBCompute total numel for given prefixes (e.g., pointwise prefixes).N)Únumelsrj  )r/   rY  r>   r1   Únumels   &&   r%   Ú_compute_prefix_numelÚ"PallasKernel._compute_prefix_numel2  sG   € àˆÛˆAØ—K‘KÖØŸ™ t§{¡{°1¥~Ó6�Ø’=ÚØ•’ñ ð ˆr(   c               ó   € V ^8„  d   QhRR/# )r   r!   rÝ  r#   )r$   s   "r%   r&   r  =  s   € ÷ 	ñ 	¨*ñ 	r(   c                ó¬   € ^pV P                    FA  pVP                  '       g   K  V P                  VP                  4      pVf    R# W,          pKC  	  V# )zCompute total reduction numel.N)r.  rÒ  rj  r\  )r/   r>   Útreer\  s   &   r%   r>  Ú%PallasKernel._compute_reduction_numel=  sK   € àˆØ×$Ô$ˆDØ× × Ò ØŸ™ t§z¡zÓ2�Ø’=ÚØ•’ñ %ð ˆr(   c               ó   € V ^8„  d   QhRR/# ©r   r!   r  r#   )r$   s   "r%   r&   r  H  s   € ÷ Cñ C tñ Cr(   c                ó2  a € S P                   '       d   R# S P                  4       pVe
   V^8”  d   R# . pS P                  P                   F§  pS P	                  V4      pVf    R# Vw  rVrxp	V	'       g    R# \        VRR 4      ! 4       p
V
e   ^ RIpW«P                  8X  d    R# \        ;QJ d    . V 3R lV 4       F  NK  	  5M! V 3R lV 4       4      pRV9   d    R# VP                  V4       K©  	  V'       d   \        \        V4      4      ^8”  d   R# V'       dw   ^pV^ ,           F  pWÞ,          pK  	  ^pS P                   FB  pVP                  '       d   K  S P                  VP                  4      pVf    R# VV,          pKD  	  Wý8w  d   R# R# )aV  
Check if TMA (Tensor Memory Accelerator) approach can be used.
TMA works for simple element-wise ops but not for:
- Reductions (need different accumulation patterns)
  TODO: TMA supports float64 for loading but not for reductions
- Broadcasting (inputs have different shapes or output differs)
- Non-contiguous tensors (strided, transposed)
FNÚ	get_dtypec                 ó   € R # rf   r#   r#   r(   r%   r¯  Ú4PallasKernel._can_use_tma_approach.<locals>.<lambda>h  s   € ¹dr(   c              3  óF   <"  € T F  pSP                  V4      x € K  	  R # 5irf   ©rj  ©rc  rX  r/   s   & €r%   rd  Ú5PallasKernel._can_use_tma_approach.<locals>.<genexpr>p  s   øé € ÐD¹8°a §¡¨q× 1Ð 1»8ùs   ƒ!T)r  r>  r.   Úinput_buffersri  r²  r  Úfloat64rË  r
  r2  r   r.  rÒ  rj  r\  )r/   Úreduction_numelÚinput_shapesr¥  r^   Úbuf_objrs  Ú	buf_numelrJ  rØ  Ú	buf_dtyper  Úshape_tupleÚinput_numelrX  r„  ra  r\  s   f                 r%   Ú_can_use_tma_approachÚ"PallasKernel._can_use_tma_approachH  sk  ø€ ð ×&×&Ð&Ùð ×7Ñ7Ó9ˆØÒ&¨?¸QÔ+>Ùð %'ˆØ—I‘I×+Ô+ˆDØ×(Ñ(¨Ó.ˆDØŠ|ÚØJNÑGˆG˜y¸-ß Úô
   ¨±lÔCÓEˆIØÒ$Ûà§¡Ô-Ú ÷  œ%ÔD¹8ÓDŸ%™%ÔD¹8ÓDÓDˆKØ�{Ô"ÚØ×Ñ Ö,ñ- ,÷2 œC¤
¨<Ó 8Ó9¸AÔ=Ù÷ ØˆKØ! !—_�_�ØÕ ’ñ %ð ˆLØ×(Ô(�Ø×(×(Ò(Ø ŸN™N¨4¯:©:Ó6�EØ’}Ú$Ø  EÕ)’Lñ )ð Ô*Ùár(   c               ó    € V ^8„  d   QhRRRR/# )r   r¥  r"   r!   z'tuple[Any, Any, Any, list, bool] | Noner#   )r$   s   "r%   r&   r  �  s   € ÷ (Kñ (K Sð (KÐ-Tñ (Kr(   c                óê  € \         P                  P                  V4      pVf   R# VP                  4       p^pV F"  pV P	                  V4      pYFe   TMT,          pK$  	  . pRp\        VRR 4      ! 4       p	V	'       d   \        V	RR4      MRp
V
eß   \        \        V4      4       F+  pV P	                  W«,          4      pVP                  V4       K-  	  \        V4      ^8X  d   V^ ,          e   V^ ,          ^8w  d   RpMo\        V4      ^8”  d`   ^p\        \        V4      ^,
          RR4       F<  pW{,          pVe   WÍ8w  d   RpV P	                  W;,          4      pVf   K4  WÞ,          pK>  	  W#WGV3# )z~Get buffer metadata (buf_obj, buf_size, buf_numel, actual_strides, is_contiguous).

Returns None if the buffer doesn't exist.
NTr­  c                 ó   € R # rf   r#   r#   r(   r%   r¯  Ú/PallasKernel._get_buffer_info.<locals>.<lambda>Ÿ  r±  r(   r;  Frî  )	r   r  rÔ  rÕ  rj  r²  rn  r2  r
  )r/   r¥  rq  rs  rr  rX  ÚsvalrJ  rØ  rµ  Ú
buf_striderõ  Úactual_strideÚexpected_strideÚdim_sizes   &&             r%   ri  ÚPallasKernel._get_buffer_info�  s]  € ô
 —'‘'×$Ñ$ TÓ*ˆØŠ?ÙØ×#Ñ#Ó%ˆØˆ	ÛˆAØ—>‘> !Ó$ˆDØÒ!1™°qÕ8ŠIñ ð
  "ˆØˆä˜ ,±Ô=Ó?ˆß8>”W˜V X¨tÔ4ÀDˆ
àÒ!Üœ3˜x›=Ö)�Ø $§¡¨z­}Ó =�Ø×%Ñ% mÖ4ñ *ô
 �8‹} Ô!Ø! !Õ$Ò0°^ÀAÕ5FÈ!Ô5KØ$)�MøÜ�X“ Ô"Ø"#�Üœs 8›}¨qÕ0°"°bÖ9�AØ$2Õ$5�MØ$Ò,°Ô0PØ(-˜Ø#Ÿ~™~¨h­kÓ:�HØÔ+Ø'Õ3šñ :ð  )¸]ÐJÐJr(   c               ó    € V ^8„  d   QhRRRR/# )r   r"  r    r!   ztuple[int, OrderedSet]r#   )r$   s   "r%   r&   r  ·  s   € ÷ 'ñ 'Øð'à	ñ'r(   c                ó  € V P                  V4      p. pV FZ  pW@P                  9   g   K  V P                  V,          pV P                  VP                  4      pVf   KI  VP	                  V4       K\  	  ^pV F  pWx,          pK  	  Wr3# )zNCompute expected output numel and used vars from iteration variables in index.)r*  rH  rj  rr  r
  )	r/   r"  r9  Úused_range_lengthsr4  rÜ  rÞ  r„  Úls	   &&       r%   rp  Ú-PallasKernel._compute_output_numel_from_index·  sŠ   € ð ×,Ñ,¨UÓ3ˆ	àÐÛˆCØ×+Ñ+Ö+Ø×-Ñ-¨cÕ2�Ø!Ÿ^™^¨E¯L©LÓ9�
ØÔ)Ø&×-Ñ-¨jÖ9ñ ð ˆÛ#ˆAØÕŠLñ $ð Ð&Ð&r(   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r"  r    r9  r   r!   r#   )r$   s   "r%   r&   r  Ë  s$   € ÷ ñ ØðØ,6ðà	ñr(   c                óà   € \        4       pV F]  p\        P                  ! W4      p\        P                  ! WT4      pVf   ^pV P	                  V4      pTP                  Ve   TMT4       K_  	  V# )zD
Extract coefficients of iteration variables from index expression.
)r   r   r5  r6  rj  rD  )r/   r"  r9  Úcoefficientsr4  r:  r;  Úcoefs   &&&     r%   Ú_get_index_coefficientsÚ$PallasKernel._get_index_coefficientsË  sj   € ô $.£<ˆÛˆCÜ*×GÒGÈÓSˆHÜ(×@Ò@ÀÓOˆFØŠ~Ø�Ø—>‘> &Ó)ˆDØ×Ñ TÒ%5™T¸6ÖBñ ð Ðr(   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   rs  rl  rJ  rØ  r  r‰  r   r!   r#   )r$   s   "r%   r&   r  Û  s<   € ÷ #ñ #àð#ð ð#ð ð	#ð
 !ð#ð 
ñ#r(   c                ó€  € ^.p\        V4      ^8”  d`   ^p. p\        \        V4      ^,
          RR4       F:  pVP                  ^ V4       V P                  W,          4      pVf   K2  Wh,          pK<  	  V'       d    \	        V4      p	V F  p
W©9  g   K   R# 	  R# \	        R V 4       4      pV F  p
W«9  g   K   R# 	  R# )zB
Check if access pattern requires gather (non-standard striding).
Tc              3  ó0   "  € T F  qf   K  Vx € K  	  R # 5irf   r#   rb  s   & r%   rd  Ú5PallasKernel._check_gather_pattern.<locals>.<genexpr>ù  s   é € Ð*V±n°¯1ª1³nùs   ‚Œ
Frî  )r2  rn  Úinsertrj  r   )r/   rs  rJ  rØ  r‰  Úexpected_stridesr  rõ  r€  Úexpected_stride_setrŠ  Úactual_stride_sets   &&&&&       r%   Ú_check_gather_patternÚ"PallasKernel._check_gather_patternÛ  sÁ   € ð ˜3Ðäˆx‹=˜1ÔØˆOØ!ÐÜœ3˜x›=¨1Õ,¨b°"Ö5�Ø ×'Ñ'¨¨?Ô;ØŸ>™>¨(­+Ó6�ØÔ'Ø#Õ/’Oñ	 6÷ ä",Ð-=Ó">ÐÛ$�ØÖ2Úñ %ñ ô !+Ñ*V±nÓ*VÓ VÐÛ$�ØÖ0Úñ %ñ r(   c               ó(   € V ^8„  d   QhRRRRRRRR/# ©r   r¥  r"   r"  r    ÚindexingrÔ  r!   r#   )r$   s   "r%   r&   r     s2   € ÷ 8ñ 8àð8ð ð8ð "ð	8ð
 
ñ8r(   c                ó$  a € VP                   R8w  g   VP                  '       d   V# S P                  V4      pVf   V# Vw  rVrxp	S P                  V4      w  r«S P	                  4       pS P                  W+4      pS P                  WhW�4      p\        V 3R lV 4       4      p\        V4      \        V4      8  ;'       d;    \        V4      ^ 8„  ;'       d%    V^8„  ;'       d    \        V4      \        V4      8„  p\        P                  P                  4       P                  R8H  pV	'       * ;'       d5    \        ;QJ d    R V 4       F  '       d   K   RM	  RM! R V 4       4      p\        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      pT;'       d    V'       * ;'       d    Wz8H  pV
^ 8”  dS   Wz8w  g   V'       g	   V'       d=   \        V4      ^ 8”  d-   V'       g%   V'       g   \        S P!                  V4      RR7      # V# )	zVCheck if buffer access needs strided indexing due to size mismatch or gather patterns.r$  c              3  óX   <"  € T F  pSP                  V4      ^8w  g   K  ^x € K!  	  R# 5irg  rj  rk  s   & €r%   rd  Ú7PallasKernel._needs_strided_indexing.<locals>.<genexpr>  s#   øé € Ð O©H q¸¿¹ÀqÓ8IÈQÑ8N§¢«Hùs   ƒ* 
*r  c              3  ó(   "  € T F  qR Jx € K
  	  R # 5irf   r#   rb  s   & r%   rd  rœ  $  s   é € ð <
Ù#1˜a�T�M£>ùrÌ  FTc              3  ób   "  € T F%  p\        V\        \        ,          4      '       * x € K'  	  R # 5irf   )r  rÍ  rý   rÏ  s   & r%   rd  rœ  '  s!   é € ÐUÉÀ1¤J¨q´#¼µ+Ó$>× >Ñ >Ëùs   ‚-/r  )rÕ  rÖ  ri  rp  rB  r‹  r•  Úsumr2  r   r  r  r  ro  rk  rÔ  rD  )r/   r¥  r"  r™  r^   rq  rs  rr  rJ  rØ  r„  r9  Úall_iter_varsr‰  Úhas_non_unit_stridesÚbuf_effective_dimsÚnot_all_vars_usedrã  Úis_known_non_contiguousÚhas_symbolic_coefÚskip_for_non_contiguouss   f&&&                 r%   Ú_needs_strided_indexingÚ$PallasKernel._needs_strided_indexing   sæ  ø€ ð ×Ñ Ô&¨(×*@×*@Ð*@ØˆOà×$Ñ$ TÓ*ˆØŠ<ØˆOàFJÑCˆ˜9°mØ"&×"GÑ"GÈÓ"NÑˆØ×+Ñ+Ó-ˆØ×3Ñ3°EÓEˆð  $×9Ñ9Ø mó 
Ðô
 !Ô O©HÓ OÓOÐä�	‹NœS Ó/Ñ/÷ /ð /Ü�I“ Ñ"÷/ð /à" QÑ&÷/ð /ô �I“¤ X£Ñ.ð	 	ô —‘×4Ñ4Ó6×;Ñ;¸uÑDˆØ&3Ô"3÷ #
ð #
¿»ñ <
Ù#1ó<
¿¿ºñ <
Ù#1ó<
ó 9
Ð÷  ›CÑUÉÓUŸCŸCšCÑUÉÓUÓUÐà#×PÐP¨F¬
×PÐP°yÑ7Pð 	 ð ˜1ÔØÔ*×.?×CWÜ�I“ Ô"ß+ß%ä"Ø×6Ñ6°uÓ=ÈTôð ð ˆr(   c               ó(   € V ^8„  d   QhRRRRRRRR/# r˜  r#   )r$   s   "r%   r&   r  :  s2   € ÷ 4ñ 4àð4ð ð4ð "ð	4ð
 
ñ4r(   c                óø  € VP                   '       g   VP                  R8X  d   V# \        P                  P	                  V4      pVf   V# VP                  4       p\        V4      ^ 8X  d   \        RVP                   R7      # \        V4      ^8X  d=   V^ ,          ^8X  d/   V P                  V4      '       g   \        RVP                   R7      # \        V4      ^8”  d^   V P                  V4      pV'       g   \        VP                  RR7      # RVP                  9   d   \        V P                  V4      RR7      # V P                  '       d.   RVP                  9   d   \        V P                  V4      RR7      # V# )zP
Adjust index expression based on buffer shape (0-dim scalar, multi-dim, etc.).
r$  r  Tr  )rÖ  rÕ  r   r  rÔ  rÕ  r2  rÔ  rR  rD  rü  )r/   r¥  r"  r™  rq  rs  r  s   &&&&   r%   Ú_adjust_index_for_buffer_shapeÚ+PallasKernel._adjust_index_for_buffer_shape:  sX  € ð ×!×!Ð! X×%7Ñ%7¸5Ô%@ØˆOä—'‘'×$Ñ$ TÓ*ˆØŠ?ØˆOà×#Ñ#Ó%ˆäˆx‹=˜AÔÜ"Ø¨x×/EÑ/Eôð ô �‹M˜QÔØ˜•˜qÔ Ø×,Ñ,¨U×3Ò3ä"Ø¨x×/EÑ/Eôð ô
 ˆx‹=˜1ÔØ ×4Ñ4°UÓ;ˆMß Ü&Ø&×0Ñ0Àôð ð ˜×+Ñ+Ô+ä&Ø"×:Ñ:¸5ÓAÐQUôð ð
 �;�;ˆ;˜4 8×#5Ñ#5Ô5Ü"Ø×6Ñ6°uÓ=ÈTôð ð ˆr(   c               ó(   € V ^8„  d   QhRRRRRRRR/# r˜  r#   )r$   s   "r%   r&   r  p  s>   € ÷ HIñ HIàðHIð ðHIð "ð	HIð
 
ñHIr(   c                ó8  € VP                   '       g   V# \        P                  P                  V4      pVf   V# VP	                  4       p\        V4      pV^8  d   V# V P                  V4      p\        V4      ^8w  d   V# \        \        V4      4      p\        P                  ! W(4      p	V P                  \        P                  ! W˜4      4      p
V
e   V
^8:  d   V# \        P                  P                  P                  W),
          4      p \        V4      pT^ 8  g   YÊ8¼  d   T# T P                  TR,          4      pTe   YÚ,          ^ 8w  d   T# T P$                  P'                  T4      pTf   T# T P                  TP(                  4      p^pT F%  pT P                  T4      pTf   Tu # TT,          pK'  	  Te   Yú,          T8w  d   T# RT^,
          ,          pT^ 8X  d	   T RT
 2pM	T T RT
 2p\+        TRR7      #   \         \"        3 d    Tu # i ; i)zË
Try to emit multi-dim slice notation instead of flatten + gather.

For a buffer with shape (d0, ..., dk) and index `stride * var + offset`,
emit `buf[:, ..., :, offset::stride]` when stride divides dk.
z:, r  Fr  rî  )rÖ  r   r  rÔ  rÕ  r2  r*  r3  r4  r   r5  rj  r6  r0  r1  rÍ  r7  r8  rH  rð  rr  rÔ  )r/   r¥  r"  r™  rq  rs  rv  r9  r4  r:  r;  r¦  r<  Úlast_dimrÜ  Ú
var_lengthrr  rX  r}  r½  Ú	slice_strs   &&&&                 r%   Ú_try_multidim_sliceÚ PallasKernel._try_multidim_slicep  s  € ð ×%×%Ð%ØˆOä—'‘'×$Ñ$ TÓ*ˆØŠ?ØˆOà×#Ñ#Ó%ˆÜ�8‹}ˆØ�!Œ8ØˆOð ×,Ñ,¨UÓ3ˆ	Üˆy‹>˜QÔØˆOä”4˜	“?Ó#ˆÜ&×CÒCÀEÓOˆØ—‘Ü×7Ò7¸ÓFó
ˆð Š>˜V qœ[ØˆOä—‘×!Ñ!×*Ñ*¨5Õ+;Ó<ˆð	Ü˜V›ˆJð ˜Œ>˜ZÔ1ØˆOà—>‘> (¨2¥,Ó/ˆØÒ˜xÕ0°AÔ5ØˆOð ×%Ñ%×)Ñ)¨#Ó.ˆØŠ=ØˆOØ—^‘^ E§L¡LÓ1ˆ
Øˆ	ÛˆAØ—‘˜qÓ!ˆAØŠyØ’Ø˜�NŠIñ	 ð
 Ò Õ!4¸	Ô!AØˆOà˜$ �(Õ#ˆØ˜Œ?Ø!˜( " V HÐ-‰Ià!˜( : ,¨b°°Ð9ˆIÜ¨À%ÔHÐHøôA œ:Ð&ô 	ØŠOð	ús   ÄH ÈHÈHc               ó$   € V ^8„  d   QhRRRRRR/# )r   Ú	load_exprr"   rá  r.  r!   r#   )r$   s   "r%   r&   r  »  s!   € ÷ 6ñ 6¨ð 6°?ð 6Àsñ 6r(   c                ó   € RV  RV R2# )zíGenerate gather-based permutation instead of jnp.permute_dims.

Avoids a Mosaic compiler bug where jnp.permute_dims produces
corrupted output tensors on TPU for 3D+ arrays.  Uses
pallas_permute which flattens to 1D and does a 1D gather.
zpallas_permute(r+   r,   r#   )rµ  rá  s   &&r%   Ú_gather_permute_exprÚ!PallasKernel._gather_permute_exprº  s   € ð !  ¨2¨d¨V°1Ð5Ð5r(   c               ó    € V ^8„  d   QhRRRR/# )r   Úvar_namer"   r!   rZ   r#   )r$   s   "r%   r&   r  Ä  s   € ÷ ñ ¨cð °jñ r(   c                ó�  € WP                   9   d   V P                   V,          # V P                  P                   Fˆ  p\        V4      P	                  4       pVP                  V R24      '       g   K8  \        P                  ! RVP                  R^4      ^,          4       F  pV P                  V4      pVf   K  Vu u # 	  KŠ  	  R# )zÉTrace a tmp variable back to its source buffer's kernel param.

Follows CSE assignments backward through bounds-checking (where/clamp)
until it finds a variable that was directly loaded from a buffer.
rš  ú
\btmp\d+\bN)
r  r0  Ú_linesr"   r  rW  ÚreÚfindallÚsplitÚ_trace_to_load_source)r/   rº  ÚlineÚline_strÚrefr>   s   &&    r%   rÁ  Ú"PallasKernel._trace_to_load_sourceÄ  s¨   € ð ×)Ñ)Ô)Ø×%Ñ% hÕ/Ð/Ø—L‘L×'Ô'ˆDÜ˜4“y×'Ñ'Ó)ˆHØ×&Ñ&¨(¨°3Ð'7×8Ò8ÙÜ—z’z -°·±ÀÀqÓ1IÈ!Õ1LÖM�Ø×3Ñ3°CÓ8�ØÔ%Ø!”Mó Nñ	 (ñ r(   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r�  r"   r¥  r"  r    r!   z_IndirectAccessInfo | Noner#   )r$   s   "r%   r&   r  Ö  s2   € ÷ I
ñ I
ØðI
Ø!ðI
Ø*4ðI
à	#ñI
r(   c           	     óÄ  a aa€ S P                  V4      pVf   R# Vw  rV  pV Uu. uF  pS P                  V4      NK  	  pp\        V4      ^8  g;   \        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       d   R# \	        \
        \        ,          V4      p	S P                  V4      p
\        V
4      ^8w  d   R# V
^ ,          pS P                  W;4      pV^ 8X  g   \        V\        4      '       g   R# S P                  V	4      pS P                  V.V4      pVf   R# V^ ,          p\        V	4      pV\        ^V^,
          4      8¼  d   R# \        V4      pS P                  V4      pVf   R# S P                  P!                  V4      pVe¦   S P                  V4      pVe‘   Vw  pp  p\        V4      ^8w  d   R# S P                  V^ ,          4      f   R# \"        P$                  ! V V3R lV 4       4      p\"        P$                  ! VV 3R lS P'                  V4       4       4      pVV8¼  d   R# \)        VV\+        V	4      VVVR7      # u upi )a  Detect a load with data-dependent indexing suitable for scalar prefetch.

Matches exactly one indirect variable whose coefficient corresponds to
a C-contiguous stride dimension.  Rejects 1-to-1 gather patterns where
the indices buffer covers the full iteration space.
Nc              3  ó(   "  € T F  qR J x € K
  	  R # 5irf   r#   rb  s   & r%   rd  Ú7PallasKernel._detect_indirect_access.<locals>.<genexpr>ä  s   é € Ð'H¹<°a¨T­	»<ùrÌ  TFc              3  óV   <"  € T F  pSP                  V4      ;of   K  Sx € K   	  R # 5irf   rj  )rc  rX  r/   r·  s   & €€r%   rd  rÉ  	  s&   øé € ð *Ù+˜!°T·^±^ÀAÓ5FÐ0F°—A’A›|ùs   ƒ)Ÿ
)c              3  ó¶   <"  € T FN  pVSP                   9   g   K  SP                  SP                   V,          P                  4      ;o  f   KJ  Sx € KP  	  R # 5irf   )rH  rj  rr  )rc  r4  rr  r/   s   & €€r%   rd  rÉ  	  sY   øé € ð )á>˜Ø˜d×3Ñ3Ñ3ô ð #'§.¡.°×1FÑ1FÀsÕ1K×1RÑ1RÓ"SÐS˜Øð ÷ ’FÛ>ùs   ƒA›/AÁ
A)rÉ  rÊ  rÌ  rÎ  rÏ  rÐ  )ri  rj  r2  rk  r   rl  rÍ  rY  r×  r  rm  rÖ  Úmaxr"   rÁ  r  rð  r  rÓ  r*  rÈ  rË  )r/   r�  r¥  r"  Úbuf_inforh  rs  rX  Úbuf_size_rawÚbuf_size_intsÚindirect_varsrÏ  rz  r¤  r"  rÎ  rv  Úindirect_var_namerÐ  Úindices_graph_nameÚindices_infoÚindices_sizeÚindices_numelÚiter_productrr  r·  s   f&&&                    @@r%   Ú_detect_indirect_accessÚ$PallasKernel._detect_indirect_accessÖ  s;  ú€ ð ×(Ñ(¨Ó.ˆØÒÙØ'Ñˆ�Q˜˜1Ù3;Ó<±8¨a˜Ÿ™ qÖ)±8ˆÐ<Üˆ|Ó˜qÔ §C£CÑ'H¹<Ó'H§C§C¢CÑ'H¹<Ó'H×$HÒ$HÙÜ#'¬¬S­	°<Ó#@ˆà×/Ñ/°Ó6ˆÜˆ}Ó Ô"ÙØ$ QÕ'ˆà×+Ñ+¨EÓ@ˆØ�AŒ:œZ¨¬s×3Ò3Ùð ×,Ñ,¨]Ó;ˆØ×*Ñ*¨E¨7°GÓ<ˆØŠ?ÙØ˜q•zˆä�=Ó!ˆØœ3˜q $¨¥(Ó+Ô+Ùä Ó-ÐØ×2Ñ2Ð3DÓEˆØÒ Ùð "×6Ñ6×:Ñ:¸=ÓIÐØÒ)Ø×0Ñ0Ð1CÓDˆLØÒ'Ø+7Ñ(��<  A qÜ�|Ó$¨Ô)ÙØ—>‘> ,¨q¥/Ó2Ò:ÙÜ $§	¢	õ *Ù+ó*ó !�ô  $Ÿyšyõ )à#×7Ñ7¸Ô>ó)ó  �ð ! LÔ0Ùä"ØØÜ˜mÓ,Ø%Ø*Ø'ô
ð 	
ùòk =s   ¦Ic               ó   € V ^8„  d   QhRR/# )r   r!   r  r#   )r$   s   "r%   r&   r  !	  s   € ÷ (
ñ (
¨tñ (
r(   c                ó¤  € \        4       pV P                   FB  w  r#\        P                  ! RV4       F"  pVP	                  VP                  4       4       K$  	  KD  	  . pV P                  P                   F‘  p\        V4      P                  4       p\        P                  ! RV\        P                  4      pV'       d5   VP                  VP                  ^4      VP                  ^4      V34       K~  VP                  RWv34       K“  	  RpV'       d‚   Rp\        V4       Fn  w  ršpV	'       g   K  W‘9   g   K  \        P                  ! RV
4       F;  pVP                  4       V9  g   K  VP	                  VP                  4       4       RpK=  	  Kp  	  K‰  V U	UUu. uF  w  r’pV	e	   W‘9   g   K  VNK  	  uppp	V P                  n        R# u uppp	i )aB  Remove dead compute lines after scalar prefetch replaces indirect load.

When the table load is simplified to buf[0] (scalar prefetch handles
indexing), the indices load and all derived bounds-checking code become
dead.  This performs backward liveness analysis from the store variables
to identify and remove dead lines.
r¼  z^(tmp\d+)\s*=\s*(.*)NTF)r   rþ  r¾  ÚfinditerrD  Úgroupr0  r½  r"   r  ÚmatchÚDOTALLr
  r¾  )r/   Ú	live_varsrh  Ú
store_lineÚmÚassignmentsrÂ  rÃ  Úchangedrº  Úrhss   &          r%   Ú_eliminate_dead_indirect_codeÚ*PallasKernel._eliminate_dead_indirect_code!	  sg  € ô &0£\ˆ	Ø!×3Ô3‰MˆAÜ—[’[ °
Ö;�Ø—‘˜aŸg™g›iÖ(ó <ñ 4ð
 :<ˆØ—L‘L×'Ô'ˆDÜ˜4“y×'Ñ'Ó)ˆHÜ—’Ð0°(¼B¿I¹IÓFˆAßØ×"Ñ" A§G¡G¨A£J°·±¸³
¸DÐ#AÖBà×"Ñ" D¨(Ð#9Ö:ñ (ð ˆßØˆGÜ$,¨[Ö$9Ñ �˜qß‘8 Ö 5ÜŸ[š[¨¸Ö<˜ØŸ7™7›9¨IÖ5Ø%ŸM™M¨!¯'©'«)Ô4Ø&*šGó =ó %:ñ &1õ
á%0Ñ!�˜TØÒ 8Ñ#8÷ ˆDÙ%0ó
ˆ�‰Öùô 
s   ÆGÆ/Gc          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   r�  r"   r¥  r"  r    r™  rÔ  r!   r#   )r$   s   "r%   r&   r  K	  s<   € ÷ 9ñ 9àð9ð ð9ð ð	9ð
 "ð9ð 
ñ9r(   c                ó¦  a€ VP                   '       dê   V P                  WV4      pVe5   V P                  e   WPP                  8w  d   \        R4      hWPn        V R2# RV n        V P
                  P                  V4       VP                  \        P                  \        P                  \        \        4      pV P                  '       d   RMRpV'       d   RVP                   RV R2MVP                  pV R	V R
2# V RVP                   R
2p	VP                  R8X  d²   V P                  '       g    V P!                  W#4      p
V
e"   V P#                  Wš4      p	W P$                  V&   V	# V P'                  W#4      pVeU   Vw  opRV	 RV R2p	SV P(                  V&   \*        ;QJ d    . V3R lV 4       F  NK  	  5M! V3R lV 4       4      V n        V	# )z3
Build the load expression based on indexing mode.
z-only one indirect access per kernel supportedz[0]Tz	jnp.int32z	jnp.int64rX  r  r,   z[...].flatten()[r’  r‘  r$  zjnp.permute_dims(r+   c              3  ó6   <"  € T F  pSV,          x € K  	  R # 5irf   r#   )rc  r1   Úcollapsed_shapes   & €r%   rd  Ú0PallasKernel._build_load_expr.<locals>.<genexpr>€	  s   øé € ð <Ù8=°1˜O¨A×.Ò.»ùó   ƒ)rÖ  r×  r  ÚAssertionErrorr  r  rD  r/  r%  r	   r   ÚTorchMinÚTorchMaxrã  rÕ  rü  rç  r·  r  r  r  rË  r  )r/   r�  r¥  r"  r™  ÚindirectÚ
has_minmaxÚ	idx_dtyperÙ  rµ  rá  Ú	collapsedÚcpermrê  s   &&&&&        @r%   Ú_build_load_exprÚPallasKernel._build_load_exprK	  sÝ  ø€ ð ×!×!Ð!à×3Ñ3°C¸uÓEˆHØÒ#Ø×'Ñ'Ò3ð  ×#7Ñ#7Ô7Ü,ØKóð ð (0Ô$Ø˜˜c�{Ð"à(,ˆDÔ%Ø×(Ñ(×,Ñ,¨TÔ2àŸ™¤5§9¡9¬e¯i©i¼Ä8ÓLˆJØ'+§{§{ {™¸ˆI÷ ð �H×&Ñ&Ð' y°°¸1Ñ=à×'Ñ'ð ð
 �UÐ*¨3¨%¨qÐ1Ð1ð ˜%˜q ×!3Ñ!3Ð 4°AÐ6ˆIà×!Ñ! UÔ*°4·;·;°;Ø×6Ñ6°tÓC�ØÒ#Ø $× 9Ñ 9¸)Ó J�IØ8<×/Ñ/°Ñ5ð Ðð !%× DÑ DÀTÓ Q�IØ Ò,Ø1:Ñ.˜¨Ø&7¸	°{À"ÀUÀGÈ1Ð$M˜	ð ?N˜×5Ñ5°dÑ;ß6;´eô <Ù8=ó<·e±eô <Ù8=ó<ó 7˜Ô3ð Ðr(   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r¥  r"   rµ  r!   r#   )r$   s   "r%   r&   r  †	  s!   € ÷ ñ °sð Àsð Èsñ r(   c                ó¼  a€ VP                  R4      '       g   V# \        ;QJ d3    V3R lV P                  P                   4       F  '       g   K   RM(	  RM$! V3R lV P                  P                   4       4      pV'       dX   \        P
                  P                  V4      oSe5   SP                  4       p\        V4      ^8X  d   VR,          ^8X  d   RV R2# V# )z�
Squeeze (N,1) intermediate buffers when kernel has 1D graph inputs.

This avoids wrong broadcasting: (N,) op (N,1) -> (N,N) instead of (N,)
r�  c              3  óî   <"  € T Fj  pVP                  R 4      '       * ;'       dH    \        P                  P                  V4      ;oRJ;'       d    \	        SP                  4       4      ^8H  x € Kl  	  R# 5i)r�  N)rW  r   r  rÔ  r2  rÕ  )rc  r£  rq  s   & €r%   rd  ÚBPallasKernel._maybe_squeeze_intermediate_buffer.<locals>.<genexpr>�	  su   øé € ð 
ñ 4�ð ×#Ñ# EÓ*Ô*÷ -ð -ÜŸG™G×.Ñ.¨xÓ8Ð8�ÀÐE÷-ð -ä�G×$Ñ$Ó&Ó'¨1Ñ,ô-ó 4ùs   ƒ!A5¥*A5Á%A5TFzjnp.squeeze(z
, axis=-1)rî  )	rW  rk  r.   rm  r   r  rÔ  rÕ  r2  )r/   r¥  rµ  Úhas_1d_inputrs  rq  s   &&&  @r%   Ú"_maybe_squeeze_intermediate_bufferÚ/PallasKernel._maybe_squeeze_intermediate_buffer†	  s¹   ø€ ð �‰˜u×%Ò%ØÐ÷ “sô 
ð !ŸI™I×3Ò3ó	
—s—s’sô 
ð !ŸI™I×3Ò3ó	
ó 
ˆ÷ Ü—g‘g×(Ñ(¨Ó.ˆGØÒ"Ø"×+Ñ+Ó-�Ü�x“= AÔ%¨(°2­,¸!Ô*;Ø)¨)¨°JÐ?Ð?àÐr(   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r¥  r"   r"  r    rµ  r!   r#   )r$   s   "r%   r&   r   	  s8   € ÷ YKñ YKØðYKØ *ðYKØ7:ðYKà	ñYKr(   c                ó,  € \         P                  P                  V4      pVe   \        VP	                  4       4      ^8w  d   V# VP                  R4      '       d   V# V P                  VP	                  4       ^ ,          4      pVf   V# \         P                  P                  V4      pVe   VP                  '       g   V# RpV P                  P                   F³  p\         P                  P                  V4      p	V	f   K(  \        V	P	                  4       4      ^8”  g   KH  V	P	                  4        U
u. uF  q P                  V
4      NK  	  pp
\        ;QJ d    R V 4       F  '       d   K   RM	  RM! R V 4       4      '       d    MRpKµ  	  Ve   \        V4      ^8:  d   V# V P                  V4      p\        V4      ^8w  d   V# \        \        V4      4      pWÀP                  9  d   V# V P                  V,          pV P                  VP                   4      V8w  d   V# V P                  P#                  4        UUu. uF=  w  rïV P                  VP                   4      V8X  g   K'  VP$                  '       d   K;  VNK?  	  ppp\        V4      ^8w  d   V# Rp\'        V4       UU
u. uF  w  pqªV8X  g   K  VNK  	  ppp
\        V4      ^8X  d   V^ ,          pMN^ pV P                  P#                  4        F.  w  ppVV8X  d   Tp M!VP$                  '       d   K%  V^,          pK0  	  Vf   V# V\        V4      ^,
          8X  d   V# ^.\        V4      ,          pR	VV&   V RRP)                  \+        \,        V4      4       R2# u up
i u uppi u up
pi )
a’  Reshape 1D buffers for higher-dim broadcasting in reduction kernels.

When a 1D buffer (e.g. a reduction result from a prior kernel, or a
batch-norm parameter) is loaded into a kernel with 2+ iteration dims,
JAX right-aligns it for broadcasting: (N,) becomes (1, N).  This is
wrong when the buffer corresponds to a non-trailing axis; we reshape
to (N, 1, ...) so broadcasting matches the correct axis.
Nr�  c              3  ó(   "  € T F  qR Jx € K
  	  R # 5irf   r#   rb  s   & r%   rd  Ú:PallasKernel._maybe_broadcast_1d_buffer.<locals>.<genexpr>Ã	  s   é € Ð;©l¨ •}«lùrÌ  FTr›  r+   r,   rî  )r   r  rÔ  r2  rÕ  rW  rj  rf  Úis_floating_pointr.   rm  ro  r*  r3  r4  rH  rr  rq  rÒ  r   r'  Úmapr"   )r/   r¥  r"  rµ  rq  Ú
buf_lengthr  Úref_buf_sizer£  Ú	other_bufrX  r9  Úused_varrÜ  r·  rÜ  Úmatching_varsÚaxis_posrõ  Úmatching_dimsÚpw_idxÚsymÚreshape_dimss   &&&&                   r%   Ú_maybe_broadcast_1d_bufferÚ'PallasKernel._maybe_broadcast_1d_buffer 	  s0  € ô —'‘'×$Ñ$ TÓ*ˆØŠ?œc '×"2Ñ"2Ó"4Ó5¸Ô:ØÐð
 �?‰?˜5×!Ò!ØÐà—^‘^ G×$4Ñ$4Ó$6°qÕ$9Ó:ˆ
ØÒØÐä—‘×!Ñ! $Ó'ˆØÒ U×%<×%<Ð%<ØÐð ˆØŸ	™	×/Ô/ˆHÜŸ™×*Ñ*¨8Ó4ˆIØÔ$¬¨Y×-?Ñ-?Ó-AÓ)BÀQÖ)FØ;D×;MÑ;MÔ;OÓPÑ;O°a§¡¨qÖ 1Ñ;O�ÐPß“3Ñ;©lÓ;—3—3’3Ñ;©lÓ;×;Ò;ÙØ#’ñ 0ð Ò¤3 |Ó#4¸Ô#9ØÐð ×,Ñ,¨UÓ3ˆ	Üˆy‹>˜QÔØÐÜœ˜Y›Ó(ˆØ×0Ñ0Ô0ØÐð ×%Ñ% hÕ/ˆØ�>‰>˜%Ÿ,™,Ó'¨:Ô5ØÐð ×-Ñ-×3Ñ3Ô5ô
á5‘�Ø�~‰~˜aŸh™hÓ'¨:Ñ5ô à>?¿n½n÷ ˆAÙ5ð 	ñ 
ô
 ˆ}Ó Ô"ØÐð ˆÜ'0°Ô'>ÔRÑ'>™t˜q !ÀzÁ/Ÿ˜Ñ'>ˆÑRÜˆ}Ó Ô"Ø$ QÕ'‰Hð ˆFØ×/Ñ/×5Ñ5Ö7‘��QØ˜(”?Ø%�HÙØ—~—~’~Ø˜a•K’Fñ 8ð ÒØÐØ”s˜<Ó(¨1Õ,Ô,ØÐà�sœS Ó.Õ.ˆØ!#ˆ�XÑØ�˜I d§i¡i´´C¸Ó0FÓ&GÐ%HÈÐJÐJùòo  Qùó.
ùó Ss$   Ä2NÉ $N
É)N
É=N
Ê(NÊ8Nc               ó$   € V ^8„  d   QhRRRRRR/# )r   r"  r    r™  rÔ  r!   r#   )r$   s   "r%   r&   r  û	  s$   € ÷ >ñ >Øð>Ø+:ð>à	ñ>r(   c                ó  € VP                   R8w  g   VP                  '       d   V# V P                  V4      pV P                  4       pV P	                  V4      p\        VR4      '       d   VP                  M	\        4       V,          pWe,
          pV'       d   \        V4      ^8:  d   V# RpV P                  P                  4        F’  w  ršV P	                  V
4      pV'       g   K   Wµ8w  d   K(  V P                  V
4      p\        VR4      '       d   VP                  M	\        4       V,          pW½8w  g   We8X  d   Kv  V P                  WšV4      '       d   K�  Rp M	  V'       d   \        V P                  V4      RR7      # V# )zê
Check for im2col-like patterns where store uses block variables but load doesn't.

For cat/expand patterns, both load and store prepared indices share block vars.
For im2col patterns, store compresses to block vars but load doesn't.
r$  rA  FTr  )rÕ  rÖ  r+  rB  r*  ÚhasattrrA  r   r2  rÿ  rq  Ú_check_load_is_strided_inputrÔ  rD  )r/   r"  r™  r)  rC  Ústore_orig_varsÚstore_prep_varsÚnew_varsÚhas_im2col_patternr£  rI  Úload_orig_varsÚ	prep_loadÚload_prep_varss   &&&           r%   Ú_check_im2col_patternÚ"PallasKernel._check_im2col_patternû	  sy  € ð ×Ñ Ô&¨(×*@×*@Ð*@ØˆOà×.Ñ.¨uÓ5ˆØ×'Ñ'Ó)ˆ	Ø×2Ñ2°5Ó9ˆô �~ ~×6Ò6ð ×'Ò'ä“Øõ	ˆð
 #Õ4ˆ÷ œ3˜Ó/°1Ô4ØˆOð #ÐØ$(×$9Ñ$9×$?Ñ$?Ö$AÑ ˆHØ!×5Ñ5°jÓAˆNß!Ùð Ô0Ùð ×-Ñ-¨jÓ9ˆIô ˜9 n×5Ò5ð ×&Ò&ä“\Øõ	ˆNð Ô/°?Ô3UÙð ×4Ñ4Ø n÷ô ð &*Ð"Ùñ5 %B÷8 Ü"Ø×6Ñ6°~ÓFØ"ôð ð
 ˆr(   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   r£  r"   rI  r    r  r   r!   r  r#   )r$   s   "r%   r&   r  ;
  s,   € ÷ &9ñ &9Øð&9Ø)3ð&9ØEOð&9à	ñ&9r(   c                ó~  € \         P                  P                  V4      pVf   R# \        VRR 4      ! 4       pVf   R# \        VRR4      pVf   R# VP	                  4       p. pV F]  p	\
        P                  ! W)4      p
\
        P                  ! W©4      pVf   K5  V P                  V4      pTP                  Ve   TMT4       K_  	  \        4       p\        V4       FQ  w  rïV P                  W~,          4      pVe
   V^8”  g   K)  V P                  V4      pTP                  Ve   TMT4       KS  	  \        V4      V8H  # )zL
Check if load coefficients match buffer strides (strided input vs im2col).
NFr­  c                 ó   € R # rf   r#   r#   r(   r%   r¯  Ú;PallasKernel._check_load_is_strided_input.<locals>.<lambda>E
  s   € ±Dr(   r;  )r   r  rÔ  r²  rÕ  r   r5  r6  rj  r
  r   r   rD  )r/   r£  rI  r  r�  rµ  Úbuf_stridesÚ	buf_sizesÚload_coeffsr4  r:  rŠ  Úint_coefÚbuf_stride_setrõ  rX  r€  Úint_ss   &&&&              r%   r  Ú)PallasKernel._check_load_is_strided_input;
  s   € ô �g‰g× Ñ  Ó*ˆØŠ;Ùä˜˜l©LÔ9Ó;ˆØŠ>Ùä˜f h°Ó5ˆØÒÙà—L‘L“Nˆ	ð ˆÛ!ˆCÜ*×GÒGÈ
ÓXˆHÜ&×>Ò>¸xÓMˆDØÔØŸ>™>¨$Ó/�Ø×"Ñ"¨xÒ/C¡8ÈÖNñ "ô $›ˆÜ˜kÖ*‰DˆAØ—~‘~ i¥lÓ3ˆHØÒ 8¨a¦<ØŸ™ qÓ)�Ø×"Ñ"¨EÒ,=¡5À1ÖEñ	 +ô ˜+Ó&¨.Ñ8Ð8r(   c               ó    € V ^8„  d   QhRRRR/# )r   r¥  r"   r!   r  r#   )r$   s   "r%   r&   r  c
  s   € ÷ 2ñ 2°ð 2¸ñ 2r(   c                ód  € V P                   '       d   R# V P                  V4      pVf   R# Vw  r4r5p\        V4      ^8w  g   \        V4      ^8w  d   R# V P                  V^ ,          4      pV P                  V^,          4      pV^ ,          pV^,          p	Ve!   V	e   W‰8  d   Ve   Ve   V^8”  d   V^8”  g   R# V P                  P
                   FZ  p
V P                  V
4      pVf   K  Vw    r<p\        V4      ^8w  d   K3  V^ ,          pV^,          pVf   KK  Vf   KQ  WÞ8  g   KY   R# 	  R# )zÛ
Check if output needs transpose for column-major storage.

Transpose on store is needed when:
- Output has column-major stride (s0 < s1)
- But input(s) have row-major stride
- And we haven't already transposed on load
FT)r  ri  r2  rj  r.   rm  )r/   r¥  r^   rh  rs  rJ  Úsize0Úsize1Ús0Ús1Úinp_nameÚinp_infoÚinp_stridesÚinp_s0Úinp_s1s   &&             r%   Ú_check_store_needs_transposeÚ)PallasKernel._check_store_needs_transposec
  s.  € ð ×&×&Ð&Ùà×$Ñ$ TÓ*ˆØŠ<Ùà,0Ñ)ˆ�Q¨Üˆ~Ó !Ô#¤s¨8£}¸Ô'9Ùà—‘˜x¨�{Ó+ˆØ—‘˜x¨�{Ó+ˆØ˜AÕˆØ˜AÕˆð ŠNØ’Ø”ØÒ!ØÒ!Ø˜”	Ø˜”	áð Ÿ	™	×/Ô/ˆHØ×,Ñ,¨XÓ6ˆHØÒÙØ&.Ñ#ˆAˆq�! !Ü�;Ó 1Ô$ÙØ  •^ˆFØ  •^ˆFØÔ! fÔ&8¸V¾_Úñ 0ñ r(   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   Úoutr"   Úvaluer   Úneeds_transposer  r!   ræ  r#   )r$   s   "r%   r&   r  —
  s,   € ÷ ñ ØðØ*ðØ=Aðà	ñr(   c                ó–   € RV R2.pV'       d   VP                  V RV R24       V# VP                  V RV RV RV RV R2
4       V# )	zµ
Build store expression for full array assignment.

Handles scalar broadcast, shape matching, and optional transpose.
Returns a list of lines to emit (variable assignment + store).
ú_val = jnp.asarray(r,   ú[...] = jnp.full(z8.shape, _val) if _val.ndim == 0 else jnp.transpose(_val)z3.shape, _val) if _val.ndim == 0 else (_val.reshape(z.shape) if _val.size == z".size else jnp.broadcast_to(_val, z.shape)))r
  )r/   r6  r7  r8  Úliness   &&&& r%   Ú_build_full_array_store_exprÚ)PallasKernel._build_full_array_store_expr—
  s‹   € ð ' u g¨QÐ/Ð0ˆßØ�L‰LØ�%ð Ø˜5ð !+ð,ôð ˆð �L‰LØ�%ð Ø˜5ð !&Ø&) UÐ*BÀ3À%ð H/Ø/2¨e°8ð=ôð ˆr(   c               ó4   € V ^8„  d   QhRRRRRRRRRR	R
RRR/# )r   r6  r"   r¥  r"  r    r7  r   r™  rÔ  Úmoder   r!   ræ  r#   )r$   s   "r%   r&   r  °
  sP   € ÷ 7:ñ 7:àð7:ð ð7:ð ð	7:ð
 ð7:ð "ð7:ð ð7:ð 
ñ7:r(   c                ód  € VP                   R8X  d$   V P                  V4      pV P                  WV4      # VP                  '       d2   RV n        VR8X  d   RMRpV RV RVP                    RV R	V R
V R2.# V P                  V4      p	\        P                  P                  V4      p
V
eJ   V
P                  4       p\        V4      ^8”  d*   V P                  V4      '       g   V P                  WR4      # V	'       d¡   VR8X  d   RMRpRV R2.pRVP                    RV R2pVR8X  dP   V P                  P                  V4       V R2pVP                  V RV RVP                    RV R	V R
V R24       V# VP                  V RVP                    RV 24       V# V RVP                    RV 2.# )zŠ
Build the store expression based on indexing mode.
mode can be None (set) or "atomic_add" (accumulate).
Returns a list of lines to emit.
r$  TÚ
atomic_addrD  Úsetú[...] = z[...].flatten().at[jnp.asarray(z).flatten()].z(jnp.asarray(z).flatten()).reshape(ú.shape)Fr:  r,   z
(jnp.full(z%.shape, _val) if _val.ndim == 0 else Ú_aliasr‘  z] = )rÕ  r3  r=  rÖ  r  r]  r   r  rÔ  rÕ  r2  rR  r   rD  r
  )r/   r6  r¥  r"  r7  r™  r@  r8  Ú
scatter_opr  r�  rs  r<  r9  Úalias_params   &&&&&&&        r%   Ú_build_store_exprÚPallasKernel._build_store_expr°
  s  € ð ×Ñ Ô&à"×?Ñ?ÀÓEˆOØ×4Ñ4°SÀÓQÐQà×!×!Ð!Ø(,ˆDÔ%à"&¨,Ô"6™¸EˆJà�%�x ˜uÐ$CÀH×DVÑDVÐCWÐWdÐeoÐdpð qØ$˜gÐ%:¸3¸%¸wðHðð ð ×.Ñ.¨uÓ5ˆÜ�g‰g× Ñ  Ó&ˆàŠ?Ø—|‘|“~ˆHÜ�8‹}˜qÔ ¨×)AÑ)AÀ%×)HÒ)Hà×8Ñ8¸ÀUÓKÐKçà"&¨,Ô"6™¸EˆJØ*¨5¨'°Ð3Ð4ˆEØ% h×&8Ñ&8Ð%9Ð9^Ð_dÐ^eÐefÐgˆJØ�|Ô#à×&Ñ&×*Ñ*¨3Ô/Ø!$  V˜n�Ø—‘Ø�e˜8 K =Ð0OÐPX×PbÑPbÐOcÐcpÐq{Ðp|ð }#Ø#- ,Ð.CÀCÀ5ÈðQôð ˆLð —‘ ˜u A h×&8Ñ&8Ð%9¸¸j¸\ÐJÔKØˆLà�%�q˜×+Ñ+Ð,¨D°°Ð8Ð9Ð9r(   c               ó0   € V ^8„  d   QhRRRRRRRRRR	R
R/# )r   r6  r"   r7  r   Úscatter_infozdict[str, Any]r¥  r@  r   r!   r#   )r$   s   "r%   r&   r  é
  sN   € ÷ N
ñ N
àðN
ð ðN
ð %ð	N
ð
 ðN
ð ðN
ð 
ñN
r(   c           
     óÂ  € VP                  RR4      pV P                  P                  V4       V R2pVR8X  d   RMRpV'       d…   VR,          p	VR,          p
VR	,          p. p\        \	        V4      4       F-  pWÚ8X  d   VP                  V	4       K  VP                  R
4       K/  	  RP                  V4      pV RV RV RV RV R2
# VR,          p	VR,          pVR,          p\        P                  P                  V4      pVe   \	        VP                  4       4      M^ p\	        V4      \	        V4      ,           p\	        V P                  4      pV^,
          pVV8H  ;'       d    VV8H  pV'       d…   V UUu. uF  w  ppVNK
  	  ppp\	        V4      p\	        V4      pV^ 8”  d&   V^ 8”  d   RV,          pRV,          pV	 RV RV R2pMT	pVP                  V4       VP                  R V 4       4       M:V Uu. uF  pRNK  	  ppVP                  V	4       VP                  R V 4       4       RP                  V4      pV RV RV RV RV R2
# u uppi u upi )zBBuild store expression for scatter operations (indirect indexing).Úis_point_scatterFrF  rB  rD  rC  rÏ  rÎ  Úoutput_shapeÚ0r+   rD  z	[...].at[z].rX  r,   Údims_beforeÚ
dims_afterúNone, ú, Noner‘  r$  r’  c              3  ó*   "  € T F	  w  rVx € K  	  R # 5irf   r#   )rc  rº  r  s   &  r%   rd  Ú9PallasKernel._build_scatter_store_expr.<locals>.<genexpr>-  s   é € ÐI¹j©N¨H�x»jùs   ‚r�  c              3  ó&   "  € T F  pR x € K	  	  R# 5i)r�  Nr#   )rc  rh  s   & r%   rd  rV  2  s   é € Ð7©J q�s«Jùs   ‚)rð  r   rD  rn  r2  r
  r'  r   r  rÔ  rÕ  rH  r¿  )r/   r6  r7  rL  r¥  r@  rN  rH  rG  rÏ  rÎ  rO  Úindex_partsr|  Úindex_tuplerQ  rR  r�  Úoutput_ndimÚnum_iter_vars_in_storeÚtotal_kernel_iter_varsÚremaining_dimsÚis_element_wiserº  r  Ú	n_leadingÚ
n_trailingÚleading_onesÚtrailing_nonesÚindirect_reshapedrh  s   &&&&&&                         r%   Ú_build_scatter_store_exprÚ&PallasKernel._build_scatter_store_expré
  sŽ  € ð (×+Ñ+Ð,>ÀÓFÐð 	×Ñ×"Ñ" 3Ô'Ø˜˜V�nˆð # lÔ2‘U¸ˆ
çà'¨Õ7ˆLØ'¨Õ7ˆLØ'¨Õ7ˆLð ˆKÜœS Ó.Ö/�ØÔ&Ø×&Ñ& |Ö4à×&Ñ& sÖ+ñ	 0ð Ÿ)™) KÓ0ˆKØ�U˜( ; -¨y¸¸ÀRÈ
À|ÐSTÐUZÐT[Ð[\Ð]Ð]ð $ NÕ3ˆØ" =Õ1ˆØ! ,Õ/ˆ
ô �g‰g× Ñ  Ó&ˆØ-0ª_”c˜#Ÿ,™,›.Ô)À!ˆä!$ [Ó!1´C¸
³OÕ!CÐÜ!$ T×%:Ñ%:Ó!;ÐØ$ q�ˆð # nÑ4÷ Að AØ&Ð*@Ñ@ð 	÷
 á:EÔF¹+©¨°$›8¹+ˆKÑFô ˜KÓ(ˆIÜ˜Z›ˆJØ˜1Œ} ¨a¤Ø'¨)Õ3�Ø!)¨JÕ!6�Ø'3 n°A°l°^À3À~ÐFVÐVWÐ$XÑ!à$0Ð!Ø×ÑÐ0Ô1à×ÑÑI¹jÓIÕIñ )4Ó4© 1›3©ˆKÐ4Ø×Ñ˜|Ô,Ø×ÑÑ7©JÓ7Ô7à—i‘i Ó,ˆàˆe�8˜K˜=¨	°+°¸bÀÀÈAÈeÈWÐTUÐVð	
ùó+ Gùò  5s   Å;IÇ>Ic               ó$   € V ^8„  d   QhRRRRRR/# )r   r¥  r"   r"  r    r!   r   r#   )r$   s   "r%   r&   r  :  s!   € ÷ -ñ -˜ð - Zð -°Kñ -r(   c                	ó  € V P                   P                  V4      p\        P                  P	                  V4      pW P
                  V&   V P                  V4      pV P                  WV4      pV P                  W!4      pVe!   W`P                  V&   V P                  W64      pM6V P                  WV4      pV P                  WV4      pV P                  W1W%4      pVP                  '       g5   VP                  R8X  d$   V P!                  W4      pV P#                  WV4      pV P$                  P'                  V P(                  VVR7      pV P                   P                  V4      p	W�P*                  \-        V4      &   WP.                  V	&   V# )Nr$  ©r  )r.   rª  r   r  rf  rÿ  r  r§  rŠ  r  r•  r«  r²  rõ  rÖ  rÕ  rü  r  r.  r/  r0  r  r"   r  )
r/   r¥  r"  r�  r  r™  rŽ  rµ  Úcse_varÚ	buf_params
   &&&       r%   ÚloadÚPallasKernel.load9  sl  € à�i‰i�o‰o˜dÓ#ˆÜ—‘×!Ñ! $Ó'ˆð ',×Ñ˜dÑ#ð ×'Ñ'¨Ó.ˆð ×/Ñ/°¸XÓFˆð
 ×/Ñ/°Ó<ˆØÒØ/5×&Ñ& tÑ,Ø×/Ñ/°Ó<‰Ið ×:Ñ:¸4ÈÓQˆHð ×/Ñ/°¸XÓFˆHð ×-Ñ-¨c¸ÓIˆIð ×%×%Ð%¨(×*<Ñ*<ÀÔ*EØ×?Ñ?ÀÓPˆIà×7Ñ7¸ÀYÓOˆIà—(‘(×#Ñ#Ø�L‰LØØð $ó 
ˆð —I‘I—O‘O DÓ)ˆ	Ø+4×Ñœ3˜w›<Ñ(Ø/3×!Ñ! )Ñ,Øˆr(   c               ó    € V ^8„  d   QhRRRR/# r!  r#   )r$   s   "r%   r&   r  i  s   € ÷ @ñ @¨Jð @¸3ñ @r(   c                ó(
  a aa$a%€ S P                  S4      pS P                  P                  V4       \        V4      ^ 8X  d   S P	                  S4      # VV 3R lp\        W#RR7      pV Uu. uF
  qS! V4      NK  	  ppS P	                  S P                  S4      4      pS P                  S4      pV U	u. uF  p	\        V	4      NK  	  p
p	V Uu/ uF  p\        V4      V! V4      bK  	  pp\        V4      ^8X  dË   \        V
4      ^8X  d»   V^ ,          p\        V4      pVS P                  9   ;'       d    S P                  V,          P                  pV'       dk   VS P                  9   dX   S P                  V,          pVP                  pS P                  V4      pRS P	                  V4       R2pVP                  VV4      pV# Rp\        V
4      ^8”  d&   S P                  4       V,
          p\        V4      ^8H  pV'       Ed   ^\        V4      ,           pV
 F/  pR\        V4      ,          pV RV R2pVP                  VV4      pK1  	  \        V4       F´  w  pp\        V4      pVS P                  9   g   K$  S P                  V,          pVP                  pS P                  V4      pR	.V,          pS P	                  V4      VV^,           &   R
P                  V4      pRS P	                  V4       RV R2pVP                  VV4      pK¶  	  V# . pV F  pVP!                  V! V4      RV34       K  	  V F  p	VP!                  V! V	4      RV	34       K  	  VP#                  R RR7       \        V4       FÜ  w  pp\        V4      pVS P                  9   g   K$  S P                  V,          pVP                  pS P                  V4      pV! V4      o%RS P	                  V4       R2p\%        V%3R lV 4       4      p\%        V%3R lVP'                  4        4       4      pVV,           pV^ 8”  d   RV,          p V RV  R2pVP                  VV4      pKÞ  	  V
 F¨  pVV,          o$\%        V$3R lV 4       4      p!\%        V$3R lV 4       4      pV!^ 8”  d&   V^ 8”  d   RV!,          p"RV,          p#V RV" RV# R2pM4V!^ 8”  d   RV!,          p"V RV" R2pMV^ 8”  d   RV,          p#V RV# R2pMTpVP                  VV4      pKª  	  V# u upi u up	i u upi )a9  
Handle indexing with both indirect variables and iteration variables.

For example, x[indices, :] generates index = i0 + stride * tmp0
where tmp0 is loaded from indices and i0 is the iteration variable.

We need to convert this to JAX advanced indexing with proper broadcasting.
When there are multiple iteration variables, they need different shapes
to form an outer product (grid) rather than broadcasting together.

Special case: For gather operations where a single iteration variable
and single indirect variable have the same extent, they should be
element-wise aligned, not broadcast into an outer product.

PyTorch advanced indexing semantics: When multiple indirect indices have
the same shape, they are paired element-wise (not outer product), and
the combined result dimension appears at the FRONT of the output.
c                ó>   <€ SP                  SV \        R 4      R7      # )Úinf)Údefault)r×  rý   )r4  r"  r/   s   &€€r%   Ú_coeffÚ3PallasKernel._handle_mixed_indexing.<locals>._coeff‡  s   ø€ Ø×.Ñ.¨u°cÄ5ÈÃ<Ð.ÓPÐPr(   T©Úkeyr  újnp.arange(r,   Fz, 1z.reshape(-1Ú1r+   z
).reshape(r4  rð  c                ó   € V ^ ,          # r=  r#   rq   s   &r%   r¯  Ú5PallasKernel._handle_mixed_indexing.<locals>.<lambda>ì  s   € ¨!¨A®$r(   c              3  ó8   <"  € T F  qS8  g   K  ^x € K  	  R# 5irg  r#   ©rc  r0   Ú	var_coeffs   & €r%   rd  Ú6PallasKernel._handle_mixed_indexing.<locals>.<genexpr>  s   øé € Ð%N±¨AÀIÁ§a¢a³ùó   ƒ�
c              3  ó8   <"  € T F  qS8  g   K  ^x € K  	  R# 5i)r   Nr#   r{  s   & €r%   rd  r}    s   øé € ð *Ù7˜!¸y¹=—A’AÓ7ùr~  rT  z[:r’  c              3  ó8   <"  € T F  qS8”  g   K  ^x € K  	  R# 5irg  r#   ©rc  r0   Úindirect_coeffs   & €r%   rd  r}    s   øé € ÐI¡{ !¸.Ñ6HŸAšA£{ùr~  c              3  ó8   <"  € T F  qS8  g   K  ^x € K  	  R# 5irg  r#   r�  s   & €r%   rd  r}    s   øé € ÐJ© 1¸>Ñ7IŸQšQ«ùr~  rS  r‘  r$  z...]z[...)r*  r(  r)  r2  r-  rE  r,  rY  r"   rH  rÒ  rr  ÚreplacerB  r   r'  r
  ÚsortrŸ  r'  )&r/   r"  Úused_iter_vars_setrr  r(  r4  Úiter_coeffsrÕ  Úindirect_var_symsr  rÐ  rX  Úindirect_coeffsrº  Úis_reduction_varÚrange_entryÚ
range_sizeÚrenamed_sizeÚarange_exprÚpaired_indirectÚunused_iter_varsÚn_output_dimsrÏ  Útrailing_onesÚreshape_exprrõ  Úshape_partsÚ	shape_strÚall_componentsÚn_trailing_iterÚn_trailing_indirectr`  Útrailing_dimsr_  Úleading_nonesrb  r‚  r|  s&   ff                                  @@r%   r  Ú#PallasKernel._handle_mixed_indexingi  s=  û€ ð& "×5Ñ5°eÓ<Ðð 	×Ñ×"Ñ"Ð#5Ô6äÐ!Ó" aÔ'Ø—:‘:˜eÓ$Ð$ö
	Qô  Ð 2ÈÔMˆÙ.<Ó=©n s�v˜c–{©nˆÐ=ð —J‘J˜t×3Ñ3°EÓ:Ó;ˆ	Ø ×3Ñ3°EÓ:ÐÙ->Ó?Ñ-> cœ˜SžÑ->ˆÐ?ñ 7HÓHÑ6G°œ3˜q›6¡6¨!£9Ò,Ñ6GˆÐHô ˆ~Ó !Ô#¬¨MÓ(:¸aÔ(?Ø  Õ#ˆCÜ˜3“xˆHà�t×,Ñ,Ñ,×XÐX°×1FÑ1FÀsÕ1K×1XÑ1Xð ÷  à˜$×/Ñ/Ô/Ø"&×"7Ñ"7¸Õ"<�KØ!,×!3Ñ!3�Jà#'×#7Ñ#7¸
Ó#C�LØ$/°·
±
¸<Ó0HÐ/IÈÐ"K�KØ )× 1Ñ 1°(¸KÓ H�IØ Ð ð  ˆÜˆ}Ó Ô!à#×2Ñ2Ó4Ð7IÕIÐô "Ð"2Ó3°qÑ8ˆOçˆ?ð ¤ NÓ 3Õ3ˆMó !.�Ø %¬¨NÓ(;Õ ;�Ø". ¨{¸=¸/ÈÐK�Ø%×-Ñ-¨l¸LÓI’	ñ !.ô $ NÖ3‘��3Ü˜s›8�Ø˜$×/Ñ/Ö/Ø"&×"7Ñ"7¸Õ"<�KØ!,×!3Ñ!3�Jà#'×#7Ñ#7¸
Ó#C�Lð $' %¨-Õ"7�KØ)-¯©°LÓ)A�K  A¥Ñ&Ø $§	¡	¨+Ó 6�Ià% d§j¡j°Ó&>Ð%?¸zÈ)ÈÐTUÐVð  ð !*× 1Ñ 1°(¸KÓ H’Iñ# 4ð& Ðð
 ˆÛ!ˆCØ×!Ñ!¡6¨#£;°¸Ð"<Ö=ñ "ã$ˆCØ×!Ñ!¡6¨#£;°
¸CÐ"@ÖAñ %à×Ñ¡¸ÐÔ=ô   Ö/‰FˆAˆsÜ˜3“xˆHØ�d×+Ñ+Ö+Ø"×3Ñ3°CÕ8�Ø(×/Ñ/�
à#×3Ñ3°JÓ?�Ù" 3›K�	à +¨D¯J©J°|Ó,DÐ+EÀQÐG�ô #&Ô%N±Ó%NÓ"N�Ü&)ô *Ø.×5Ñ5Ô7ó*ó 'Ð#ð -Ð/BÕB�
à ”>Ø$,¨zÕ$9�MØ%0 M°°M°?À!Ð"D�Kà%×-Ñ-¨h¸ÓD’	ñ5 0ó: *ˆLØ,¨\Õ:ˆNô ÔI¡{ÓIÓIˆIÜÔJ©ÓJÓJˆJð ˜1Œ} ¨a¤Ø (¨9Õ 4�Ø!)¨JÕ!6�Ø". ¨q°°¸sÀ>ÐBRÐRSÐT‘Ø˜Q”Ø (¨9Õ 4�Ø". ¨q°°¸tÐD‘Ø˜a”Ø!)¨JÕ!6�Ø". ¨t°NÐ3CÀ1ÐE‘à+�à!×)Ñ)¨,¸ÓEŠIñ+ *ð. Ðùò} >ùò
 @ùò Is   Á*TÂ1T
ÃTc          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )r   r¥  r"   r"  r    r7  r   r@  r   r!   r  r#   )r$   s   "r%   r&   r  ,  s4   € ÷ :7ñ :7Øð:7Ø *ð:7Ø3>ð:7ØFIð:7à	ñ:7r(   c                	ó`  € Ve   VR8w  d   \        RV R24      hV P                  P                  V4      pV P                  P	                  V4       \
        P                  P                  V4      pVR J;'       d    \        VP                  4       4      ^ 8H  pV'       d   RV R2V RV RV R2.pM¼V P                  e   V P                  WSR	4      pM›V P                  W!4      p	V	e@   V P                  P                  V P                  V4      4       V P!                  WSW‘V4      .pMGV P#                  V4      p
V P%                  WV
4      p
V P'                  W*4      p
V P)                  WQW#W¤4      pV F:  pV P*                  P-                  V4       V P.                  P1                  W[34       K<  	  R # )
NrB  zpallas store mode 'z' not supportedr:  r,   r;  z2.shape, _val) if _val.ndim == 0 else _val.reshape(rE  F)rh   r.   ÚoutputÚstore_buffer_namesrD  r   r  rÔ  r2  rÕ  r  r=  Ú_detect_scatter_patternr(  r)  r*  rd  r  r«  r  rI  Ústoresr¡  rþ  r
  )r/   r¥  r"  r7  r@  r6  r�  Ú	is_scalarÚstore_linesrL  r™  rÂ  s   &&&&&       r%   ÚstoreÚPallasKernel.store+  s±  € ð
 Ò ¨Ô 4ÜÐ 3°D°6¸ÐIÓJÐJØ�i‰i×Ñ˜tÓ$ˆØ×Ñ×#Ñ# DÔ)ô �g‰g× Ñ  Ó&ˆØ˜t�O×@Ð@¬¨C¯L©L«NÓ(;¸qÑ(@ˆ	çà% e W¨AÐ.Ø�%Ð(¨¨Ð-_Ð`cÐ_dÐdkÐlð‰Kð ×*Ñ*Ò6Ø"×?Ñ?ÀÈEÓR‘ð  $×;Ñ;¸EÓH�àÒ+à×'Ñ'×.Ñ.¨t×/GÑ/GÈÓ/NÔOà×6Ñ6Ø¨¸Dóð#‘Kð  $×3Ñ3°EÓ:�Hð  $×BÑBØ Xó �Hð
  $×9Ñ9¸%ÓJ�Hð #'×"8Ñ"8Ø 5°ó#�Kó  ˆDØ�K‰K×!Ñ! $Ô'à×"Ñ"×)Ñ)¨3¨+Ö6ó  r(   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r"  r    r4  rÚ  rq  zint | floatr!   r#   )r$   s   "r%   r&   r  i  s,   € ÷ 
ñ 
Øð
Ø ,ð
Ø7Bð
à	ñ
r(   c                ó¨   € V P                  V4      pV^ 8X  d   \        P                  ! W4      p \        V4      #   \        \
        3 d    Tu # i ; i)z=Get integer coefficient of a variable in an index expression.)rz  r%  ÚdiffrÍ  r7  r8  )r"  r4  rq  rz  s   &&& r%   r×  Ú#PallasKernel._get_index_coefficienth  sO   € ð
 —‘˜CÓ ˆØ�AŒ:Ü—J’J˜uÓ*ˆEð	Ü�u“:ÐøÜœ:Ð&ô 	ØŠNð	ús   °
; »AÁAc               ó$   € V ^8„  d   QhRRRRRR/# )r   r"  r    Úoutput_namer"   r!   údict[str, Any] | Noner#   )r$   s   "r%   r&   r  u  s)   € ÷ Nñ NØðNØ.1ðNà	ñNr(   c                ó,  € V P                  V4      p\        V4      ^8w  d   R# V^ ,          p\        V4      p\        V P	                  W4      4      pV^ 8X  d   R# V P                  V4      '       g   V P                  W%V4      # V P                  WV4      # )zDDetect scatter operation pattern. Returns scatter info dict or None.N)rY  r2  r"   rÍ  r×  rR  Ú_detect_point_scatterÚ_detect_iter_scatter)r/   r"  r«  Úindirect_symsÚindirect_symrÏ  r‚  s   &&&    r%   r   Ú$PallasKernel._detect_scatter_patternu  s“   € ð ×/Ñ/°Ó6ˆÜˆ}Ó Ô"Ùà$ QÕ'ˆÜ˜<Ó(ˆÜ! $×"=Ñ"=¸eÓ"RÓSˆØ˜QÔÙð ×'Ñ'¨×.Ò.Ø×-Ñ-¨kÈÓXÐXð ×(Ñ(¨¸nÓMÐMr(   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r«  r"   rÏ  r‚  rÍ  r!   r¬  r#   )r$   s   "r%   r&   r  Š  s,   € ÷ 
ñ 
Øð
Ø.1ð
ØCFð
à	ñ
r(   c                ó¶  € V'       g   R#  \         P                  P                  V4      pVP                  4        Uu. uF  p\	        V4      NK  	  pp\        T4      ^8  d   R# ^p\        T4      ^,
          p\        \        T4      ^,
          R	R	4       F  p	Y78X  d   T	p MYvT	,          ,          pK  	  RTRTR. R. RRRT/# u upi   \
         d     R# i ; i)
z&Detect single-element scatter pattern.NrÏ  rÎ  rQ  rR  rN  TrO  rî  )r   r  rÔ  rÕ  rÍ  Ú	Exceptionr2  rn  )
r/   r«  rÏ  r‚  r�  rX  rO  Ú
cumulativerÎ  r|  s
   &&&&      r%   r®  Ú"PallasKernel._detect_point_scatterŠ  sâ   € ÷ Ùð	Ü—'‘'×$Ñ$ [Ó1ˆCØ,/¯L©L¬NÓ;©N qœC žF©NˆLÐ;ô ˆ|Ó˜qÔ Ùð ˆ
Ü˜<Ó(¨1Õ,ˆÜœ˜\Ó*¨QÕ.°°BÖ7ˆCØÔ+Ø"�ÙØ sÕ+Õ+ŠJñ	 8ð ˜LØ˜LØ˜2Ø˜"Ø Ø˜Lð
ð 	
ùò! <øÜô 	Úð	ús"   Œ1C	 ½CÁC	 ÃC	 Ã	CÃCc               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   r"  r    rÏ  r"   r‚  rÍ  r!   r¬  r#   )r$   s   "r%   r&   r  «  s,   € ÷ +
ñ +
Øð+
Ø/2ð+
ØDGð+
à	ñ+
r(   c                ó   a€ V P                  V4      p. pV F‡  p\        V P                  W4      4      pV^ 8”  g   K&  W`P                  9   g   K8  V P	                  V P                  V,          P
                  4      pVf    R# VP                  \        V4      Wx34       K‰  	  VP                  SVR34       VP                  R RR7       \        V3R l\        V4       4       R4      p	V	f   R# ^p
\        WY^,           R 4       F  w  r·pWz8w  d    R# W¨,          p
K  	  W:8w  d   R# RSRT	RVRV	  UUUu. uF	  w  rËqÜV3NK  	  upppR	WY^,           R  UUUu. uF	  w  rËqÜV3NK  	  upppR
RRR/# u upppi u upppi )z0Detect scatter pattern with iteration variables.Nc                ó   € V ^,          # )r9   r#   rq   s   &r%   r¯  Ú3PallasKernel._detect_iter_scatter.<locals>.<lambda>¼  s   €  A a¦Dr(   Trt  c              3  óF   <"  € T F  w  pw  p q2S8X  g   K  Vx € K  	  R # 5irf   r#   )rc  rõ  r¥  rh  rÏ  s   &   €r%   rd  Ú4PallasKernel._detect_iter_scatter.<locals>.<genexpr>À  s$   øé € ÐRÑ&9‘?�1‘l�t˜Q À\Ñ=Q�QŠQÓ&9ùs   ƒ!—
!rÏ  rÎ  rQ  rR  rN  FrO  rî  )r*  rÍ  r×  rH  rj  rr  r
  r"   r…  r3  r   r¾  )r/   r"  rÏ  r‚  r(  Úall_varsr4  rz  rr  Úindirect_posÚexpectedrh  r  r…  s   &&f&          r%   r¯  Ú!PallasKernel._detect_iter_scatter«  s‹  ø€ ð ×1Ñ1°%Ó8ˆð 02ˆÛ!ˆCÜ˜×3Ñ3°EÓ?Ó@ˆEØ�qŽy˜S×$9Ñ$9Ö9ØŸ™¨×(=Ñ(=¸cÕ(B×(IÑ(IÓJ�Ø’>ÚØ—‘¤ S£¨5Ð 9Ö:ñ "ð 	�‰˜ ~°rÐ:Ô;Ø�‰™.°$ˆÔ7ô ÜR¤i°Ô&9ÓRØó
ˆð ÒÙð ˆÜ (¨ÀÕ2BÐ2DÐ)EÖ FÑˆA�fØÔ ÚØÕŠHñ !Gð Ô%Ùð ˜LØ˜LØ°(¸=¸LÑ2IÕJÑ2I¡w q¨Q ›FÑ2IÓJØ°ÈÕ:JÐ:LÑ1MÕNÑ1M¡g a¨A˜q›6Ñ1MÓNØ Ø˜Dð
ð 	
ùô KùÜNs   Ä6E2ÅE9c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   r  r  r  Úreduction_typerQ   r7  z%CSEVariable | tuple[CSEVariable, ...]r!   r#   )r$   s   "r%   r&   r  Ø  sC   € ÷ nñ nàðnð ðnð &ð	nð
 5ðnð 
/ñnr(   c                óÈ  a € S P                   '       g   \        R4      hVR8X  d   S P                  W4      # \        V\        4      '       d   \        R4      hW#V3pVS P                  P                  9   d   S P                  P                  V,          # RRRRRR	R
RRRRRRR/p\        . R"O4      p\        ;QJ d    V 3R lV 4       F  '       g   K   RM	  RM! V 3R lV 4       4      pS P                  V4      p	S P                  4       p
\        R S P                  P                  4        4       4      pT;'       d)    V	RJ;'       d    V	^8„  ;'       d    T
;'       d    V^ 8„  pT;'       d    V^ 8„  ;'       d    V	RJ pVR8X  dE   V'       d6   S P                  4       p\!        V4      ^8X  d
   V^ ,          MTpRV RV R2pMÚRV R2pMÓVR#9   d=   Wc,          pV'       d$   S P                  4       pV RV RVR$,           R2pM™V RV R2pM�W69   db   Wc,          pV'       d8   S P                  4       p\!        V4      ^8X  d
   V^ ,          MTpV RV RV R2pMCV'       d
   V RV R2pM2V RV R2pM)\        RV R\#        VP%                  4       4       R 24      hS P                  P'                  S P(                  VVR!7      pVS P                  P                  V&   V# )%a  
Generate code for reduction operations in JAX/Pallas.

Reductions in Pallas work by:
1. Loading the input data into the kernel
2. Applying JAX reduction operations (jnp.sum, jnp.max, etc.)
3. Storing the reduced result

The reduction happens over the loaded block of data.
z!expected to be inside a reductionÚwelford_reducezHTuple reductions (e.g., welford_combine) not supported in Pallas backendrŸ  zjnp.sumrÓ  zjnp.prodrÌ  zjnp.maxÚminzjnp.minrk  zjnp.anyÚargmaxz
jnp.argmaxÚargminz
jnp.argminc              3  ó@   <"  € T F  qSP                   9   x € K  	  R # 5irf   )r[  )rc  r1   r/   s   & €r%   rd  Ú)PallasKernel.reduction.<locals>.<genexpr>  s   øé € ÐIÑ6H° §¡Ö,Ó6Hùs   ƒTFc              3  óL   "  € T F  qP                   '       g   K  ^x € K  	  R# 5irg  ©rÒ  )rc  rÜ  s   & r%   rd  rÊ    s   é € ð 
Ù9�%×=OÕ=O�AŠAÓ9ùó   ‚$š
$NÚxor_sumzjnp.bitwise_xor.reduce(z, axis=r,   rX  z, keepdims=True)z	, axis=0)zReduction type 'z8' not yet supported in Pallas backend. Supported types: z	, xor_sumrh  )rm   rü  Úz)rÇ  rÈ  rî  )Úinside_reductionrí  Úwelford_reduce_fallbackr  rË  rh   r.  Úreduction_cacher   rk  r]  r>  rŸ  rH  r'  rV  r2  rl  rI  r/  r0  )r/   r  r  rÃ  r7  Ú	cache_keyÚreduction_opsÚpointwise_prefixesÚhas_pointwiseÚpointwise_numelro  Ún_reduction_dimsÚis_partial_reductionÚis_symbolic_partialrR  Ú	axis_exprÚreduction_exprÚreduction_opr>   s   f&&&&              r%   Ú	reductionÚPallasKernel.reductionØ  s7  ø€ ð" ×$×$Ð$Ü Ð!DÓEÐEð Ð-Ô-Ø×/Ñ/°Ó=Ð=ä�eœU×#Ò#ÜØZóð ð
 °Ð6ˆ	Ø˜Ÿ™×0Ñ0Ô0Ø—8‘8×+Ñ+¨IÕ6Ð6ð �9Ø�JØ�9Ø�9Ø�9Ø�lØ�lð
ˆô (ªÓ8Ðß›ÔIÑ6HÓIŸŸšÔIÑ6HÓIÓIˆØ&*×&@Ñ&@ÐASÓ&TˆØ&*×&CÑ&CÓ&EˆÜñ 
Ø×0Ñ0×7Ñ7Ô9ó
ó 
Ðð
 ÷ %ð %Ø tÐ+÷%ð %à !Ñ#÷%ð %ð  ÷%ð %ð ! 1Ñ$ð 	ð ×NÐNÐ.°Ñ2×NÐN°È$Ð7Nð 	ð ˜YÔ&ß#Ø×/Ñ/Ó1�Ü'*¨4£y°A¤~˜D žG¸4�	Ø#:¸5¸'ÀÈÈÐSTÐ!U‘à#:¸5¸'ÀÐ!C‘ØÐ3Ô3Ø(Õ8ˆLß#à×/Ñ/Ó1�Ø$0 >°°5°'¸ÀÀbÅÀ
È!Ð!L‘à$0 >°°5°'¸Ð!;‘ØÔ,Ø(Õ8ˆLß#Ø×/Ñ/Ó1�Ü'*¨4£y°A¤~˜D žG¸4�	à#�n A e W¨G°I°;Ð>NÐOñ ÷ %ð %1 >°°5°'¸Ð!C‘à$0 >°°5°'¸Ð!;‘äØ" >Ð"2ð 3$Ü$(¨×);Ñ);Ó)=Ó$>Ð#?¸yðJóð ð —‘×"Ñ"Ø�L‰LØØð #ó 
ˆð /5ˆ�‰× Ñ  Ñ+Øˆr(   c               ó    € V ^8„  d   QhRRRR/# )r   Úbuffer_namer"   r!   r  r#   )r$   s   "r%   r&   r  I  s   € ÷ &ñ &¨3ð &°4ñ &r(   c                	ó€   € \         P                  P                  V 4      pVP                  4       pVP	                  4       # rf   )r   r  rÔ  r­  rØ  )rá  r�  rµ  s   &  r%   Ú_buffer_is_contiguousÚ"PallasKernel._buffer_is_contiguousH  s1   € ä�g‰g× Ñ  Ó-ˆØ—‘Ó!ˆØ×#Ñ#Ó%Ð%r(   c               ó   € V ^8„  d   QhRR/# rd  r#   )r$   s   "r%   r&   r  N  s   € ÷ Dñ D 4ñ Dr(   c                óP  aaa € V P                   '       d   R# V P                  '       d   R# V P                  '       d   R# V P                  '       de   RP	                  R V P
                  P                   4       4      pV P                   F(  pW P                  9   d   K  \        V4      V9   g   K'   R# 	  \        V P                  P                  P                  4       4      pRpV Fº  pV P                  V4      pVf   K  Vw  rxryp\        V	4      ^8¼  g   K2  \        V4      ^8¼  g   KD  V	^ ,          p
V	^,          pV P                  V^ ,          4      pV P                  V^,          4      pV
f   KŒ  Vf   K’  W«8  g   Kš  Vf   K   Vf   K¦  V^8”  g   K¯  V^8”  g   K¸  Rp M	  \!        V P"                  4      ;'       g    TV n        V P'                  4       pVRJ;'       d    V^8„  pV'       d   \)        R V P*                   4       4      M^ V n        . o V F�  pV P                  V4      pVf    R# Vw  rx  pV Uu. uF  pV P                  V4      NK  	  upo\.        ;QJ d    R S 4       F  '       g   K   RM	  RM! R S 4       4      '       d    R# \        S4      \        S 4      8”  g   K›  So KŸ  	  S '       g   R# V P0                  e   \        V P0                  4      o \        S 4      p\        V P                  P2                  4      V,           pRpV EF.  pV P                  V4      pVf    R# Vw  rx  p\        V4      ^ 8X  d   K5  WPP4                  9   d   \        V P4                  V,          4      oMˆV P0                  e   WS9   d   \        V P0                  4      oM^V Uu. uF  pV P                  V4      NK  	  upo\.        ;QJ d    R S 4       F  '       g   K   RM	  RM! R S 4       4      '       d    R# \        S4      pVV8X  Edd   WPP6                  9   pRp\9        V4       F@  pSV,          S V,          8X  g%   SV,          ^8X  g   S V,          ^8X  g	   V'       d   K>  Rp M	  V'       dŽ   WPP"                  9   d~   V P"                  V,          o\        S4      V8X  dW   \:        ;QJ d*    VVV 3R	 l\9        V4       4       F  '       d   K   RM	  RM! VVV 3R	 l\9        V4       4       4      '       g    R# MV'       d    R# V'       gU   \.        ;QJ d)    VV 3R
 l\9        V4       4       F  '       g   K   RM	  RM! VV 3R
 l\9        V4       4       4      '       d   RpEK]  EK`  VV8”  dƒ   Rp\9        VV,
          ^,           4       FS  pRp\9        V4       F3  pS V,          ^8X  d   K  SVV,           ,          S V,          8w  g   K1  Rp M	  V'       g   KQ  Rp M	  V'       g    R# RpEKé  \=        \?        S4      \?        S 4      4       F#  w  ppVV8w  g   K  V^8w  g   K  V^8w  g   K!    R# 	  EK1  	  V'       g   R# \@        PB                  PE                  4       PF                  R8H  pV'       g
   ^@V n$        R# RV n$        R# u upi u upi )a¸  Check if this kernel can use tiling on CPU/TPU.

Tiling is compatible with reductions, transpositions, and multi-range-tree
kernels as long as no flatten-based indexing is used (buf[...].flatten()[idx]).
Flatten indexing requires global flat indices which don't decompose into
per-tile local indices.

Reject:
- GPU (has its own TMA / padding path)
- Flatten-based indexing
- Scatter outputs (indirect indexing complicates tile boundaries)
FÚ
c              3  ó8   "  € T F  p\        V4      x € K  	  R # 5irf   ©r"   ©rc  rÂ  s   & r%   rd  Ú1PallasKernel._can_tile_cpu_tpu.<locals>.<genexpr>g  s   é € Ð$OÑ;N°4¤S¨§Y YÓ;Nùó   ‚NTc              3  óL   "  € T F  qP                   '       g   K  ^x € K  	  R# 5irg  rÌ  )rc  ra  s   & r%   rd  rë  “  s   é € ÐDÑ.�d×2CÕ2C—’Ó.ùrÍ  c              3  ó(   "  € T F  qR J x € K
  	  R # 5irf   r#   rb  s   & r%   rd  rë  Ÿ  s   é € Ð/¡h ˜•9£hùrÌ  c              3  ó(   "  € T F  qR J x € K
  	  R # 5irf   r#   rb  s   & r%   rd  rë  Á  s   é € Ð3©( Q˜D•y«(ùrÌ  c              3  ó¶   <"  € T FN  pSSV,          ,          SV,          8H  ;'       g(    SSV,          ,          ^8H  ;'       g    SV,          ^8H  x € KP  	  R# 5irg  r#   )rc  rõ  Úint_sizerá  Ú	ref_shapes   & €€€r%   rd  rë  Ù  sd   øé € ð  ñ &3 ð % T¨!¥WÕ-°¸1µÑ=÷ 1ð 1Ø'¨¨Q­Õ0°AÑ5÷1ð 1à(¨�|¨qÑ0ô1ó &3ùs   ƒ%A©AÁAc              3  ór   <"  € T F,  pSV,          SV,          8H  ;'       d    SV,          ^8„  x € K.  	  R# 5irg  r#   )rc  rõ  rñ  rò  s   & €€r%   rd  rë  å  s9   øé € ð %á*˜ð ˜Q•K 9¨Q¥<Ñ/×DÐD°I¸aµLÀ1Ñ4DÔDÛ*ùs   ƒ7¢7r  )%rü  r  r   r(  r'  r0  r½  r  r"   rl  r.   Úoutput_buffersrI  ri  r2  rj  r  r  Útile_has_transposer>  rŸ  r.  Útile_skip_last_nrk  r  rm  r  r  rn  ro  Úzipr¾  r   r  r  r  r  )!r/   Úcompute_textrÛ  Úout_bufsÚhas_col_major_outr£  r^   rh  rs  rJ  r,  r-  Úd0Úd1ro  Úhas_reductionrX  Úref_ndÚall_bufsÚhas_tileableÚbuf_ndÚ
is_stridedÚmismatchrõ  Úfoundræ  Úokrä   rå   rã  rñ  rá  rò  s!   &                             @@@r%   Ú_can_tile_cpu_tpuÚPallasKernel._can_tile_cpu_tpuN  sž  ú€ ð �;�;ˆ;ÙØ×$×$Ð$ÙØ×!×!Ð!Ùð ××ÐØŸ9™9Ñ$O¸4¿<¹<×;NÒ;NÓ$OÓOˆLØ×.Ô.�Ø×:Ñ:Ô:ÙÜ�w“< <Ö/Ú ñ	 /ô ˜Ÿ	™	×0Ñ0×5Ñ5Ó7Ó8ˆð "ÐÛ ˆHØ×(Ñ(¨Ó2ˆDØŠ|ÙØ04Ñ-ˆA˜¨AÜ�>Ó" aÖ'¬C°«M¸QÖ,>Ø# AÕ&�Ø# AÕ&�Ø—^‘^ H¨Q¥KÓ0�Ø—^‘^ H¨Q¥KÓ0�à”NØœØžØœØœØ˜QžØ˜Qžà(,Ð%Ùñ) !ô* #' t×'BÑ'BÓ"C×"XÐ"XÐGXˆÔð
 ×7Ñ7Ó9ˆØ'¨tÐ3×KÐK¸È!Ñ8Kˆ÷ ô ÑD˜d×.Ò.ÓDÔDàð 	Ôð  "ˆ	Û ˆHØ×(Ñ(¨Ó2ˆDØŠ|ÚØ#'Ñ ˆA˜˜A˜qÙ3;Ó<±8¨a˜Ÿ™ qÖ)±8Ñ<ˆHß‹sÑ/¡hÓ/�s�sŠsÑ/¡hÓ/×/Ò/ÚÜ�8‹}œs 9›~Ö-Ø$’	ñ !÷ Ùð
 ×&Ñ&Ò2Ü˜T×8Ñ8Ó9ˆIä�Y“ˆä˜Ÿ	™	×/Ñ/Ó0°8Õ;ˆØˆÜ ˆHØ×(Ñ(¨Ó2ˆDØŠ|ÚØ#'Ñ ˆA˜˜A˜qÜ�8‹} Ô!Ùð ×8Ñ8Ô8Ü × =Ñ =¸hÕ GÓH‘Ø×,Ñ,Ò8¸XÔ=QÜ × ;Ñ ;Ó<‘á7?Ó@±x°!˜DŸN™N¨1Ö-±xÑ@�ß“3Ñ3©(Ó3—3—3’3Ñ3©(Ó3×3Ò3Ú Ü˜“]ˆFà˜Õð &×)CÑ)CÑC�
Ø �Ü˜vž�Aà  � y°¥|Ô3Ø# A�;¨!Ô+Ø$ Q�<¨1Ô,ß%á Ø#�HÙñ '÷  ×,GÑ,GÔ GØ×6Ñ6°xÕ@�Dä˜D›	 VÔ+ß›Cö  ô &+¨6¤]ó	 ŸCŸCšCö  ô &+¨6¤]ó	 ÷ ò ò  %ð÷ Ú ÷ §£õ %ä" 6œ]ó%§§¢õ %ä" 6œ]ó%÷ "ò "ð $(“Lò	"ð ˜&”ð �Ü˜v¨�°Õ2Ö3�AØ�BÜ" 6ž]˜Ø$ Q�<¨1Ô,Ù$Ø# A¨¥E�?¨i¸­lÖ:Ø!&˜BÙ!ñ +÷ ‘rØ $˜Ùñ 4÷ Ú Ø#“ô  ¤¨Ó 2´H¸YÓ4GÖH‘D�A�qØ˜A–v ! q¦&¨Q°!®VÛ$ô Iña !÷h Ùô —‘×4Ñ4Ó6×;Ñ;¸uÑDˆßØ)+ˆDÔ&ñ ð *.ˆDÔ&áùòi =ùòD As   È?ZÎ,Z#c               ó    € V ^8„  d   QhRRRR/# )r   r¥  rZ   r!   r"   r#   )r$   s   "r%   r&   r    s   € ÷ Qñ Q :ð Q¸ñ Qr(   c                ó`  € \        4       pV P                  P                  4       w  r4 pV Uu. uF  qfP                  NK  	  ppV Uu. uF  qˆP	                  R4      '       g   K  VNK  	  p	pV Uu. uF  qˆP	                  RJ4      '       g   K  VNK  	  p
p\        V P                  P                  P                  4       4      pV Uu. uF  qˆV9   g   K  VNK  	  ppV
'       g   \        R4      hV P                  P                  P                  4        UUu/ uF  w  rÞ\        V\        4      '       g   K  WíbK!  	  pppT;'       g    Rp\        P                  P                  4       P                   R8H  pV'       d   RMRp/ pV	 F  pRVV&   K
  	  V	 Uu. uF  pVV,          '       g   K  V R	2NK  	  ppV Uu. uF  qˆP	                  RK4      '       g   K  VNK  	  ppVV,           pVV,           p\        VP                  4        UUu. uF  w  ppV'       d   K  VNK  	  upp4      pV'       d   \#        \%        \'        V
4      4      4      pM=V P(                  '       d   . pM(\+        V
4       UUu. uF  w  ppVV9   g   K  VNK  	  ppp\-        RL/ R
VbRVbRV P(                  bRVbRVbRVbRV	bRV
bRVbRVbRVbRVbRVbRVbRVbRVbRVbR. b pVV n        V P1                  V4       \        4       pVP3                  4       ;_uu_ 4        V P5                  VV4       V P6                  P8                   F  pVP;                  \        V4      4       K  	  RRR4       V P                  P                  4       w  r4 pV Uu. uF  qfP                  NK  	  pp\        V P                  P                  P                  4       4      pV Uu. uF  qˆV9   g   K  VNK  	  upVn        V Uu. uF  qˆP	                  RK4      '       g   K  VNK  	  upVn        VVP>                  ,           Vn         VV,           Vn!        V PE                  4       V n#        Rp V PH                  '       d   Rp V PK                  VV4      Vn&        \O        V PP                  4      p!V!'       d–   V PS                  4        \        4       p"V"P3                  4       ;_uu_ 4        V P6                  P8                   F  pV"P;                  \        V4      4       K  	  RRR4       V PU                  VVV"4       VPW                  4       # RV R R!PY                  VPB                  4       V  R"2p#VP;                  V#4       VP3                  4       ;_uu_ 4        V P[                  VVV4       RRR4       VP;                  R4       V R#2p$. p%^\'        VP<                  4      ,           p&\+        VP@                  4       F>  w  ppVV9   g   VP	                  R4      '       g   K&  V%P]                  VV&,           4       K@  	  V%'       d(   R$R!PY                  R% V% 4       4      ,           R&,           p'MR'p'\#        \%        ^\'        VP<                  4      ,           4      4      p(R$R!PY                  R( V( 4       4      ,           R&,           p)VP;                  R)V) R*V' R+24       R,R-.VP<                  ,           VP@                  ,           p*VP;                  RV$ R$R!PY                  V*4       R"24       R!PY                  R. VPL                   4       4      p+V P_                  V4      w  p,p-RMp.VP3                  4       ;_uu_ 4        V,'       d   VPa                  V.4       EMíV-'       dD   VP;                  R/4       VP3                  4       ;_uu_ 4        VPa                  V.4       RRR4       VP;                  R04       V Pb                  e    VP;                  R1V Pb                   R&24       VPL                   F3  w  p/p0VP@                  V/,          pVP;                  V R2V R3V0 R424       K5  	  VP;                  R54       VP;                  R64       VP;                  R74       VP;                  R+4       V PF                  '       d   V Pe                  V4       EM4V Pg                  VVP@                  4       VP@                   FY  pV Pi                  V4      p1V1'       d   V Pj                  Pm                  V14      MRp2V2f   K?  VP;                  V R2V R8V2 R+24       K[  	  VP;                  R94       VP;                  R:4       VP;                  R74       VP;                  R+4       VP;                  R;4       VP;                  R<4       VP;                  R=R!PY                  VP@                  4      ,           R>,           4       VP;                  R+4       V PH                  '       dX   V PF                  '       d$   VP;                  R?4       VP;                  R@4       M"VP;                  RA4       VP;                  RB4       . p3VP<                   F  p4V3P]                  V4 RCV4 24       K  	  V PH                  '       d#   V3P]                  RD4       V3P]                  RE4       V3'       d   RFV RGR!PY                  V34       RH2p5MV RI2p5V Pn                  ;'       d%    V Pp                  ;'       d    V Ps                  4       p6V6'       d   V Pu                  VV54       MCV Pn                  '       d   V Pw                  VV54       MV Py                  VV5VPL                  V+4       RRR4       V P{                  VV$4       VPW                  4       # u upi u upi u upi u upi u uppi u upi u upi u uppi u uppi   + '       g   i     ELo; iu upi u upi u upi   + '       g   i     ELè; i  + '       g   i     ELp; i  + '       g   i     ELX; i  + '       g   i     LÁ; i)Na}  
Generate the complete Pallas kernel code as a Python string.

This includes:
- Import statements for JAX/Pallas
- The kernel function that operates on refs
- The main wrapper function that handles PyTorch<->JAX conversions via DLPack

Args:
    name: Optional kernel name (will use placeholder if not provided)

Returns:
    str: Complete Python source code for the Pallas kernel
Úout_ptrÚ
in_out_ptrz2Pallas backend requires at least one output bufferú<KERNEL_NAME>Úcpur=  r>  TrF  rá  râ  rã  rä  rå  rç  rè  ré  rê  rë  rí  rî  rï  rð  rñ  rò  rô  rö  Nr#  z&, _pallas_tile=None, _pallas_ax2g=Noneúdef ú_kernel(r+   ú):Ú_jit_wrapperrX  c              3  ó8   "  € T F  p\        V4      x € K  	  R # 5irf   ré  ©rc  rm   s   & r%   rd  Ú.PallasKernel.codegen_kernel.<locals>.<genexpr>¯  s   é € Ð,L¹^¸¬S°¯V¨V»^ùrì  ú,)z()c              3  ó8   "  € T F  p\        V4      x € K  	  R # 5irf   ré  r  s   & r%   rd  r  ³  ó   é € Ð0PÁ¸A´°Q·°Ãùrì  ú+@functools.partial(jax.jit, static_argnums=z, donate_argnums=r,   Ú
out_shapesÚ
out_dtypesc              3  ó4   "  € T F  w  rV R V 2x € K  	  R# 5i©ú: Nr#   ©rc  rõ  Úos   &  r%   rd  r  ¾  s   é € Ð%PÁ±f°q¨¨¨2¨a¨S¥kÃùó   ‚z+if any(0 in shape for shape in out_shapes):zI_pallas_out_shapes = tuple(s if len(s) > 0 else (1,) for s in out_shapes)z_pallas_out_shapes = (rš  z.reshape(_pallas_out_shapes[ú])zout_shapes_pallas = tuple(z&    jax.ShapeDtypeStruct(shape, dtype)z;    for shape, dtype in zip(_pallas_out_shapes, out_dtypes)r›  úout_specs_pallas = tuple(z+    pallas_make_block_spec_non_tiled(shape)úin_specs_pallas = tuple(z-    pallas_make_block_spec_non_tiled(i.shape)z    for i in [r’  z_pallas_tile = _tilez_pallas_ax2g = _ax2gz$_pallas_tile = _pallas_out_shapes[0]z_pallas_ax2g = {}Ú=z_pallas_tile=_pallas_tilez_pallas_ax2g=_pallas_ax2gúfunctools.partial(ú	_kernel, ú),z_kernel,)r
  r  )r  Úin_ptrr#   )zPresults = tuple(jnp.empty(s, dtype=dt) for s, dt in zip(out_shapes, out_dtypes))z2return results if len(results) > 1 else results[0])>r   r.   Úpython_argdefsr¥  rW  r   r0  r'  ÚRuntimeErrorrô  rq  r  r"   r   r  r  r  rl  rn  r2  rã  r   rà  Úaliasable_out_ptrsÚ_codegen_importsÚindentÚ_codegen_iteration_varsr0  r½  r¡  rê  rï  rð  rñ  r  Útile_cpu_tpur  Ú_compute_alias_pairsrö  r  r  rå  Ú _codegen_scalar_prefetch_wrapperÚgetvaluer'  Ú_emit_kernel_bodyr
  r+  Ú
writelinesr  Ú_codegen_tiled_specsr¨  rŸ  r  rð  rü  rý  rv  Ú_codegen_jit_wrapper_tmaÚ_codegen_jit_wrapper_legacy_gpuÚ_codegen_jit_wrapper_cpu_tpuÚ_codegen_main_entry)7r/   r¥  rá  Úarg_defsÚ	call_argsrh  rä   rç  r1   rè  ré  Úsize_var_namesrê  ÚouterrP  rë  râ  rä  rå  rí  r¢  rî  rï  rð  rñ  Úflagrò  rô  rÙ  r%  Úkernel_bodyrÂ  Úextra_kernel_paramsÚuse_scalar_prefetchÚkernel_body_spÚkernel_signatureÚjit_wrapper_nameÚdonate_indicesÚbase_offsetÚdonate_literalÚstatic_argnumsÚstatic_argnums_literalÚwrapper_paramsÚalias_map_literalÚhas_zero_dimr)  Úzero_dim_returnÚ	input_idxÚout_idxr£  ÚcshapeÚpartial_argsÚsv_paramÚ
kernel_argÚuse_tmas7   &&                                                     r%   Úcodegen_kernelÚPallasKernel.codegen_kernel  s  € ô Óˆð %)§I¡I×$<Ñ$<Ó$>Ñ!ˆ˜Q Ù)1Ó2© AŸœ©ˆÐ2Ù&3ÓO¡m ·|±|ÀI×7NŸ1˜1¡mˆÐOá$ó
Ù$�!¯©Ð5N×(O�AˆA‘}ð 	ð 
ô $ D§I¡I×$6Ñ$6×$=Ñ$=Ó$?Ó@ˆÙ&3ÓK¡m ¸NÑ7JŸ1˜1¡mˆÐKßÜÐSÓTÐTð !%§	¡	× 8Ñ 8× >Ñ >Ô @ô 
á @‘�Ü˜%¤×%ô ˆEŠLÙ @ð 	ñ  
ð ×-Ð-˜oˆÜŸ7™7×>Ñ>Ó@×EÑEÈÑNÐß&6™F¸GÐà+-ˆÛ$ˆEØ%)ˆO˜EÓ"ñ %ñ +:ó
Ù*9 ¸_ÈU×=SÑ=SÔˆuˆg�VÓ©/ð 	ð 
ñ %ó
Ù$�!¯©Ð5M×(N�AˆA‘}ð 	ð 
ð +¨\Õ9ÐØ)¨MÕ9ÐÜ&Ø$3×$9Ñ$9Ô$;ÔHÑ$;‘j�d˜DÄ4�TˆTÑ$;ÒHó
Ð÷ Ü"&¤u¬S°Ó-?Ó'@Ó"AÑØ�[�[ˆ[Ø"$Ñô "+¨=Ô!9ô#á!9‘I�C˜ØÐ,Ñ,÷ �Ù!9ð  ñ #ô ò 
Ùð
á#ð
ð —;’;ð
ñ .ð	
ñ
 0ð
ñ (ð
ñ ,ð
ñ (ð
ñ ,ð
ñ "6ð
ñ ,ð
ñ &ð
ñ &ð
ñ !4ð
ñ  2ð
ñ  0ð!
ñ" !4ð#
ñ$ ð%
ˆð( #2ˆÔà×Ñ˜cÔ"ä$Ó&ˆØ×Ñ×!Õ!Ø×(Ñ(¨°cÔ:àŸ™×+Ô+�Ø×%Ñ%¤c¨$£iÖ0ñ ,÷ "ð %)§I¡I×$<Ñ$<Ó$>Ñ!ˆ˜Q Ù)1Ó2© AŸœ©ˆÐ2Ü# D§I¡I×$6Ñ$6×$=Ñ$=Ó$?Ó@ˆÙ*7ÓO©- QÀÑ;NŸq˜q©-ÑOˆÔá$ó
Ù$�!¯©Ð5M×(N�AˆA‘}ñ
ˆÔð #/°×1AÑ1AÕ"AˆÔØ!-°Õ!=ˆÔð !×2Ñ2Ó4ˆÔà ÐØ×'×'Ð'Ø"JÐà×3Ñ3°C¸ÓIˆŒä" 4×#7Ñ#7Ó8ÐçØ×.Ñ.Ô0Ü+Ó-ˆNØ×&Ñ&×(Õ(Ø ŸL™L×/Ô/�DØ"×,Ñ,¬S°«YÖ7ñ 0÷ )ð ×1Ñ1ØØØôð
 —=‘=“?Ð"ð " + ¨h°t·y±yÀ×AWÑAWÓ7XÐ6YÐZmÐYnÐnpÐqÐØ�‰Ð'Ô(à�[‰[�]�]Ø×"Ñ" 4¨°cÔ:÷ ð 	�‰�rÔØ)˜]¨,Ð7ÐØˆØœ#˜c×1Ñ1Ó2Õ2ˆÜ" 3×#:Ñ#:Ö;‰IˆC�Ø˜Ô$¨¯©¸×)FÔ)FØ×%Ñ% c¨KÕ&7Ö8ñ <÷ Ø  4§9¡9Ñ,L¹^Ó,LÓ#LÕLÈtÕS‰Nà!ˆNÜœe A¬¨C×,?Ñ,?Ó(@Õ$@ÓAÓBˆØ!$ t§y¡yÑ0PÁÓ0PÓ'PÕ!PÐSWÕ!WÐØ�‰ð'Ø'=Ð&>Ð>OØÐ˜að!ô	
ð ˜<Ð(¨3×+>Ñ+>Õ>À×AXÑAXÕXð 	ð 	�‰˜Ð.Ð/¨q°·±¸>Ó1JÐ0KÈ2ÐNÔOà ŸI™IÑ%PÀÇÂÓ%PÓPÐà(,×(CÑ(CÀCÓ(HÑ%ˆ�oð
ˆð �[‰[�]�]ßØ—‘ Ö0ç"Ø—N‘NÐ#PÔQØŸ™Ÿ�ØŸ™¨Ô8÷ 'ð —‘ðEôð ×.Ñ.Ò:Ø—N‘NØ0°×1LÑ1LÐ0MÈRÐPôð +.¯/¬/Ñ&�I˜wØ×3Ñ3°IÕ>�EØ—N‘NØ ˜'  U GÐ+GÈÀyÐPRÐSöñ +:ð
 —‘Ð;Ô<Ø—‘ÐGÔHØ—‘ØQôð —‘˜sÔ#Ø×$×$Ð$Ø×-Ñ-¨cÖ2à×2Ñ2°4¸×9PÑ9PÔQØ!$×!8Ô!8˜Ø#'×#:Ñ#:¸5Ó#A˜÷  (ð !×9Ñ9×=Ñ=¸hÔGà!%ð ð
 "Ô-Ø ŸN™N¨e¨W°C¸°w¸iÈÀxÈqÐ+QÖRñ "9ð —N‘NÐ#>Ô?Ø—N‘NÐ#PÔQØ—N‘NØUôð —N‘N 3Ô'Ø—N‘NÐ#=Ô>Ø—N‘NÐ#RÔSØ—N‘NØ(¨4¯9©9°S×5LÑ5LÓ+MÕMÐPSÕSôð —N‘N 3Ô'à×/×/Ð/Ø×(×(Ð(ØŸ™Ð'=Ô>ØŸ™Ð'=Õ>àŸ™Ð'MÔNØŸ™Ð':Ô;ð  "�Ø #× 3Ô 3�HØ ×'Ñ'¨8¨*°A°h°ZÐ(@ÖAñ !4ð ×/×/Ð/Ø ×'Ñ'Ð(CÔDØ ×'Ñ'Ð(CÔDçØ#5°k°]À)ÈDÏIÉIÐVbÓLcÐKdÐdfÐ!g‘Jà$/ =°Ð!9�Jð —K‘K÷ 5ð 5Ø×.Ñ.÷5ð 5à×2Ñ2Ó4ð ÷
 Ø×1Ñ1°#°zÕBØ—[—[�[Ø×8Ñ8¸¸jÕIà×5Ñ5Ø˜Z¨¯©Ð:Kô÷q ðx 	× Ñ  Ð&6Ô7Ø�}‰}‹Ðùò} 3ùÚOùò
ùò
 Lùó 
ùò
ùò
ùó Iùó#÷> "×!Ð!üò 3ùâOùò
÷* )×(Ð(ú÷ �]ˆ]ú÷T 'Ÿ˜ú÷ �]ús  ­nÁnÁ$nÁ0nÂnÃnÃnÄn"Ä4n"Æn(Æ*	n(Æ9n-Çn-Èn2
Èn2
É1n8Ên8ÌA
n>ÎoÏ	oÏoÏ(oÐoÓ
8o!Õ:o5Ý#pÝ?)pÞ(p		Þ:CpâA5päCpç2pèBpê)pê00pë!pë5pì$pì31pî>o	ï!o2	ï5p	ð	pð	pðp-	c               ó$   € V ^8„  d   QhRRRRRR/# )r   r%  rà  rí  rì  r!   rõ  r#   )r$   s   "r%   r&   r  (  s$   € ÷ ñ ØðØ/>ðà	ñr(   c                	ój  € . p\        V P                  4       F—  w  r4VP                  R 4      '       dO   VP                  VR4      '       d5   V R2pV P                  P                  V4      pVP                  Wc34       Kh  Kj  V P                  P                  V4      pVP                  Wc34       K™  	  V# )r
  FrF  )r   ré  rW  rð  rð  r"  r
  )r%  rí  rö  rO  r¥  Ú
alias_namerN  s   &&     r%   r0  Ú!PallasKernel._compute_alias_pairs'  sª   € ð .0ˆÜ& s×'8Ñ'8Ö9‰MˆGØ�‰˜y×)Ò)Ø"×&Ñ& t¨U×3Ò3Ø$( 6¨ �JØ #× 7Ñ 7× =Ñ =¸jÓ I�IØ×&Ñ&¨	Ð';Ö<ñ 4ð
  ×3Ñ3×9Ñ9¸$Ó?�	Ø×"Ñ" IÐ#7Ö8ñ :ð Ðr(   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rá  r   r?  r%  rà  r!   r  r#   )r$   s   "r%   r&   r  7  s2   € ÷ +ñ +àð+ð $ð+ð ð	+ð
 
ñ+r(   c                ó@  € VP                    FU  p\        V\        4      '       d"   VP                  VP	                  4       4       K:  VP                   P                  V4       KW  	  V P                   F(  w  rVWSP                  9   g   K  VP                  V4       K*  	  R# )z:Emit the kernel body lines and store operations into code.N)r½  r  r"   r¡  r  r
  rþ  rñ  )r/   rá  r?  r%  rÂ  r
  rà  s   &&&&   r%   r3  ÚPallasKernel._emit_kernel_body7  sr   € ð  ×&Ô&ˆDÜ˜$¤×$Ò$Ø—‘˜tŸ{™{›}Ö-à—‘×"Ñ" 4Ö(ñ	 'ð
 $(×#9Ô#9ÑˆGØ×0Ñ0Ö0Ø—‘˜zÖ*ó $:r(   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   r%  rà  râ  r"   r?  r   r!   r  r#   )r$   s   "r%   r&   r  G  s8   € ÷ m8ñ m8àðm8ð ðm8ð $ð	m8ð
 
ñm8r(   c                óê  € V P                   f   \        R4      hV P                   pVP                  p\        VP                  4      pVP
                   Uu. uF1  pWtP                  8w  g   K  WtP                  8w  g   K'  Wv9  g   K/  VNK3  	  ppVP                  .VP                  .,           V,           \        VP                  4      ,           VP                  ,           p	VP                  RV RRP                  V	4       R24       VP                  4       ;_uu_ 4        V P                  WSV4       RRR4       VP                  R4       V R2p
R	R
.VP                  ,           VP
                  ,           p\        \        ^\!        VP                  4      ,           4      4      pRRP                  R V 4       4      ,           R,           pVP                  RV R24       VP                  RV
 RRP                  V4       R24       VP                  4       ;_uu_ 4        VP                  pVP                  pVP"                  p\!        VP$                  4      pVP                  R4       \        V4       F$  pVV8w  g   K  VP                  RV RV R24       K&  	  VP                  RV R24       V^ 8X  d   VP                  RV RV R24       MFV.\        V4       Uu. uF  pVV8w  g   K  VNK  	  upO5pVP                  RV RV RV RV R2	4       . pV F£  pRV R2pVP                  RV RV R24       VP                  R V R!V R"24       VP                  R#V R$24       VP                  R V R!V R%V R&24       VP                  R'4       VP                  R V R!V R(24       VP'                  V4       K¥  	  . pVP                   F1  pRV R2pVP                  V R!V R"24       VP'                  V4       K3  	  VP                   Uu. uF
  pV R)V 2NK  	  ppV'       d   R*V R+RP                  V4       R2pMV R,2pVP                  R-4       ^\!        V4      ,           pVP                  R.4       VP                  4       ;_uu_ 4        VP                  R/4       V F  pVP                  R0V R1V R224       K  	  VP                   F  pVP                  R34       K  	  RRR4       VP                  R4       \!        VP                  4      pVP                  R4RP                  R5.V,          4      ,           R,           4       . p\)        VP                  4       F,  w  pp^V,           V,           p VP'                  V  R6V 24       K.  	  RP                  V4      p!\        V4       Uu. uF	  pR7V R82NK  	  p"pR9RP                  V"4      ,           R,           p#VP                  R:4       VP                  4       ;_uu_ 4        VP                  V R;24       VP                  R<V# R;24       VP                  R=4       VP                  4       ;_uu_ 4        VP                  R>4       VP                  R?4       VP                  R@4       VP                  RA4       RRR4       VP                  RB4       V'       d   VP                  RCV! RD24       V P*                  '       g    VP                  REVP,                   R;24       RRR4       V.RF.,           V,           V,           p$VP                  RGRP                  V$4       R24       VP                  RH4       RRR4       V P/                  W4       R# u upi   + '       g   i     EL\; iu upi u upi   + '       g   i     EL¾; iu upi   + '       g   i     EL; i  + '       g   i     LÉ; i  + '       g   i     L†; i)Iz=Emit kernel, JIT wrapper, and main entry for scalar prefetch.Nz"expected indirect_access to be setr  r  r+   r  r#  r  r  r  rX  c              3  ó8   "  € T F  p\        V4      x € K  	  R # 5irf   ré  r  s   & r%   rd  Ú@PallasKernel._codegen_scalar_prefetch_wrapper.<locals>.<genexpr>r  r  rì  r  r  r,   z_D = 1z
_D = _D * z.shape[r’  z_seq = z	.shape[0]z_table_3d = r›  z.shape[0], 1, _D)z
.transposez	], 1, _D)rh  Ú_3dzif z.ndim == 2 and z.shape[0] == _seq:ú    rš  z.reshape(_seq, 1, _D)zelif z.ndim == 1:z.reshape(1, 1, z
.shape[0])úelse:z.reshape(1, 1, -1)r$  r%  r&  Ú_kernelzR_ROW_SPEC = pl.BlockSpec((1, 1, _D), lambda i, _: (i, jnp.int32(0), jnp.int32(0)))z_in_specs = [zPpl.BlockSpec((1, 1, _D), lambda gi, idx: (idx[gi], jnp.int32(0), jnp.int32(0))),z_ROW_SPEC if z$.shape[0] == _seq else pl.BlockSpec(zA.shape, lambda i, _: (jnp.int32(0), jnp.int32(0), jnp.int32(0))),z
_ROW_SPEC,z_out_specs = [Ú	_ROW_SPECr  z/jax.ShapeDtypeStruct((_seq, 1, _D), out_dtypes[r!  r‘  ú_result = pl.pallas_call(Ú,z
out_shape=z'grid_spec=pltpu.PrefetchScalarGridSpec(znum_scalar_prefetch=1,zgrid=(_seq,),zin_specs=_in_specs,zout_specs=_out_specs,r'  zinput_output_aliases={ ú },z
interpret=Ú	_table_3dú)(z?return tuple(r.reshape(s) for r, s in zip(_result, out_shapes)))r  rí  rá  r   rî  rð  rÐ  rÉ  rl  ré  r¡  r'  r-  r3  rê  rn  r2  rÎ  rÌ  r
  r   rã  rå  r9  )%r/   r%  râ  r?  rð  rá  Ú	alias_setr1   Úother_input_paramsÚprefetch_kernel_paramsrD  rJ  rH  rI  ÚtableÚindicesÚind_dimrv  rõ  r}  rá  Úpallas_call_other_argsÚp3dÚpallas_call_alias_argsÚsvrQ  Ú
kernel_refÚnum_non_alias_in_specsrh  Únum_outputsÚalias_map_partsrO  Úarg_idxrK  Úout_shape_partsÚout_shape_exprÚall_pallas_argss%   &&&&                                 r%   r1  Ú-PallasKernel._codegen_scalar_prefetch_wrapperG  s�  € ð ×ÑÒ'Ü Ð!EÓFÐFØ×'Ñ'ˆØ�x‰xˆä˜s×/Ñ/Ó0ˆ	ð ×,Ò,ó
á,�Ø×*Ñ*Ñ*ô ð ×)Ñ)Ñ)ô ð Ñ"÷	 ˆAÙ,ð 	ð 
ð ×#Ñ#Ð$Ø×#Ñ#Ð$õ%à õ!ô �3×#Ñ#Ó$õ%ð ×Ñõ	 ð 	ð 	�‰Ø�;�-˜x¨¯	©	Ð2HÓ(IÐ'JÈ"ÐMô	
ð �[‰[�]�]Ø×"Ñ" 4°cÔ:÷ ð 	�‰�rÔØ)˜]¨,Ð7Ðà˜<Ð(¨3×+>Ñ+>Õ>À×AXÑAXÕXð 	ô œe A¬¨C×,?Ñ,?Ó(@Õ$@ÓAÓBˆØ!$ t§y¡yÑ0PÁÓ0PÓ'PÕ!PÐSWÕ!WÐØ�‰Ø9Ð:PÐ9QÐQRÐSô	
ð 	�‰˜Ð.Ð/¨q°·±¸>Ó1JÐ0KÈ2ÐNÔOà�[‰[�]�]Ø×(Ñ(ˆEØ×,Ñ,ˆGà×+Ñ+ˆGÜ�x×+Ñ+Ó,ˆDØ�N‰N˜8Ô$Ü˜4–[�Ø˜–<Ø—N‘N Z°¨w°g¸a¸SÀÐ#BÖCñ !ð �N‰N˜W W I¨YÐ7Ô8à˜!Œ|Ø—‘ ¨e¨W°I¸e¸WÐDUÐVÕWàÐK¬e°D¬kÓ"J©k¨¸QÀ'¹\§1 1©kÑ"JÑK�Ø—‘Ø" 5 '¨°D°6¸Ø�g˜W W I¨Yð8ôð &(Ð"Û'�Ø˜!˜˜C�j�Ø—‘  Q C °q°cÐ9KÐLÔMØ—‘  c U¨#¨a¨SÐ0EÐFÔGØ—‘  q c¨Ð5Ô6Ø—‘  c U¨#¨a¨S°À¸sÀ*ÐMÔNØ—‘˜wÔ'Ø—‘  c U¨#¨a¨SÐ0BÐCÔDØ&×-Ñ-¨cÖ2ñ (ð &(Ð"Ø×%Ô%�Ø˜!˜˜C�j�Ø—‘ #  c¨!¨Ð,AÐBÔCØ&×-Ñ-¨cÖ2ñ &ð
 47×3FÒ3FÓGÑ3F¨R˜r˜d ! B 4›LÑ3FˆLÐGßà(¨¨ð 6ØŸ	™	 ,Ó/Ð0°ð3ñ ð
 !,˜}¨GÐ4�
ð �N‰NðAôð
 &'¬Ð-CÓ)DÕ%DÐ"Ø�N‰N˜?Ô+Ø—‘—•Ø—‘ðOôó 2�CØ—N‘NðØ"˜eð $)Ø),¨ð .UðVöñ 2ð ×)Ô)�AØ—N‘N <Ö0ñ *÷ ð �N‰N˜3Ôä˜c×/Ñ/Ó0ˆKØ�N‰NØ  4§9¡9¨k¨]¸[Õ-HÓ#IÕIÈCÕOôð !ˆOÜ'¨×(8Ñ(8Ö9‘
�˜ØÐ4Õ4°wÕ>�Ø×&Ñ&¨'¨°"°W°IÐ'>Ö?ñ :ð !%§	¡	¨/Ó :Ðô ˜{Ô+óá+�Að BÀ!ÀÀBÓGÙ+ð ð ð ! 4§9¡9¨_Ó#=Õ=ÀÕCˆNà�N‰NÐ6Ô7Ø—‘—•Ø—‘ * ¨QÐ/Ô0Ø—‘ ¨NÐ+;¸1Ð=Ô>Ø—‘ÐHÔIØ—[‘[—]•]Ø—N‘NÐ#;Ô<Ø—N‘N ?Ô3Ø—N‘NÐ#8Ô9Ø—N‘NÐ#:Ô;÷	 #ð
 —‘˜tÔ$ß"Ø—N‘NÐ%=Ð>OÐ=PÐPTÐ#UÔVØ—{—{�{Ø—N‘N Z°×0EÑ0EÐ/FÀaÐ#HÔI÷ ð  �	Ø�-õ à(õ)ð )õ)ð ð �N‰N˜R §	¡	¨/Ó :Ð;¸1Ð=Ô>à�N‰NØQô÷q ðx 	× Ñ  Ö7ùòA
÷( �]ˆ]üò> #Kùò: H÷" —�üò:÷ #—]�]ú÷	 —ú÷C �]úsÄ   Á]?Á,]?Á>]?Â]?Ä^ÈA_"É?A _"Ë	^
Ë-^
Ë3D_"Ð^Ð"A4_"ÒA^"	Ó-C	_"Ö6^6×A
_"ØA_	Ù"A^;Ú' _	Û&_	Û/_	ÜA_"Þ^	Þ
_"Þ"^3Þ-_"Þ;_ß	_	ß_ß_"ß"_2	c               ó    € V ^8„  d   QhRRRR/# ©r   r%  rà  r!   r  r#   )r$   s   "r%   r&   r  ö  s   € ÷ -ñ - Oð -¸ñ -r(   c                	óB  € R pVP                   '       d   VR,          pVR,          pVR,          pMVP                  '       g
   VR,          pV P                  '       d%   VP                   '       g   VR,          pVR,          pVP                  P	                  VRR7       R# )	aß  
import functools
import math
import torch
import jax
import jax.numpy as jnp
from jax.experimental import pallas as pl
from torch.utils._ordered_set import OrderedSet
from torch._inductor.runtime.runtime_utils import (
    pallas_compute_tiling, pallas_make_block_spec, pallas_permute,
    pallas_gpu_align_output_specs, pallas_gpu_pad_inputs,
    pallas_gpu_unpad_results,
    pallas_ensure_nonzero_rank,
    pallas_make_block_spec_non_tiled,
    torch_dtype_to_jax_runtime,
)
z
import jax.exportz1
from jax.experimental.pallas import tpu as pltpuz8
from torch_tpu._internal.pallas import tpu_torch_pallasz8
from jax.experimental.pallas import mosaic_gpu as plgpuzA
import os as _os; _os.environ.setdefault('JAX_PLATFORMS', 'cpu')T©ÚstripN)rã  rä  r  rá  Úsplice)r/   r%  Úimportss   && r%   r,  ÚPallasKernel._codegen_importsö  sŽ   € ðˆð" �:�:ˆ:ØÐ,Õ,ˆGØÐKÕKˆGØÐRÕR‰GØ×%×%Ð%ØÐRÕRˆGØ××Ð¨¯
¯
¨
ØØTõˆGð ÐKÕKˆGØ�‰�‰˜ tˆÖ,r(   c               ó    € V ^8„  d   QhRRRR/# )r   rÛ  rÚ  r!   rÝ  r#   )r$   s   "r%   r&   r    s   € ÷ ñ ¨,ð ¸:ñ r(   c                ó@  € ^ p^ p\        R V P                  P                  4        4       4      pV P                  P                  4        FQ  w  rVWQ8X  d!   VP                  '       g   Vu # WC,           u # VP                  '       d   V^,          pKH  V^,          pKS  	  R# )zãMap an iteration variable to its output tensor axis index.

Non-reduction variables map to axes 0, 1, 2, ... in order.
Reduction variables map to axes after all pointwise axes.
Returns None if the mapping cannot be determined.
c              3  óL   "  € T F  qP                   '       d   K  ^x € K  	  R# 5irg  rÌ  )rc  rÜ  s   & r%   rd  Ú2PallasKernel._get_iter_var_axis.<locals>.<genexpr>  s   é € ÐSÑ<˜ÇNÅN—1’1Ó<ùrÍ  N)rŸ  rH  r'  rq  rÒ  )r/   rÛ  r  Úr_idxÚn_pwr  rÜ  s   &&     r%   Ú_get_iter_var_axisÚPallasKernel._get_iter_var_axis  sˆ   € ð ˆØˆÜÑS˜d×3Ñ3×:Ñ:Ô<ÓSÓSˆØ×/Ñ/×5Ñ5Ö7‰JˆCØŒ~Ø%*×%7×%7Ð%7�vÒI¸T½\ÒIØ×!×!Ð!Ø˜•
’à˜!•’ñ 8ñ r(   c               ó   € V ^8„  d   QhRR/# )r   r!   z)tuple[tuple[int, ...] | None, int | None]r#   )r$   s   "r%   r&   r  (  s   € ÷ ":ñ ":à	2ñ":r(   c           
     	óä  a€ \        V P                  P                  4        Uu. uFJ  p\        VP                  \
        \        P                  34      '       g   K5  \        VP                  4      NKL  	  up4      oV3R  lpV P                  P                  4       pVP                  V P                  P                  4       RRrTV F"  pV! V4      pV^ ,          '       g   K  Vw  rE WE3# 	  WE3# u upi )c                ó^  <€ \         P                  P                  V 4      pVe   \        VP	                  4       4      ^8:  d   R# \
        ;QJ d"    . R VP	                  4        4       F  NK  	  5M! R VP	                  4        4       4      p\        P                  ! V4      pVS9   d   W#3# R# )Nc              3  óˆ   "  € T F8  p\        V\        \        P                  34      '       d   \        V4      MTx € K:  	  R # 5irf   )r  rÍ  r%  r³  rb  s   & r%   rd  ÚePallasKernel._get_reshape_target_shape_and_numel.<locals>._get_nd_shape_if_matches.<locals>.<genexpr>9  s5   é € ð á'�Aô % Q¬¬e¯m©mÐ(<×=Ò=”�A”À1ÔDÛ'ùs   ‚A A)NN)r   r  r(  r2  rÕ  rË  r  rÓ  )r£  r�  r  r\  Úiter_lengthss   &   €r%   Ú_get_nd_shape_if_matchesÚRPallasKernel._get_reshape_target_shape_and_numel.<locals>._get_nd_shape_if_matches5  sŽ   ø€ Ü—'‘'×(Ñ(¨Ó2ˆCØŠ{œc #§,¡,£.Ó1°QÔ6Ø!Ð!ß”Eñ àŸ™œó—E‘Eñ àŸ™œóó ˆEô —I’I˜eÓ$ˆEØ%*¨lÔ%:�E�>ÐLÀÐLr(   N)r   rH  r'  r  rr  rÍ  r%  r³  r  Úcopyr¿  r.   rm  )	r/   rÜ  r•  Úcandidate_buf_namesÚreshape_target_shapeÚreshape_target_numelr£  r>   r”  s	   &       @r%   Ú#_get_reshape_target_shape_and_numelÚ0PallasKernel._get_reshape_target_shape_and_numel(  sÛ   ø€ ô
 "ð ×.Ñ.×5Ñ5Ô7óá7�AÜ˜aŸh™h¬¬e¯m©mÐ(<×=ô ”�A—H‘H–Ù7ñó
ˆõ		Mð #×7Ñ7×<Ñ<Ó>ÐØ×"Ñ" 4§9¡9×#:Ñ#:Ô;à59¸4Ð2Û+ˆHÙ-¨hÓ7ˆFØ�a�yŽyØ=CÑ:Ð$Øà#Ð9Ð9ñ ,ð $Ð9Ð9ùò9s   £2C-ÁC-c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úbroadcast_varsúlist[_BroadcastedIterVar]Úbroadcast_idxrÍ  r!   r"   r#   )r$   s   "r%   r&   r  L  s$   € ÷ ñ Ø7ðØHKðà	ñr(   c                	ó  € W,          pVP                   P                  pV P                  V4      pV P                  V4      p\	        V4      pV P                  WV4      pR .V,          p	WiV&   RP                  V	4      p
RV R2pV RV
 R2pV# )rw  r+   rv  r,   r›  )rÜ  rr  r,  r-  r2  Ú_broadcast_axis_idxr'  )r/   rž  r   Úbvrr  Úrenamed_lengthÚ
length_strÚnum_broadcast_dimsÚaxis_idxr”  r•  ÚarangeÚreshapeds   &&&          r%   Ú$_make_broadcasted_iteration_var_exprÚ1PallasKernel._make_broadcasted_iteration_var_exprL  s¢   € ð Õ*ˆØ—‘—‘ˆØ×-Ñ-¨fÓ5ˆØ—Z‘Z Ó/ˆ
ä  Ó0ÐØ×+Ñ+ØÐ+=ó
ˆð �eÐ0Õ0ˆØ *�HÑØ—I‘I˜kÓ*ˆ	Ø˜z˜l¨!Ð,ˆØ�X˜Y y k°Ð3ˆØˆr(   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r?  r   r%  rà  r!   r  r#   )r$   s   "r%   r&   r  _  s.   € ÷ eTñ eTØ)ðeTØ0?ðeTà	ñeTr(   c                	ó4  a€ V P                   '       d%   V P                  '       g   V P                  '       g   R # VP                  R4       V P	                  4       w  r4\        V P                   P                  4       4      p. pR p\        V4       FM  w  ow  r‰V P                  V	P                  4      p
V
e   W¤8X  d   SpK1  VP                  \        SW‰V
4      4       KO  	  \        V4      p\        V4       EF�  w  ow  r‰W€P                  9  d   K  \        V4      pV	P                  pV P                  V4      pV P                  V4      pV P                  V4      p
V
f}   V'       d\   V^8”  dU   SV8w  dN   \!        V3R l\        V4       4       R 4      pVe+   V P#                  VV4      pVP                  V RV 24       KÌ  VP                  V RV R24       Kå  V'       dR   \        V4      ^8”  dB   W¤8X  d<   RP%                  R V 4       4      pRV R2pVP                  V RV R	V R24       EK>  V^8”  dQ   SV8w  dJ   \!        V3R
 l\        V4       4       4      pV P#                  VV4      pVP                  V RV 24       EK•  RP%                  R V P&                  P(                   4       4      pVV9   pT;'       d]    V P                  '       * ;'       dD    V P*                  '       * ;'       d+    V P,                  '       * ;'       d    V	P.                  '       * pV'       d   V P1                  V4      MR pVe<   VP                  V RV RV RV R24       V P2                  P5                  V4       EK†  VP                  V RV R24       EK   	  R # )Nz*# Define iteration variables as JAX arraysc              3  óR   <"  € T F  w  rVP                   S8X  g   K  Vx € K  	  R # 5irf   ©rÙ  ©rc  rõ  r·  rÙ  s   &  €r%   rd  Ú7PallasKernel._codegen_iteration_vars.<locals>.<genexpr>Œ  s!   øé € ÐQÑ'@™t˜qÀAÇEÁEÈSÁLŸšÓ'@ùó   ƒ'�
'rš  z = jnp.arange(r,   r+   c              3  ó8   "  € T F  p\        V4      x € K  	  R # 5irf   ré  rb  s   & r%   rd  r±  �  s   é € Ð%KÑ6J°¤c¨!§f fÓ6Jùrì  rv  r›  c              3  óR   <"  € T F  w  rVP                   S8X  g   K  Vx € K  	  R # 5irf   r¯  r°  s   &  €r%   rd  r±  ¡  s#   øé € ð %Ù";™$˜!¸q¿u¹uÈ¹|—A’AÓ";ùr²  rç  c              3  ó8   "  € T F  p\        V4      x € K  	  R # 5irf   ré  rê  s   & r%   rd  r±  °  s   é € Ð(SÑ?R°t¬¨T¯¨Ó?Rùrì  z = jnp.arange(_pallas_tile[z$]) + pl.program_id(_pallas_ax2g.get(z, 0)) * _pallas_tile[r’  )rH  rü  r(  r¡  r›  rl  rq  r   rj  rr  r
  rØ  r2  r"   r,  r-  r3  rª  r'  r0  r½  r   r  rÒ  r�  r  rD  )r/   r?  r%  r™  rš  Ú	var_itemsrž  Útotal_var_idxrÛ  rÜ  rÞ  r¦  rº  rr  r¤  r¥  r   r   r•  r¨  rø  Úvar_in_computeÚcan_tile_relativer§  rÙ  s   &&&                     @r%   r.  Ú$PallasKernel._codegen_iteration_vars_  s“  ø€ ð
 ×%×%Ð%¨d¯k¯k¨k¸d×>Q×>QÐ>QÙà×ÑÐJÔKð ×4Ñ4Ó6ñ 	3Ðô ˜×.Ñ.×4Ñ4Ó6Ó7ˆ	àˆØˆÜ%.¨yÖ%9Ñ!ˆCÑ!�'ØŸ™¨¯©Ó5ˆJØÒ%¨*Ô*LØ #’à×%Ñ%Ü'¨¨W¸ZÓHöñ &:ô ! Ó0Ðä%.¨y×%9Ñ!ˆCÑ!�'Ø×1Ñ1Ô1ÙÜ˜7“|ˆHØ—\‘\ˆFØ!×1Ñ1°&Ó9ˆNØŸ™ NÓ3ˆJØŸ™¨Ó/ˆJàÒ!ç(Ø*¨QÔ.Ø˜}Ô,ä$(ÜQ¤y°Ô'@ÓQØó%�Mð %Ò0Ø#×HÑHØ*¨Mó ˜ð $×-Ñ-°°
¸#¸d¸VÐ.DÔEÙ Ø×%Ñ%¨¨
°.ÀÀÈAÐ&NÔOÙ÷ %ÜÐ,Ó-°Ô1ØÔ6à ŸI™IÑ%KÑ6JÓ%KÓK�	Ø& z l°!Ð4�Ø×%Ñ%¨¨
°#°f°X¸YÀyÀkÐQRÐ&S×TØ# aÔ'¨C°=Ô,@Ü $ô %Ü"+¨NÔ";ó%ó !�ð ×@Ñ@Ø" Mó�ð ×%Ñ%¨¨
°#°d°VÐ&<×=ð  $Ÿy™yÑ(S¸t¿|¹|×?RÒ?RÓ(SÓS�Ø!)¨\Ñ!9�à"÷ /ð /Ø ŸK™Kœ÷/ð /à ×2Ñ2Ô2÷/ð /ð !×5Ñ5Ô5÷/ð /ð "×.Ñ.Ô.ð "÷ 9J�D×+Ñ+¨GÔ4Ètð ð Ò'Ø×)Ñ)Ø#˜*Ð$?À¸zð J=Ø=E¸Jð G+Ø+3¨*°Að7ôð
 ×0Ñ0×4Ñ4°W×=à×)Ñ)¨X¨J°nÀZÀLÐPQÐ*R×SóQ &:r(   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rž  rŸ  r   rÍ  r¦  r!   r#   )r$   s   "r%   r&   r  Ç  s0   € ÷ 6ñ 6Ø1ð6àð6ð  ð6ð 
ñ	6r(   c                	ó  € \         ;QJ d    R  V  4       F  '       g   K   RM	  RM! R  V  4       4      p\         ;QJ d    R V  4       F  '       g   K   RM	  RM! R V  4       4      pT;'       d    TpV'       d   V# V^,
          V,
          # )c              3  ój   "  € T F)  p\        VP                  4      P                  R 4      x € K+  	  R# 5i©ÚrN©r"   rÛ  rW  ©rc  r£  s   & r%   rd  Ú3PallasKernel._broadcast_axis_idx.<locals>.<genexpr>Ï  s)   é € ð !
Ù6D°ŒC�—
‘
‹O×&Ñ& s×+Ð+³nùs   ‚13TFc              3  ót   "  € T F.  p\        VP                  4      P                  R 4      '       * x € K0  	  R# 5ir¾  rÀ  rÁ  s   & r%   rd  rÂ  Ò  s,   é € ð !
Ù:H°B”�B—J‘J“×*Ñ*¨3Ó/×/Ñ/».ùs   ‚68)rk  )rž  r   r¦  Úhas_reduction_varsÚhas_pointwise_varsÚis_mixeds   &&&   r%   r¢  Ú PallasKernel._broadcast_axis_idxÆ  s‰   € ÷ !›Sñ !
Ù6Dó!
ŸSŸSšSñ !
Ù6Dó!
ó 
Ð÷ !›Sñ !
Ù:Hó!
ŸSŸSšSñ !
Ù:Hó!
ó 
Ðð &×<Ð<Ð*<ˆßØ Ð Ø! AÕ%¨Õ5Ð5r(   c               ó$   € V ^8„  d   QhRRRRRR/# ©r   r%  rà  rS  r"   r!   r  r#   )r$   s   "r%   r&   r  Ú  s,   € ÷ vUñ vU¨Oð vUÈð vUÐQUñ vUr(   c                	ón  € VP                   pVP                  pVP                  pVP                  R 4       VP                  R4       VP                  R4       VP                  R4       VP                  R4       V F  pVP                  RV R24       K  	  VP                  R4       VP                  R4       VP                  R	4       V Uu. uF  qw R
2NK	  	  ppV Uu. uF  qw R
2NK	  	  p	pV Uu. uF  qw R2NK	  	  p
pV Uu. uF  qw R2NK	  	  ppVP                  R4       VP                  R4       W‰,           pW«,           p\	        \        V4      4       Uu. uF  pRV 2NK
  	  ppRP                  Wß,           4      pVP                  RRP                  V4       RV R24       VP                  4       ;_uu_ 4        VP                  R4       VP                  R4       VP                  4       ;_uu_ 4        VP                  R4       VP                  R4       VP                  R4       \        \        WŠ4      4       F$  w  pw  ppVP                  RV RV RV R24       K&  	  VP                  R4       VP                  R4       \        V4       F  w  ppVP                  RV R24       K  	  VP                  R4       VP                  R4       W«,           pVP                  R4      P                  4       pVP                  V RRP                  V4       R24       VP                  R4       VP                  R4       VP                  R 4       \        W›4       F  w  ppVP                  R!V RV R"24       K   	  VP                  R#4       VP                  R4       VP                  R$4       R%R%R%4       VP                  R4       VP                  R&4       VP                  R'4       R%R%R%4       VP                  R4       VP                  R(4       VP                  R)4       \        V
4       F&  w  ppWN,          pVP                  R*V R+V R,24       K(  	  \        V4       F  w  ppVP                  R*V R-V R.24       K   	  V F  pVP                  R*V R/24       K  	  VP                  R4       VP                  R04       VP                  R14       VP                  R4       VP                  R24       VP                  R34       VP                  4       ;_uu_ 4        VP                  R44       VP                  R54       VP                  R64       R%R%R%4       VP                  R74       V F  pVP                  R8V R924       K  	  VP                  R4       VP                  R4       VP                  R:4       VP                  R;4       R%# u upi u upi u upi u upi u upi   + '       g   i     ELG; i  + '       g   i     EL ; i  + '       g   i     LÆ; i)<z6# Use lax.fori_loop with TMA for automatic OOB maskingzfrom jax import laxz"_tile_size = 128  # Warpgroup sizez_orig_out_shapes = out_shapesz_max_numel = 0z_max_numel = max(_max_numel, ú.size)úfor shape in out_shapes:z2    _max_numel = max(_max_numel, math.prod(shape))z8_num_tiles = (_max_numel + _tile_size - 1) // _tile_sizeÚ_gmemÚ_smemr#  z4# Wrapper kernel using lax.fori_loop with direct TMAÚ	_barrier_r+   zdef _tma_kernel(z, *, r  zdef _tile_body(_tile_idx, _):z$_tile_start = _tile_idx * _tile_sizez5# TMA load inputs from GMEM to SMEM (OOB auto-masked)zplgpu.copy_gmem_to_smem(z%.at[pl.ds(_tile_start, _tile_size)], z, _barrier_r,   z # Wait for TMA loads to completezplgpu.barrier_wait(_barrier_z# Compute on SMEM tilesrh  rX  z7# TMA store outputs from SMEM to GMEM (OOB auto-masked)zplgpu.commit_smem()zplgpu.copy_smem_to_gmem(z$.at[pl.ds(_tile_start, _tile_size)])zplgpu.wait_smem_to_gmem(0)zreturn NoneNz# Iterate over all tilesz.lax.fori_loop(0, _num_tiles, _tile_body, None)zA# Build SMEM scratch shapes for inputs, outputs, and TMA barriersz_scratch_shapes = {}z_scratch_shapes['z'] = plgpu.SMEM((_tile_size,), r«  z*'] = plgpu.SMEM((_tile_size,), out_dtypes[r!  z"'] = plgpu.Barrier(num_arrivals=1)z4# Create flattened output specs aligned to tile sizezV_flat_out_specs, _ = pallas_gpu_align_output_specs(out_shapes, out_dtypes, _tile_size)z## Call plgpu.kernel with TMA kernelz_result = plgpu.kernel(z_tma_kernel,zout_shape=_flat_out_specs,zscratch_shapes=_scratch_shapes,rk  rc  z.flatten(),z$# Reshape results to original shapesz:return pallas_gpu_unpad_results(_result, _orig_out_shapes))rá  rð  ré  r¡  rn  r2  r'  r-  r   r÷  Úrstriprƒ  )r/   r%  rS  rá  rð  ré  r¢  r1   Úgmem_input_paramsÚgmem_output_paramsÚsmem_input_paramsÚsmem_output_paramsÚwrapper_kernel_paramsÚall_smem_paramsrõ  Úbarrier_paramsÚscratch_paramsÚgmem_inÚsmem_inrh  Úkernel_call_argsrX   Úgmem_outÚsmem_outÚ
smem_paramÚ
orig_paramÚbarrier_params   &&&                        r%   r6  Ú%PallasKernel._codegen_jit_wrapper_tmaÚ  sˆ  € Ø�x‰xˆØ!×5Ñ5ÐØ×)Ñ)ˆð 	�‰ÐOÔPØ�‰Ð,Ô-Ø�‰Ð;Ô<Ø�‰Ð6Ô7à�‰Ð'Ô(Û(ˆEØ�N‰NÐ:¸5¸'ÀÐHÖIñ )à�‰Ð1Ô2Ø�‰ÐKÔLà�‰ÐQÔRá2EÓFÑ2E¨Q˜s %›[Ñ2EÐÐFÙ3@ÓA±=¨a  5›k±=ÐÐAÙ2EÓFÑ2E¨Q˜s %›[Ñ2EÐÐFÙ3@ÓA±=¨a  5›k±=ÐÐAà�‰�rÔØ�‰ÐMÔNà 1Õ FÐØ+Õ@ˆÜ38¼Ð=PÓ9QÔ3RÓSÑ3R¨a˜I a S›/Ñ3RˆÐSØŸ™ ?Õ#CÓDˆà�‰Ø˜tŸy™yÐ)>Ó?Ð@ÀÀnÐEUÐUWÐXô	
ð �[‰[�]�]Ø�N‰N˜2ÔØ�N‰NÐ:Ô;Ø—‘—•Ø—‘ÐEÔFØ—‘˜rÔ"à—‘ÐVÔWÜ-6ÜÐ)Ó=ö.Ñ)�AÑ)˜ ð —N‘NØ2°7°)Ð;`ÐahÐ`iÐitÐuvÐtwÐwxÐyöñ.ð —‘˜rÔ"Ø—‘ÐAÔBÜ%Ð&7Ö8‘D�A�qØ—N‘NÐ%AÀ!ÀÀAÐ#FÖGñ 9ð —‘˜rÔ"Ø—‘Ð8Ô9Ø#4Õ#IÐ Ø&×-Ñ-¨cÓ2×8Ñ8Ó:�	Ø—‘ ) ¨A¨d¯i©iÐ8HÓ.IÐ-JÈ!ÐLÔMà—‘˜rÔ"Ø—‘ØMôð —‘Ð4Ô5Ü*-Ð.@Ö*UÑ&�H˜hØ—N‘NØ2°8°*¸B¸x¸jÐHlÐmöñ +Vð —‘Ð;Ô<Ø—‘˜rÔ"Ø—‘˜}Ô-÷E ðH �N‰N˜2ÔØ�N‰NÐ5Ô6Ø�N‰NÐKÔL÷S ðX 	�‰�rÔØ�‰ØOô	
ð 	�‰Ð-Ô.Ü&Ð'8Ö9‰MˆAˆzØ,Õ/ˆJØ�N‰NØ# J <Ð/NÈzÈlÐZaÐböñ :ô
 'Ð'9Ö:‰MˆAˆzØ�N‰NØ# J <Ð/YÐZ[ÐY\Ð\^Ð_öñ ;ó ,ˆMØ�N‰NØ# M ?Ð2TÐUöñ ,ð
 	�‰�rÔØ�‰ÐMÔNØ�‰Ødô	
ð 	�‰�rÔØ�‰Ð<Ô=Ø�‰Ð0Ô1Ø�[‰[�]�]Ø�N‰N˜>Ô*Ø�N‰NÐ7Ô8Ø�N‰NÐ<Ô=÷ ð 	�‰�tÔÛ(ˆEØ�N‰N˜T % ¨Ð4Ö5ñ )à�‰�sÔà�‰�rÔØ�‰Ð=Ô>Ø�‰ÐSÖTùòG GùÚAùÚFùÚAùò T÷ —�ú÷ �]ˆ]ú÷P �]úsO   ÃW#Ã"W(Ã5W-ÄW2ÅW7Ç;XÈ F>W<	Î>;XÔ24X$×<XØ	XØX!	Ø$X4	c               ó$   € V ^8„  d   QhRRRRRR/# rÉ  r#   )r$   s   "r%   r&   r  R  s)   € ÷ L
ñ L
Ø"ðL
Ø03ðL
à	ñL
r(   c                	óÖ  € VP                   pVP                  pR RP                  V4       R2pVP                  R4       VP                  R4       V F  pVP                  RV R24       K  	  VP                  R4       VP                  R4       VP                  R	4       VP                  R
4       VP                  R4       VP                  R4       VP                  R4       VP                  RV R24       VP                  R4       VP                  R4       VP                  RV,           4       VP                  R4       VP                  R4       VP                  R4       VP                  R4       VP                  R4       VP                  R4       VP                  R4       VP                  R4       VP                  R4       VP                  RV R24       VP                  R4       VP                  R4       VP                  R4       VP                  R 4       VP                  R!4       VP                  R"V,           4       VP                  R#4       VP                  R$4       VP                  R%4       VP                  R&4       VP                  R'4       VP                  R(4       VP                  R)4       VP                  R*V 24       VP                  R+4       VP                  R,4       VP                  R-4       VP                  R!4       VP                  R"V,           4       VP                  R#4       VP                  R$4       VP                  R.4       R/# )0r‘  r+   r’  z7# Check if all tensors have same size (no broadcasting)z_all_sizes = []z_all_sizes.append(rË  rÌ  z'    _all_sizes.append(math.prod(shape))z&_unique_sizes = OrderedSet(_all_sizes)zH_can_pad = len(_unique_sizes) == 1 and all(s > 1 for s in _unique_sizes)r#  zif _can_pad:z5    # All tensors same size - safe to flatten and padz+    _padded_inputs = pallas_gpu_pad_inputs(r,   zZ    _aligned_out_specs, _is_scalar = pallas_gpu_align_output_specs(out_shapes, out_dtypes)z    _result = plgpu.kernel(z        z%        out_shape=_aligned_out_specs,z    )(*_padded_inputs)zD    return pallas_gpu_unpad_results(_result, out_shapes, _is_scalar)rd  zA    # Different sizes - check if it's a reduction (scalar output)z)    _out_numel = math.prod(out_shapes[0])rc  z    if _out_numel <= 1:zG        # Scalar output (reduction) - pad inputs but keep scalar outputz/        _padded_inputs = pallas_gpu_pad_inputs(z#        _aligned_out_specs = tuple(z.            jax.ShapeDtypeStruct(shape, dtype)z;            for shape, dtype in zip(out_shapes, out_dtypes)z	        )z        _result = plgpu.kernel(z            z)            out_shape=_aligned_out_specs,z        )(*_padded_inputs)z        return _resultz	    else:zP        # Non-scalar output with broadcasting - broadcast inputs to output shapez%        _target_shape = out_shapes[0]z        _broadcasted = [z>            jnp.broadcast_to(_inp, _target_shape) for _inp in z	        ]z<        _padded_inputs = pallas_gpu_pad_inputs(_broadcasted)z^        _aligned_out_specs, _is_scalar = pallas_gpu_align_output_specs(out_shapes, out_dtypes)zH        return pallas_gpu_unpad_results(_result, out_shapes, _is_scalar)N)rá  rð  r'  r¡  )r/   r%  rS  rá  rð  Ú
input_listr¢  s   &&&    r%   r7  Ú,PallasKernel._codegen_jit_wrapper_legacy_gpuR  sß  € ð �x‰xˆØ!×5Ñ5ÐØ˜Ÿ™Ð#6Ó7Ð8¸Ð:ˆ
ð
 	�‰ÐPÔQØ�‰Ð(Ô)Û(ˆEØ�N‰NÐ/°¨w°fÐ=Ö>ñ )à�‰Ð1Ô2Ø�‰Ð@ÔAØ�‰Ð?Ô@Ø�‰ØVô	
ð 	�‰�rÔØ�‰�~Ô&Ø�‰ÐNÔOØ�‰ÐDÀZÀLÐPQÐRÔSØ�‰Øhô	
ð 	�‰Ð4Ô5Ø�‰�z JÕ.Ô/Ø�‰Ð>Ô?Ø�‰Ð/Ô0Ø�‰ØRô	
ð 	�‰�wÔØ�‰ØOô	
ð 	�‰ÐBÔCØ�‰�vÔØ�‰Ð0Ô1Ø�‰ØUô	
ð 	�‰ÐHÈÈÐTUÐVÔWØ�‰Ð<Ô=Ø�‰ÐGÔHØ�‰ÐTÔUØ�‰�{Ô#Ø�‰Ð8Ô9Ø�‰�~¨
Õ2Ô3Ø�‰ÐBÔCØ�‰Ð3Ô4Ø�‰Ð/Ô0Ø�‰�{Ô#Ø�‰Ø^ô	
ð 	�‰Ð>Ô?Ø�‰Ð1Ô2Ø�‰ØLÈZÈLÐYô	
ð 	�‰�{Ô#Ø�‰ÐUÔVØ�‰Ølô	
ð 	�‰Ð8Ô9Ø�‰�~¨
Õ2Ô3Ø�‰ÐBÔCØ�‰Ð3Ô4Ø�‰ØVö	
r(   c               ó    € V ^8„  d   QhRRRR/# )r   r¢  r"   r!   rZ   r#   )r$   s   "r%   r&   r     s   € ÷ ñ ¨ð °
ñ r(   c                ót   € V P                   P                  P                  4        F  w  r#W18X  g   K  Vu # 	  R# )z:Map a kernel parameter name back to its graph buffer name.N)r.   rm  rq  )r/   r¢  Ú
graph_nameÚ
inner_names   &&  r%   rŸ  ÚPallasKernel._param_to_buf_name   s4   € à&*§i¡i×&=Ñ&=×&CÑ&CÖ&EÑ"ˆJØÖ"Ø!Ò!ñ 'Fñ r(   c               ó    € V ^8„  d   QhRRRR/# r€  r#   )r$   s   "r%   r&   r  §  s   € ÷ G ñ G ¨ð G ¸Dñ G r(   c                ó  € VP                   pV P                  pV P                  '       d   RMRpVP                  '       d   RMRp. pVP                   FH  pV P                  V4      pTP                  V'       d   V P                  P                  V4      MR4       KJ  	  V P                  p	V	'       d   RV	 2MRp
\        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       d   R	\        V4       2MRpVP                  R
V RV RV V V
 R2	4       VP                  R4       VP                  R4       VP                  R4       VP                  R4       VP                  R4       VP                  R4       V P                  W!P                  4       VP                   FY  pV P                  V4      pV'       d   V P                  P                  V4      MRpVf   K?  VP                  V RV RV R24       K[  	  RP                  VP                  4      p\        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       dg   RP                  R V 4       4      pVP                  RV R24       VP                  R4       VP                  RV R24       VP                  R4       R# VP                  R4       VP                  RV R24       VP                  R4       R# )u)  Generate tiled BlockSpec and grid variables for CPU/TPU.

Tiles the last 1â€“2 dimensions of each tensor, respecting TPU
alignment constraints (last dim multiple of 128, second-to-last
multiple of 8).  Lower-ndim inputs are right-aligned with the
reference output shape per numpy broadcast rules.
r=  r>  Nz, max_grid_product=r#  c              3  ó(   "  € T F  qR Jx € K
  	  R # 5irf   r#   ©rc  r1   s   & r%   rd  Ú4PallasKernel._codegen_tiled_specs.<locals>.<genexpr>À  s   é € Ð4©) Q˜D•=«)ùrÌ  TFz, permutations=zM_tile, _grid, _ax2g = pallas_compute_tiling(_pallas_out_shapes[0], transpose=z, skip_last_n=z4, exact_only=len(_pallas_out_shapes[0]) < 2, is_tpu=r,   z_ng = len(_grid)z_ref = _pallas_out_shapes[0]r"  zF    pallas_make_block_spec(s, _ref, _tile, _ax2g, _ng, is_output=True)z    for s in _pallas_out_shapesrš  r›  r+   c              3  ó(   "  € T F  qR Jx € K
  	  R # 5irf   r#   rî  s   & r%   rd  rï  à  s   é € Ð0¡i ˜�}£iùrÌ  c              3  ó8   "  € T F  p\        V4      x € K  	  R # 5irf   )r  rî  s   & r%   rd  rï  á  s   é € Ð!=±9¨a¤$ q§' '³9ùrì  z_perm_flags = [r’  r#  z]    pallas_make_block_spec(i.shape, _ref, _tile, _ax2g, _ng, permutation=p) for i, p in zip([z], _perm_flags)zG    pallas_make_block_spec(i.shape, _ref, _tile, _ax2g, _ng) for i in [)rá  rö  rõ  rã  rð  rŸ  r
  r  rð  r  rk  r  r¡  r¨  r  r'  )r/   r%  rá  Úskip_nÚhas_transposeÚis_tpu_literalÚ	all_permsr1   r£  ÚmgpÚmgp_argÚ	perms_argr¢  rP  rä  Ú	perm_lists   &&              r%   r5  Ú!PallasKernel._codegen_tiled_specs§  sµ  € ð �x‰xˆØ×&Ñ&ˆØ"&×"9×"9Ð"9™¸wˆØ#&§:§: :™°7ˆð 35ˆ	Ø×(Ô(ˆAØ×.Ñ.¨qÓ1ˆHØ×Ñß=E�×+Ñ+×/Ñ/°Ô9È4öñ )ð ×(Ñ(ˆß14Ð'¨ uÑ-¸"ˆ÷ ‹sÑ4©)Ó4�s�sŠsÑ4©)Ó4×4Ò4ð œd 9›oÐ.Ñ/àð 	ð
 	�‰ðà&˜ð (Ø!˜(ð #Ø$Ð%Øˆk˜'˜ !ð%ô	
ð 	�‰Ð)Ô*Ø�‰Ð5Ô6à�‰Ð2Ô3Ø�‰ØTô	
ð 	�‰Ð8Ô9Ø�‰�sÔà×&Ñ& t×-DÑ-DÔEð ×,Ô,ˆEØ×.Ñ.¨uÓ5ˆHßDL�T×2Ñ2×6Ñ6°xÔ@ÐRVˆFØÔ!Ø—‘ % ¨¨E¨7°)¸F¸8À1ÐEÖFñ	 -ð —Y‘Y˜s×6Ñ6Ó7ˆ
ß‹3Ñ0¡iÓ0�3�3Š3Ñ0¡iÓ0×0Ò0ØŸ	™	Ñ!=±9Ó!=Ó=ˆIØ�N‰N˜_¨Y¨K°qÐ9Ô:Ø�N‰NÐ5Ô6Ø�N‰Nð%Ø%/ L°ðAôð �N‰N˜3Öà�N‰NÐ5Ô6Ø�N‰NØYÐZdÐYeÐefÐgôð �N‰N˜3Ör(   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r   r%  rà  rS  r"   rö  rõ  rK  r!   r  r#   )r$   s   "r%   r&   r  ð  s<   € ÷ #)ñ #)àð#)ð ð#)ð +ð	#)ð
 ð#)ð 
ñ#)r(   c                	óJ  € VP                   pV P                  '       d   R MRpVP                  R4       VP                  RV,           4       VP                  R4       VP                  R4       VP                  R4       VP                  RVP                   R24       VP                  R	V R24       TP                  V'       d   R
V R2MR4       VP                  R4       VP                  '       dD   VP                   Uu. uF	  pRV R2NK  	  ppVP                  RRP                  V4       R24       VP                  R4       VP                  R4       VP                  R4       VP                  R4       VP                  R4       VP                  R4       R# u upi )Ú_gridz(1,)rg  rc  z     out_shape=out_shapes_pallas,z    out_specs=out_specs_pallas,z    in_specs=in_specs_pallas,z    interpret=rh  z	    grid=z    input_output_aliases={ ri  z    input_output_aliases={},rk  zpallas_ensure_nonzero_rank(r,   r+   zif isinstance(_result, tuple):zF    _result = tuple(r.reshape(s) for r, s in zip(_result, out_shapes))rd  z,    _result = _result.reshape(out_shapes[0])zreturn _resultN)rá  r/  r¡  rå  rð  r'  )	r/   r%  rS  rö  rK  rá  Ú	grid_exprr1   Ú kernel_input_params_nonzero_ranks	   &&&&&    r%   r8  Ú)PallasKernel._codegen_jit_wrapper_cpu_tpuð  su  € ð �x‰xˆØ#×0×0Ð0‘G°fˆ	Ø�‰Ð2Ô3Ø�‰�v 
Õ*Ô+Ø�‰Ð9Ô:Ø�‰Ð8Ô9Ø�‰Ð6Ô7Ø�‰˜¨×(=Ñ(=Ð'>¸aÐ@ÔAØ�‰˜ 9 +¨QÐ/Ô0Ø�‰çð +Ð+<Ð*=¸TÑBà/ô	
ð
 	�‰�tÔØ×"×"Ð"à<?×<SÒ<Só0Ù<S°qÐ-¨a¨S°Ó2Ñ<Sð -ð 0ð �N‰N˜T $§)¡)Ð,LÓ"MÐ!NÈaÐPÔQØ�‰�sÔà�‰Ð7Ô8Ø�‰ØTô	
ð 	�‰�wÔØ�‰ÐEÔFØ�‰Ð'Ö(ùò0s   ÄF c               ó$   € V ^8„  d   QhRRRRRR/# ©r   r%  rà  rD  r"   r!   r  r#   )r$   s   "r%   r&   r    s'   € ÷ Dñ D ð DÈ#ð DÐRVñ Dr(   c                	ór   € VP                   '       d   V P                  W4       R # V P                  W4       R # rf   )rã  Ú_codegen_main_entry_tpuÚ_codegen_main_entry_default)r/   r%  rD  s   &&&r%   r9  Ú PallasKernel._codegen_main_entry  s'   € Ø�:�:ˆ:Ø×(Ñ(¨Ö?à×,Ñ,¨SÖCr(   c               ó$   € V ^8„  d   QhRRRRRR/# r  r#   )r$   s   "r%   r&   r    s.   € ÷ nWñ nWØ"ðnWØ69ðnWà	ñnWr(   c                	ó¦  € VP                   pVP                  R 4       VP                   R2pVP                  pVP                  RV RRP                  VP                  4       R24       VP                  4       ;_uu_ 4        VP                  R4       VP                  R4       \        VP                  4      \        VP                  4      ,           pV F  pVP                  V RV R	V R
V 24       K!  	  VP                  R4       . pVP                   F1  p	VP                  V	 RV	 RV	 R24       VP                  V	 R24       K3  	  VP                   F1  p
VP                  V
 RV
 RV
 R24       VP                  V
 R24       K3  	  TP                  RRP                  VP                   Uu. uF	  pRV R2NK  	  up4      ,           R,           4       . pVP                   Fv  pVP                  P                  V4      pVe@   \        P                  P                  V4      pVe   VP                  \!        V4      4       Ka  VP                  RV R24       Kx  	  VP                  RRP                  V4      ,           R,           4       RR.pVP#                  VP$                  4       VP#                  V4       VP                  RV RRP                  V4       R24       . pVP                   F  pVP                  RV R24       K  	  V'       d   RP                  V4      MRp. pVP&                   F  pVP                  RV R24       K  	  V'       d   RP                  V4      MRpVP                  R V R!V R"V 24       VP                  R#V R$24       VP                  4       ;_uu_ 4        VP                  R%4       VP                  4       ;_uu_ 4        VP                  R&V R'24       RRR4       VP                  R(4       VP                  4       ;_uu_ 4        VP                  R&V R)24       RRR4       RRR4       \        VP                  4      \        VP                  4      ,           pVP                  R*RP                  V4       R+24       VP                  R,4       VP                  4       ;_uu_ 4        VP                   Fx  pVP                  P                  V4      pVe?   \        P                  P                  V4      pVe   VP                  R-V R.V: R/24       K`  VP                  R-V R.V R024       Kz  	  RRR4       VP                  R+4       VP(                  '       dp   RP                  R1 VP(                   4       4      pVP                  R2V R324       RP                  R4 VP(                   4       4      pVP                  R5V R+24       M"VP                  R64       VP                  R74       VP                  R%4       VP                  4       ;_uu_ 4        VP                  R8V R924       RRR4       VP                  R(4       VP                  4       ;_uu_ 4        VP                  R8V R:24       RRR4       VP                  R;4       VP                  4       ;_uu_ 4        VP                  R<4       VP                  4       ;_uu_ 4        VP                  R=4       RRR4       RRR4       RRR4       R# u upi   + '       g   i     EL3; i  + '       g   i     EL ; i  + '       g   i     EL; i  + '       g   i     EL; i  + '       g   i     EL,; i  + '       g   i     Lø; i  + '       g   i     Lž; i  + '       g   i     L©; i  + '       g   i     R# ; i)>r#  Ú_mainr  rX  r+   ú, stream=None):z*jax.config.update('jax_enable_x64', False)újax.clear_caches()rš  z.to(torch.int32) if z.dtype == torch.int64 else z+# Build JAX placeholders for export tracingz$_placeholder = jax.ShapeDtypeStruct(z#.shape, torch_dtype_to_jax_runtime(z.dtype))Ú_placeholderúout_shapes = (útuple(rE  r  Nútorch_dtype_to_jax_runtime(r«  úout_dtypes = (r  r  zexported = jax.export.export(z, platforms=['tpu'])(r,   z'_'.join(str(s) for s in z	 + 'x' + z''zkernel_key = 'z	_out_' + z + '_in_' + z.if not tpu_torch_pallas.lookup_custom_kernel('z', kernel_key):ztry:z)tpu_torch_pallas.register_custom_kernel('zF', kernel_key, serialized_mlir_module=exported.mlir_module_serialized)zexcept TypeError:z/', kernel_key, exported.mlir_module_serialized)zinput_tensors = [r’  zoutput_shape_tensors = [ztorch.empty(z.shape, dtype=z, device='tpu'),z.dtype, device='tpu'),c              3  ó4   "  € T F  w  rV R V 2x € K  	  R# 5ir  r#   r  s   &  r%   rd  Ú7PallasKernel._codegen_main_entry_tpu.<locals>.<genexpr>¤  s   é € Ð)TÁO¹&¸1¨Q¨C¨r°!°­+ÃOùr   z_input_output_aliases = { z }c              3  ó<   "  € T F  w  r\        V4      x € K  	  R # 5irf   ré  )rc  rõ  Ú_os   &  r%   rd  r  ¦  s   é € Ð.UÁ_¹'¸1¬s°1¯v¨vÃ_ùs   ‚z_donate_argnums = [z_input_output_aliases = {}z_donate_argnums = []z0_results = tpu_torch_pallas.call_custom_kernel('zh', kernel_key, inputs=input_tensors, output_shapes=output_shape_tensors, donate_argnums=_donate_argnums)zt', kernel_key, inputs=input_tensors, output_shapes=output_shape_tensors, input_output_aliases=_input_output_aliases)zif _results is not None:z7for _in_idx, _out_idx in _input_output_aliases.items():z0input_tensors[_in_idx].copy_(_results[_out_idx]))rá  r¡  râ  r'  rñ  r-  rl  rî  rï  r
  ré  rë  rð  r   r  rf  r   r¿  rê  rð  rö  )r/   r%  rD  rá  Ú	main_nameÚkernel_name_strÚall_input_paramsÚ
param_nameÚall_jax_input_namesrY  Úptrr¥  Údtype_exprsr£  r  Úwrapper_placeholder_argsÚshape_key_partsr1   Úoutput_key_exprÚinput_key_partsÚinput_key_exprÚinput_tensor_namesÚalias_map_strÚdonate_argnums_strs   &&&                     r%   r  Ú$PallasKernel._codegen_main_entry_tpu  sþ  € ð �x‰xˆØ�‰�rÔØ—‘Ð' uÐ-ˆ	ØŸ/™/ˆØ�‰Ø�9�+˜Q˜tŸy™y¨×)?Ñ)?Ó@ÐAÀÐQô	
ð �[‰[�]�]ð
 �N‰NÐGÔHØ�N‰NÐ/Ô0ô  $ C×$4Ñ$4Ó5¼¸S×=MÑ=MÓ8NÕNÐÛ.�
Ø—‘Ø!�l # j \ð 2Ø$˜Ð%@ÀÀðNöñ /ð �N‰NÐHÔIØ"$ÐØ!×.Ô.�
Ø—‘Ø!�lÐ"FØ!�lÐ"EÀjÀ\ÐQYð[ôð $×*Ñ*¨j¨\¸Ð+FÖGñ /ð ×'Ô'�Ø—‘Ø�eÐ?Ø�eÐ>¸s¸eÀ8ðMôð $×*Ñ*¨c¨U°,Ð+?Ö@ñ (ð �N‰NØ Ø—)‘)À×@QÒ@QÓRÑ@Q¸˜v d V¨7Ó3Ñ@QÑRÓSõTàõôð
 &(ˆKØ×)Ô)�Ø×3Ñ3×7Ñ7¸Ó=�ØÒ'ÜŸG™G×-Ñ-¨hÓ7�EØÒ(Ø#×*Ñ*Ô+=¸eÓ+DÔEÙ Ø×"Ñ"Ð%@ÀÀÀgÐ#NÖOñ *ð �N‰NÐ+¨d¯i©i¸Ó.DÕDÀtÕKÔLð )5°lÐ'CÐ$Ø$×+Ñ+¨C×,?Ñ,?Ô@Ø$×+Ñ+Ð,?Ô@Ø�N‰NØ/Ø#Ð$ð %Ø—I‘IÐ6Ó7Ð8¸ð;ôð !ˆOØ×&Ô&�Ø×&Ñ&Ð)BÀ1À#ÀWÐ'MÖNñ '÷ 6E�× Ñ  Ô1È$ð ð !ˆOØ×,Ô,�Ø×&Ñ&Ð)BÀ1À#ÀWÐ'MÖNñ -÷ 6E�× Ñ  Ô1È$ð ð �N‰NØ  Ð 1°Ø"Ð#Ø˜~Ð.ð0ôð �N‰NØ@ÀÐ@QÐQ`Ðaôð —‘—•Ø—‘˜vÔ&Ø—[‘[—]•]Ø—N‘NðØ+Ð,ð -RðSô÷ #ð —‘Ð2Ô3Ø—[‘[—]•]Ø—N‘NðØ+Ð,ð -;ð<ô÷ #÷ ô" "& c×&6Ñ&6Ó!7¼$¸s×?OÑ?OÓ:PÕ!PÐØ�N‰NÐ.¨t¯y©yÐ9KÓ/LÐ.MÈQÐOÔPð �N‰NÐ5Ô6Ø—‘—•Ø×-Ô-�DØ"×7Ñ7×;Ñ;¸DÓA�HØÒ+Ü !§¡× 1Ñ 1°(Ó ;˜Ø Ò,Ø ŸN™NØ".¨t¨f°NÀ5Á)ÐK[Ð \ôñ %Ø—N‘NØ& t f¨N¸4¸&Ð@VÐWöñ .÷ ð �N‰N˜3Ôð ��ˆØ $§	¡	Ñ)TÀCÇOÂOÓ)TÓ T�Ø—‘Ð!<¸]¸OÈ3ÐOÔPØ%)§Y¡YÑ.UÀSÇ_Â_Ó.UÓ%UÐ"Ø—‘Ð!4Ð5GÐ4HÈÐJÕKà—‘Ð;Ô<Ø—‘Ð5Ô6à�N‰N˜6Ô"Ø—‘—•Ø—‘ðØ'Ð(ð )6ð7ô÷ ð �N‰NÐ.Ô/Ø—‘—•Ø—‘ðØ'Ð(ð )BðCô÷ ð �N‰NÐ5Ô6Ø—‘—•Ø—‘ØMôð —[‘[—]•]Ø—N‘NÐ#UÔV÷ #÷	 ÷ ‰]ùòF S÷f #—]�]ú÷ #—]�]ú÷ —�ú÷, —�ú÷< —�ú÷ —ú÷$ #—]ú÷	 —ú÷ �]ˆ]ús÷   ÂD1^?Æ3\ÇE^?ÌA^?ÍA^?Î8*]
	Ï"\"Ï81]
	Ð)\6Ð?]
	ÑB^?ÓB	]	Õ*^?Õ?B:^?Ø9]2	Ù1^?Ú ^	Ú1^?Û*^,	Û1^Ü^,	Ü^?Ü^?Ü"\3Ü-	]
	Ü6]Ý	]
	Ý
]Ý	^?Ý]/Ý)	^?Ý2^Ý=	^?Þ^Þ^?Þ^)Þ$^,	Þ,^<Þ7^?Þ?_	c               ó$   € V ^8„  d   QhRRRRRR/# r  r#   )r$   s   "r%   r&   r  Ë  s)   € ÷ Nñ NØ"ðNØ69ðNà	ñNr(   c                	ó8  a€ VP                   pVP                  R 4       VP                   R2pVP                  RV RRP                  VP                  4       R24       VP                  4       ;_uu_ 4        VP                  R4       VP                  '       d   VP                  R4       VP                  R4       VP                  '       dN   VP                  R	4       VP                   F,  pV P                  VVVP                  VP                  R
7       K.  	  VP                  R4       VP                   F:  pVP                  R4      '       g   K  V P                  W6VP                  RR
7       K<  	  VP                  R4       VP                   F:  pVP                  R4      '       g   K  V P                  W6VP                  RR
7       K<  	  VP                  R4       TP                  RRP                  VP                   Uu. uF	  pRV R2NK  	  up4      ,           R,           4       . pVP                   Fv  pVP                  P                  V4      p	V	e@   \        P                   P#                  V	4      p
V
e   VP%                  \'        V
4      4       Ka  VP%                  RV R24       Kx  	  VP                  RRP                  V4      ,           R,           4       / oVP                   F  pV R2SV&   K  	  VP                   F  pV R2SV&   K  	  RR.pVP)                  VP*                  4       VP)                  V3R lVP,                   4       4       VP                  RV RRP                  V4       R24       VP                  R 4       VP.                  '       dO   VP                  R!4       VP.                   F-  pVP                  V,          pVP                  V R"V R#24       K/  	  RRR4       R# u upi   + '       g   i     R# ; i)$r#  r	  r  rX  r+   r
  z)jax.config.update('jax_enable_x64', True)z>jax.config.update('jax_default_device', jax.devices('cpu')[0])r  z*# Convert Torch -> JAX for donated outputs)Ú
contiguousz+# Convert Torch -> JAX for in-place tensorsr  Fz!# Convert Torch -> JAX for inputsr(  Tz-# Prepare output metadata from PyTorch tensorr  r  rE  r  Nr  r«  r  Ú_jaxr  r  c              3  ó6   <"  € T F  pSV,          x € K  	  R # 5irf   r#   )rc  r¥  Úarg_name_maps   & €r%   rd  Ú;PallasKernel._codegen_main_entry_default.<locals>.<genexpr>  s   øé € ð %Ù/F t�˜T×"Ò"Ó/Fùrì  zres = r,   zjax.block_until_ready(res)z9result_values = res if isinstance(res, tuple) else (res,)z'.copy_(torch.from_dlpack(result_values[z])))rá  r¡  râ  r'  rñ  r-  rä  rî  Ú_emit_torch_to_jaxrã  rï  rW  ré  rë  rð  r   r  rf  r
  r   r¿  rê  rð  rô  )r/   r%  rD  rá  r  rY  r  r¥  r  r£  r  Úwrapper_call_argsrÙ  rÞ  r*  s   &&&           @r%   r  Ú(PallasKernel._codegen_main_entry_defaultË  sª  ø€ ð �x‰xˆØ�‰�rÔØ—‘Ð' uÐ-ˆ	Ø�‰Ø�9�+˜Q˜tŸy™y¨×)?Ñ)?Ó@ÐAÀÐQô	
ð �[‰[�]�]Ø�N‰NÐFÔGØ×#×#Ð#Ø—‘ØTôð �N‰NÐ/Ô0Ø××ÐØ—‘ÐKÔLØ"%×"2Ô"2�Jð ×+Ñ+ØØ"ØŸ
™
Ø#&×#7Ñ#7ð	 ,ö ñ #3ð �N‰NÐHÔIØ×'Ô'�Ø—>‘> ,×/Ô/Ø×+Ñ+¨D°s·z±zÈeÐ+ÖTñ (ð �N‰NÐ>Ô?Ø×'Ô'�Ø—>‘> (×+Ô+Ø×+Ñ+¨D°s·z±zÈdÐ+ÖSñ (ð �N‰NÐJÔKØ�N‰NØ Ø—)‘)À×@QÒ@QÓRÑ@Q¸˜v d V¨7Ó3Ñ@QÑRÓSõTàõôð
 &(ˆKØ×)Ô)�Ø×3Ñ3×7Ñ7¸Ó=�ØÒ'ÜŸG™G×-Ñ-¨hÓ7�EØÒ(Ø#×*Ñ*Ô+=¸eÓ+DÔEÙ Ø×"Ñ"Ð%@ÀÀÀgÐ#NÖOñ *ð �N‰NÐ+¨d¯i©i¸Ó.DÕDÀtÕKÔLØ+-ˆLØ!×.Ô.�
Ø.8¨\¸Ð+>�˜ZÓ(ñ /à×'Ô'�Ø'* e¨4 L�˜SÓ!ñ (ð ".¨|Ð <ÐØ×$Ñ$ S×%8Ñ%8Ô9Ø×$Ñ$ô %Ø/2×/FÒ/Fó%ô ð �N‰N˜VÐ$4Ð#5°Q°t·y±yÐARÓ7SÐ6TÐTUÐVÔWØ�N‰NÐ7Ô8Ø×&×&Ð&Ø—‘ØOôð ×2Ô2�CØ"×0Ñ0°Õ5�HØ—N‘NØ#˜*Ð$KÈCÈ5ÐPSÐTöñ 3÷C ‰]ùòF S÷G �]ˆ]ús<   Á7APÃBPÅAPÆ0APÈPÈFPÎ+APÐPÐP	c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r   rá  r   rº  r"   rã  r  r'  r!   r  r#   )r$   s   "r%   r&   r    s;   € ÷ Wñ WØðWØ(+ðWØ59ðWØJNðWà	ñWr(   c               	óP   € V'       d   R MRpV P                  V RV V R24       R# )z.detach().contiguous()z	.detach()z_jax = jax.dlpack.from_dlpack(r,   N)r¡  )rá  rº  rã  r'  Úsuffixs   &&&$ r%   r,  ÚPallasKernel._emit_torch_to_jax  s-   € ÷ .8Ñ)¸[ˆØ�‰˜(˜Ð#AÀ(ÀÈFÈ8ÐSTÐUÖVr(   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r¥  r"   rÂ  zIRNode | Noner!   r  r#   )r$   s   "r%   r&   r  "  s!   € ÷ 'ñ ' ð '¨=ð 'ÀDñ 'r(   c                óB  € \         P                  P                  pV P                  P	                  4       w  rE pV Uu. uF  qwP
                  NK  	  ppV U	u. uF  q™P                  R4      '       g   K  V	NK  	  p
p	\        \        \        V4      4      p\        V R/ 4      pV
 U	u. uF4  p	VP                  V	R4      '       g   K  W¸P                  V	4      ,          NK6  	  pp	V RRP                  WÛ,           4       R2pVP                  V4       R# u upi u up	i u up	i )z7Generate the Python code that calls this Pallas kernel.r
  r+  Fz.run(r+   r,   N)r   r  Úwrapper_coder.   r)  r¥  rW  rl  r  r"   r²  rð  r"  r'  r¡  )r/   r¥  rÂ  Úwrapperr:  r;  rh  rä   Úkernel_param_namesr1   rè  Úcall_arg_strsÚ	aliasableÚalias_call_argsÚkernel_calls   &&&            r%   Úcall_kernelÚPallasKernel.call_kernel"  s  € ä—'‘'×&Ñ&ˆØ$(§I¡I×$<Ñ$<Ó$>Ñ!ˆ˜Q Ù.6Ó7©h¨Ÿfœf©hÐÐ7Ù&8ÓTÑ&8 ¿L¹LÈ×<SŸ1˜1Ñ&8ˆÐTÜœS¤ iÓ0Ó1ˆÜ˜DÐ"6¸Ó;ˆ	ñ %ó
á$�Ø�}‰}˜Q ×&ô 7ˆM×2Ñ2°1Ó5×6Ð6Ù$ð 	ð 
ð ˜˜e D§I¡I¨oÕ.MÓ$NÐ#OÈqÐQˆØ×Ñ˜+Ö&ùò 8ùÚTùò
s   ½DÁDÁ4DÂ&DÃD)r  r  r  r  r+  r  r  r  r  r  rü  rã  rÿ  r   r  rþ  r  r/  rõ  r  rö  rý  r(  rf   r=  )r#  )\rH   rI   rJ   rK   rL   rj   Ú	overridesÚpallas_pexprr-  rÒ  r_   r  r*  r(  rD  rB  r*  rR  rY  r]  rŠ  rÁ  r•  r¨  r¸  rÆ  rç  r  rï  r  rj  rm  rÖ  r+  rV  r]  r>  rv  ri  rp  r‹  r•  r§  r«  r²  r·  rÁ  r×  rå  rõ  rü  r  r  r  r3  r=  rI  rd  Útyping_extensionsÚoverriderk  r  r¤  r×  r   r®  r¯  rÞ  rã  r  rU  r0  r3  r1  r,  r�  r›  rª  r.  r¢  r6  r7  rŸ  r5  r8  r9  r  r  r,  r<  rM   Ú__classcell__©r  s   @r%   rø  rø  š  sÉ  ø‡ ñð &€IØ)5€EÐ&Ó5õ.+õ`8õ!>õFbõHõ<8õ:õ5õKõ7õIðV ô	,ó ð	,õ(SðT ôó ðõ  õDhõTrðh ôó ðõ,Uð0 ôó ðð ôó ðð ôó ðõ*&õ dõL	õ	õCõJ(KõT'õ(õ #õJ8õt4õlHIðT ô6ó ð6õõ$I
õV(
õT9õvõ4YKõv>õ@&9õP2õh÷27:õrN
ð` ×Ñô-ó  ð-õ^@ðD ×Ñö:7ó  ð:7ðx ö
ó ð
÷Nõ*
õB+
õZnð` ô&ó ð&õ
D÷LQðf ôó ðõ+õ m8õ^-õ>õ&":õHõ&eTðN ô6ó ð6õ&vUõpL
õ\õG õR#)õJDõnWõ`Nð` ôWó ðW÷'õ 'r(   rø  c                  óV   a € ] tR tRt]t]R R l4       tV 3R lt]t	]t
R R ltRtV ;t# )ÚPallasSchedulingi7  c               ó    € V ^8„  d   QhRRRR/# )r   r  ztorch.devicer!   zOrderedSet[BackendFeature]r#   )r$   s   "r%   r&   ÚPallasScheduling.__annotate__;  s   € ÷ Eñ E¨,ð EÐ;Uñ Er(   c                	ó6   € \        \        P                  .4      # rf   )r   r   ÚREDUCE_TO_SINGLE_ELEMENT)Úclsr  s   &&r%   Úget_backend_featuresÚ%PallasScheduling.get_backend_features:  s   € ô œ>×BÑBÐCÓDÐDr(   c                	óü  <€ \         SV `  W4      '       g   R # VP                  4       '       dÎ   VP                  4       '       d¸   ^ RIHp / pVP
                  P                   F.  p\        WS4      '       g   K  VP                  WEP                  &   K0  	  VP
                  P                   FM  p\        WS4      '       g   K  VP                  V9   g   K)  WEP                  ,          VP                  8w  g   KL   R # 	  R# )F)Ú	MemoryDepT)
rû  Úcan_fuserÒ  Útorch._inductor.dependenciesrN  r  Úreadsr  r"  r¥  )r/   Únode1Únode2rN  Úreads1r  r  s   &&&   €r%   rO  ÚPallasScheduling.can_fuse@  s·   ø€ Ü‰wÑ ×-Ò-Ùð ×Ñ×Ò E×$6Ñ$6×$8Ò$8Ý>àˆFØ×(Ñ(×.Ô.�Ü˜c×-Ô-Ø'*§y¡y�FŸ8™8Ó$ñ /ð ×(Ñ(×.Ô.�Ü˜c×-Ô-°#·(±(¸fÖ2DØŸh™hÕ'¨3¯9©9Ö4Ú$ñ /ñ r(   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Úsrc_coder"   Únode_schedulezSequence[BaseSchedulerNode]r'  rø  r!   r#   )r$   s   "r%   r&   rG  X  s2   € ÷ "ñ "àð"ð 3ð"ð ð	"ð
 
ñ"r(   c                	óÚ  € \         P                  P                  pWP                  9   d   VP                  V,          # \        P
                  P                  '       d%   \        V\        P
                  P                  4      MR p\        P                  ! VP                  R4      4      P                  4       R,          pVR8X  d   RV 2pMRV RV 2pWtP                  V&   VP                  RV4      p\        4       pVP                  RV: R24       VP                  VR	R
7       VP                  R4       \!        W$4      w  ršV	 RV
 2pVP#                  WxP%                  4       V4       V# )r#  zutf-8:Né   NÚfusedÚpallas_rh  r  zasync_compile.pallas(z, r'''Tr‚  z''')rç  )r   r  r5  Úsrc_to_kernelr   ÚtritonÚdescriptive_namesr   ÚhashlibÚsha256ÚencodeÚ	hexdigestr„  r   r¡  r„  r   Údefine_kernelr2  )r/   rW  rX  r'  r6  Ú
fused_nameÚkernel_hashrâ  Úcompile_wrapperÚoriginsÚdetailed_originsÚmetadata_comments   &&&&        r%   rd  ÚPallasScheduling.define_kernelX  sP  € ô —'‘'×&Ñ&ˆØ×,Ñ,Ô,Ø×(Ñ(¨Õ2Ð2ô �}‰}×.×.Ð.ô " -´·±×1PÑ1PÔQàð 	ô
 —n’n X§_¡_°WÓ%=Ó>×HÑHÓJÈ2ÕNˆØ˜Ô Ø# K =Ð1‰Kà# J <¨q°°Ð>ˆKØ*5×Ñ˜hÑ'ð ×#Ñ# O°[ÓAˆä(Ó*ˆØ×!Ñ!Ð$9¸+¹ÈÐ"OÔPØ×Ñ˜x¨tÐÔ4Ø×!Ñ! &Ô)ä$7¸Ó$OÑ!ˆØ%˜Y bÐ)9Ð(:Ð;ÐØ×Ñ˜k×+CÑ+CÓ+EÐGWÔXàÐr(   r#   )rH   rI   rJ   rK   rø  Úkernel_typeÚclassmethodrK  rO  Úcan_fuse_verticalÚcan_fuse_horizontalrd  rM   rB  rC  s   @r%   rE  rE  7  s9   ø† Ø€KàôEó ðEõ
ð* !ÐØ"Ð÷"ó "r(   rE  )FÚ
__future__r   Údataclassesr`  r  r¾  r@  Útypingr   r   r   r%  r  Útorch.utils._ordered_setr   Útorch.utils._sympy.functionsr   rï  r	   rî  r
   r#  r   Úruntime.runtime_utilsr   r&  r   r   Úvirtualizedr   Úblock_analysisr   Úcommonr   r   r   r   r   Úsimdr   r   r   r   r-   r?  Úcollections.abcrN   rO   ÚirrP   Úops_handlerrQ   Ú	schedulerrR   ÚMAIN_SUFFIXÚ_loggingÚgetArtifactLoggerrH   r]   rV   r*  rh   rj   Ú	dataclassrÈ  rÔ  rØ  rà  rø  rE  r#   r(   r%   Ú<module>r‚     s`  ðÝ "ã Û Û Û 	Û ß +Ñ +ã ã Ý /÷ñ õ Ý 6ß >Ý Ý /÷õ ÷ CÑ Bô�Mô ñ< ‹×&Ñ&€÷ ß2åÝ+Ý-ð €ð —.‘.×2Ñ2°8¸]ÓK€÷>ñ >ô.U�,ô Uôr
˜Kô r
ðj ×Ñ÷ð ó ðð ×Ñ÷ð ó ðð ×Ñ÷ð ó ðð ×Ñ÷'ð 'ó ð'ô.Z>'�:ô Z>'ôz|C�~ö Cr(   