
    ^MhD2                         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 n# e$ r Y nw xY wd	 Zd
 Zd Zd Zd Zd Z d Z!e"dk    r e!             dS dS )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                  8   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 ]}	|	                    ||	          
                    |d                                                                          }
|

                    t          d|          d                              t          d           }|d|	z  z  }|                    ||	z  t          |	          z             |                    t!          |                     |                    t!          |
|z                                                       d}|dz  }t#          g d	|||g          D ]F\  }}t          t%          |                    D ]$}|d
| d| dt'          ||                   z   z  }%G|S )zATylor series expansion of Phi(a, b, x) in a=0 up to order 5.
       a b x kr      c                      dS Nr    argss    g/var/www/html/test/jupyter/venv/lib/python3.11/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AJ5GHHJq%)A,,&3J 1eAg 
3 
3q!$$))!Q//88::??AA))IaOOQ//79oo66 	 	2'	Aill"###	   	f..00112222HA	MMAAq	22 1 1as1vv 	1 	1A$d$$Q$$$s1Q4yy00AA	1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   s\    
 	Aa4*a$q'')A!H4q!QqSkBBC Cr!   c                 P    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                  t
   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 ]|
                    |                               | d                                                                          }|                    t!          d          d                              t           d           }|dz  z  }||z  t	                    z  }dk    r|                    t           fd	          }|                    ddz   z
  
                                                              t!          dd          dt          d          z                                            }|                    | z  t                    z             |                    t+          |                     |	                    |           t          j        |	d                             |                                                                                     t          t3                              D ]/}|         t          |          z                                  |<   0d}|dz  }|dz  }|dz  }|dz  }|dz  }|dz  }t5          ddg||g          D ]H\  }}t          t3          |                    D ]&}|d| d| dz  }|t7          ||                   z  }'It          t3                              D ]}|d| dz  }|t7          |                   z  }|d| dz  }|t7          |                             |t          |t          |t          d          i                              d                    z  }|dz  }|dz  }|dz  }t;          fdt          dz
            D                       }||	d                             |          z
                                  }|d |t          d          k     z  }|d!z  }t;          fd"t          dz
            D                       }||	d                             |          z
                                  }|d |t          d          k     z  }|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                      dS r   r   r   s    r   r   z(series_small_a_small_b.<locals>.<lambda>e   r    r!   r"   c                 2    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7193M3M r!   )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] + ..c                 R    g | ]#}|z  t          |          z  |d z            z  $S )r   r   .0r:   Cr8   s     r   
<listcomp>z*series_small_a_small_b.<locals>.<listcomp>   5    CCCq1Yq\\!AacF*CCCr!   z
test successful = z-
Test B[3] == C[2] + b*C[3] + b^2/2*C[4] + ..c                 R    g | ]#}|z  t          |          z  |d z            z  $S )rE   rR   rS   s     r   rV   z*series_small_a_small_b.<locals>.<listcomp>   rW   r!   )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   r9   r:   M_PIM_EGM_Z3c_subsr#   r$   r%   r;   r=   r>   pg_partrB   r?   r@   rA   testrU   r8   r<   r6   s                      @@@@r   series_small_a_small_brf   F   s-    E##JAq!Q/00D$$
D$q''48F
A
A
A
A
 q%)A,,&AqD1eAaCEll*Q1:,>??@J 1eAg  q!$$))!Q//88::??AA))IaOOQ//79oo66 	 	2'v+eAhh&66ooi&M&M&M&M&MO OG~~aeAgai~88		Yq!__baj99 

  	
Aill"###	   	 	
1Q499V$$a((//11AIIKKK3q66]] 0 0!y||#--//!NA	FFAA	22AA	A	ASzAq6**  as1vv 	 	A$d$$Q$$$$AQqTNAA	 3q66]]  	a	S1YY	^A^^^	S1D*dBd1ggFGG%))  	 	<<A	..A	FFACCCCCE%'NNCCCDDD1Q499V$$$..00D	,add
	,	,,A	99ACCCCCE%'NNCCCDDD1Q499V$$$..00D	,add
	,	,,AHr!   c            	      X   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                                  }d t          j        |                                          D             }	t          j        |	          }	||	z                                                      |t           j	                  }|
                    |dz   |i          }|d| d|	 d| dz  }|d| dt          |           dz  }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                   2    e Zd ZdZdZe fd            ZdS )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                 6   |dk    st          d          |dk    rdS  |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    66 !3444aqq1c1~~c!eAguSU|| ;<<ac

588 344556T:: :r!   N__name__
__module____qualname____doc__nargsclassmethodrq   rp   s   r   rp   rj      sI        	 	 		: 	: 	: 	: 
	: 	: 	:r!   rp   c                   2    e Zd ZdZdZe fd            ZdS )!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                    |dk    st          d          t          d          }d|z
  | z   d|z  ||          | t          dd          z
  z  z  }|                    |d|z                                |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 >= 0ro   r   rE   )rl   r   r
   r-   r.   r   r   r   )rm   mrn   betaro   r;   resrp   s          r   rq   z&asymptotic_series.<locals>.coef_C.eval   s    66 !3444AA#$!!AaCa..A2hq!nn;L*MMJ//!QqS))..q!44y1~~ECq8Aq>>122ad;s1uIXa^^);<= >CJr!   Nrr   ry   s   r   coef_Cr{      sI        	 	 			 		 		 		 
		 		 		r!   r   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                 6    g | ]}|                                 S r   )denominatorrT   r9   s     r   rV   z%asymptotic_series.<locals>.<listcomp>   s     EEEa!--//EEEr!   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/   r[   r\   lcmcollectfactorxreplacer5   recompilesubr1   )r6   r   r   r8   r   C0r?   rB   exprr   r   re_are_b	re_digitsrp   s                 @r   asymptotic_seriesr      s    E: : : : : : :EN : : :(         , +&&KB4	2q		B,A	::A	@@A	))A	A	A	##A	//A1eAg * *q"a  B"qyL1;;==EE5:d+;+;+B+B+D+DEEE6""v''))11!U\BB}}bdD\**	7!77777777	)!))#d))))))III::n%%D1A::m$$D1A			&(##A			$A 

<((Ifa  AHr!   c            
        	
 d 	d	fd	g dg dg dt          j                  \                                                                                                  cg } t          j                  D ]6
|                     t          
fdd	d
ddi          j                   7t          j        |           } | d}d }t          t          |||d         d          d                   }d}|dz  }|dz  }|dz  }|dz  }|d                    d |D                       z  }|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                     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  sT    cA2&&RVC[[ 1q55=26!c'??#BBQFJJr!   {Gz?d   c                 b     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           
      R    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-    BBsAq!S,A,A1,D(D E E r!   r   r   )epsrellimit)r   r   r   )r   r7   r8   r9   r   r   r   s   ````  r   	arclengthz+optimal_epsilon_integral.<locals>.arclength	  sL     EEEEEEEEru!. . ../1 	1r!   )
MbP?g?g      ?g?r   rE      r      rh   )r   r   r      
   )r   g      ?rE   r   r      2   r      i  g     @@g     @g     @c                 D     |                                      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           
      F   | 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)))&a1q5kBF1II55RVRC!G__8LLRVBF^^!345 6 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, c                     g | ]}|d S )z.5gr   r   s     r   rV   z,optimal_epsilon_integral.<locals>.<listcomp>:  s    4441qJJ444r!   )r   r   )r   meshgridflattenr,   sizer2   r   r9   arraylistr   join)best_epsdfr   func_paramsr?   r   r   r   r   r   rB   s        @@@@@@r   optimal_epsilon_integralr      s   K K K
1 1 1 1 1 1 544FFEEEF[@@FFF$nn..0@0@$nn.. FFFH6; 
 
 = = = = = = = =#/#,woG G G HI		
 	
 	
 	
 x!!H
 
B7 7 7 yr2e9UCCCAFGGKBA	&&A	NNA	JJA	,,A44444	5	55AHr!   c                  j   t                      } t          t          t                    }|                    dt
          g dd           |                                }d d d d	 d} |                    |j        d
                        t          dt                      | z
  dz  dd           d S )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                  8    t          t                                S r   )printrC   r   r!   r   r   zmain.<locals>.<lambda>L  s    ~//00 r!   c                  8    t          t                                S r   )r   rf   r   r!   r   r   zmain.<locals>.<lambda>M  s    57788 r!   c                  8    t          t                                S r   )r   r   r   r!   r   r   zmain.<locals>.<lambda>N  s    02233 r!   c                  8    t          t                                S r   )r   r   r   r!   r   r   zmain.<locals>.<lambda>O  s    79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   rv   r   add_argumentint
parse_argsgetr   r   )t0parserr   switchs       r   mainr   >  s    	B,@B B BF
sLLLP     D008833:: F
 =FJJt{;;<<>>>	
8R
8
8
8
899999r!   __main__)#rv   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   rf   r   r   r   rs   r   r!   r   <module>r      s   
 : 9 9 9 9 9 9 9                 5 5 5 5 5 5 5 5      	LLLB B B B B B B B B B B B B B B B B B B B B B B B B B,,,,,,, 	 	 	D	  DC C C/ / /
V V VrV V VrC C CL: : :. zDFFFFF s   $A	 	AA