
    tKgD2                         d Z ddlmZmZ ddlZddlmZ ddlm	Z	m
Z
 ddlmZ 	 ddl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 ddlmZ d	 Zd
 Zd Zd Zd Zd Z d Z!e"dk(  r e!        yy# e$ r Y *w xY w)zPrecompute coefficients of several series expansions
of Wright's generalized Bessel function Phi(a, b, x).

See https://dlmf.nist.gov/10.46.E1 with rho=a, beta=b, z=x.
    )ArgumentParserRawTextHelpFormatterN)quad)minimize_scalar	curve_fit)time)
EulerGammaRationalSSum	factorialgamma	gammasimppi	polygammasymbolszeta)hornerc                     d} t        d      \  }}}}g }g }g }t        ||z  t        |      z  t        ||z  |z         z  |dt        j
                  f      }t        |      t        j                  |      z  |z  }t        d| dz         D ]  }	|j                  ||	      j                  |d      j                         j                         }
|
j                  t        d|      d      j                  t        d       }|d|	z  z  }|j                  ||	z  t        |	      z         |j                  t!        |             |j                  t!        |
|z  j                                       d}|dz  }t#        g d	|||g      D ]9  \  }}t        t%        |            D ]  }|d
| d| dt'        ||         z   z  } ; |S )zATylor series expansion of Phi(a, b, x) in a=0 up to order 5.
       a b x kr      c                       yNr    argss    k/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/scipy/special/_precompute/wright_bessel.py<lambda>z series_small_a.<locals>.<lambda>&       A    z=Tylor series expansion of Phi(a, b, x) in a=0 up to order 5.
zAPhi(a, b, x) = exp(x)/gamma(b) * sum(A[i] * X[i] * B[i], i=0..5)
)AXB
[] = )r   r   r   r   r   Infinitysympyexprangediffsubssimplifydoitr   replaceappendr   ziplenstr)orderabxkr#   r$   r%   
expressionntermx_partsnamecis                   r   series_small_arC      s    E#JAq!Q
A
A
AQT)A,&uQqSU|3aAJJ5GHJq%))A,&3J 1eAgq!$))!Q/88:??A))IaOQ/79o6 	 	2'	Ail"#	 	f..012  	IA	MMAAq	2as1vA2dV1QCt$s1Q4y00A  3 Hr!   c                     t        d      }d| z  t        z
  t        j                  d|z  t	        |      z  | |dz
  z  z  |d|dz   f      z   S )zSymbolic expansion of digamma(z) in z=0 to order n.

    See https://dlmf.nist.gov/5.7.E4 and with https://dlmf.nist.gov/5.5.E2
    r:   r"   r      )r   r	   r*   	summationr   )zr<   r:   s      r   	dg_seriesrH   7   sW    
 	Aa4*a$q')A!H4q!QqSkBC Cr!   c                 J    t        j                  t        ||| z         ||       S )z8Symbolic expansion of polygamma(k, z) in z=0 to order n.)r*   r-   rH   )r:   rG   r<   s      r   	pg_seriesrJ   A   s     ::i1Q3'A..r!   c                  	   dt        d      \  } }}}t        d      \  }}}t        |t        |t        d      |i}g }g }	g }
g }t	        |      t        j                  |      z  t        ||z  t        |      z  t	        | |z  |z         z  |dt        j                  f      z  }t        ddz         D ]Q  |j                  |       j                  | d      j                         j                         }|j                  t!        d|      d      j#                  t         d       }|dz  z  }||z  t	        |      z  }dk\  rv|j#                  t         fd	      }|j%                  |ddz   z
  
      j'                         j                  t!        dd      dt        d      z        j                         }|j)                  | z  t              z         |	j)                  t+        |             |
j)                  |       T t        j,                  |
d   j                  |      |      j/                         }|j1                          t        t3        |            D ]$  }||   t        |      z  j                         ||<   & d}|dz  }|dz  }|dz  }|dz  }|dz  }|dz  }t5        ddg||	g      D ];  \  }}t        t3        |            D ]  }|d| d| dz  }|t7        ||         z  }! = t        t3        |            D ]k  }|d| dz  }|t7        ||         z  }|d| dz  }|t7        ||   j                  |t        |t        |t        d      i      j9                  d            z  }m |dz  }|dz  }|dz  }t;        t        dz
        D cg c]  }||z  t        |      z  ||dz      z   c}      }||
d   j                  |      z
  j                         }|d|t        d      k(   z  }|d z  }t;        t        dz
        D cg c]  }||z  t        |      z  ||dz      z   c}      }||
d   j                  |      z
  j                         }|d|t        d      k(   z  }|S c c}w c c}w )!a  Tylor series expansion of Phi(a, b, x) in a=0 and b=0 up to order 5.

    Be aware of cancellation of poles in b=0 of digamma(b)/Gamma(b) and
    polygamma functions.

    digamma(b)/Gamma(b) = -1 - 2*M_EG*b + O(b^2)
    digamma(b)^2/Gamma(b) = 1/b + 3*M_EG + b*(-5/12*PI^2+7/2*M_EG^2) + O(b^2)
    polygamma(1, b)/Gamma(b) = 1/b + M_EG + b*(1/12*PI^2 + 1/2*M_EG^2) + O(b^2)
    and so on.
    r   r   zM_PI M_EG M_Z3   r   r   c                       yr   r   r   s    r   r   z(series_small_a_small_b.<locals>.<lambda>e   r    r!   r"   c                 *    t        | |dz   z         S )Nr   )rJ   )r:   r9   r<   r6   s     r   r   z(series_small_a_small_b.<locals>.<lambda>m   s    9Q57193Mr!   )r<   rE   zDTylor series expansion of Phi(a, b, x) in a=0 and b=0 up to order 5.z9
Phi(a, b, x) = exp(x) * sum(A[i] * X[i] * B[i], i=0..5)
z	B[0] = 1
z&B[i] = sum(C[k+i-1] * b**k/k!, k=0..)
z

M_PI = piz
M_EG = EulerGammaz
M_Z3 = zeta(3)r#   r$   r&   r'   r(   z
# C[z
C[   z/

Test if B[i] does have the assumed structure.z"
C[i] are derived from B[1] alone.z:
Test B[2] == C[1] + b*C[2] + b^2/2*C[3] + b^3/6*C[4] + ..z
test successful = z-
Test B[3] == C[2] + b*C[3] + b^2/2*C[4] + ..)r   r   r	   r   r   r*   r+   r   r   r   r)   r,   r-   r.   r/   r0   r   r1   seriesremoveOr2   r   Polycoeffsreverser4   r3   r5   evalfsum)r7   r8   r9   r:   M_PIM_EGM_Z3c_subsr#   r$   r%   Cr;   r=   r>   pg_partrB   r?   r@   rA   testr<   r6   s                        @@r   series_small_a_small_br_   F   s    E#JAq!Q/0D$$
D$q'48F
A
A
A
A
 q%))A,&AqD1eAaCEl*Q1::,>?@J 1eAgq!$))!Q/88:??A))IaOQ/79o6 	 	2'v+eAh&6ooi&MOG~~aeAgai~8	Yq!_baj9 
  	
Ail"#	 	+ 0 	

1Q499V$a(//1AIIK3q6]!y|#--/!  	OA	FFAA	22AA	A	ASzAq6*as1vA2dV1QCt$$AQqTNA  +
 3q6]	vaS	S1Y	tA3d^	S1D*dBd1gFG%) 		  	<<A	..A	FFAE%'NCNq1Yq\!AacF*NCDD1Q499V$$..0Dad
|	,,A	99AE%'NCNq1Yq\!AacF*NCDD1Q499V$$..0Dad
|	,,AH D Ds   !Q<!Rc            	         d}  G fddt         j                         G fddt         j                        }t        d      \  }}} |d||      }d}|d	z  }|d
z  }|dz  }|dz  }|dz  }|dz  }|dz  }t        d| dz         D ]  } ||||      |d|z   |z  z  z  j	                         }t        j
                  |      j                         D 	cg c]  }	|	j                          }
}	t        j                  |
      }
||
z  j	                         j                  |t         j                        }|j                  |dz   |i      }|d| d|
 d| dz  }|d| dt        |       dz  } ddl}|j                  d      }|j                  d|      }|j                  d      }|j                  d|      }|j!                  dd      }|j!                  dd      }|j                  d       }|j                  d!|      }|S c c}	w )"a  Asymptotic expansion for large x.

    Phi(a, b, x) ~ Z^(1/2-b) * exp((1+a)/a * Z) * sum_k (-1)^k * C_k / Z^k
    Z = (a*x)^(1/(1+a))

    Wright (1935) lists the coefficients C_0 and C_1 (he calls them a_0 and
    a_1). With slightly different notation, Paris (2017) lists coefficients
    c_k up to order k=3.
    Paris (2017) uses ZP = (1+a)/a * Z  (ZP = Z of Paris) and
    C_k = C_0 * (-a/(1+a))^k * c_k
       c                   *    e Zd ZdZdZe fd       Zy)asymptotic_series.<locals>.gzHelper function g according to Wright (1935)

        g(n, rho, v) = (1 + (rho+2)/3 * v + (rho+2)*(rho+3)/(2*3) * v^2 + ...)

        Note: Wright (1935) uses square root of above definition.
        rL   c                     |dk\  st        d      |dk(  ry |dz
  ||      t        t        |dz   |z         t        |dz         z        t        t        d|z         t        d      z        z  ||z  z  z   S )Nr   zmust have n >= 0r   rE   rL   )
ValueErrorr   r   )clsr<   rhovgs       r   evalz!asymptotic_series.<locals>.g.eval   s    6 !344a1c1~c!eAguSU| ;<ac
58 34556T:: :r!   N__name__
__module____qualname____doc__nargsclassmethodrj   ri   s   r   ri   rc      s!    	 		: 
	:r!   ri   c                   *    e Zd ZdZdZe fd       Zy)!asymptotic_series.<locals>.coef_CzCalculate coefficients C_m for integer m.

        C_m is the coefficient of v^(2*m) in the Taylor expansion in v=0 of
        Gamma(m+1/2)/(2*pi) * (2/(rho+1))^(m+1/2) * (1-v)^(-b)
            * g(rho, v)^(-m-1/2)
        rL   c                 r   |dk\  st        d      t        d      }d|z
  | z   d|z  ||      | t        dd      z
  z  z  }|j                  |d|z        j	                  |d      t        d|z        z  }|t        |t        dd      z         dt        z  z  d|dz   z  |t        dd      z   z  z  z  }|S )Nr   zmust have m >= 0rh   r   rE   )re   r   r
   r-   r.   r   r   r   )rf   mrg   betarh   r;   resri   s          r   rj   z&asymptotic_series.<locals>.coef_C.eval   s    6 !344AA#$!AaCa.A2hq!n;L*MMJ//!QqS)..q!4y1~ECq8Aq>12ad;s1uIXa^);<= >CJr!   Nrk   rr   s   r   coef_Crt      s!    	 			 
		r!   ry   z	xa b xap1r   z!Asymptotic expansion for large x
z.Phi(a, b, x) = Z**(1/2-b) * exp((1+a)/a * Z) 
z3               * sum((-1)**k * C[k]/Z**k, k=0..6)

zZ      = pow(a * x, 1/(1+a))
zA[k]   = pow(a, k)
zB[k]   = pow(b, k)
zAp1[k] = pow(1+a, k)

z#C[0] = 1./sqrt(2. * M_PI * Ap1[1])
r   zC[z] = C[0] / (z * Ap1[z])
z] *= z

Nzxa\*\*(\d+)zA[\1]z
b\*\*(\d+)zB[\1]xap1zAp1[1]xar7   z	(\d{10,})z\1.)r*   Functionr   r,   r/   rS   rT   denominatorlcmcollectfactorxreplacer5   recompilesubr1   )r6   ry   r{   r8   rz   C0r?   rB   exprr9   r   r   re_are_b	re_digitsri   s                  @r   asymptotic_seriesr      s    E:ENN :( , +&KB4	2q	B,A	::A	@@A	))A	A	A	##A	//A1eAgq"a B"qyL1;;=+0::d+;+B+B+DE+Da!--/+DE6"v'')11!U\\B}}bdD\*	r!Ls$77	r!E#d)D))  ::n%D1A::m$D1A			&(#A			$A 

<(Ifa AH# Fs   Hc            
      f  	
 d 
d
fd	g dg dg d	t        j                  	      \  	j                         j                         	j                         c	g } t        	j                        D ]3  | j                  t        	fdddd	d
i      j                         5 t        j                  |       } 	| d}d }t        t        |||d   d      d         }d}|dz  }|dz  }|dz  }|dz  }|dj                  |D cg c]  }|d c}      z  }|S c c}w )a  Fit optimal choice of epsilon for integral representation.

    The integrand of
        int_0^pi P(eps, a, b, x, phi) * dphi
    can exhibit oscillatory behaviour. It stems from the cosine of P and can be
    minimized by minimizing the arc length of the argument
        f(phi) = eps * sin(phi) - x * eps^(-a) * sin(a * phi) + (1 - b) * phi
    of cos(f(phi)).
    We minimize the arc length in eps for a grid of values (a, b, x) and fit a
    parametric function to it.
    c                     t        j                  d| z  |       }| t        j                  |      z  ||z  |z  t        j                  ||z        z  z
  dz   |z
  S )zDerivative of f w.r.t. phi.g      ?r   )nppowercos)epsr7   r8   r9   phieps_as         r   fpz$optimal_epsilon_integral.<locals>.fp  sS    cA2&RVVC[ 1q55=266!c'?#BBQFJJr!   c                 \     t         fddt        j                  |d      d   S )zCompute Arc length of f.

        Note that the arc length of a function f from t0 to t1 is given by
            int_t0^t1 sqrt(1 + f'(t)^2) dt
        c           
      N    t        j                  d |       dz  z         S )Nr   rE   )r   sqrt)r   r7   r8   r   r   r9   s    r   r   z=optimal_epsilon_integral.<locals>.arclength.<locals>.<lambda>  s%    BsAq!S,A1,D(D Er!   r   d   )epsrellimit)r   r   r   )r   r7   r8   r9   r   r   r   s   ````  r   	arclengthz+optimal_epsilon_integral.<locals>.arclength	  s+     Eruu!../1 	1r!   )
MbP?g?g      ?g?r   rE      r      ra   )r   r   r      
   )r   g      ?rE   r   r      2   r      i  g     @@g     @g     @c                 ,     |                S Nr   )r   r   data_adata_bdata_xrB   s    r   r   z*optimal_epsilon_integral.<locals>.<lambda>  s    	#vay&)28))=r!   )r   i  Boundedxatolr   )boundsmethodoptions)r7   r8   r9   r   c           
      >   | d   }| d   }| d   }	||z  t        j                  d|z        z  t        j                  |dd|z   z  t        j                  |	      z  z   |t        j                  | |z        z  z
  |dt        j                  ||z        z   z  z         z   S )z#Compute parametric function to fit.r7   r8   r9   g      r   )r   r+   log)
dataA0A1A2A3A4A5r7   r8   r9   s
             r   funcz&optimal_epsilon_integral.<locals>.func*  s    IIIQq))&&a1q5kBFF1I55RVVRC!G_8LLRVVBF^!345 66 	7r!   r   trf)r   r   z7Fit optimal eps for integrand P via minimal arc length
zwith parametric function:
zBoptimal_eps = (A0 * b * exp(-a/2) + exp(A1 + 1 / (1 + a) * log(x)
z=              - A2 * exp(-A3 * a) + A4 / (1 + exp(A5 * a)))

z Fitted parameters A0 to A5 are:
z, z.5g)g{Gz?r   )r   meshgridflattenr,   sizer2   r   r9   arraylistr   join)best_epsdfr   func_paramsr?   r9   r   r   r   r   r   rB   s         @@@@@@r   optimal_epsilon_integralr      sR   K
1 5FFEF[[@FFF$nn.0@$nn. FFFH6;; =#/#,woG HIq		
   xx!H
B7 yr2e9UCAFGKBA	&&A	NNA	JJA	,,A41qgJ4	55AH 5s   D.
c                  .   t               } t        t        t              }|j	                  dt
        g dd       |j                         }d d d d	 d} |j                  |j                  d
               t        dt               | z
  dz  dd       y )N)descriptionformatter_classaction)r   rE   rL   r   zchose what expansion to precompute
1 : Series for small a
2 : Series for small a and small b
3 : Asymptotic series for large x
    This may take some time (>4h).
4 : Fit optimal eps for integral representation.)typechoiceshelpc                  (    t        t                     S r   )printrC   r   r!   r   r   zmain.<locals>.<lambda>L  s    ~/0r!   c                  (    t        t                     S r   )r   r_   r   r!   r   r   zmain.<locals>.<lambda>M  s    578r!   c                  (    t        t                     S r   )r   r   r   r!   r   r   zmain.<locals>.<lambda>N  s    023r!   c                  (    t        t                     S r   )r   r   r   r!   r   r   zmain.<locals>.<lambda>O  s    79:r!   c                      t        d      S )NzInvalid input.)r   r   r!   r   r   zmain.<locals>.<lambda>Q  s
    E*:$;r!   r&   <   z.1fz minutes elapsed.
)
r   r   ro   r   add_argumentint
parse_argsgetr   r   )t0parserr   switchs       r   mainr   >  s    	B,@BF
sLP   D083:F
 =FJJt{{;<>	BR$$7
89r!   __main__)#ro   argparser   r   numpyr   scipy.integrater   scipy.optimizer   r   r   r*   r	   r
   r   r   r   r   r   r   r   r   r   sympy.polys.polyfuncsr   ImportErrorrC   rH   rJ   r_   r   r   r   rl   r   r!   r   <module>r      s   
 :    5 	B B B B,
DC/
VrVrCL:. zF I
  		s   $A+ +A32A3