
    ukip                     j	   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mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z mZm!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- ddl.m/Z/ ddl	m0Z0 dd	l1m2Z2 dd
l1m3Z3 ddl4m5Z5 ddl6m7Z7m8Z8 d Z9de8de8de8de7fdZ:de8de7fdZ;de8de7fdZ<de8de8de7fdZ=de8de8de7fdZ>de8de8de7fdZ?de8de8de7fdZ@e9de8de8de7fd       ZAde8de8de7fdZBde8de7fdZCde8de7fdZDde8de7fdZEde8de7fd ZFde8de7fd!ZGd" ZHd# ZId$ ZJd% ZKd& ZLd' ZMd( ZNd) ZOd* ZPd+ ZQ G d, d-e      ZRd.e7de7fd/ZSd0 ZTd1 ZUd2 ZVd3 ZWd4 ZXd5 ZYd6 ZZd7 Z[d8 Z\d9 Z] e%e*e*e*gd:      Z^ e3j                  e^ e3j                   e9eQ      d;<              e2j                  e^eIeIeH        e&e*d=      Zb e2j                  ebd>         e3j                  eb ee+e5jv                                e&e*d?      Zc e3j                  ec ee+e5jx                                e2j                  ecd@         e%e*e*gdA      Zd e3j                  ed ee+e5jz                                e2j                  edeNeO        e%e*e*gdB      Ze e3j                  ee e3j                   e9eU      d;<              e%e*e*gdC      Zf e3j                  ef e3j                   e9eX      d;<              e2j                  eeeKeJ        e%e*e*gdD      Zg e3j                  eg e3j                   e9eW      d;<              e2j                  egeMeL        e%e*e*gdE      Zh e3j                  eh ee+e5j                                e&e*dF      Zi e3j                  ei e3j                  e]d;<              e2j                  eidG         e&e*dH      Zk e3j                  ek ee+e5j                               dI Zl e2j                  ekel        e&e*dJ      Zm e2j                  emdK         e3j                  em ee+e5j                                e&e*dL      Zn e2j                  endM         e3j                  en ee+e5j                                e&e*dN      Zo e2j                  eodO         e3j                  eo ee+e5j                               y)Pz` Special functions

LAX decompositions for special functions into their StableHLO counterparts.
    )EnumN)partialreduce)core)#addbitwise_andbitwise_not
bitwise_orbroadcast_in_dimbroadcast_shapesconvert_element_typediveqexp	full_likegegtleloglog1pltmulneneg
reciprocalr   selectsignsqrtsquarestandard_naryopstandard_unopsub_const_dtype_float_nary_lower_hlo_ones_isnan)
while_loop)dtypes)ad)mlir)chlo)Array	ArrayLikec                       fd}|S )Nc                     t        d | D         }| D cg c]+  }t        ||t        t        |j                                    - } }| d   j
                  }|t        j                  k(  xs |t        j                  k(  }|r8| D cg c]  }t        |t        j                         } }t        j                  }n|} | d|i}|rt        ||      }|S c c}w c c}w )Nc              3   4   K   | ]  }|j                     y wN)shape).0as     O/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/jax/_src/lax/special.py	<genexpr>z>_up_and_broadcast.<locals>.up_and_broadcast.<locals>.<genexpr>,   s     *Aq177*As   r   dtype)r   r   listrangendimr9   r*   bfloat16npfloat16r   float32)argsbroadcasted_shaper6   a_dtypeneeds_upcasta_x_typeresultdoits          r7   up_and_broadcastz+_up_and_broadcast.<locals>.up_and_broadcast+   s    (*AD*ABQUVAQ 14aff3FGVDV1gmmGfoo-FBJJ1FL;?@a"1bjj1@d@hh4(x(F#FG4fM W
 As   0C!C )rG   rH   s   ` r7   _up_and_broadcastrJ   *   s     
    r6   bxreturnc                 f    t        j                  | ||      \  } }}t        j                  | ||      S )z1Elementwise regularized incomplete beta integral.)r   standard_insert_pvaryregularized_incomplete_beta_pbind)r6   rL   rM   s      r7   betaincrS   <   s1    &&q!Q/'!Q	&	+	+Aq!	44rK   c                 ,    t         j                  |       S )z7Elementwise log gamma: :math:`\mathrm{log}(\Gamma(x))`.)lgamma_prR   rM   s    r7   lgammarW   A   s    	q	rK   c                 ,    t         j                  |       S )z%Elementwise digamma: :math:`\psi(x)`.)	digamma_prR   rV   s    r7   digammarZ   E       		rK   mc                 `    t        j                  | |      \  } }t        j                  | |      S )z-Elementwise polygamma: :math:`\psi^{(m)}(x)`.)r   rP   polygamma_prR   )r\   rM   s     r7   	polygammar_   I   s+    		#	#Aq	)$!Q			!Q	rK   c                 `    t        j                  | |      \  } }t        j                  | |      S )z2Elementwise regularized incomplete gamma function.)r   rP   igamma_prR   r6   rM   s     r7   igammarc   N   s)    		#	#Aq	)$!Q	q!	rK   c                 `    t        j                  | |      \  } }t        j                  | |      S )z@Elementwise complementary regularized incomplete gamma function.)r   rP   	igammac_prR   rb   s     r7   igammacrf   S   s)    		#	#Aq	)$!Q	1	rK   c                 `    t        j                  | |      \  } }t        j                  | |      S )zDElementwise derivative of the regularized incomplete gamma function.)r   rP   igamma_grad_a_prR   rb   s     r7   igamma_grad_ari   X   s+    		#	#Aq	)$!Q			a	##rK   c                P    t        j                  | |      \  } }t        | ||      S )z5Elementwise derivative of samples from `Gamma(a, 1)`.)r9   )r   rP   random_gamma_grad_impl)r6   rM   r9   s      r7   random_gamma_gradrl   ]   s)     
	#	#Aq	)$!Q	1E	22rK   qc                 `    t        j                  | |      \  } }t        j                  | |      S )z6Elementwise Hurwitz zeta function: :math:`\zeta(x, q)`)r   rP   zeta_prR   )rM   rm   s     r7   zetarp   c   s)    		#	#Aq	)$!Q	Q	rK   c                 ,    t         j                  |       S )zpExponentially scaled modified Bessel function of order 0:
  :math:`\mathrm{i0e}(x) = e^{-|x|} \mathrm{i0}(x)`
  )bessel_i0e_prR   rV   s    r7   
bessel_i0ers   h        
		1	rK   c                 ,    t         j                  |       S )zpExponentially scaled modified Bessel function of order 1:
  :math:`\mathrm{i1e}(x) = e^{-|x|} \mathrm{i1}(x)`
  )bessel_i1e_prR   rV   s    r7   
bessel_i1erw   n   rt   rK   c                 ,    t         j                  |       S )z4Elementwise error function: :math:`\mathrm{erf}(x)`.)erf_prR   rV   s    r7   erfrz   t   s    	ArK   c                 ,    t         j                  |       S )z]Elementwise complementary error function:
    :math:`\mathrm{erfc}(x) = 1 - \mathrm{erf}(x)`.)erfc_prR   rV   s    r7   erfcr}   x   s     
QrK   c                 ,    t         j                  |       S )zAElementwise inverse error function: :math:`\mathrm{erf}^{-1}(x)`.)	erf_inv_prR   rV   s    r7   erf_invr   }   r[   rK   c                     t        |      t        |      z   t        ||z         z
  }t        |dz
  t        |       z  |dz
  t        |      z  z   |z
        }|| z  S N   )rW   r   r   r   )gr6   rL   rM   lbeta	partial_xs         r7   betainc_gradxr      sc    
)fQi
&Q-
/%1q5E1"I%q5CF"#%*+ ,)	QrK   c                     t        d      )Nz7Betainc gradient with respect to a and b not supported.
ValueError)r   r6   rL   rM   s       r7   betainc_grad_not_implementedr      s    LMMrK   c                 n    | t        | |t        |      z
  t        |      z  z   t        |      z
        z  S r3   )r   r'   r   rW   r   r6   rM   s      r7   igamma_gradxr      s3    	
S!q58|s1v--q	9:	::rK   c                      | t        ||      z  S r3   )ri   r   s      r7   igamma_gradar      s    	
]1a 	  rK   c                     t        | ||       S r3   )r   r   s      r7   igammac_gradxr          
q!Q
	rK   c                     t        | ||       S r3   )r   r   s      r7   igammac_gradar      r   rK   c                     t        d      )Nz5polygamma gradient with respect to m is not supportedr   r   r\   rM   s      r7   polygamma_gradmr      s    JKKrK   c           
      H    | t        t        |t        |d            |      z  S r   )r_   r   r#   r   s      r7   polygamma_gradxr      s!    	
Ys1fQl+Q/	//rK   c           
          ddddd fd}f
d} dg }t        t        t        |            t        |j                  d      |      }	dd	|	t        |	d      |	g}
t        |||
      }
|
   S )
Nr   r            c                 H    |    }t        |      }|    }t        ||      S r3   )r   r   )values	iterationiterations_remain_condvalues_unconverged_condkIterationIdxkValuesUnconvergedIdxnum_iterationss       r7   while_cond_fnz7lentz_thompson_barnett_algorithm.<locals>.while_cond_fn   s5    }%I	>:$%:;-/FGGrK   c                   
 |    } |g
 } |g
 }t        |t        ||                }t        |      }t        t	        t        |      |      ||      }t        |t        ||                }t        t	        t        |      |      ||      }t        |      }t        ||      }t        |    |      }|dz   | <   || <   || <   || <   t        t        t        |t        |d                        }	t        |	      | <   | S )Nr         ?)r   r   r   r   r   absr   r   r   r"   r#   _any)r   r   partial_numeratorpartial_denominatorcsmall_constantddeltahtolerance_comparisoninputskCIdxkDIdxkHIdxr   r   nth_partial_denominatornth_partial_numeratorsmall	thresholds             r7   while_body_fnz7lentz_thompson_barnett_algorithm.<locals>.while_body_fn   s"   }%I-iA&A1)EfE%6u!FGAq%(Nr#a&.)>1=A%6u!FGAr#a&.)>1=A1A1IEF5M5!A &MF=F5MF5MF5Mc#eVE3-?"@A9M$()=$>F !MrK   rI   T)r   r   r   r   r4   r   r)   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s   ``````     @@@@@r7    lentz_thompson_barnett_algorithmr      s    -
%
%
%H 0 0;F;R'(%0e%8%>%>C "! d1Yq^A&&m]F;&	rK   c                   | j                   fd}fd}t        t        | t        | d            t        |t        |t	        d                        }t        t        |t        |d            t        | t        | t	        d                        }t        |t        |d            }t        |t        |d            }	t        |      }
t        |	      }t        t        t        |       t        |            t        |            }t        t        ||      t        ||            }t        t        ||
      t        ||	            }t        t        t        t        | t        | d            t        |t        |d                  t        |t        |d                  t        |t        |d                  }t        |t        t        ||      |            }t        || t        | d      z   | |z   t        |d      z   z        }| }t        || |      } t        |||      }t        ||t        t        |d      |            }t        t        j                  k(  rdndt        j                         j"                  d	z  j%                        t        j                         j"                  d	z  j%                        ||| ||g
      }t        j                         j&                  d	z  j%                        }t)        |      t)        | |z         z
  }t)        |       |z   }t        t        | t        | |            t+        t-        |       |z  |z
        t+        t/        |      | z  t-        |       |z  z   |z
        | z        }||z  }t        ||t        t        |d      |            }t        |t        | d      |      }t        |t        | d      |      }t        |t        | t	        d            |      }|S )Nc           	      N   t        | g       }t        |t        |d      z  t        |d            }t        |t        |d            }|t        |d      z
  }|t        |d      z  }t        |t        |d            }	t        |      }t        |d      }
t        |d      }||z    |z  ||
z   z  }t	        |	|||z    ||z   |z   z  |z  |||z  z   |||z  z   |
z   z  z        }|||z
  z  |z  |||z  z   |
z
  |||z  z   z  z  }t        |d      }t	        |||      }t	        |||      S )z
    The partial numerator for the incomplete beta function is given
    here: http://dlmf.nist.gov/8.17.E23 Note that there is a special
    case: the partial numerator for the first iteration is one.
    r   r   r          @r   )r   r   r   r   r   )r   r6   rL   rM   iteration_bcastiteration_is_eveniteration_is_oneiteration_minus_oner\   	m_is_zeroonetwozero_numeratoreven_numeratorodd_numeratorone_numerator	numeratorr9   r4   s                    r7   nth_partial_betainc_numeratorzGregularized_incomplete_beta_impl.<locals>.nth_partial_betainc_numerator   sg    'y%<O?Y-JJ$_a8:/9_a+HI)Ioq,IIy)<a@@A1i1o&IQ&A
Aq/C
As
C
 1uX\QW-NI~!eHA	2Q6 37{q37{S/@ACDN QK!OC!Gc(9a#'k'JKMa%M(.-HI"M9==rK   c           	          t        | g       }t        t        |t        |d            t        |d      t        |d            S )Nr   r   )r   r   r   r   )r   r6   rL   rM   r   r4   s        r7   nth_partial_betainc_denominatorzIregularized_incomplete_beta_impl.<locals>.nth_partial_betainc_denominator   s?    &y%<O"_i&CDAq/9Q?4 4rK   r   infr   r      iX  r   )r   r   r   r   r   r   nan)r4   r
   r   r   floatr	   r(   r   r   r   r   r"   r   r>   r@   r*   finfoepsastypetinyrW   r   r   r   )r6   rL   rM   r9   r   r   	a_is_zero	b_is_zero	x_is_zerox_is_onex_is_not_zerox_is_not_oneis_nanresult_is_zeroresult_is_oneresult_is_nanconverges_rapidlya_origcontinued_fraction
very_smalllbeta_ab_small_albeta_abfactorrF   r4   s      `                    @r7    regularized_incomplete_beta_implr      sd   
''%>:4
 AyA/AyE%L7Q1RS)AyA/AyE%L7Q1RS)IaO$)9Q?#(i(-X&,jF1I6q	B&k)\BKPY[dDef.[MBKPY[cDde-Z
q)Aq/Bq)Aq/2)4q)Aq/9Q?35- ]J{9i7XZ`,ab- Q1a0QUYq#=N5NOP&1%!6*!3yA#:;!72::-33<<""Q&
.
.u
5||E"&&*22597;q!9 U#((1,44U;*AYA.AY))("Q	!Z01eQBi!m&667c!fqj5!9q=08;<q@B& &&#VS611Ev-NO&.)Aq/6:&-1a&9&-1eEl!;VD&	-rK   c                       e Zd ZdZdZdZy)
IgammaModer   r   r   N)__name__
__module____qualname__VALUE
DERIVATIVESAMPLE_DERIVATIVErI   rK   r7   r   r   +  s    
%*rK   r   
predicatesc                     t        | d      }| j                  }t        t        t	        |                  }t        | |t        |      S )NF)r#   r4   tupler;   lenr   r
   )r   fpredicates_shapeall_dimensionss       r7   r   r   0  s@    Z!%%s#3456.	
Az>	::rK   c           
         d }fd}||t        |d      t        |d      |t        |d      t        |d      f}t        |||      }	|	d   }
|	d   }t        j                  k(  r|
| z  |z  S t	        |      t        |t        |d      z         z
  }t        j                  k(  r| |
|z  |z   z  |z  S t        j                  k(  r||
|z  z    |z  |z  S t        d      )Nc                     t        | d         S )Nr   )r   )valss    r7   cond_fnz_igamma_series.<locals>.cond_fn7  s    Q=rK   c                 2   | \  }}}}}}}|t        |d      z   }|||z  z  ||z  ||z  z  z
  }||z   }|||z  z  }||z   }
t        j                  k(  r0t        |||z  t	        j
                  	      j                  kD        }n8t        |t        ||z        t	        j
                  	      j                  kD        }|t        ||| d         t        ||| d         t        ||| d         t        ||| d         t        ||| d         t        ||| d         fS )Nr   r   r   r   r         )	r#   r   r   r   r*   r   r   r   r   )r   enabledrr   ansrM   dc_dadans_daconditionalr9   modes            r7   body_fnz_igamma_series.<locals>.body_fn:  s3   ,0)GQ35'	F1bMAQUOq1uQ//EoG	QUA
'CzS6<<3F3J3J)JKk #EGO 4U8K8O8O OQk
 Waa!Waa!Wc47#Waa!WeT!W%WgtAw' rK   r   r   r   r   zInvalid IgammaMode)
r   r)   r   r   r   rZ   r#   r   r   r   )axrM   r6   r   r9   r  r   r  	init_valsr   r  r  	dlogax_das       ``       r7   _igamma_seriesr  6  s    6 Q	!Q1a!Yq!_aO)
 
GWi	0$Q#G'	Z"H>!fwq6!Q</00)	Z"""y7*+a//z+++sY&'!+a//
)
**rK   c                "   t        t        |       t        |            }t        |t        |t	        d                  }t        | t        | d            }t        |t        |d            }t        t         t        |t        |d            t        | t        | d            t        ||      |g      }t        t        |t        |d            t        ||             }| t        |      z  |z
  t        |       z
  }	t        |	t        t        j                  |      j                               }
t        |	      }	t!        t        t         |||
|g            }t#        |t        | d      t%        |	|| t        ||      |t&        j(                        z
  t+        |	|| t        |t!        |            |t&        j(                              }t#        |t-        | d      |      }t#        |t-        | d      |      }t#        |t-        | t	        d            |      }|S )Nr   r   r   r   )r
   r(   r   r#   r   _reducer   r   r   r   r   rW   r*   r   maxr   r	   r   _igammac_continued_fractionr   r   r  r   )r6   rM   r9   r   x_is_infinityr   r   domain_erroruse_igammacr  	underflowr   outputs                r7   igamma_implr  i  s   fQi+&Qq%,/0-F1aL!)F1aL!)bF1aL&92a1;NP[\egpPqsy%z{,Bq&A,/Aq:+3q6zA~q	!"c&,,u-11223)
2w"
YiQ^,_`a'
1aL!"aK,M"')9)9;; 2q![+k2JK***,& )Yq!_f5&-1a&9&,	!U5\ :FC&	-rK   c                    t        j                  |      j                  d }fd}t        |d      |z
  }||z   t        |d      z   }	t        |d      }
t	        |d      }|}|t        |d      z   }|	|z  }||z  }t	        |d      }t	        |d      }t	        |d      }t	        |d      }| }|||z  z
  |z  }|||||	|
|||||||||f}t        |||      }|d   }t        j                  k(  r|| z  S |d   }t        |      t        |      z
  }t        j                  k(  r t        | t        t        ||      |            S t        j                  k(  r"t        t        |t        ||            |z        S t        d       )Nc                 X    | ^}}}}}}}t        |t        |d      k  t        |            S )Ni  )r   r#   r   )r   r   _ans_t_y_xr   _s           r7   r   z,_igammac_continued_fraction.<locals>.cond_fn  s2    '+$GT2r2q1q6!T?*DM::rK   c                    | \  }}}}}}}}}	}
}}}}}|t        |d      z   }|t        |d      z   }|t        |d      z   }||z  }||z  |	|z  z
  }||z  |
|z  z
  }t        |t        |d            }||z  }t        |t        t	        t        ||      |            t        |d            }t        |||      }||z  |z
  ||z  z
  |	|z  z   }||z  |z
  ||z  z
  |
|z  z   }t        |t	        |||z  z
  |      |      }t        |t        ||z
        t        |d            }|}	|}|}
|}|}|}|}|}t        t        |      t        t        |                  }t        |t        |	t        |	            |	      }	t        |t        |t        |            |      }t        |t        |
t        |
            |
      }
t        |t        |t        |            |      }t        |t        |t        |            |      }t        |t        |t        |            |      }t        |t        |t        |            |      }t        |t        |t        |            |      }t        j                  k(  rt        ||kD        }nt        ||t        |      kD        }|t        ||| d         t        ||| d         t        ||| d         t        ||| d         |t        ||| d         t        ||| d         t        ||	| d         t        ||
| d	         t        ||| d
         t        ||| d         t        ||| d         t        ||| d         t        ||| d         fS )Nr   r   r   r   r   r         	   
               )r#   r   r   r   r   r"   r   r   r   r   r   r   r   )r   r   r  tyzr   pkm1qkm1pkm2qkm2dpkm2_dadqkm2_dadpkm1_dadqkm1_dar  ycpkqkqk_is_nonzeror  dpk_dadqk_dadans_da_newgrad_conditionalrescaler  r   r  s                              r7   r  z,_igammac_continued_fraction.<locals>.body_fn  s   :>8Wc1aAtT48Xw	F1aLA	F1aLA	F1aLA	
QB	D2I	B	D2I	Br6"a=)M
RA}c#c#qk1"56	!QHA
3
'C\D 8b=04!8;F\D 8b=04!8;FFS6\,A2(FPKm!+"78'35 DDDDHHHHR*VB_56G'3tVD#%67>D'3tVD#%67>D'3tVD#%67>D'3tVD#%67>Dgs8VHc-BCXNHgs8VHc-BCXNHgs8VHc-BCXNHgs8VHc-BCXNHzS1k6"2C88:k 	d1g	&	DG	$	DG	$	DG	$	
	tAw	'	tAw	'	tAw	'	tAw	'	48	,	48	,	48	,	48	,	d2h	/1 1rK   r   r   r%  zInvalid mode: )r*   r   r   r#   r   r)   r   r   r   rZ   r   r   r   r   r   r   )r  rM   r6   r   r9   r  r   r  r'  r(  r   r+  r,  r)  r*  r  r&  r-  r.  r/  r0  r  r	  r   r
  r   s        `                   @r7   r  r    s   U#;@1D QlQ!!efQl!Ql!	1a$	
$	
VAq\	$	
Q$t#1o!q!_(q!_(q!_(R(h&$.'qQTTTT8Xw@) 
GWi	0$Q#	Z"9H'!f
")	Z"""r3s3	*G455z+++s7CY/01455
~dV,
--rK   c                   t        t        |       t        |            }t        | t        | d            }t        |t        |d            }t        |t        |t	        d                  }t        t         t        |t        |d            t        | t        | d            t        ||      |g      }t        t        |t        |d            t        ||             }| t        |      z  |z
  t        |       z
  }	t        |	t        t        j                  |      j                               }
t        t        t         ||
||g            }t        |	      }	t        |	|| t        ||      |t         j"                        }t%        |	|| t        |t        |            |t         j"                        }t'        |t        | d      |z
  |      }t'        t        ||      t)        |d      |      }t'        |t)        | t	        d            |      }|S )Nr   r   r   r   )r
   r(   r   r#   r   r  r   r   r   rW   r*   r   r  r	   r   r  r   r   r  r   r   )r6   rM   r9   r   r   r   r  r  
use_igammar  r  r   igamma_calligammac_cf_callr  s                  r7   igammac_implr>    s   fQi+&F1aL!)F1aL!)Qq%,/0-bF1aL&92a1;NP[\egpPqsy%z{,"Qq!-r!Qx8*3q6zA~q	!"c&,,u-11223)
\9mU^,_`a'
2w"r1aWj)I$j&6&68+/AqZ015*:J:JL/ *fQl[8/J&*]I6	&!8LfU&,	!U5\ :FC&	-rK   c                z   t        t        |       t        |            }t        |t        |d            }t        t	        |t        |d            t        | t        | d                  }t        t        |t        |d            t        ||             }| t        |      z  |z
  t        |       z
  }t	        |t        t        j                  |      j                               }t        |      }t        t        t        t        ||      |      |            }	t        |t!        ||| t        |	|      |t"        j$                         t'        ||| t        |	t        |            |t"        j$                              }
t        |t        |
d      |
      }
t        t        ||      t        | t)        d            |
      }
|
S Nr   r   r   )r
   r(   r   r   r   r   r   r   r   rW   r*   r   r  r   r	   r   r  r   r   r  r   r6   rM   r9   r   r   r  r  r  r  r   r  s              r7   igamma_grad_a_implrB    sv   fQi+&IaN#)Bq)Aq/2Bq)Aq/4JK,Bq)Aa.12a8<+3q6zA~q	!"c&,,u-11223)
2w"
:j/ )$+,24 5'+ Q;w+L!&
(=(=? ?2q![+k2JK*//12&
 )Yva0&9&*\62AuU|,f6&	-rK   c                   t        t        |       t        |            }t        |t        |d            }t        t	        |t        |d            t        | t        | d                  }t        t        |t        |d            t        ||             }| t        |      z  |z
  t        |       z
  }t	        |t        t        j                  | j                        j                               }t        |      }t        t        t        t        ||      |      |            }	t!        |t#        ||| t        |	|      |t$        j&                         t)        ||| t        |	t        |            |t$        j&                              }
t!        |t        |
d      |
      }
t!        t        ||      t        | t+        d            |
      }
|
S r@  )r
   r(   r   r   r   r   r   r   r   rW   r*   r   r9   r  r   r	   r   r  r   r   r  r   rA  s              r7   rk   rk     s~   fQi+&IaN#)Bq)Aa.12a1Q3HI,Bq)Aa.12a8<+3q6zA~q	!"c&,,qww/33445)
2w"
:j/($*+13 4'+ Q;w+L!&
(D(DF F2q![+k2JK).
0L0LNO&
 )Yva0&9&*\62AuU|,f6&	-rK   c                     t        | d      }t        | d      }t        | d      }|D ]  }|}|}| |z  |z
  t        | |      z   } d||z
  z  S )Nr         ?)r   )rM   coefficientsb0b1b2r   s         r7   evaluate_chebyshev_polynomialrJ  +  sd    1~"1~"1~" 'a	B	B	
R"yA	&B' 
RrK   c                 J   t        j                  g d      }t        j                  g d      }t        |       } t        | d      }t        | d      }t        | d      }t	        || z  |z
  |      }t        t	        || z  |z
  |      t        |             }t        | dk  ||      S )z
  Computes an approximation to the modified Bessel function of the first kind,
  zeroth order. The following implementation follows Cephes' F32 and F64
  implementation of i0e.
  )0K5dMv;p>"c쑾$>'doҾY(X?>ZY&+|t(?RBuZ?I ^qa?!N-Ί>?-4pKw?Wӿ*5N?)["d,->mրVX>na>+A>Rx?I墌k?	b?rE  r         @@       @r>   arrayr   r   rJ  r   r   r   rM   i0e_coeffs_ai0e_coeffs_bhalfr   
thirty_tworesult_le_8result_gt_8s           r7   _i0e_impl32rp  5  s     <
,  , 
!f!	1c	$!S#D!*-dQhnlK+1*q.32F2>@AEaJ+ 
S+{	33rK   c                 J   t        j                  g d      }t        j                  g d      }t        |       } t        | d      }t        | d      }t        | d      }t	        || z  |z
  |      }t        t	        || z  |z
  |      t        |             }t        | dk  ||      S )N)g4!\Tg}b3<gr넱g^<g"P
g'&&KF5=gbLag$ӛ/=gjzg<t̾=gVg4T&>rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  )gT`g0fFVg!<gA`<gҫ`g8箸g}<g攐*<gbe~g2hϙ]'gE_V=gsk[=g&GCi=gfCg{~5g%t9QgO $=guo >r^  r_  r`  ra  rb  rc  rd  rE  r   re  rf  rg  ri  s           r7   _i0e_impl64rr  X  s    >," !,  
!f!	1c	$!S#D!*-dQhnlK+1*q.32F2>@AEaJ+ 
S+{	33rK   c                 "   | j                   t        j                  k(  rt        |       S | j                   t        j                  k(  rt        |       S | j                   }| j                  t        j                        } t        t        |       |      S r3   )r9   r>   float64rr  r@   rp  r   r   )rM   x_dtypes     r7   bessel_i0e_implrv    sd    WW

q>ww"**q> ggG	AA88rK   regularized_incomplete_betaF)multiple_resultsrW   c                 ,    t        | t        |            S r3   )r   rZ   r   rM   s     r7   <lambda>r{    s    Q
!3 rK   rZ   c           	      B    t        | t        t        |d      |            S r   )r   r_   r#   rz  s     r7   r{  r{    s    #a6!Q<)C"D rK   r_   rc   ri   rf   rp   rs   c                 <    | t        |      t        |      |z  z
  z  S r3   )rw   r   )r   r'  rM   s      r7   r{  r{    s    jmd1gk.I)J rK   rw   c                     t        j                  t        |            j                  }t	        |      |kD  }t        ||t        ||            }t        |      |t        |      t        |      z   z  z
  }t        ||t        |d            }| |z  S )NrE  )
r*   r   r$   r   r   r   r   rs   r   r   )r   r'  rM   r   x_is_not_tinysafe_xdy_dxs          r7   _bessel_i1e_jvpr    s}    VAY###a&3,--Ia$56&
V
qDL:f3E$EF
F%
yC'8
9%	
UrK   rz   c                     t        t        |dt        j                  t        j                        z        t        | t        t        t        |                              S Nr   r   r#   r>   r   pir   r   r   rz  s     r7   r{  r{    s<    c&B,?"@"%aS^)<"=? rK   r}   c                     t        t        |dt        j                  t        j                        z        t        | t        t        t        |                              S )Ng       r  rz  s     r7   r{  r{    s=    s6!S277255>-A#B#&q#c&)n*=#> @ rK   r   c                     t        t        |t        j                  t        j                        dz        t        | t        t        |                        S r  )r   r#   r>   r   r  r   r   )r   r  rM   s      r7   r{  r{    s9    F1bggbeenr6I,J,/3vc{3C,D)F rK   )p__doc__enumr   numpyr>   	functoolsr   r   r  jax._srcr   jax._src.lax.laxr   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(   jax._src.lax.control_flow.loopsr)   r*   jax._src.interpretersr+   r,   jax._src.lib.mlir.dialectsr-   jax._src.typingr.   r/   rJ   rS   rW   rZ   r_   rc   rf   ri   rl   rp   rs   rw   rz   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r>  rB  rk   rJ  rp  rr  rv  rQ   register_lowering	lower_fundefjvprU   rY   r^   ra   rh   re   ro   rr   defjvp2rv   r  ry   r|   r   rI   rK   r7   <module>r     s  
   0 F F F F F F F F F F 7  $ & + ,$5y 5Y 59 5 5
i E y U    y  U  
i I % 
y Y 5 
$Y $9 $ $
 3 3y 3u 3 3
I )  
)  )  9  I % 
y U N;!  L00fWr 
;U ;u ;1+f4g.R,(*!4F+4Z
9 !0VV;!=    4$.."#CD"')* 
		
'
 * 			(3 4   x$++!F G&),	   y'/4<<"H I 			)D Evv.<   {GOT^^$L M 			+ 8FF+X6   x0A+0NAF"H I "66"2OD   %t~~&78J&K7<>? 
		(L, /VV,i8	   y%t~~&7&E7<>? 
		)]M 2	&&)6	2   vw		B CV\2   |%t~~o7<>? 

<J KV\2   |AC 

< )fe$ 			% ? @   ugotxx@ A	vv	& 			& @ A   vw		B C&),	 


9 F G   y'/4<<"H IrK   