B
    b‹drÉ  ã               @   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   s–  d }}d}g }xvt |ƒD ]h\}}	|	\}
}}}}}}d}x>t |
ƒD ]2\}}|sF|  || ¡dkrF|| rFd }}d}qFW dddg}x¼t |||gƒD ]ª\}}x t |ƒD ]”\}}|  |¡\}}|dkrÈq¨|| jkr&d}|dkrx(|D ] }|  |¡rè|t|ƒkrèd}P qèW |rq¨||  d7  < q¨|dk r¨|| 7 }d}q¨W q–W |rv|d |d |d  krv|sv| |¡ qt|ƒrd }}qW ||||fS )NFé    Tr   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*   úl/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/mpmath/functions/hypergeometric.pyÚ_check_need_perturb   sH    



 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<x4ˆ  j d7  _ ˆ j |kr˜tt|ˆ j f ƒ‚ˆ j }|	d d … }||Ž }|
rÚtƒ  tdƒ td	ˆ j ƒ td
|ƒ t	ˆ |||ƒ\}}}‰ˆ  j |7  _ |r–d|kr|d }n$ˆ j
r0tˆ j d ƒ}n|d | }ˆ  ˆ j| ¡}|d | d ˆ _ x6tt|ƒƒD ]&}||  |7  < |||d  7 }qlW |r¤||Ž }|rÀ‡fdd„t|ƒD ƒ}|sÌˆ jS g }x"t|ƒD ]\}}|\}}}}}} }!|
r€tƒ  td|d t|ƒt|ƒt| ƒf ƒ tdˆ  |¡ˆ  |¡ƒ tdˆ  |¡ˆ  |¡ƒ tdˆ  |¡ˆ  | ¡ƒ tdˆ  |!¡ƒ ˆ  ˆ j|| |!f|Žg‡ fdd„|D ƒ ‡ fdd„|D ƒ ‡ fdd„t||ƒD ƒ ¡}"|
rætd|"ƒ | |"¡ qÜW t|ƒdkr|s|d }P ˆ j
r(ˆ  |¡}P ˆ  |¡}‡ fdd„|D ƒ}#t|#ƒ}$ˆ  |¡}%|$|% }&|
rˆtƒ  td|&dƒ tdˆ j | dƒ |&ˆ j | k }'|d kr¦d}(n|$ˆ j  | k }(|d krÆd})n|$|k})|'rÚ|ræˆ  |&¡rêP qn|'rh|d kr
|d7 }|}qnn\ˆ  || ¡ˆ  |¡| kr,P n:|(r<ˆ j}P n*|)rLˆ j}P nd|krZP n|d9 }|}qntt|&|d ƒt||ƒƒ}*ˆ  j |*7  _ |
rntdƒ qnqnW W d |ˆ _ X |
 S ) NÚverboseFÚmaxprecÚzeroprecÚinfprecr   é
   zENTERING hypercomb main loopzprec =ÚhextraÚhmagg333333Ó?r   c                s   g | ]\}}|ˆ kr|‘qS r*   r*   )Ú.0r$   r   )r   r*   r+   ú
<listcomp>k   s    zhypercomb.<locals>.<listcomp>z  Evaluating term %i/%i : %iF%iz
    powersz	    gammaz	    hyperz    zc                s   g | ]}ˆ   |¡‘qS r*   )Úgamma)r4   Úa)r   r*   r+   r5   ~   s    c                s   g | ]}ˆ   |¡‘qS r*   )Zrgamma)r4   Úb)r   r*   r+   r5      s    c                s   g | ]\}}ˆ   ||¡‘qS r*   )Úpower)r4   r"   Úc)r   r*   r+   r5   €   s    z
    Value:c                s   g | ]}ˆ   |¡‘qS r*   )Úmag)r4   r%   )r   r*   r+   r5   Ž   s    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   ÚldexpÚoneÚrangeÚlenr   ÚnstrZfprodÚhyperÚzipr   ÚfsumÚmaxr;   ÚisnanÚinfÚmin)+r   ÚfunctionÚparamsr   ÚkwargsÚorigZsumvalueÚ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_okÚ	incrementr*   )r   r   r+   Ú	hypercomb:   sÜ    





 6








rX   c                sJ  ˆ   |¡}t|ƒ}t|ƒ}‡ fdd„|D ƒ}‡ fdd„|D ƒ}| dd¡r¼| dd¡}d}x`||k rº|rº|| }	|	|kr°|sŠˆ  |	d ¡s°| |	¡ | |	¡ |d	8 }|d	8 }q\|d	7 }q\W |dkrò|d	krÜˆ j||f|ŽS |dkrîˆ  |¡S n2|d	krT|d	krˆ j|||f|ŽS |d
kr4ˆ j|||f|ŽS |dkr$ˆ  	|d d |¡S nÐ|d
krÐ|d	krzˆ j
|||f|ŽS |d
kr–ˆ j|||f|ŽS |dkr²ˆ j|||f|ŽS |dkr$ˆ j|||f|ŽS nT||d	 krôˆ j|||||f|ŽS ||d	 kr$| d¡s$ˆ j|||||f|ŽS t|| Ž \}
}ˆ j||||
|f|ŽS )z0
    Hypergeometric function, general case.
    c                s   g | ]}ˆ   |¡‘qS r*   )Ú_convert_param)r4   r7   )r   r*   r+   r5   Ê   s    zhyper.<locals>.<listcomp>c                s   g | ]}ˆ   |¡‘qS r*   )rY   )r4   r8   )r   r*   r+   r5   Ë   s    Z	eliminateTZeliminate_allFr   r   r   é   Úforce_series)ÚconvertrF   r?   r   ÚremoveÚ_hyp0f1ÚexpÚ_hyp1f1Ú_hyp1f2Ú_hyp1f0Ú_hyp2f1Ú_hyp2f2Ú_hyp2f3Ú_hyp2f0Ú_hypq1fqÚ
_hyp_borelrI   Úhypsum)r   r   r   r    rQ   ÚpÚqZelim_nonpositiver$   r8   ZcoeffsÚtypesr*   )r   r+   rH   Â   sV    



  

 
 
 

 
 
 
 rH   c             K   s   | j g |g|f|ŽS )N)rH   )r   r8   r    rQ   r*   r*   r+   Úhyp0f1í   s    rm   c             K   s   | j |g|g|f|ŽS )N)rH   )r   r7   r8   r    rQ   r*   r*   r+   Úhyp1f1ñ   s    rn   c             K   s   | j |g||g|f|ŽS )N)rH   )r   Úa1Úb1Úb2r    rQ   r*   r*   r+   Úhyp1f2õ   s    rr   c             K   s   | j ||g|g|f|ŽS )N)rH   )r   r7   r8   r:   r    rQ   r*   r*   r+   Úhyp2f1ù   s    rs   c             K   s   | j ||g||g|f|ŽS )N)rH   )r   ro   Úa2rp   rq   r    rQ   r*   r*   r+   Úhyp2f2ý   s    ru   c             K   s   | j ||g|||g|f|ŽS )N)rH   )r   ro   rt   rp   rq   Úb3r    rQ   r*   r*   r+   Úhyp2f3  s    rw   c             K   s   | j ||gg |f|ŽS )N)rH   )r   r7   r8   r    rQ   r*   r*   r+   Úhyp2f0  s    rx   c             K   s   | j |||g||g|f|ŽS )N)rH   )r   ro   rt   Úa3rp   rq   r    rQ   r*   r*   r+   Úhyp3f2	  s    rz   c             C   s   d| |  S )Nr   r*   )r   r7   r    r*   r*   r+   rb     s    rb   c       	         sî   |\\‰ }ˆrˆ  ˆ¡}nd}|dkrÔ| d¡sÔyŒˆj}zXˆ jd|d  7  _‡ ‡‡fdd„}ˆj|g dd	}ˆ ˆ ¡dˆ ˆj¡  | }W d |ˆ_X ˆ ˆ ¡r¸ˆ ˆ¡r¸ˆ |¡}|
 S  ˆj	k
rÒ   Y nX ˆj
dd
|fˆ gˆf|Ž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_2r_   Zmpq_3_2)r"   Zjwr)   r:   ÚEÚT1ÚT2)r8   r   r    r*   r+   rT   !  s    

.*z_hyp0f1.<locals>.hT)r[   r   )r;   r?   r   rX   r6   r   ÚpiÚ_is_real_typeÚ_reÚNoConvergenceri   )	r   r   r    rQ   ÚbtypeÚmagzrR   rT   rU   r*   )r8   r   r    r+   r^     s&    
	"
r^   c          	      sd  |\\}}|\\}}ˆs"ˆ j ˆ S ˆ  ˆ¡}	|	dkrBˆ  |¡rPˆ  |¡dksBˆ  ˆ¡ržˆ  |¡ˆ  |¡  krŠˆ  ˆ¡  krŠdkr”n nˆ jS ˆ jˆ S z’ytˆ  j|	7  _ˆ  	ˆ¡dk ‰‡ ‡‡fdd„}
ˆ j
|
||gdd}ˆ  |¡rˆ  |¡rˆ  ˆ¡rˆ  |¡}|
 S  ˆ jk
r,   Y nX W d ˆ  j|	8  _X ˆ jdd||f||gˆf|Ž}|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Úfnegr_   )r7   r8   r‚   Úrzrƒ   r„   )r   Úsectorr    r*   r+   rT   E  s    
24z_hyp1f1.<locals>.hT)r[   )rD   r;   Úisintr	   ÚisinfÚsignrM   Únanr   Z_imrX   r†   r‡   rˆ   ri   )r   r   r   r    rQ   r7   Úatyper8   r‰   rŠ   rT   rU   r*   )r   r   r    r+   r`   5  s0    



$
4
	$

r`   c       %      K   sô  ||||f\}}}}	| j }
| dd|
 ¡}d}x¾|
| | _ |  |	¡}|  d¡}|  d¡}|  d¡}d}|| | }|| j }|d | j }d| }|| }|| | }|| | }|d }| j  d }| j}| j}| j}| j}xÚ|| }|| ||  | d|d  | ||   }|||| | |   } ||| || |   }!|||| ||  |  |  d| |  }"|| |" }#t	|||#ƒƒ}||#| ƒ|k r P | |!|#  }}}|d7 }qâW |||#ƒ }$|$|k rÖP q2||$7 }||kr2| j
‚q2W |#S )Nr.   éd   r1   r   r   r   r}   )r   r?   r\   Úmpfr   rG   Únprintr;   r   rK   rˆ   )%r   r7   r8   r:   r    rQ   Ú_aÚ_bZ_cZ_zrR   r.   Úextrar'   ÚeÚfr!   ZabzÚchZc1hZnzÚgZabgZcbaZz2ÚtolrG   r—   r;   ZmaxmagZkchZkakbzZd1Úe1ÚftÚf1rV   r*   r*   r+   Ú_hyp2f1_gosperY  sV    





,,

r£   c                sú  |\\}}\}}|\\‰ }	ˆdkr
ˆ  ˆ | | ¡dk}
ˆ |¡rL|dkp\ˆ |¡o\|dk}ˆ ˆ ¡o´ˆ dko´ˆ |¡r’ˆ |  koŒdkn  p²ˆ |¡o²ˆ |  ko®dkn   }|
s¾|rê|sêˆjˆ ˆ | | gˆ | ˆ | gddS ˆ ||ˆ dˆjd  ¡ˆj S ˆs8ˆ s*|dks*|dkr2dˆ S ˆjS ˆ ˆ ¡r¤ˆ dkr¤ˆ |¡rtˆ |  krrdks¤n ˆ |¡ržˆ |  kr˜dkržn n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|ŽS ˆj	}zÌˆ j	d7  _	|d	kr^‡ ‡‡fd
d„}ˆj
|||gf|Ž}nŠtdˆ ƒdkr”‡ ‡fdd„}ˆj
|||gf|Ž}nTtˆˆd  ƒdkrÔˆ |ˆ | ˆ ˆˆd  ¡dˆ |  }ntˆ||ˆ ˆf|Ž}W d |ˆ_	X |
 S )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 )Nr   )Zmpq_1)r7   r8   ÚtÚabrŽ   rƒ   r„   )r:   r   r    r*   r+   rT   Ã  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 )Nr   r*   )r7   r8   r¤   ÚcaÚcbrŽ   rƒ   r„   )r:   r    r*   r+   rT   Ì  s       $0)r	   r   Ú	gammaprodrs   ÚepsrM   r“   Úabsri   r   rX   r£   )r   r   r   r    rQ   r7   r”   r8   r‰   ÚctypeZ
convergentZfiniteZzerodivÚabszrR   rT   rU   r*   )r:   r   r    r+   rc     sJ    

$F( &(* "
*rc   c          
      s¤  t ˆŽ \‰}t ˆŽ \‰}tˆƒ‰tˆƒ‰tˆƒ}	d}
x$ˆD ]}ˆ |¡r:|dkr:d}
P q:W |	dk sf|
rªyˆjˆ	ˆ
|| ˆˆ ˆf|ŽS  ˆjk
r¨   |	dks¢|
r¤‚ Y nX ˆdkrèˆ tˆƒtˆƒ ¡}|dkrèˆjˆˆdf|Žˆj	 S ˆ	ˆ
fdkrÌtˆd ƒdk rÌˆ\‰ ‰‰ˆ\‰‰ˆˆ ˆ }ˆ 
ˆˆ ˆˆ ˆ ˆgˆˆ ˆˆ d|g¡}d|if‡ ‡‡‡‡‡‡fd	d
„	‰y@ˆjˆdˆj	g| d¡| dd¡d}|ˆ 
ˆˆgˆ ˆˆg¡ S  ˆjk
rÊ   Y nX |	dk r~ˆ ˆ¡dkr~dˆjif‡‡‡‡	‡
‡‡fdd
„	‰| dd¡}y0ˆjˆdˆj	g| d¡| dd¡| dd¡dS  ˆjk
rh   d|krd‚ Y nX | d¡r~tdƒ ‡‡‡‡fdd„‰‡‡‡‡fdd„}ˆjd }ˆj}z¼dˆj }ˆ jd7  _xžtdƒD ]’}ˆ ‡fdd„t|ƒD ƒ¡}ˆjˆ|ˆj	g|||ƒ| d¡ddd\}}||k r6|| }P |d 9 }ˆ jˆjd  7  _|d!krÖˆ d"¡‚qÖW W d#|ˆ_X |
 S ‡‡	‡
‡fd$d%„}ˆj|ˆˆ f|ŽS )&z&
    Evaluates 3F2, 4F3, 5F4, ...
    Fr   Tr   gš™™™™™ñ?gÍÌÌÌÌÌì?)rZ   r   gš™™™™™©?c                s~   ˆˆ ˆ |  }| |kr"||  }nH|| d  }|ˆ|  ˆ d ˆ|  ˆ d  9 }|| |d   }||| < |ˆ  ˆ ˆ|ˆ¡ S )Nr   )rs   )r!   Ú_cacher)   r¤   )ro   rt   ry   rp   rq   r   r    r*   r+   r     s    
$z_hypq1fq.<locals>.termr-   Ústrict)r-   r®   c                sì   t | ƒ}|| krhˆˆ | ¡ ˆ | ¡ }xˆ D ]}|ˆ || ¡9 }q.W xˆD ]}|ˆ || ¡ }qLW |S ||krx|| S ˆ|d ƒ}|d }x tˆƒD ]}|ˆ | | 9 }q–W x tˆƒD ]}|ˆ| |  }q¸W |ˆ9 }|| }|||< |S )Nr   )r   r–   ZfacÚrfr   )Úkkr­   r!   r¤   r7   r8   Úmr€   )r   r   r   rj   rk   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‰ x\t ‡‡ ‡fdd„ˆD ƒƒt ‡‡ ‡fdd„|D ƒƒ }ˆ dkrš|ˆ ˆ¡7 }|V  ˆ d7 ‰ qPW d S )Nr   c             3   s   | ]}ˆ   |ˆ ¡V  qd S )N)Úloggamma)r4   r7   )r   Úk0r*   r+   ú	<genexpr>i  s    z._hypq1fq.<locals>.log_diffs.<locals>.<genexpr>c             3   s   | ]}ˆ   |ˆ ¡V  qd S )N)rµ   )r4   r8   )r   r¶   r*   r+   r·   j  s    r   c             3   s   | ]}ˆ   ˆ|ˆ ¡V  qd S )N)Úpsi)r4   r7   )r   r$   r¶   r*   r+   r·   m  s    c             3   s   | ]}ˆ   ˆ|ˆ ¡V  qd S )N)r¸   )r4   r8   )r   r$   r¶   r*   r+   r·   n  s    )r   Úlog)r¶   rq   rU   )r   r   r   r    )r$   r¶   r+   Ú	log_diffsg  s    
@z_hypq1fq.<locals>.log_diffsc             3   sJ   ˆ  dd„ ˆD ƒdd„ ˆ D ƒ¡}x$ˆ ˆ| ƒ¡D ]}|| }|V  q0W d S )Nc             S   s   g | ]}|‘qS r*   r*   )r4   r8   r*   r*   r+   r5   u  s    z1_hypq1fq.<locals>.hyper_diffs.<locals>.<listcomp>c             S   s   g | ]}|‘qS r*   r*   )r4   r7   r*   r*   r+   r5   u  s    )r¨   Z	diffs_exp)r¶   ÚCr'   rU   )r   r   r   rº   r*   r+   Úhyper_diffst  s     z_hypq1fq.<locals>.hyper_diffsi   é2   r=   é   c             3   s   | ]}ˆ |ƒV  qd S )Nr*   )r4   r!   )r   r*   r+   r·   €  s    z_hypq1fq.<locals>.<genexpr>)rŸ   Zadiffsr-   ÚerrorZ_fast_abortr   r}   z*Euler-Maclaurin summation did not convergeNc        
   
      s  t | d ˆ… ƒ‰ t | ˆd … ƒ‰g }ˆjˆ }ˆjˆdd}xÂtˆd ƒD ]²‰ˆ ˆ ‰|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¡ qJW |S )	NT)rŒ   r   c                s    g | ]}|ˆkrˆ | ˆ ‘qS r*   r*   )r4   r€   )r   Úakr!   r*   r+   r5   ¡  s    z'_hypq1fq.<locals>.h.<locals>.<listcomp>c                s   g | ]}ˆ| ˆ  ‘qS r*   r*   )r4   r€   )rÀ   r   r*   r+   r5   ¢  s    c                s   g | ]}ˆ ˆ|  d  ‘qS )r   r*   )r4   r€   )rÀ   r   r*   r+   r5   £  s    c                s$   g | ]}|ˆkrd ˆ |  ˆ ‘qS )r   r*   )r4   r€   )r   rÀ   r!   r*   r+   r5   ¤  s    )ÚlistrD   r   rE   r   )
ÚargsZTsZreczZnegzr»   ZCpZGnZGdZFnZFd)r   rj   rk   r    )r   rÀ   r   r!   r+   rT   —  s    
(z_hypq1fq.<locals>.h)rI   rÁ   rª   r   ri   rˆ   r	   r   rH   rM   r¨   Znsumr?   r‡   rD   ÚreplacerB   r©   r   Zdpsr   rJ   ZsumemrX   )r   rj   rk   r   r   r    rQ   Úa_typesÚb_typesr¬   Zispolyr7   ÚSr)   Úinitialr²   r¼   rŸ   r   Útruncr$   ÚheadÚtailÚerrrU   rT   r*   )ro   rt   ry   r   rp   rq   r   r   rº   rj   rk   r   r    r+   rg   ß  sŽ    
 
, 
"

"



rg   c                s
  ˆ rt ˆ Ž \‰ }tˆ ƒ‰ n
g d ‰ }ˆr>t ˆŽ \‰}tˆƒ‰n
g d ‰}| dˆj¡|d< yˆj|||| ˆ ˆ ˆf|ŽS  ˆjk
rŽ   Y nX ˆj}	z|| dˆjd ¡}
ˆ jd7  _dˆjif‡ ‡‡‡fdd„	‰ˆj}x4td	ˆjƒD ]$}ˆ|ƒ}||7 }t	|ƒ|
krè|S qèW W d |	ˆ_X ||d
 kr | d¡}|sªˆ 
ˆ¡dk r ˆtd	t	ˆƒƒ }ˆ 
ˆ¡dkr†d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‚d S )Nr*   ÚmaxtermsZ	asymp_tolr}   r1   r   c                st   | |kr||  S ˆ| d ƒ}xˆ D ]}||| d  9 }q"W xˆD ]}||| d   }q@W |ˆ9 }||  }||| < |S )Nr   r*   )r!   Úcacher¤   r7   r8   )r   r   r   r    r*   r+   r   ¿  s    
 
 z_hyp_borel.<locals>.termr   rZ   Úcontourg      Ð?y               @y       @       @r   y       €       Ày       @       ÀÚquad_kwargsc                s$   ˆ  |  ¡ˆ ˆ ˆdg | ˆ ¡ S )Nr   )r_   rH   )r¤   )r   r   r   r    r*   r+   rž   à  s    z_hyp_borel.<locals>.gr¿   Tr{   )rI   rÁ   r?   r   ri   rˆ   r©   rD   r   rª   ÚargrK   rM   Úquad)r   rj   rk   r   r   r    rQ   rÄ   rÅ   r   rŸ   Úsr!   r¤   rÎ   r)   rÏ   rž   ÚIrË   r*   )r   r   r   r   r    r+   rh   ©  sP    






rh   c                s  |\\}}\}}|\\}	}
\}}t ˆƒ}ˆ  ˆ¡}ˆ j}|}| d¡ oTˆ  |¡dk}|rîzŠynˆ  j|7  _‡ ‡fdd„}ˆ j||||	|gddˆ j d}t‡ fdd	„|||	|ˆgD ƒƒd
krÈˆ  |¡}|S  ˆ jk
rà   Y nX W d |ˆ _X ˆ jdd|||
|f|||	|gˆf|ŽS )Nr[   rZ   c                st  | | | | }| | }|| }i }ˆ j |d< |d | ||  | |  |d< d}d}	d}
x.|	|kr&d| d|   | d  d|  |d  ||  | |  ||  d| d|d   |	  d|	d   }|	| | d |	| | d  |	| d  }ˆ j |	 |||	d   |||	d     ||	< ||	 ˆ|	   }t|ƒdˆ j k rNP |	dkrtt|
ƒt|ƒ dk rtˆ j‚||7 }|}
|	d7 }	q^W ˆ  ˆ¡| }ˆ|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   rZ   gš™™™™™¹?r¾   g      ø?r~   )rD   rª   r©   rˆ   r_   )ro   rt   rp   rq   ÚXÚA2ZB2r:   Ús1r!   ÚtprevÚuu1Úuu2Út1rÆ   rƒ   r„   ÚT3)r   r    r*   r+   rT     s6    
 
d,. "VXz_hyp2f2.<locals>.hTr}   )r[   rÌ   c             3   s   | ]}ˆ   |¡V  qd S )N)r†   )r4   r)   )r   r*   r+   r·   !  s    z_hyp2f2.<locals>.<genexpr>r¾   r   )	rª   r;   r   r?   rX   r   r	   rˆ   ri   )r   r   r   r    rQ   ro   Úa1typert   Úa2typerp   Úb1typerq   Úb2typer¬   rŠ   rR   Úasymp_extraprecÚcan_use_asymptoticrT   rU   r*   )r   r    r+   rd   è  s*    
 $

rd   c                s"  |\\}}|\\}}\}	}
t ˆƒ}ˆ  ˆ¡}ˆ j}ˆo<|d }| d¡ ohˆ  |¡dkohˆ  |¡d| k}|r z†yjˆ  j|7  _‡ ‡fdd„}ˆ j||||	gddˆ j d	}t‡ fd
d„|||	ˆgD ƒƒdkrÚˆ  |¡}|S  ˆ jk
rò   Y nX W d |ˆ _X ˆ j	dd|||
f|||	gˆf|ŽS )Nr   r[   é   g      ø?c                sX  ˆ 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}xŽ||kräd|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 rNP |dkrtt|ƒt|ƒ dk rtˆ j
‚||7 }||7 }|}|d7 }qW ˆ  ˆ 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   rZ   r   iðÿÿÿr}   iøÿÿÿé   iúÿÿÿg      à¿gš™™™™™¹?r¾   g      ø?g      à?)r   rD   Úmpq_1_4Úmpq_3_16Úmpq_1_16Zmpq_5_2r€   r–   rª   r©   rˆ   Úexpjr…   r   )ro   rp   rq   rÔ   r:   rÖ   Ús2r!   r×   rØ   rÙ   r"   rÚ   Út2rÆ   rƒ   r„   )r   r    r*   r+   rT   I  sF    
<:T
^*2  "("
 $z_hyp1f2.<locals>.hTr}   )r[   rÌ   c             3   s   | ]}ˆ   |¡V  qd S )N)r†   )r4   r)   )r   r*   r+   r·   r  s    z_hyp1f2.<locals>.<genexpr>r   )
rª   r;   r   r?   r   rX   r   r	   rˆ   ri   )r   r   r   r    rQ   ro   rÜ   rp   rÞ   rq   rß   r¬   rŠ   rR   rà   rá   rT   rU   r*   )r   r    r+   ra   -  s,    

("

ra   c          	      s@  |\\}}\}}|\\}	}
\}}\}}t ˆƒ}ˆ  ˆ¡}ˆoB|d }ˆ j}| d¡ otˆ  |¡dkotˆ  |¡d| k}|rzyrˆ  j|7  _‡ ‡fdd„}ˆ j||||	||gddˆ j d	}t‡ fd
d„|||	||ˆgD ƒƒdkrîˆ  |¡}|S  ˆ jk
r   Y nX W d |ˆ _X ˆ j	dd|||
||f|||	||gˆf|ŽS )Nr   r[   râ   g      ø?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}xJ||k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 r(P |dkrNt|ƒt|ƒ dk rNˆ j
‚||7 }||7 }|}|d7 }q&W ˆ  ˆ 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   rZ   r   iðÿÿÿé    r}   iøÿÿÿrã   r{   é   é   r|   r¾   iöÿÿÿg      à¿gš™™™™™¹?g      ø?g      à?)r   rD   rä   rå   ræ   r9   r€   r–   rª   r©   rˆ   rç   r…   r   )ro   rt   rp   rq   rv   rÔ   rÕ   ZB3ÚAÚBÚRr:   rÖ   rè   r!   r×   rØ   rÙ   Zuu3r"   rÚ   ré   rÆ   rƒ   r„   rÛ   )r   r    r*   r+   rT   ˜  sT     
4\
>°@B  "(&
080:z_hyp2f3.<locals>.hTr}   )r[   rÌ   c             3   s   | ]}ˆ   |¡V  qd S )N)r†   )r4   r)   )r   r*   r+   r·   Ç  s    z_hyp2f3.<locals>.<genexpr>rë   rZ   )
rª   r;   r   r?   r   rX   r   r	   rˆ   ri   )r   r   r   r    rQ   ro   rÜ   rt   rÝ   rp   rÞ   rq   rß   rv   Zb3typer¬   rŠ   rà   rR   rá   rT   rU   r*   )r   r    r+   re     s*    
 ."&

re   c                s–   |\\}}\}}y8|  ¡ }	|	 dˆ j¡|	d< ˆ jdd||f||gˆf|	ŽS  ˆ jk
rj   | d¡rf‚ Y nX ‡ ‡fdd„}
ˆ j|
|d| | gf|Ž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…   )r7   r8   r"   rŽ   rƒ   r„   )r   r    r*   r+   rT   Þ  s
    
0Bz_hyp2f0.<locals>.hr   )Úcopyr?   r   ri   rˆ   rX   )r   r   r   r    rQ   r7   r”   r8   r‰   ZkwargsbrT   r*   )r   r    r+   rf   Ñ  s    
rf   Nc                s*  |\}}|\}	}
t |ƒ‰ˆt |ƒ ‰t |	ƒ‰ˆt |
ƒ ‰|| }|	|
 }‡ fdd„|D ƒ}‡ fdd„|D ƒ}ˆ  ˆ¡‰|d krÀˆˆk rŠd}ˆˆkr–d}ˆˆkrÀˆˆ ˆkr¼tˆƒdkr¼d}nd}| d¡rÜtdˆˆˆˆ|ƒ |dkrþ‡ ‡‡‡‡‡‡fdd	„}n‡ ‡‡‡‡‡‡fd
d	„}ˆ j||| f|ŽS )Nc                s   g | ]}ˆ   |¡‘qS r*   )r\   )r4   Ú_)r   r*   r+   r5   ð  s    zmeijerg.<locals>.<listcomp>c                s   g | ]}ˆ   |¡‘qS r*   )r\   )r4   rñ   )r   r*   r+   r5   ñ  s    r   r   r-   zMeijer G m,n,p,q,series =c        	   
      s$  | d ˆ… ‰ | ˆd … ‰g }x t ˆƒD ]ô‰ˆ	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(W |S )Nc                s$   g | ]}|ˆkrˆ | ˆ ˆ  ‘qS r*   r*   )r4   r€   )r8   r!   r*   r+   r5     s    z&meijerg.<locals>.h.<locals>.<listcomp>c                s    g | ]}d ˆ |  ˆˆ  ‘qS )r   r*   )r4   r€   )r7   r8   r!   r*   r+   r5     s    c                s   g | ]}ˆ | ˆˆ  ‘qS r*   r*   )r4   r€   )r7   r8   r!   r*   r+   r5     s    c                s    g | ]}d ˆ |  ˆ ˆ  ‘qS )r   r*   )r4   r€   )r8   r!   r*   r+   r5     s    c                s    g | ]}d ˆ |  ˆˆ  ‘qS )r   r*   )r4   r€   )r7   r8   r!   r*   r+   r5   	  s    c                s(   g | ] }|ˆkrd ˆ |  ˆ ˆ  ‘qS )r   r*   )r4   r€   )r8   r!   r*   r+   r5   
  s    )rE   rD   r   )	rÂ   r   ÚbasesÚexptsÚgnÚgdÚhnÚhdÚhz)r   r±   r&   rj   rk   Úrr    )r7   r8   r!   r+   rT   þ  s    "zmeijerg.<locals>.hc        	   
      sH  | d ˆ… ‰ | ˆd … ‰g }x$t ˆƒD ]‰ˆ	g}ˆdkrLˆ ˆ 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(W |S )	Nr   c                s$   g | ]}|ˆkrˆ ˆ ˆ |  ‘qS r*   r*   )r4   r€   )r7   r!   r*   r+   r5     s    z&meijerg.<locals>.h.<locals>.<listcomp>c                s    g | ]}d ˆ ˆ  ˆ|  ‘qS )r   r*   )r4   r€   )r7   r8   r!   r*   r+   r5     s    c                s   g | ]}ˆ ˆ ˆ|  ‘qS r*   r*   )r4   r€   )r7   r8   r!   r*   r+   r5     s    c                s    g | ]}d ˆ ˆ  ˆ |  ‘qS )r   r*   )r4   r€   )r7   r!   r*   r+   r5     s    c                s    g | ]}d ˆ ˆ  ˆ|  ‘qS )r   r*   )r4   r€   )r7   r8   r!   r*   r+   r5     s    c                s(   g | ] }|ˆkrd ˆ |  ˆ ˆ  ‘qS )r   r*   )r4   r€   )r7   r!   r*   r+   r5     s    )rE   r\   rD   r   )	rÂ   r   rò   ró   rô   rõ   rö   r÷   rø   )r   r±   r&   rj   rk   rù   r    )r7   r8   r!   r+   rT     s"    ")rF   r\   rª   r?   rB   rX   )r   r   r   r    rù   ZseriesrQ   ÚanZapZbmÚbqr7   r8   rT   r*   )r   r±   r&   rj   rk   rù   r    r+   Úmeijergæ  s4    
  
rü   c       
      K   sú   t |ƒt |ƒkr$|| }}|| }}dd„ }|  |¡r8nš|  |¡rDnŽ|  |¡rd||||f\}}}}nn||ƒsÒ|| |d  }	||	ƒsŒtdƒ‚d| |  d| || |   | j|| ||| | ||	|f|Ž S | j|g|g|gdœd|gi||f|ŽS )Nc             S   s   t | ƒdk S )Ng®Gáz®ï?)rª   )r%   r*   r*   r+   r(   +  s    zappellf1.<locals>.okr   z%Analytic continuation not implemented)zm+nr±   r&   zm+n)rª   r   r@   Úappellf1Úhyper2d)
r   r7   rp   rq   r:   r%   ÚyrQ   r(   Úu1r*   r*   r+   rý   $  s"    




 &rý   c       	      K   s,   | j |g|g|gdœ|g|gdœ||f|ŽS )N)zm+nr±   r&   )r±   r&   )rþ   )	r   r7   rp   rq   Úc1Úc2r%   rÿ   rQ   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|ŽS )N)r±   r&   zm+n)r   rª   rþ   )r   ro   rt   rp   rq   r:   r%   rÿ   rQ   Zouter_polynomialZinner_polynomialr*   r*   r+   Úappellf3G  s    
r  c             K   s&   | j d||gi|g|gdœ||f|ŽS )Nzm+n)r±   r&   )rþ   )r   r7   r8   r  r  r%   rÿ   rQ   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  ƒ‚|rÎtd| ¡ d  ƒ‚d}ˆ j}ˆ  d¡‰d}ˆ j}| dd| ¡}zÎˆ  jd7  _ˆ j
 }x°d}d}t	|
ƒ}t	|ƒ}‡fdd„|	D ƒ}‡fdd„|D ƒ}x*|D ]"}|ˆ }| 
|¡ | 
|¡ q\W x*|D ]"}|ˆ }| 
|¡ | 
|¡ qˆW x.|D ]&}| 
|ˆ ¡ | 
|ˆ d ¡ q´W xD|D ]<}|d9 }|dˆ 9 }| 
d| ˆ ¡ | 
| ˆ ¡ qäW xB|D ]:}| 
|dˆ  ¡ | 
|dˆ  d| dˆ   ¡ q*W xN|D ]F}|d9 }| 
d| dˆ  ¡ | 
|dˆ  d| dˆ   ¡ qnW xP|D ]H}|d9 }| 
d|ˆ  ¡ | 
d|ˆ d  ¡ | 
|ˆ d ¡ q¾W ˆ j|||| fdˆ ji|—Ž} ||  | }!t|!ƒ|k rN|d7 }nd}|dksb|sdP ||!7 }x|D ]}||9 }qrW x|D ]}|| }qŠW ˆd7 ‰|| ˆ }ˆ|krˆ  d¡‚qW W d|ˆ _X |
 S )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                sF   |   |g ¡}yt|ƒ}W n tk
r2   |g}Y nX ‡ fdd„|D ƒS )Nc                s   g | ]}ˆ   |¡‘qS r*   )r\   )r4   rÐ   )r   r*   r+   r5   æ  s    z*hyper2d.<locals>.parse.<locals>.<listcomp>)ÚpoprÁ   Ú	TypeError)ÚdctÚkeyrÂ   )r   r*   r+   Úparseà  s    zhyper2d.<locals>.parser±   r&   zm+nzm-nzn-mz2m+nz2m-nz2n-mzunsupported key: %rr   rÌ   r=   r1   r   c                s   g | ]}|ˆ  ‘qS r*   r*   )r4   r7   )r±   r*   r+   r5     s    zhyper2d.<locals>.<listcomp>c                s   g | ]}|ˆ  ‘qS r*   r*   )r4   r8   )r±   r*   r+   r5     s    r~   r   r}   g      à?r/   rZ   zmaxterms exceeded in hyper2dN)r\   Údictr@   ÚkeysrD   r–   r   r?   r©   rÁ   r   rH   rª   rˆ   )"r   r7   r8   r%   rÿ   rQ   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Ò   Ú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¨     	












  







(
(


 
 
rþ   c                sp   |   ˆ¡‰|| }t|ƒ‰t|ƒ}ˆ|fdks:ˆ|fdkrD| jˆ S ˆ| d ‰ ‡ ‡‡fdd„}| j||f|Ž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   s   g | ]}d | ‘qS )r   r*   )r4   r8   r*   r*   r+   r5   ~  s    z&bihyper.<locals>.h.<locals>.<listcomp>c             S   s   g | ]}d | ‘qS )r   r*   )r4   r7   r*   r*   r+   r5     s    r~   c             S   s   g | ]}d | ‘qS )r   r*   )r4   r8   r*   r*   r+   r5   €  s    c             S   s   g | ]}d | ‘qS )r   r*   )r4   r7   r*   r*   r+   r5   €  s    r   )rÁ   rF   )	r   r   r   Zaa_sZbb_sÚrpÚrcrƒ   r„   )Únegrj   r    r*   r+   rT   {  s    *" zbihyper.<locals>.h)r\   rF   r>   rX   )r   r   r   r    rQ   r   rk   rT   r*   )r  rj   r    r+   ÚbihyperD  s    0


r  )r   N)#Zlibmp.backendr   Z	functionsr   r   r,   rA   rX   rH   rm   rn   rr   rs   ru   rw   rx   rz   rb   r^   r`   r£   rc   rg   rh   rd   ra   re   rf   rü   rý   r  r  r  rþ   r  r*   r*   r*   r+   Ú<module>   sH   4 +$$6P K?ERR=
 o