U
    »mœdR2  ã                   @   sð   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 zLd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 W n ek
r¤   Y nX d	d
„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Z dd„ Z!e"dkrìe!ƒ  dS )z¨Precompute 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                  C   s`  d} t dƒ\}}}}g }g }g }t|| t|ƒ t|| | ƒ |dtjfƒ}t|ƒt |¡ | }td| d ƒD ]„}	| 	||	¡ 
|d¡ ¡  ¡ }
|
 
td|ƒd¡ tdd„ ¡}|d|	 9 }| ||	 t|	ƒ ¡ | t|ƒ¡ | t|
|  ¡ ƒ¡ qrd}|d	7 }td
ddg|||gƒD ]@\}}tt|ƒƒD ](}|d|› d|› d�t|| ƒ 7 }�q.�q|S )zATylor series expansion of Phi(a, b, x) in a=0 up to order 5.
    é   úa b x kr   é   c                  W   s   dS ©Nr   © ©Úargsr   r   ú`/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/scipy/special/_precompute/wright_bessel.pyÚ<lambda>&   ó    z series_small_a.<locals>.<lambda>éÿÿÿÿ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Úir   r   r   Úseries_small_a   s.    . ÿ*r?   c                 C   sB   t dƒ}d|  t t d| t|ƒ | |d   |d|d f¡ S )z„Symbolic 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
    r6   r   r   é   )r   r   r&   Z	summationr   )Úzr8   r6   r   r   r   Ú	dg_series7   s    
,ÿrB   c                 C   s   t  t|||  ƒ|| ¡S )z8Symbolic expansion of polygamma(k, z) in z=0 to order n.)r&   r)   rB   )r6   rA   r8   r   r   r   Ú	pg_seriesA   s    rC   c                     sz  d‰t dƒ\} ‰}}t dƒ\}}}t|t|tdƒ|i}g }g }g }	g ‰ tˆƒt |¡ t|| t|ƒ t| | ˆ ƒ |dt	j
fƒ }
tdˆd ƒD ]Þ‰|
 | ˆ¡ | d¡ ¡  ¡ }| tdˆƒd¡ tdd„ ¡}|d	ˆ 9 }|| tˆƒ }ˆdk�rD| t‡‡fd
d„¡}|jˆdˆd ˆ d� ¡  tddƒdtdƒ ¡ ¡ }| | ˆ tˆƒ ¡ | t|ƒ¡ |	 |¡ q”t |	d  |¡ˆ¡ ¡ ‰ ˆ  ¡  ttˆ ƒƒD ]}ˆ | t|ƒ  ¡ ˆ |< �q¢d}|d7 }|d7 }|d7 }|d7 }|d7 }|d7 }tddg||gƒD ]D\}}tt|ƒƒD ],}|d|› d|› d�7 }|t|| ƒ7 }�q�qttˆ ƒƒD ]b}|d|› d�7 }|tˆ | ƒ7 }|d|› d�7 }|tˆ |  |t|t|tdƒi¡ d¡ƒ7 }�qZ|d7 }|d7 }|d7 }t‡ ‡fd d!„tˆd ƒD ƒƒ}||	d  |¡  ¡ }|d"|t	dƒk› �7 }|d#7 }t‡ ‡fd$d!„tˆd ƒD ƒƒ}||	d  |¡  ¡ }|d"|t	dƒk› �7 }|S )%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                  W   s   dS r   r   r   r   r   r   r   e   r   z(series_small_a_small_b.<locals>.<lambda>r   c                    s   t | |ˆd ˆ  ƒS )Nr   )rC   )r6   r5   )r8   r2   r   r   r   m   r   )r8   r@   éþÿÿÿ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] allone.z:
Test B[2] == C[1] + b*C[2] + b^2/2*C[3] + b^3/6*C[4] + ..c                    s(   g | ] }ˆ| t |ƒ ˆ |d    ‘qS )r   ©r   ©Ú.0r6   ©ÚCr4   r   r   Ú
<listcomp>•   s     z*series_small_a_small_b.<locals>.<listcomp>z
test successful = z-
Test B[3] == C[2] + b*C[3] + b^2/2*C[4] + ..c                    s(   g | ] }ˆ| t |ƒ ˆ |d    ‘qS )r@   rG   rH   rJ   r   r   rL   ™   s     )r   r   r   r   r   r&   r'   r   r   r
   r%   r(   r)   r*   r+   r,   r   r-   ZseriesZremoveOr.   r   ÚPolyÚcoeffsÚreverser0   r/   r1   ZevalfÚsum)r3   r5   r6   ZM_PIZM_EGZM_Z3Zc_subsr   r    r!   r7   r9   r:   Zpg_partr>   r;   r<   r=   Útestr   )rK   r4   r8   r2   r   Úseries_small_a_small_bF   s~    ,ÿ ÿ
ÿ 
þ"ÿ  rR   c               	      s   d} G ‡ fdd„dt jƒ‰ G ‡ fdd„dt jƒ}tdƒ\}}}|d||ƒ}d}|d	7 }|d
7 }|d7 }|d7 }|d7 }|d7 }|d7 }td| d ƒD ]¤}||||ƒ|d| |    ¡ }dd„ t  |¡ ¡ D ƒ}	t  |	¡}	||	  ¡  |t j	¡}| 
|d |i¡}|d|› d|	› d|› d�7 }|d|› dt|ƒ› d�7 }q”ddl}
|
 d¡}| d|¡}|
 d¡}| d|¡}| dd¡}| d d!¡}|
 d"¡}| d#|¡}|S )$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                       s$   e Zd ZdZdZe‡ fdd„ƒZdS )zasymptotic_series.<locals>.gzÈHelper 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.
        rD   c                    sr   |dkst dƒ‚n\|dkrdS ˆ |d ||ƒtt|d | ƒt|d ƒ ƒttd| ƒtdƒ ƒ ||   S d S )Nr   zmust have n >= 0r   r@   rD   )Ú
ValueErrorr   r   )Úclsr8   ÚrhoÚv©Úgr   r   Úeval¶   s    
ÿÿÿz!asymptotic_series.<locals>.g.evalN©Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚnargsÚclassmethodrZ   r   rX   r   r   rY   ­   s   rY   c                       s$   e Zd ZdZdZe‡ fdd„ƒZdS )z!asymptotic_series.<locals>.coef_CzßCalculate 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)
        rD   c                    s¦   |dkst dƒ‚tdƒ}d| |  ˆ d| ||ƒ| tddƒ   }| |d| ¡ |d¡td| ƒ }|t|tddƒ ƒdt  d|d  |tddƒ    }|S )Nr   zmust have m >= 0rW   r   r@   )rT   r   r	   r)   r*   r   r   r   )rU   ÚmrV   ÚbetarW   r7   ÚresrX   r   r   rZ   Ê   s    .$ÿz&asymptotic_series.<locals>.coef_C.evalNr[   r   rX   r   r   Úcoef_CÁ   s   re   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   c                 S   s   g | ]}|  ¡ ‘qS r   )Údenominator©rI   r5   r   r   r   rL   ä   s     z%asymptotic_series.<locals>.<listcomp>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]Úxar3   z	(\d{10,})z\1.)r&   ÚFunctionr   r(   r+   rM   rN   ZlcmZcollectÚfactorZxreplacer1   ÚreÚcompileÚsubr-   )r2   re   ri   r4   rh   ZC0r;   r>   Úexprrk   rl   Zre_aZre_bZ	re_digitsr   rX   r   Úasymptotic_seriesŸ   s>     



rp   c                     sF  dd„ ‰d0‡fdd„	‰ ddd	d
ddddddg
‰dddddg‰dddddddddddddg‰t  ˆˆˆ¡\‰‰‰ˆ ¡ ˆ ¡ ˆ ¡   ‰‰‰g } tˆjƒD ]0‰|  t‡ ‡‡‡‡fdd„ddd did!�j¡ q˜t  | ¡} ˆˆˆ| d"œ}d#d$„ }t	t
|||d% d&d'�d ƒ}d(}|d)7 }|d*7 }|d+7 }|d,7 }|d- d.d/„ |D ƒ¡7 }|S )1aÝ  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                 S   sB   t  d|  | ¡}| t  |¡ || | t  || ¡  d | S )zDerivative of f w.r.t. phi.g      ð?r   )ÚnpÚpowerÚcos)Úepsr3   r4   r5   ÚphiZeps_ar   r   r   Úfp  s    z$optimal_epsilon_integral.<locals>.fpç{®Gáz„?éd   c                    s(   t ‡ ‡‡‡‡fdd„dtj|dd�d S )z—Compute Arc length of f.

        Note that the arg length of a function f fro t0 to t1 is given by
            int_t0^t1 sqrt(1 + f'(t)^2) dt
        c              	      s   t  dˆˆˆ ˆˆ| ƒd  ¡S )Nr   r@   )rq   Úsqrt)ru   )r3   r4   rt   rv   r5   r   r   r     r   z=optimal_epsilon_integral.<locals>.arclength.<locals>.<lambda>r   rx   )ÚepsrelÚlimit)r   rq   r   )rt   r3   r4   r5   rz   r{   )rv   )r3   r4   rt   r5   r   Ú	arclength	  s      þþz+optimal_epsilon_integral.<locals>.arclengthçü©ñÒMbP?gš™™™™™¹?g      à?gÍÌÌÌÌÌì?r   r@   é   r   é   rS   r   é   é
   g      ø?é   é2   éÈ   iô  g     @�@g     ˆ³@g     ˆÃ@c                    s   ˆ | ˆˆ ˆˆ ˆˆ ƒS ©Nr   )rt   )r|   Údata_aÚdata_bÚdata_xr>   r   r   r     s   ÿz*optimal_epsilon_integral.<locals>.<lambda>)r}   iè  ZBoundedZxatol)ZboundsÚmethodÚoptions)r3   r4   r5   rt   c           
   
   S   sx   | d }| d }| d }	|| t  d| ¡ t  |dd|  t  |	¡  |t  | | ¡  |dt  || ¡   ¡ S )z#Compute parametric function to fit.r3   r4   r5   g      à¿r   )rq   r'   Úlog)
ÚdataZA0ÚA1ÚA2ZA3ZA4ZA5r3   r4   r5   r   r   r   Úfunc*  s    0ÿÿz&optimal_epsilon_integral.<locals>.funcrt   Ztrf)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, c                 S   s   g | ]}d   |¡‘qS )z{:.5g})Úformatrg   r   r   r   rL   :  s     z,optimal_epsilon_integral.<locals>.<listcomp>)rw   rx   )rq   ZmeshgridÚflattenr(   Úsizer.   r   r5   ÚarrayÚlistr   Újoin)Zbest_epsZdfr�   Zfunc_paramsr;   r   )r|   r†   r‡   rˆ   rv   r>   r   Úoptimal_epsilon_integralø   sB    ÿ
 ýÿ
ý	r–   c                  C   s‚   t ƒ } tttd�}|jdtddddgdd� | ¡ }d	d
„ dd
„ dd
„ dd
„ dœ}| |jdd
„ ¡ƒ  t	d 
t ƒ |  d ¡ƒ d S )N)ÚdescriptionÚformatter_classÚactionr   r@   rD   r~   zÒchose 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                   S   s
   t tƒ ƒS r…   )Úprintr?   r   r   r   r   r   L  r   zmain.<locals>.<lambda>c                   S   s
   t tƒ ƒS r…   )r�   rR   r   r   r   r   r   M  r   c                   S   s
   t tƒ ƒS r…   )r�   rp   r   r   r   r   r   N  r   c                   S   s
   t tƒ ƒS r…   )r�   r–   r   r   r   r   r   O  r   )r   r@   rD   r~   c                   S   s   t dƒS )NzInvalid input.)r�   r   r   r   r   r   Q  r   z
{:.1f} minutes elapsed.
é<   )r   r   r_   r   Úadd_argumentÚintÚ
parse_argsÚgetr™   r�   r�   )Út0Úparserr   Úswitchr   r   r   Úmain>  s    ÿÿýr¦   Ú__main__)#r_   Úargparser   r   Únumpyrq   Zscipy.integrater   Zscipy.optimizer   r   r   r&   r   r	   r
   r   r   r   r   r   r   r   r   Zsympy.polys.polyfuncsr   ÚImportErrorr?   rB   rC   rR   rp   r–   r¦   r\   r   r   r   r   Ú<module>   s(   4"
YYF