o
    "`r                     @   s  d dl mZ ddlmZmZ dd ZdZeg dfdd	Zed
d Zedd Z	edd Z
edd Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zed d! Zd"d# Zed$d% Zed&d' Zed(d) Zed*d+ Zed,d- Zed.d/ Zed0d1 ZedAd3d4Zed5d6 Zed7d8 Zed9d: Zed;d< Z ed=d> Z!	 ed?d@ Z"d2S )B   )xrange   )defundefun_wrappedc                 C   sr  d }}d}g }t |D ]\}}	|	\}
}}}}}}d}t |
D ]\}}|s8| || dkr8|| r8d }}d}qg d}t |||gD ]O\}}t |D ]F\}}| |\}}|dkr\qL|| jkrd}|dkr{|D ]}| |rz|t|krzd} nqi|r~qL||  d7  < qL|dk r|| 7 }d}qLqD|r|d |d |d  kr|s|| qt|rd }}q||||fS )NF    T)r   r   r   r   r   )	enumeraterenint_distanceninfisnpintintappendsum)ctxtermsprecdiscard_known_zerosperturb	recompute	extraprecdiscard
term_indextermw_sc_salpha_sbeta_sa_sb_szZhave_singular_nongamma_weightkwZ
pole_countZ
data_indexdataixndoku r*   A/usr/lib/python3/dist-packages/mpmath/functions/hypergeometric.py_check_need_perturb   sT   

r,   a  
hypercomb() failed to converge to the requested %i bits of accuracy
using a working precision of %i bits. The function value may be zero or
infinite; try passing zeroprec=N or infprec=M to bound finite values between
2^(-N) and 2^M. Otherwise try a higher maxprec or maxterms.
Tc           +         s   j } j} j} j}|d d  }	|dd}
|d |}||d< |d}|d}d }d}z>	   j d7  _  j |krKtt| j f  j }|	d d  }|| }|
rlt  td	 td
 j  td| t	 |||\}}}  j |7  _ |rd|v r|d }n j
rt j d }n|d | }  j| }|d | d  _ tt|D ]}||  |7  < |||d  7 }q|r|| }|rׇfddt|D }|s jW | _ S g }t|D ]\}}|\}}}}}} }!|
r7t  td|d t|t|t| f  td | | td | | td | |  td |!   j|| |!fi |g fdd|D   fdd|D   fddt||D  }"|
rltd|" ||" qt|dkr|s|d }n j
r |}n |} fdd|D }#t|#}$ |}%|$|% }&|
rt  td|&d td j | d |& j | k }'|d u rd}(n|$ j  | k }(|d u rd})n|$|k})|'r|r |&rne|'r%|d u r|d7 }|}q5 ||  || kr
nM|(r j}nM|)r j}nMd|v rnN|d9 }|}ntt|&|d t||}*  j |*7  _ |
r@td q5q6W | _ |
 S W | _ |
 S W | _ |
 S W | _ |
 S W | _ |
 S W | _ |
 S W | _ |
 S | _ w ) NverboseFmaxpreczeroprecinfprecr   r   
   zENTERING hypercomb main loopzprec =hextrahmagg333333?c                    s   g | ]
\}}| vr|qS r*   r*   ).0r$   r   )r   r*   r+   
<listcomp>k       zhypercomb.<locals>.<listcomp>z  Evaluating term %i/%i : %iF%iz
    powersz	    gammaz	    hyperz    zc                       g | ]}  |qS r*   )gammar4   ar   r*   r+   r5   ~       c                    r7   r*   )Zrgammar4   br;   r*   r+   r5      r<   c                    s   g | ]
\}}  ||qS r*   )power)r4   r"   cr;   r*   r+   r5      r6   z
    Value:c                    r7   r*   )mag)r4   r%   r;   r*   r+   r5      r<   z  Cancellation:bitsz  Increased precision:   r   z*  Must start over with increased precision)r   zeror
   r   getZ_default_hyper_maxprec
ValueError_hypercomb_msgprintr,   Z_fixed_precisionr   Zldexponerangelenr   nstrZfprodhyperzipr   fsummaxrA   Zisnaninfmin)+r   functionparamsr   kwargsorigZsumvalueZdistr   Zorig_paramsr-   r.   r/   r0   Zperturbed_reference_valuer2   Zorig2r   r   r   r   r3   hr!   Zevaluated_termsr   Z	term_datar   r   r   r   r   r   r    vZterm_magnitudesZmax_magnitudeZsum_magnitudecancellationZprecision_okZzero_okZinf_okZ	incrementr*   )r   r   r+   	hypercomb:   s  





R







>84rZ   c                    sd    |}t|}t|} fdd|D } fdd|D }|ddra|dd}d}||k ra|ra|| }	|	|v rW|sD |	d sW||	 ||	 |d	8 }|d	8 }n|d	7 }||k ra|s3|dkr}|d	krs j||fi |S |dkr| |S n|d	kr|d	kr j|||fi |S |d
kr j|||fi |S |dkr 	|d d |S no|d
kr|d	kr j
|||fi |S |d
krЈ j|||fi |S |dkr߈ j|||fi |S |dkr j|||fi |S n.||d	 kr j|||||fi |S ||d	 kr|ds j|||||fi |S t||  \}
} j||||
|fi |S )z0
    Hypergeometric function, general case.
    c                    r7   r*   Z_convert_paramr9   r;   r*   r+   r5      r<   zhyper.<locals>.<listcomp>c                    r7   r*   r[   r=   r;   r*   r+   r5      r<   Z	eliminateTZeliminate_allFr   r   r      force_series)convertrK   rE   r   remove_hyp0f1exp_hyp1f1_hyp1f2_hyp1f0_hyp2f1_hyp2f2_hyp2f3_hyp2f0_hypq1fq
_hyp_borelrN   hypsum)r   r   r   r    rU   pqZelim_nonpositiver$   r>   Zcoeffstypesr*   r;   r+   rM      sF   




 rM   c                 K   s   | j g |g|fi |S NrM   )r   r>   r    rU   r*   r*   r+   hyp0f1   s   rq   c                 K   s   | j |g|g|fi |S ro   rp   r   r:   r>   r    rU   r*   r*   r+   hyp1f1      rs   c                 K   s   | j |g||g|fi |S ro   rp   )r   a1b1b2r    rU   r*   r*   r+   hyp1f2      rx   c                 K   s   | j ||g|g|fi |S ro   rp   )r   r:   r>   r@   r    rU   r*   r*   r+   hyp2f1   ry   rz   c                 K   s   | j ||g||g|fi |S ro   rp   )r   ru   a2rv   rw   r    rU   r*   r*   r+   hyp2f2   s   r|   c                 K   s    | j ||g|||g|fi |S ro   rp   )r   ru   r{   rv   rw   b3r    rU   r*   r*   r+   hyp2f3      r~   c                 K   s   | j ||gg |fi |S ro   rp   rr   r*   r*   r+   hyp2f0  rt   r   c                 K   s    | j |||g||g|fi |S ro   rp   )r   ru   r{   a3rv   rw   r    rU   r*   r*   r+   hyp3f2	  r   r   c                 C   s   d| |  S Nr   r*   )r   r:   r    r*   r*   r+   rd     s   rd   c           	         s   |\\ }r }nd}|dkrm|dsmzJj}z/ jd|d  7  _ fdd}j|g dd	} dj  | }W |_n|_w  r_r_|}|
 W S  j	yl   Y nw j
dd
|f gfi |S )Nr      r]      r   c                     s     } j|  }dd|  }j  }d| }| |g|dgg g  j j  gg | f}||g|dgg g  j j  gg |f}||fS )Nr      r   )sqrtjmpq_1_2ra   Zmpq_3_2)r"   Zjwr)   r@   ET1T2r>   r   r    r*   r+   rW   !  s   

.*z_hyp0f1.<locals>.hTr]   r   )rA   rE   r   rZ   r8   r   pi_is_real_type_reNoConvergencerk   )	r   r   r    rU   btypemagzrV   rW   rX   r*   r   r+   r`     s(   
	 
r`   c              	      sv  |\\}}|\\}}s j  S  }	|	dkr |r& |dks rK | |  krE   krEdkrF jS   j S zTz@  j|	7  _ 	dk  fdd}
 j
|
||gdd} |r |r r |}|
 W W   j|	8  _S   jy   Y nw W   j|	8  _n  j|	8  _w  jdd||f||gfi |}|S )N   r   r   c                    s   r   j| dd}n  | }d }|gd|  g|g||  g| d|  | gg | f} gd| | g|g| g||  d|  gg |f}||fS )NTexactr   )Zexpjpifnegra   )r:   r>   r   rzr   r   r   Zsectorr    r*   r+   rW   E  s   
24z_hyp1f1.<locals>.hTr   )rI   rA   isintr	   ZisinfsignrQ   nanr   Z_imrZ   r   r   r   rk   )r   r   r   r    rU   r:   atyper>   r   r   rW   rX   r*   r   r+   rb   5  s8   



 
.
	
 "rb   c           %      K   s  ||||f\}}}}	| j }
|dd|
 }d}	 |
| | _ | |	}| d}| d}| d}d}|| | }|| j }|d | j }d| }|| }|| | }|| | }|d }| j  d }| j}| j}| j}| j}	 || }|| ||  | d|d  | ||   }|||| | |   } ||| || |   }!|||| ||  |  |  d| |  }"|| |" }#t	|||#}||#| |k rn| |!|#}}}|d7 }qp|||# }$|$|k r	 |#S ||$7 }||kr| j
q)Nr.   d   r1   r   r   r   r   )r   rE   r^   mpfr   rL   nprintrA   r   rP   r   )%r   r:   r>   r@   r    rU   Z_aZ_bZ_cZ_zrV   r.   Zextrar'   efr!   ZabzZchZc1hZnzgZabgZcbaZz2tolrL   r   rA   ZmaxmagZkchZkakbzZd1Ze1Zftf1rY   r*   r*   r+   _hyp2f1_gosperY  sZ   





,,r   c                    s  |\\}}\}}|\\ }	dkr  | | dk}
|r%|dkp-|o-|dk} oY dkoY|rH |  koEdkn  pX|oX |  koVdkn   }|
s^|rt|stj  | | g |  | gddS || djd  j S s s|dks|dkrd S jS  rǈ dkrǈ|r |  krdksn |rĈ |  krdkrn jS njS t}|dks|r|dkr|dks|r|dkr|dkrjdd|||	f|| gfi |S j	}z j	d7  _	|d	kr! fd
d}j
|||gfi |}nPtd dkr> fdd}j
|||gfi |}n:td  dkr^| |  d  d |  }n!t|| fi |}W |_	|
 S W |_	|
 S W |_	|
 S W |_	|
 S |_	w )Nr   r   T)Z_infsignr   g?ir1   g?c                    s   j   }| | }d } g|  g | g| |  g| ||  gj | g|f} g| g |g|  | g||| gj | g|f}||fS r   )Zmpq_1)r:   r>   tabr   r   r   r@   r   r    r*   r+   rW     s   86z_hyp2f1.<locals>.hg      ?c                    s    |  | } |  } | }d }g g  |g||g| |gd| g|f}|g|g | |   g| |g||gd| g|f}||fS r   r*   )r:   r>   r   cacbr   r   r   )r@   r    r*   r+   rW     s   $$0)r	   r   	gammaprodrz   epsrQ   r   absrk   r   rZ   r   )r   r   r   r    rU   r:   r   r>   r   ZctypeZ
convergentZfiniteZzerodivabszrV   rW   rX   r*   r   r+   re     sv   
$B(  "&
*re   c              
      s  t  \}t  \}ttt}	d}
D ]}|r+|dkr+d}
 nq|	dk s2|
rVzj	
||  fi |W S  jyU   |	dksR|
rS Y nw dkrwtt }|dkrwjdfi |j	 S 	
fdkrtd dk r\ \  }
   g  d|g}d|if fd	d
	z!jdj	g|d|ddd}|
g g W S  jy   Y nw |	dk rȈdkrdjif	
fdd
	|dd}zjdj	g|d|dd|dddW S  jy4   d|vr2 Y nw |dr?td 	 fddfdd}jd }j}zidj } jd7  _tdD ]J}fddt|D }j|j	g||||dddd\}}||k r|| } n!|d 9 } jjd  7  _|d!krd"qkW |_|
 S W |_|
 S |_w 	
fd#d$}j| fi |S )%z&
    Evaluates 3F2, 4F3, 5F4, ...
    Fr   Tr   g?g?)r\   r   g?c                    s~     |  }| |v r||  }n$|| d  }||   d |   d  9 }|| |d   }||| < |  | S r   )rz   )r!   _cacher)   r   )ru   r{   r   rv   rw   r   r    r*   r+   r     s   
$z_hypq1fq.<locals>.termr-   strict)r-   r   c                    s   t | }|| kr0|  |  } D ]
}||| 9 }qD ]
}|||  }q#|S ||v r8|| S |d }|d }tD ]
}| | | 9 }qFtD ]
}|| |  }qU|9 }|| }|||< |S r   )r   r   ZfacZrfr   )Zkkr   r!   r   r:   r>   mr   )r   r   r   rl   rm   r   r    r*   r+   r   '  s    
sum_methodzr+s+er    )r-   r   methodz$Attempting Euler-Maclaurin summationc                 3   s    dg }t fddD t fdd|D    V  d 	 t  fddD t  fdd|D  } dkrN|7 }|V   d7  q))Nr   c                 3       | ]
}  | V  qd S ro   Zloggammar9   r   k0r*   r+   	<genexpr>i      z._hypq1fq.<locals>.log_diffs.<locals>.<genexpr>c                 3   r   ro   r   r=   r   r*   r+   r   j  r   r   c                 3        | ]}  | V  qd S ro   Zpsir9   r   r$   r   r*   r+   r   m      c                 3   r   ro   r   r=   r   r*   r+   r   n  r   )r   log)r   rw   rX   r   r   r   r    )r$   r   r+   	log_diffsg  s"   
z_hypq1fq.<locals>.log_diffsc                 3   sH     dd D dd  D }| D ]	}|| }|V  qd S )Nc                 S      g | ]}|qS r*   r*   r=   r*   r*   r+   r5   u      z1_hypq1fq.<locals>.hyper_diffs.<locals>.<listcomp>c                 S   r   r*   r*   r9   r*   r*   r+   r5   u  r   )r   Z	diffs_exp)r   Cr'   rX   )r   r   r   r   r*   r+   hyper_diffst  s    z_hypq1fq.<locals>.hyper_diffsi   2   rC      c                 3   s    | ]} |V  qd S ro   r*   )r4   r!   )r   r*   r+   r     s    z_hypq1fq.<locals>.<genexpr>)r   Zadiffsr-   errorZ_fast_abortr   r   z*Euler-Maclaurin summation did not convergec            
   
      s   t | d   t | d  g }j }jdd}td D ]Y  |g} g}g  fddtd D  } fddtD  }gfddtD  } fddtd D }	|||||||	|f q$|S )	NTr   r   c                    s    g | ]}|kr |  qS r*   r*   r4   r   r   akr!   r*   r+   r5          z'_hypq1fq.<locals>.h.<locals>.<listcomp>c                    s   g | ]}|   qS r*   r*   r   r   r   r*   r+   r5     s    c                    s   g | ]
} |  d  qS r   r*   r   r   r*   r+   r5     r6   c                    s$   g | ]}|krd  |   qS r   r*   r   r   r*   r+   r5        $ )listrI   r   rJ   r   )
argsZTsZreczZnegzr   ZCpZGnZGdZFnZFd)r   rl   rm   r    )r   r   r   r!   r+   rW     s   
(z_hypq1fq.<locals>.h)rN   r   r   r   rk   r   r	   r   rM   rQ   r   ZnsumrE   r   rI   replacerH   r   r   Zdpsr   rO   ZsumemrZ   )r   rl   rm   r   r   r    rU   a_typesb_typesr   Zispolyr:   Sr)   initialr   r   r   r   Ztruncr$   headtailerrrX   rW   r*   )ru   r{   r   r   rv   rw   r   r   r   rl   rm   r   r    r+   ri     s   $
, 

"







	ri   c                    s   rt   \ }t  ng d }rt  \}tng d}|dj|d< zj||||   fi |W S  jyI   Y nw j}	zE|djd }
 jd7  _djif fdd	j}td	jD ]}|}||7 }t	||
kr|  W |	_S quW |	_n|	_w ||d
 kr|d}|sۈ
dk rֈtd	t	 }
dkrddd| d| jg}nddd| d| jg}ndjg}|di } fdd}j||fddi|\}}|t	|j d kr|S j)Nr*   maxtermsZ	asymp_tolr   r1   r   c                    sl   | |v r||  S | d } D ]
}||| d  9 }qD ]
}||| d   }q|9 }||  }||| < |S r   r*   )r!   cacher   r:   r>   )r   r   r   r    r*   r+   r     s   z_hyp_borel.<locals>.termr   r\   contourg      ?y               @y       @       @r   y              y       @       quad_kwargsc                    s$    |   dg |   S r   )ra   rM   )r   r   r*   r+   r     s   $z_hyp_borel.<locals>.gr   Tr   )rN   r   rE   r   rk   r   r   rI   r   r   argrP   rQ   Zquad)r   rl   rm   r   r   r    rU   r   r   r   r   sr!   r   r   r)   r   r   Ir   r*   )r   r   r   r   r    r+   rj     sX   



$


rj   c                    s&  |\\}}\}}|\\}	}
\}}t } } j}|}|d o* |dk}|r~zLz<  j|7  _ fdd} j||||	|gdd j d}t fdd	|||	|fD d
krd |}|W W | _S   jyt   Y nw W | _n| _w  jdd|||
|f|||	|gfi |S )Nr]   r\   c                    sh  | | | | }| | }|| }i } j |d< |d | ||  | |  |d< d}d}	d}
	 |	|vrd| d|   | d  d|  |d  ||  | |  ||  d| d|d   |	  d|	d   }|	| | d |	| | d  |	| d  } j |	 |||	d   |||	d     ||	< ||	 |	   }t|d j k rn|	dkrt|
t| dk r j||7 }|}
|	d7 }	q. | }|g|dg||g| |gg g df} g|  g||||  g|||  ||  g| | | d | | d g| | d gd f} g| g||| | g| || || g||| d || d g|  | d gd f}|||fS )	Nr   r   r   r\   皙?r         ?r   )rI   r   r   r   ra   )ru   r{   rv   rw   XA2ZB2r@   s1r!   tprevuu1uu2t1r   r   r   T3r   r    r*   r+   rW     s8   
 d,."VX
z_hyp2f2.<locals>.hTr   r]   r   c                 3       | ]}  |V  qd S ro   r   r4   r)   r;   r*   r+   r   !      z_hyp2f2.<locals>.<genexpr>r   r   )	r   rA   r   rE   rZ   r   r	   r   rk   )r   r   r   r    rU   ru   a1typer{   a2typerv   b1typerw   b2typer   r   rV   asymp_extrapreccan_use_asymptoticrW   rX   r*   r   r+   rf     s2   
 $
*rf   c                    s2  |\\}}|\\}}\}	}
t } } j}o|d }|d o4 |dko4 |d| k}|rzJz:  j|7  _ fdd} j||||	gdd j d	}t fd
d|||	fD dkrl |}|W W | _S   jy|   Y nw W | _n| _w  j	dd|||
f|||	gfi |S )Nr   r]      r   c                    sP   j | | |  j   }i } j|d< d jd|  | | d  | | |  ||   j  |d< d||  j| | |  d|  | | d    j d   jdd|  d  | | d| | |  d| d  d|   | | d   d   |d< d}d}d}d}	 ||vrd|d  d	|  d|  d|  d |  d| d   || d  d|  || d    j }	||  | |  j  ||  | |  j   ||  | |  j  }
 jd|  |	||d   |
||d     ||< ||  d
|   } j |  d|   | } j|  d|   | }t|d j	 k r%n"|dkr8t|t| dk r8 j
||7 }||7 }|}|d7 }q  j| d    |   j| d     |  }d|  j gdd
|g||g| gg g df} g|  g||g||  ||  g| | | d | | d gg d f}||fS )Nr   r   r\   r   r      i      r   r   r         ?)r   rI   mpq_1_4mpq_3_16mpq_1_16Zmpq_5_2r   r   r   r   r   expjr   r   )ru   rv   rw   r   r@   r   s2r!   r   r   r   r"   r   t2r   r   r   r   r*   r+   rW   I  sd   
<:.6
*2  "$"  z_hyp1f2.<locals>.hTr   r   c                 3   r   ro   r   r   r;   r*   r+   r   r  r   z_hyp1f2.<locals>.<genexpr>r   
r   rA   r   rE   r   rZ   r   r	   r   rk   )r   r   r   r    rU   ru   r   rv   r   rw   r   r   r   rV   r   r   rW   rX   r*   r   r+   rc   -  s6   

("
&rc   c              	      sN  |\\}}\}}|\\}	}
\}}\}}t } }o!|d } j}|d o: |dko: |d| k}|rzNz>  j|7  _ fdd} j||||	||gdd j d	}t fd
d|||	||fD dkrv |}|W W | _S   jy   Y nw W | _n| _w  j	dd|||
||f|||	||gfi |S )Nr   r]   r   r   c              	      s   j | | | | |  j   }| | }|| | }| | }|| ||  ||  }	|| | }
i } j|d< d|	|  jd| | d  ||    j  |d<  j |d d   jdd| d  |	|  d|
  dd|d  d	|  d
|  | d  ||   d   |d< d}d}d}d}	 ||vr\|d|  d |d|  d|  d  |d|  d|  d  |d|  d|  d  }d|d d  dd| |  |d d   dd|d  d| |  d|	  | d  |d   d|d   d| |d   d|	  d
|
  dd|	 | d  |  d|  d }d|d d  dd| | d|  d  |d   d|d   } jd|  |||d   |||d    |||d     ||< ||   d|  } j |  d|   | } j|  d|   | }t|d j	 k rn"|dkrt|t| dk r j
||7 }||7 }|}|d7 }q  j| d    |   j| d     |  }d|  j gdd|g|||g| |gg g df} g|  g|||||  g|||  ||  ||  g| | | d | | d | | d g| | d gd f} g| g|||| | g| || || || g||| d || d || d g|  | d gd f}|||fS )Nr   r   r\   r   r       r   r   r   r         r   r   ir   r   r   r   )r   rI   r   r  r  r?   r   r   r   r   r   r  r   r   )ru   r{   rv   rw   r}   r   r   ZB3ABRr@   r   r  r!   r   r   r   Zuu3r"   r   r  r   r   r   r   r   r*   r+   rW     s    
42.
>*2
@B  "$&0406
z_hyp2f3.<locals>.hTr   r   c                 3   r   ro   r   r   r;   r*   r+   r     r   z_hyp2f3.<locals>.<genexpr>r  r\   r  )r   r   r   r    rU   ru   r   r{   r   rv   r   rw   r   r}   Zb3typer   r   r   rV   r   rW   rX   r*   r   r+   rg     s6   
".&
.rg   c                    s   |\\}}\}}z|  }	|	d j|	d<  jdd||f||gfi |	W S   jy7   |dr5 Y nw  fdd}
 j|
|d| | gfi |S )Nr   r   r   r]   c                    s     |}d } j||gdd| gg | | d |g| g|g|f} j ||gddd|  | gg | d| g| | d gd| g|f}||fS )Nr   r   r   )Zsinpir   )r:   r>   r"   r   r   r   r   r*   r+   rW     s
   
0Bz_hyp2f0.<locals>.hr   )copyrE   r   rk   r   rZ   )r   r   r   r    rU   r:   r   r>   r   ZkwargsbrW   r*   r   r+   rh     s   $
 rh   Nc                    s.  |\}}|\}	}
t |t | t |	t |
 || }|	|
 } fdd|D } fdd|D } |d u r`k rEd}krKd}kr` kr^tdkr^d}nd}|drntd| |dkr fdd	}n fd
d	} j||| fi |S )Nc                    r7   r*   r^   r4   _r;   r*   r+   r5     r<   zmeijerg.<locals>.<listcomp>c                    r7   r*   r  r  r;   r*   r+   r5     r<   r   r   r-   zMeijer G m,n,p,q,series =c            	   
      s  | d   | d  g }t D ]z	g}  g}fddt D }| fddt D 7 } fddt D }|fddt D 7 } fddt D }fddt D }j    	j   }||||||||f q|S )Nc                    s$   g | ]}|kr |    qS r*   r*   r   r>   r!   r*   r+   r5     r   &meijerg.<locals>.h.<locals>.<listcomp>c                        g | ]}d  |    qS r   r*   r   r:   r>   r!   r*   r+   r5     r   c                    s   g | ]
} |   qS r*   r*   r   r  r*   r+   r5     r6   c                    s    g | ]}d  |     qS r   r*   r   r  r*   r+   r5     r   c                    r  r   r*   r   r  r*   r+   r5   	  r   c                    s(   g | ]}|krd  |     qS r   r*   r   r  r*   r+   r5   
     ( )rJ   rI   r   	r   r   basesZexptsZgngdZhnZhdhzr   r   r&   rl   rm   rr    r  r+   rW     s   "zmeijerg.<locals>.hc            	   
      s@  | d   | d  g }t D ]	g}dkr#  d g}n  d  g} fddt D }| fddt D 7 } fddt D }| fddt D 7 } fddt D } fddt D }j    	j   }||||||||f q|S )	Nr   c                    s$   g | ]}|kr   |  qS r*   r*   r   r:   r!   r*   r+   r5     r   r  c                        g | ]}d    |  qS r   r*   r   r  r*   r+   r5     r   c                    s   g | ]
}  |  qS r*   r*   r   r  r*   r+   r5     r6   c                    s    g | ]}d     |  qS r   r*   r   r  r*   r+   r5     r   c                    r  r   r*   r   r  r*   r+   r5     r   c                    s(   g | ]}|krd  |     qS r   r*   r   r  r*   r+   r5     r  )rJ   r^   rI   r   r  r  r  r+   rW     s"   ")rK   r^   r   rE   rH   rZ   )r   r   r   r    r  ZseriesrU   ZanZapZbmZbqr:   r>   rW   r*   r  r+   meijerg  s0   

r  c           
      K   s  t |t |kr||}}||}}dd }| |rnO| |r"nI| |r2||||f\}}}}n9||sk|| |d  }	||	sFtdd| |  d| || |   | j|| ||| | ||	|fi | S | j|g|g|gdd|gi||fi |S )Nc                 S   s   t | dk S )NgGz?)r   )r%   r*   r*   r+   r(   +  s   zappellf1.<locals>.okr   z%Analytic continuation not implementedm+nr   r&   r   )r   r   rF   appellf1hyper2d)
r   r:   rv   rw   r@   r%   yrU   r(   Zu1r*   r*   r+   r!  $  s$   




 &,r!  c           	      K   s0   | j |g|g|gd|g|gd||fi |S )Nr  r   r&   r"  )	r   r:   rv   rw   c1c2r%   r#  rU   r*   r*   r+   appellf2A  s
   r(  c                 K   s   |  |p	|  |}	|  |p|  |}
|	s/|
s t|t|kr/||}}||||f\}}}}| j||g||gdd|gi||fi |S )Nr$  r   )r   r   r"  )r   ru   r{   rv   rw   r@   r%   r#  rU   Zouter_polynomialZinner_polynomialr*   r*   r+   appellf3G  s   
,r)  c                 K   s*   | j d||gi|g|gd||fi |S )Nr   r$  r%  )r   r:   r>   r&  r'  r%   r#  rU   r*   r*   r+   appellf4Q  s   *r*  c           "         s    |}  |} fdd}t|}t|}||d}	||d}
||d}||d}||d}||d}||d	}||d
}||d}||d}||d}|r[td| d  |rgtd| d  d} j} dd} j}|dd| }zS  jd7  _ j
 }	 d}d}t	|
}t	|}fdd|	D }fdd|D }|D ]}| }|
| |
| q|D ]}| }|
| |
| q|D ]}|
|  |
| d  q|D ]}|d9 }|d 9 }|
d|   |
|   q|D ]}|
|d   |
|d  d| d    q|D ]#}|d9 }|
d| d   |
|d  d| d    q'|D ]$}|d9 }|
d|   |
d| d   |
| d  qM j|||| fd ji|} ||  | }!t|!|k r|d7 }nd}|dks|sn-||!7 }|D ]}||9 }q|D ]}|| }qd7 ||  }|krˈ dqW | _|
 S | _w )az  
    Sums the generalized 2D hypergeometric series

    .. math ::

        \sum_{m=0}^{\infty} \sum_{n=0}^{\infty}
            \frac{P((a),m,n)}{Q((b),m,n)}
            \frac{x^m y^n} {m! n!}

    where `(a) = (a_1,\ldots,a_r)`, `(b) = (b_1,\ldots,b_s)` and where
    `P` and `Q` are products of rising factorials such as `(a_j)_n` or
    `(a_j)_{m+n}`. `P` and `Q` are specified in the form of dicts, with
    the `m` and `n` dependence as keys and parameter lists as values.
    The supported rising factorials are given in the following table
    (note that only a few are supported in `Q`):

    +------------+-------------------+--------+
    | Key        |  Rising factorial | `Q`    |
    +============+===================+========+
    | ``'m'``    |   `(a_j)_m`       | Yes    |
    +------------+-------------------+--------+
    | ``'n'``    |   `(a_j)_n`       | Yes    |
    +------------+-------------------+--------+
    | ``'m+n'``  |   `(a_j)_{m+n}`   | Yes    |
    +------------+-------------------+--------+
    | ``'m-n'``  |   `(a_j)_{m-n}`   | No     |
    +------------+-------------------+--------+
    | ``'n-m'``  |   `(a_j)_{n-m}`   | No     |
    +------------+-------------------+--------+
    | ``'2m+n'`` |   `(a_j)_{2m+n}`  | No     |
    +------------+-------------------+--------+
    | ``'2m-n'`` |   `(a_j)_{2m-n}`  | No     |
    +------------+-------------------+--------+
    | ``'2n-m'`` |   `(a_j)_{2n-m}`  | No     |
    +------------+-------------------+--------+

    For example, the Appell F1 and F4 functions

    .. math ::

        F_1 = \sum_{m=0}^{\infty} \sum_{n=0}^{\infty}
              \frac{(a)_{m+n} (b)_m (c)_n}{(d)_{m+n}}
              \frac{x^m y^n}{m! n!}

        F_4 = \sum_{m=0}^{\infty} \sum_{n=0}^{\infty}
              \frac{(a)_{m+n} (b)_{m+n}}{(c)_m (d)_{n}}
              \frac{x^m y^n}{m! n!}

    can be represented respectively as

        ``hyper2d({'m+n':[a], 'm':[b], 'n':[c]}, {'m+n':[d]}, x, y)``

        ``hyper2d({'m+n':[a,b]}, {'m':[c], 'n':[d]}, x, y)``

    More generally, :func:`~mpmath.hyper2d` can evaluate any of the 34 distinct
    convergent second-order (generalized Gaussian) hypergeometric
    series enumerated by Horn, as well as the Kampe de Feriet
    function.

    The series is computed by rewriting it so that the inner
    series (i.e. the series containing `n` and `y`) has the form of an
    ordinary generalized hypergeometric series and thereby can be
    evaluated efficiently using :func:`~mpmath.hyper`. If possible,
    manually swapping `x` and `y` and the corresponding parameters
    can sometimes give better results.

    **Examples**

    Two separable cases: a product of two geometric series, and a
    product of two Gaussian hypergeometric functions::

        >>> from mpmath import *
        >>> mp.dps = 25; mp.pretty = True
        >>> x, y = mpf(0.25), mpf(0.5)
        >>> hyper2d({'m':1,'n':1}, {}, x,y)
        2.666666666666666666666667
        >>> 1/(1-x)/(1-y)
        2.666666666666666666666667
        >>> hyper2d({'m':[1,2],'n':[3,4]}, {'m':[5],'n':[6]}, x,y)
        4.164358531238938319669856
        >>> hyp2f1(1,2,5,x)*hyp2f1(3,4,6,y)
        4.164358531238938319669856

    Some more series that can be done in closed form::

        >>> hyper2d({'m':1,'n':1},{'m+n':1},x,y)
        2.013417124712514809623881
        >>> (exp(x)*x-exp(y)*y)/(x-y)
        2.013417124712514809623881

    Six of the 34 Horn functions, G1-G3 and H1-H3::

        >>> from mpmath import *
        >>> mp.dps = 10; mp.pretty = True
        >>> x, y = 0.0625, 0.125
        >>> a1,a2,b1,b2,c1,c2,d = 1.1,-1.2,-1.3,-1.4,1.5,-1.6,1.7
        >>> hyper2d({'m+n':a1,'n-m':b1,'m-n':b2},{},x,y)  # G1
        1.139090746
        >>> nsum(lambda m,n: rf(a1,m+n)*rf(b1,n-m)*rf(b2,m-n)*\
        ...     x**m*y**n/fac(m)/fac(n), [0,inf], [0,inf])
        1.139090746
        >>> hyper2d({'m':a1,'n':a2,'n-m':b1,'m-n':b2},{},x,y)  # G2
        0.9503682696
        >>> nsum(lambda m,n: rf(a1,m)*rf(a2,n)*rf(b1,n-m)*rf(b2,m-n)*\
        ...     x**m*y**n/fac(m)/fac(n), [0,inf], [0,inf])
        0.9503682696
        >>> hyper2d({'2n-m':a1,'2m-n':a2},{},x,y)  # G3
        1.029372029
        >>> nsum(lambda m,n: rf(a1,2*n-m)*rf(a2,2*m-n)*\
        ...     x**m*y**n/fac(m)/fac(n), [0,inf], [0,inf])
        1.029372029
        >>> hyper2d({'m-n':a1,'m+n':b1,'n':c1},{'m':d},x,y)  # H1
        -1.605331256
        >>> nsum(lambda m,n: rf(a1,m-n)*rf(b1,m+n)*rf(c1,n)/rf(d,m)*\
        ...     x**m*y**n/fac(m)/fac(n), [0,inf], [0,inf])
        -1.605331256
        >>> hyper2d({'m-n':a1,'m':b1,'n':[c1,c2]},{'m':d},x,y)  # H2
        -2.35405404
        >>> nsum(lambda m,n: rf(a1,m-n)*rf(b1,m)*rf(c1,n)*rf(c2,n)/rf(d,m)*\
        ...     x**m*y**n/fac(m)/fac(n), [0,inf], [0,inf])
        -2.35405404
        >>> hyper2d({'2m+n':a1,'n':b1},{'m+n':c1},x,y)  # H3
        0.974479074
        >>> nsum(lambda m,n: rf(a1,2*m+n)*rf(b1,n)/rf(c1,m+n)*\
        ...     x**m*y**n/fac(m)/fac(n), [0,inf], [0,inf])
        0.974479074

    **References**

    1. [SrivastavaKarlsson]_
    2. [Weisstein]_ http://mathworld.wolfram.com/HornFunction.html
    3. [Weisstein]_ http://mathworld.wolfram.com/AppellHypergeometricFunction.html

    c                    sD   |  |g }zt|}W n ty   |g}Y nw  fdd|D S )Nc                    r7   r*   r  )r4   r   r;   r*   r+   r5     r<   z*hyper2d.<locals>.parse.<locals>.<listcomp>)popr   	TypeError)Zdctkeyr   r;   r*   r+   parse  s   
zhyper2d.<locals>.parser   r&   r   zm-nzn-mz2m+nz2m-nz2n-mzunsupported key: %rr   r   rC   r1   r   c                       g | ]}|  qS r*   r*   r9   r   r*   r+   r5         zhyper2d.<locals>.<listcomp>c                    r/  r*   r*   r=   r0  r*   r+   r5     r1  r   r   r   r   r/   r\   zmaxterms exceeded in hyper2d)r^   dictrF   keysrI   r   r   rE   r   r   r   rM   r   r   )"r   r:   r>   r%   r#  rU   r.  r   r   Za_mZa_nZ	a_m_add_nZ	a_m_sub_nZ	a_n_sub_mZ
a_2m_add_nZ
a_2m_sub_nZ
a_2n_sub_mZb_mZb_nZ	b_m_add_nr   ZouterZok_countr   r   r   Z
inner_signZ
outer_signZinner_aZinner_bZouter_aZouter_binnerr   r*   )r   r   r+   r"  V  s    
	














&&


2	r"  c                    st   |  || }t|t|}|fdks|fdkr"| j S | d   fdd}| j||fi |S )a`  
    Evaluates the bilateral hypergeometric series

    .. math ::

        \,_AH_B(a_1, \ldots, a_k; b_1, \ldots, b_B; z) =
            \sum_{n=-\infty}^{\infty}
            \frac{(a_1)_n \ldots (a_A)_n}
                 {(b_1)_n \ldots (b_B)_n} \, z^n

    where, for direct convergence, `A = B` and `|z| = 1`, although a
    regularized sum exists more generally by considering the
    bilateral series as a sum of two ordinary hypergeometric
    functions. In order for the series to make sense, none of the
    parameters may be integers.

    **Examples**

    The value of `\,_2H_2` at `z = 1` is given by Dougall's formula::

        >>> from mpmath import *
        >>> mp.dps = 25; mp.pretty = True
        >>> a,b,c,d = 0.5, 1.5, 2.25, 3.25
        >>> bihyper([a,b],[c,d],1)
        -14.49118026212345786148847
        >>> gammaprod([c,d,1-a,1-b,c+d-a-b-1],[c-a,d-a,c-b,d-b])
        -14.49118026212345786148847

    The regularized function `\,_1H_0` can be expressed as the
    sum of one `\,_2F_0` function and one `\,_1F_1` function::

        >>> a = mpf(0.25)
        >>> z = mpf(0.75)
        >>> bihyper([a], [], z)
        (0.2454393389657273841385582 + 0.2454393389657273841385582j)
        >>> hyper([a,1],[],z) + (hyper([1],[1-a],-1/z)-1)
        (0.2454393389657273841385582 + 0.2454393389657273841385582j)
        >>> hyper([a,1],[],z) + hyper([1],[2-a],-1/z)/z/(a-1)
        (0.2454393389657273841385582 + 0.2454393389657273841385582j)

    **References**

    1. [Slater]_ (chapter 6: "Bilateral Series", pp. 180-189)
    2. [Wikipedia]_ http://en.wikipedia.org/wiki/Bilateral_hypergeometric_series

    )r   r   )r   r   r   c            	         s   t | d  }t | d  }dd |D }dd |D }d   gdd |D  dd |D  }dgdgt|  dgt|  }g g g g |dg |f}||g g |dg |d   f}||fS )Nc                 S      g | ]}d | qS r   r*   r=   r*   r*   r+   r5   ~  r1  z&bihyper.<locals>.h.<locals>.<listcomp>c                 S   r5  r6  r*   r9   r*   r*   r+   r5     r1  r   c                 S   r5  r   r*   r=   r*   r*   r+   r5     r1  c                 S   r5  r   r*   r9   r*   r*   r+   r5     r1  r   )r   rK   )	r   r   r   Zaa_sZbb_sZrpZrcr   r   negrl   r    r*   r+   rW   {  s   *" zbihyper.<locals>.h)r^   rK   rD   rZ   )r   r   r   r    rU   r   rm   rW   r*   r7  r+   bihyperD  s   
0

r9  )r   N)#Zlibmp.backendr   Z	functionsr   r   r,   rG   rZ   rM   rq   rs   rx   rz   r|   r~   r   r   rd   r`   rb   r   re   ri   rj   rf   rc   rg   rh   r  r!  r(  r)  r*  r"  r9  r*   r*   r*   r+   <module>   s~    / 
*









#
#6
O
 J
>
D
Q
Q
=


	

 g