
    uki/;                    n   d Z ddlmZ ddlZddlmZmZ ddlmZ ddl	m
Z ddl	mZ ddl	mZ dd	lmZ dd
l	mZ ddlZedd       Zedd       Zedd       Zed d       Zd!dZd"dZd#dZ	 	 	 	 	 	 	 	 d$dZ	 	 	 	 	 	 	 	 	 	 d%dZd Zd Zd Zd Zd Z ej:                  d       G d d             Zy)&zPallas utility functions.    )annotationsN)Anyoverload)lax)core)dtypes)typing)
split_list)numpyc                     y N abs     P/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/jax/_src/pallas/utils.pycdivr              c                     y r   r   r   s     r   r   r   #   r   r   c                     y r   r   r   s     r   r   r   '   r   r   c                     y r   r   r   s     r   r   r   +   r   r   c                    t        | t              rt        |t              r| |z   dz
  |z  S t        j                  | |dz
  z   |      S )zComputes the ceiling division of a divided by b.

  Examples:
    >>> cdiv(8, 2)
    4
    >>> cdiv(9, 2)  # 9 / 2 = 4.5, which rounds up to 5
    5
     )
isinstanceintr   divr   s     r   r   r   /   sC     3Jq#.EAI!	a!ea	  r   c                    t        j                  |       }g }| D ]!  }||z  }|j                  t        |             # t	        |      S r   )npprodappendr   tuple)shapesizestridesss       r   strides_from_shaper'   =   sH    	$' a19DNN3t9 
wr   c                \    | dk  rt        d      | dk(  rdS d| dz
  j                         z  S )z;Returns the next power of two greater than or equal to `x`.r   z2`next_power_of_2` requires a non-negative integer.r      )
ValueError
bit_lengthxs    r   next_power_of_2r.   F   s8    U
I
JJ1f3!A11333r   c                   |dkD  r| j                   |   }| j                  d   }|j                  j                  s6|j                  j                  t
        j                  t
        j                  fvrt        d|j                   d|       |j                  j                  s6|j                  j                  t
        j                  t
        j                  fvrt        d|j                   d|       t        | j                        D ]  \  }}|j                  t        j                  k(  s$|j                   d   |k(  s7t        |j                   d   t        j                         s_|j                   d   j"                  dk(  s||j                  d   |k(  s|} n t        d      | j%                  | j                  d | | j                  |dz   d  z   | j                  dd        } d}| |fS d	}| |fS )
Nr   znot a fori_loop index in: z jaxpr=znot a fori_loop index out: r   z!Unable to match fori_loop pattern)eqnsoutvarsTF)invarsr1   avalr#   dtypejnpint32int64NotImplementedError	enumerater0   	primitiver   add_pr   jax_coreLiteralvalreplace)	jaxpr
num_consts	num_carryin_index_varout_index_varieqn	eqn_indexhas_loop_indexs	            r   pattern_match_scan_to_fori_looprI   M   s    ] <<
+LMM!$M		399'==&|'8'8&95(
CE E    CII(>>'(:(:';8UH
EG G EJJ' 	E3	#))	#::a=L(

1x'7'78zz!}  A%Q=0		E   CDD MMZZ
#ejjQ&@@ab!  #E N
 
	 N		r   c           	        |ryt        | j                  j                  |g      \  }}|D cg c]  }|j                   }}t	        |      dk  ry|d d \  }}	|j
                  s,|j                  t        j                  t        j                  fvry|	j
                  s,|	j                  t        j                  t        j                  fvry|d d \  }
}| j                  j                  d   }|j                  j                  t        j                  k(  sJ t	        | j                  j                        dk7  ry| j                  j                  d   }|j                  t        j                  k7  ry|j                  |gk7  ry|j                  |
|gk7  ryt        |j                  j                  |g      \  }}|d d \  }
}|j                  j                  d d \  }}||ury	t!        |j                  j                        D ]  \  }}|j                  t        j"                  u s#|j                  d   |
u s5t%        |j                  d   t&        j(                        s]|j                  d   j*                  dk(  sz|j                  d   |k(  s|} n y
|j                  }g |j                  d | |j                  |   |j                  |dz   d  }t-        |j                  dd        }|j.                  j0                  ;g |j.                  j0                  d | d|j.                  j0                  |dz   d  }nd }|j.                  j2                  |j.                  j2                  dd  }nd }|j5                  |j                  d | |j                  |dz   d  z   |||j.                  j7                  ||            }|d fS c c}w )N)Nz'Conditional jaxpr can't contain consts.r)   )Nz+Conditional jaxpr have only two carry args.)Nz6First conditional jaxpr carry arg is not a scalar int.)Nz7Second conditional jaxpr carry arg is not a scalar int.r   r   )Nz-Non-trivial conditional jaxprs not supported.)Nz!Loop upper bound is not constant.)Nz#Loop index not incremented in body. )	arg_namesresult_paths)r0   r2   r1   
debug_info)r
   r@   r2   r3   lenr#   r4   r5   r6   r7   r1   bool_r0   r:   r   lt_pr9   r;   r   r<   r=   r>   r"   rN   rL   rM   r?   _replace)
cond_jaxprcond_nconsts
body_jaxprbody_nconsts_cond_invarsvcond_in_avalsa1a2v1v2outvarrF   body_invarsvo1vo2rE   rG   r@   
new_invarsnew_outvarsnew_arg_namesnew_result_pathss                           r    pattern_match_while_to_fori_looprg   w   s    <j..55~F.![#./a166/-/!@!&"bXX#))SYY!77KXX#))SYY!77Lr?&"b##A&&			cii	''	'				1$Ba #]]chhB[[VHBZZB8Bj..55~F.![r?&"b%%bq)(#ss]6***//0 	9fa
}}		!	A"	cjjmX%5%56ZZ]!#{{1~$i	9 9


%||M\"ll<  ||L1$&'*
 emmAB'(+
+Ee&&00,? EE&&001A1BCEM M
"".''44QR8
--::jy!EJJy1}$??!!**]8H + J	  % 
C 0s   O c                   d}g d}g d}t        j                  | |  z         }|dk  }t        j                  ||dz
  t        j                  |      dz
        }t        j                  ||d   |d         }t	        d|      D ]'  }t        j                  |||   ||         }|||z  z   }) t        j                  t        j
                  |       d	k(  t         j                  | z  || z        S )
N	   )	gG,^>gf	>gjfj;goD XkҾg4JY`[,?gA4! Tg8Eqg")`?gܴ?)	gn<_>*g1gav?g@V?g]rng_Ow?gߺ8g0ֿT?g9a?gA@      @g      @g      @r   r         ?)r5   log1pwheresqrtrangeabsinf)	r-   k_degreew_lt_5_constantsw_gt_5_constantsww_lt_5prE   cs	            r   _erf_inv_32_lowering_helperry      s    (
 yyaR!s7&	iiC!s!23!	ii(+-=a-@A!H a		&*1-/?/BCA	AE	A 
3771:$cggk1q5	99r   c                  	
 g dg d	g dt        j                  | |  z         }|dk  
|dk  	
fd}t        j                  dd      }t        j                  |      |z
  }t        j                  
|d	z
  |      } |d
      }t	        dd      D ]  } ||      ||z  z   } t	        dd      D ]%  }t        j                   ||      ||z  z   |      }' t	        dd      D ]%  }t        j                  
 ||      ||z  z   |      }' t        j                  t        j
                  |       dk(  t        j                  | z  || z        S )N)g'F5g'$3g|>7<gXri<gk
	6g2.x<g&<gf>&g@p6g ~"*=gYgaуͽg<kG>g`Mȍ1gF=m6_g]Ok>gJC趾g6{g$y(?gvEHg	1öxg(>ـ?g|^u?)g2ۇ#>g5R\x>gU9StwglLUͫS>g786>gP+оgR>g#ʠ)>ggЄ?g"T2>gD7g%Z<O?g8/$[g<Shd?gںngju?g9dm?gHZ8̫@)gSxνg'gE->g_/NF0gZ@>g_I.PgJ3 L_>g>"-rgT$>grԨg+=	>g~Ig ?gS]6/,g|ߥ."gܠ0*?gMf@g      @g      0@c                    |    }| dk  rt        j                  ||          }| dk  rt        j                  ||          }|S )N      )r5   rm   )rE   rx   w_gt_16_constantsw_lt_16w_lt_16_constantsw_lt_625w_lt_625_constantss     r   get_coefficientz4_erf_inv_64_lowering_helper.<locals>.get_coefficient  sP    1A2v
))Ha!21!5
6a2v
))GQ 1! 4
5aHr   g      
@rj   g      	@r   r   r}   r|      rk   )r5   rl   rm   rn   ro   rp   r   rq   )r-   ru   r   select2select2_resultrw   rE   r~   r   r   r   r   s          @@@@@r   _erf_inv_64_lowering_helperr      sV   
 yyaR!X(H'  IIgtS)'88A;(.	ii!e)^4!a!B< #aQU"A#R= :a		'?1-A5q9A:R= ;a		(OA.Q6:A; 
3771:$bffqj!a%	88r   c                    | j                   t        j                  k(  rt        |       S | j                   t        j                  k(  rt        |       S t        d| j                          )Nz,erf_inv_lowering_helper not implemented for )r4   r5   float32ry   float64r   r8   r,   s    r   erf_inv_lowering_helperr   '  sO    WW&q))WW&q))J177)TUUr   c                   t        j                  | j                  t         j                        r| dk7  j	                  | j                        S t        j                  | j                  t         j
                        r=| dkD  j	                  | j                        | dk  j	                  | j                        z
  S t        j                  | j                  t         j                        ru| dkD  j	                  | j                        | dk  j	                  | j                        z
  }t        j                  t        j                  |       t         j                  |      S t        d| j                         )Nr   g        z)sign_lowering_helper not implemented for )r5   
issubdtyper4   unsignedintegerastypeintegerfloatingrm   isnannanr8   )r-   outs     r   sign_lowering_helperr   /  s    ^^AGGS001F??177##^^AGGS[[)E>>!''"a!e^^AGG%<<<^^AGGS\\*r6//!''
"a"f__QWW%=
=C99SYYq\377C00GyQRRr   c                   | j                   |j                   k7  r%t        d| j                    d|j                          | j                   t        j                  t        j                  fvrt        d| j                          | j                   t        j                  k(  rMt        j                  t        j
                  t        j                  t        j
                  t        j                  fnLt        j                  t        j                  t        j                  t        j                  t        j                  f\  }}}}}t        j                  | j                         }| j                  |      }|j                  |      }	t        j                  |       t        j                  |      z  }
t        j                  | |t        j                        j                  |            } |d|dz
  z        }|}| }||z  }|	|z  }| |k(  }|	}t        j                   |      }||k(  }||k(  }|	}||z  }|	|z  }t        j"                  |      }||z  }||k7  }||kD  }||z  }t        j                  | |d      j                  |            }t        j$                  |||      }||z   } t        j$                  |t        j$                  |||      |       } t        j$                  |||       } t        j$                  |
||       } | j                  |      S )Nz@The two inputs to `nextafter` must have the same dtype, but got z and z7`nextafter` only supports float32 and float64, but got r   )r4   r*   r5   r   r   uint32r   r6   uint64r7   r   itemsize_bitsviewr   	full_liker   
zeros_like	ones_likerm   )!r-   y	jnp_floatjnp_uintnp_floatnp_uintnp_intbitwidthx_as_inty_as_int	nan_inputresult_for_nansign_bit	sign_masknegated_sign_maskx_absy_absx_and_y_are_equalresult_for_equalzero	x_is_zero	y_is_zeroresult_for_both_zerox_signy_signoneresult_for_x_zero_y_non_zerosigns_disagreex_magnitude_larger_than_yresult_has_smaller_magnitude	minus_onemagnitude_adjustmentresults!                                    r   nextafter_lowering_helperr   >  s   WW
	GG9E!''	$ 
 WWS[[#++..

A!''K  	ww#++ 
kk3::rzz299bhh4 
kk3::rzz299bhh$ 1)Xx& !!!''*(VVH(VVH( iilSYYq\))==8BFF+;+@+@+IJ. aHqL)*()i
&
&%
&
&% 1f 
	!$tm)tm)!i&i& 	h#!'# V#.#em!:^!KmmHfRjoog&>?)#?CP**& 99	ii	/1MN& 99&(8&A& 99Y7& 
Y	r   T)frozenc                  >    e Zd ZU ded<   ded<   ded<   edd       Zy)	MeshInfotuple[int, ...]
mesh_shapeztuple[str, ...]
axis_namesmesh_stridesc                     t        t         fd j                  D                    }t         j                  j	                               }t        | j                  |      S )Nc              3  <   K   | ]  }j                   |     y wr   )r#   ).0r   meshs     r   	<genexpr>z%MeshInfo.from_mesh.<locals>.<genexpr>  s      ,

1,s   )r'   r"   r   r#   valuesr   )r   r   r   s   `  r   	from_meshzMeshInfo.from_mesh  sS     &e ,#, ' L tzz((*+JJ>>r   N)r   r   returnr   )__name__
__module____qualname____annotations__staticmethodr   r   r   r   r   r     s&    ? ?r   r   )r   r   r   r   r   r   )r   r   r   jax_typing.Arrayr   r   )r   r   r   r   r   r   )r   r   r   r   r   r   )r   int | jax_typing.Arrayr   r   r   r   )r#   r   r   r   )r-   r   r   r   )r@   zjax_core.JaxprrA   r   rB   r   r   ztuple[jax_core.Jaxpr, bool])
rS   jax_core.ClosedJaxprrT   r   rU   r   rV   r   r   z(tuple[jax_core.Jaxpr | None, str | None])__doc__
__future__r   dataclassesr	   r   r   jax._src.laxr   jax._srcr   r<   r   
jax_typingjax._src.utilr
   r   r5   r   r   r'   r.   rI   rg   ry   r   r   r   r   	dataclassr   r   r   r   <module>r      s,     "     %  ) $ !  
 
 
 
 
 
 
 
!4'''*'7:' 'TM$MM %M 	M
 .Mb:6A9HVST n d#? ? $?r   