o
    Ö­jD2  ã                   @   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 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 W n	 eyQ   Y nw d	d
„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Z dd„ Z!e"dkrwe!ƒ  dS 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   sZ  d} t dƒ\}}}}g }g }g }t|| t|ƒ t|| | ƒ |dtjfƒ}t|ƒt |¡ | }td| d ƒD ]B}	| 	||	¡ 
|d¡ ¡  ¡ }
|
 
td|ƒd¡ tdd„ ¡}|d|	 9 }| ||	 t|	ƒ ¡ | t|ƒ¡ | t|
|  ¡ ƒ¡ q9d}|d	7 }tg d
¢|||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   ó   dS ©Nr   © ©Úargsr   r   úd/var/www/html/CropPilot/venv/lib/python3.10/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
    r7   r   r   é   )r   r   r'   Ú	summationr   )Úzr9   r7   r   r   r   Ú	dg_series7   s   
,ÿrD   c                 C   s   t  t|||  ƒ|| ¡S )z8Symbolic expansion of polygamma(k, z) in z=0 to order n.)r'   r*   rD   )r7   rC   r9   r   r   r   Ú	pg_seriesA   s   rE   c                     sv  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 ]n‰|
 | ˆ¡ | d¡ ¡  ¡ }| tdˆƒd¡ tdd„ ¡}|d	ˆ 9 }|| tˆƒ }ˆdkr¡| t‡‡fd
d„¡}|jˆdˆd ˆ d� ¡  tddƒdtdƒ ¡ ¡ }| | ˆ tˆƒ ¡ | t|ƒ¡ |	 |¡ qJt |	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 ]"\}}tt|ƒƒD ]}|d|› d|› d�7 }|t|| ƒ7 }�q�qttˆ ƒƒD ]1}|d|› d�7 }|tˆ | ƒ7 }|d|› d�7 }|tˆ |  |t|t|tdƒi¡ d¡ƒ7 }�q+|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   r   r   r   r   r   r   r   r   e   r   z(series_small_a_small_b.<locals>.<lambda>r   c                    s   t | |ˆd ˆ  ƒS )Nr   )rE   )r7   r6   )r9   r3   r   r   r   m   ó    )r9   rA   éþÿÿÿ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] + ..c                    ó(   g | ]}ˆ| t |ƒ ˆ |d    ‘qS )r   ©r   ©Ú.0r7   ©ÚCr5   r   r   Ú
<listcomp>•   ó   ( 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                    rJ   )rA   rK   rL   rN   r   r   rP   ™   rQ   )r   r   r   r   r   r'   r(   r   r   r
   r&   r)   r*   r+   r,   r-   r   r.   ÚseriesÚremoveOr/   r   ÚPolyÚcoeffsÚreverser1   r0   r2   ÚevalfÚsum)r4   r6   r7   ÚM_PIÚM_EGÚM_Z3Úc_subsr    r!   r"   r8   r:   r;   Úpg_partr?   r<   r=   r>   Útestr   )rO   r5   r9   r3   r   Úseries_small_a_small_bF   s€   ,ÿÿÿýþ 
ÿ  r_   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 ]R}||||ƒ|d| |    ¡ }dd„ t  |¡ ¡ D ƒ}	t  |	¡}	||	  ¡  |t j	¡}| 
|d |i¡}|d|› d|	› d|› d�7 }|d|› dt|ƒ› d�7 }qJd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                       ó$   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.
        rF   c                    sl   |dkst dƒ‚|dkrdS ˆ |d ||ƒtt|d | ƒt|d ƒ ƒttd| ƒtdƒ ƒ ||   S )Nr   zmust have n >= 0r   rA   rF   )Ú
ValueErrorr   r   )Úclsr9   ÚrhoÚv©Úgr   r   Úeval¶   s   ÿÿÿz!asymptotic_series.<locals>.g.evalN©Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚnargsÚclassmethodrh   r   rf   r   r   rg   ­   ó
    rg   c                       ra   )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)
        rF   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 >= 0re   r   rA   )rb   r   r	   r*   r+   r   r   r   )rc   Úmrd   Úbetare   r8   Úresrf   r   r   rh   Ê   s   .$ÿz&asymptotic_series.<locals>.coef_C.evalNri   r   rf   r   r   Úcoef_CÁ   rp   rt   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©rM   r6   r   r   r   rP   ä   rG   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]Úxar4   z	(\d{10,})z\1.)r'   ÚFunctionr   r)   r,   rT   rU   ÚlcmÚcollectÚfactorÚxreplacer2   ÚreÚcompileÚsubr.   )r3   rt   rx   r5   rw   ÚC0r<   r?   Úexprr|   r~   Úre_aÚre_bÚ	re_digitsr   rf   r   Úasymptotic_seriesŸ   s>    



r†   c               	      s  dd„ ‰d!‡fdd„	‰ g d¢‰g d¢‰g d	¢‰t  ˆˆˆ¡\‰‰‰ˆ ¡ ˆ ¡ ˆ ¡ ‰‰‰g } tˆjƒD ]‰|  t‡ ‡‡‡‡fd
d„ddddid�j¡ q6t  | ¡} ˆˆˆ| dœ}dd„ }t	t
|||d dd�d ƒ}d}|d7 }|d7 }|d7 }|d7 }|d dd„ |D ƒ¡7 }|S )"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                 S   sB   t  d|  | ¡}| t  |¡ || | t  || ¡  d | S )zDerivative of f w.r.t. phi.g      ð?r   )ÚnpÚpowerÚcos)Úepsr4   r5   r6   ÚphiÚeps_ar   r   r   Úfp  s   0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 arc length of a function f from t0 to t1 is given by
            int_t0^t1 sqrt(1 + f'(t)^2) dt
        c              	      s   t  dˆˆˆ ˆˆ| ƒd  ¡S )Nr   rA   )r‡   Úsqrt)r‹   )r4   r5   rŠ   r�   r6   r   r   r     s    z=optimal_epsilon_integral.<locals>.arclength.<locals>.<lambda>r   r�   )ÚepsrelÚlimit)r   r‡   r   )rŠ   r4   r5   r6   r‘   r’   )r�   )r4   r5   rŠ   r6   r   Ú	arclength	  s   þþz+optimal_epsilon_integral.<locals>.arclength)
çü©ñÒMbP?gš™™™™™¹?g      à?gÍÌÌÌÌÌì?r   rA   é   r   é   r`   )r   r   r•   é   é
   )r   g      ø?rA   r•   r˜   é   é2   r�   éÈ   iô  g     @�@g     ˆ³@g     ˆÃ@c                    s   ˆ | ˆˆ ˆˆ ˆˆ ƒS ©Nr   )rŠ   )r“   Údata_aÚdata_bÚdata_xr?   r   r   r     s    ÿz*optimal_epsilon_integral.<locals>.<lambda>)r”   iè  ÚBoundedÚxatolr”   )ÚboundsÚmethodÚoptions)r4   r5   r6   rŠ   c           
   
   S   sx   | d }| d }| d }	|| t  d| ¡ t  |dd|  t  |	¡  |t  | | ¡  |dt  || ¡   ¡ S )z#Compute parametric function to fit.r4   r5   r6   g      à¿r   )r‡   r(   Úlog)
ÚdataÚA0ÚA1ÚA2ÚA3ÚA4ÚA5r4   r5   r6   r   r   r   Úfunc*  s   0ÿÿz&optimal_epsilon_integral.<locals>.funcrŠ   Ú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, c                 S   s   g | ]}|d ›‘qS )z.5gr   rv   r   r   r   rP   :  rG   z,optimal_epsilon_integral.<locals>.<listcomp>N)rŽ   r�   )r‡   ÚmeshgridÚflattenr)   Úsizer/   r   r6   ÚarrayÚlistr   Újoin)Úbest_epsÚdfr­   Úfunc_paramsr<   r   )r“   r�   rž   rŸ   r�   r?   r   Úoptimal_epsilon_integralø   sB   
ÿýü
ý	r¸   c                  C   s‚   t ƒ } tttd�}|jdtg d¢dd� | ¡ }dd„ dd„ d	d„ d
d„ dœ}| |jdd„ ¡ƒ  t	dt ƒ |  d d›d�ƒ d S )N)ÚdescriptionÚformatter_classÚaction)r   rA   rF   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   ó
   t tƒ ƒS rœ   )Úprintr@   r   r   r   r   r   L  ó   
 zmain.<locals>.<lambda>c                   S   r¿   rœ   )rÀ   r_   r   r   r   r   r   M  rÁ   c                   S   r¿   rœ   )rÀ   r†   r   r   r   r   r   N  rÁ   c                   S   r¿   rœ   )rÀ   r¸   r   r   r   r   r   O  rÁ   c                   S   s   t dƒS )NzInvalid input.)rÀ   r   r   r   r   r   Q  s    r#   é<   z.1fz minutes elapsed.
)
r   r   rm   r   Úadd_argumentÚintÚ
parse_argsÚgetr»   rÀ   )Út0Úparserr   Úswitchr   r   r   Úmain>  s   ÿÿý rÊ   Ú__main__)#rm   Úargparser   r   Únumpyr‡   Úscipy.integrater   Úscipy.optimizer   r   r   r'   r   r	   r
   r   r   r   r   r   r   r   r   Úsympy.polys.polyfuncsr   ÚImportErrorr@   rD   rE   r_   r†   r¸   rÊ   rj   r   r   r   r   Ú<module>   s.    4ÿ"
YYF
ÿ