a
    ¬<brÉ  ć                   @   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 }t |D ]V\}}	|	\}
}}}}}}d}t |
D ]2\}}|s@|  || ”dkr@|| r@d }}d}q@g d¢}t |||gD ]¢\}}t |D ]\}}|  |”\}}|dkrŗq|| jkrd}|dkrś|D ]"}|  |”rÖ|t|krÖd} qśqÖ|rq||  d7  < q|dk r|| 7 }d}qq|r`|d |d |d  kr`|s`| |” qt|rd }}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*   śo/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/site-packages/mpmath/functions/hypergeometric.pyŚ_check_need_perturb   sJ    
 ’
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}zL  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|v r|d }n$ j
r,t j d }n|d | }   j| ”}|d | d  _ tt|D ]&}||  |7  < |||d  7 }qf|r|| }|røfddt|D }|sĢ jW | _ S g }t|D ]\}}|\}}}}}} }!|
r|t  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  ”}"|
rętd|" | |"” qŲt|dkr|s|d }q¬ j
r*  |”}q¬  |”} fdd|D }#t|#}$  |”}%|$|% }&|
rt  td|&d td j | d |& j | k }'|d u rØd}(n|$ j  | k }(|d u rČd})n|$|k})|'rÜ|r¬  |&”rīq¬qj|'rt|d u r|d7 }|}qjnd  || ”  |”| kr2q¬n@|(rD j}q¬n.|)rV j}q¬nd|v rfq¬n|d9 }|}qjtt|&|d t||}*  j |*7  _ |
rjtd qjqjW | _ n| _ 0 |
 S ) NŚverboseFŚmaxprecŚzeroprecŚinfprecr   é
   zENTERING hypercomb main loopzprec =ŚhextraŚhmagg333333Ó?r   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                    s   g | ]}   |”qS r*   )Śgamma©r4   Śa©r   r*   r+   r5   ~   r6   c                    s   g | ]}   |”qS r*   )Zrgamma©r4   Śbr:   r*   r+   r5      r6   c                    s   g | ]\}}   ||”qS r*   )Śpower)r4   r"   Ścr:   r*   r+   r5      r6   z
    Value:c                    s   g | ]}   |”qS r*   )Śmag)r4   r%   r:   r*   r+   r5      r6   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ģ    



’


R®’’žż






’
r\   c                    sn     |”}t|}t|} fdd|D } fdd|D }| dd”rø| dd”}d}||k rø|rø|| }	|	|v r®|s  |	d ”s®| |	” | |	” |d	8 }|d	8 }qZ|d	7 }qZ|dkrņ|d	krÜ j||fi |¤S |dkrī  |”S nR|d	kr\|d	kr j|||fi |¤S |d
kr< j|||fi |¤S |dkrD  	|d d |”S nč|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rD j|||fi |¤S n\||d	 kr j|||||fi |¤S ||d	 krD| d”sD j|||||fi |¤S t||  \}
} j||||
|fi |¤S )z0
    Hypergeometric function, general case.
    c                    s   g | ]}   |”qS r*   ©Z_convert_paramr8   r:   r*   r+   r5   Ź   r6   zhyper.<locals>.<listcomp>c                    s   g | ]}   |”qS r*   r]   r;   r:   r*   r+   r5   Ė   r6   Z	eliminateTZeliminate_allFr   r   r   é   Śforce_series)ŚconvertrJ   rC   r   ŚremoveŚ_hyp0f1ŚexpŚ_hyp1f1Ś_hyp1f2Ś_hyp1f0Ś_hyp2f1Ś_hyp2f2Ś_hyp2f3Ś_hyp2f0Ś_hypq1fqŚ
_hyp_borelrM   Śhypsum)r   r   r   r    rU   ŚpŚqZelim_nonpositiver$   r<   ZcoeffsŚtypesr*   r:   r+   rL   Ā   sD    





   
   "rL   c                 K   s   | j g |g|fi |¤S ©N©rL   )r   r<   r    rU   r*   r*   r+   Śhyp0f1ķ   s    rs   c                 K   s   | j |g|g|fi |¤S rq   rr   ©r   r9   r<   r    rU   r*   r*   r+   Śhyp1f1ń   s    ru   c                 K   s   | j |g||g|fi |¤S rq   rr   )r   Śa1Śb1Śb2r    rU   r*   r*   r+   Śhyp1f2õ   s    ry   c                 K   s   | j ||g|g|fi |¤S rq   rr   )r   r9   r<   r>   r    rU   r*   r*   r+   Śhyp2f1ł   s    rz   c                 K   s   | j ||g||g|fi |¤S rq   rr   )r   rv   Śa2rw   rx   r    rU   r*   r*   r+   Śhyp2f2ż   s    r|   c                 K   s    | j ||g|||g|fi |¤S rq   rr   )r   rv   r{   rw   rx   Śb3r    rU   r*   r*   r+   Śhyp2f3  s    r~   c                 K   s   | j ||gg |fi |¤S rq   rr   rt   r*   r*   r+   Śhyp2f0  s    r   c                 K   s    | j |||g||g|fi |¤S rq   rr   )r   rv   r{   Śa3rw   rx   r    rU   r*   r*   r+   Śhyp3f2	  s    r   c                 C   s   d| |  S ©Nr   r*   )r   r9   r    r*   r*   r+   rf     s    rf   c           	         sų   |\\ }r  ”}nd}|dkrŚ| d”sŚzj}z^ jd|d  7  _ fdd}j|g dd	}  ”d j”  | }W |_n|_0   ”r¾ ”r¾ |”}|
 W S  j	yŲ   Y n0 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_2rc   Zmpq_3_2)r"   Zjwr)   r>   ŚEŚT1ŚT2©r<   r   r    r*   r+   rX   !  s    

.*z_hyp0f1.<locals>.hT©r_   r   )r?   rC   r   r\   r7   r   ŚpiŚ_is_real_typeŚ_reŚNoConvergencerm   )	r   r   r    rU   ŚbtypeŚmagzrV   rX   rY   r*   r   r+   rb     s&    
	 
rb   c              	      s  |\\}}|\\}}s" j  S   ”}	|	dkr`  |”rP  |”dks`  ”r  |”  |”  kr  ”  krdkrn n jS  j S z°z  j|	7  _  	”dk  fdd}
 j
|
||gdd}  |”r  |”r  ”r  |”}|
 W W   j|	8  _S   jy<   Y n0 W   j|	8  _n  j|	8  _0  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Śfnegrc   )r9   r<   r   Śrzr   r   ©r   Zsectorr    r*   r+   rX   E  s    
24z_hyp1f1.<locals>.hTr   )rH   r?   Śisintr	   ŚisinfŚsignrQ   Śnanr   Z_imr\   r   r   r   rm   )r   r   r   r    rU   r9   Śatyper<   r   r   rX   rY   r*   r   r+   rd   5  s4    



$
4
	$
ü "rd   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 rq¶| |!|#  }}}|d7 }qÜ|||# }$|$|k rŅqźq.||$7 }||kr.| j
q.|#S )Nr.   éd   r1   r   r   r   r   )r   rC   r`   Śmpfr   rK   Śnprintr?   r   rO   r   )%r   r9   r<   r>   r    rU   Z_aŚ_bZ_cZ_zrV   r.   Śextrar'   ŚeŚfr!   ZabzŚchZc1hZnzŚgZabgZcbaZz2ŚtolrK   r¢   r?   ZmaxmagZkchZkakbzZd1Śe1ŚftŚf1rZ   r*   r*   r+   Ś_hyp2f1_gosperY  sR    





,,

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i |¤S j	}zŽ j	d7  _	|d	krf fd
d}j
|||gfi |¤}ntd dkr  fdd}j
|||gfi |¤}nXtd  dkrą | |  d  ”d |  }nt|| fi |¤}W |_	n|_	0 |
 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 r   )Zmpq_1)r9   r<   ŚtŚabr   r   r   ©r>   r   r    r*   r+   rX   Ć  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*   )r9   r<   r®   ŚcaŚcbr   r   r   )r>   r    r*   r+   rX   Ģ  s    $$0)r	   r   Ś	gammaprodrz   ŚepsrQ   r   Śabsrm   r   r\   r­   )r   r   r   r    rU   r9   r   r<   r   ŚctypeZ
convergentZfiniteZzerodivŚabszrV   rX   rY   r*   r°   r+   rg     s`    

$B’( &’’
’*’’’&
*rg   c              
      s“  t  \}t  \}ttt}	d}
D ]} |”r8|dkr8d}
 qXq8|	dk sd|
r¬z$j	
||  fi |¤W S  jyŖ   |	dks¤|
r¦ Y n0 dkrī tt ”}|dkrījdfi |¤j	 S 	
fdkrŅtd dk rŅ\ \  } 
   g  d|g”}d|if fd	d
	zBjdj	g| d”| dd”d}| 
g g” W S  jyŠ   Y n0 |	dk r ”dkrdjif	
fdd
	| dd”}z2jdj	g| d”| dd”| dd”dW S  jyn   d|vrj Y n0 | d”rtd fddfdd}jd }j}zĀdj } jd7  _tdD ]} fddt|D ”}j|j	g|||| d”ddd\}}||k r>|| } qr|d 9 } jjd  7  _|d!krŚ d"”qŚW |_n|_0 |
 S 	
fd#d$}j| fi |¤S )%z&
    Evaluates 3F2, 4F3, 5F4, ...
    Fr   Tr   gń?gĶĢĢĢĢĢģ?)r^   r   g©?c                    s~     |  }| |v r"||  }nH|| d  }||   d |   d  9 }|| |d   }||| < |   |” S r   )rz   )r!   Ś_cacher)   r®   )rv   r{   r   rw   rx   r   r    r*   r+   r     s    
$z_hypq1fq.<locals>.termr-   Śstrict)r-   r¹   c                    sÜ   t | }|| kr` | ”  | ” } D ]}| || ”9 }q,D ]}| || ” }qF|S ||v rp|| S |d }|d }tD ]}| | | 9 }qtD ]}|| |  }qŖ|9 }|| }|||< |S r   )r   r”   ZfacŚrfr   )Śkkrø   r!   r®   r9   r<   Śmr   )r   r   r   rn   ro   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r| ”7 }|V   d7  qNd S )Nr   c                 3   s   | ]}   | ”V  qd S rq   ©Zloggammar8   ©r   Śk0r*   r+   Ś	<genexpr>i  r6   z._hypq1fq.<locals>.log_diffs.<locals>.<genexpr>c                 3   s   | ]}   | ”V  qd S rq   rĄ   r;   rĮ   r*   r+   rĆ   j  r6   r   c                 3   s   | ]}   | ”V  qd S rq   ©Śpsir8   ©r   r$   rĀ   r*   r+   rĆ   m  r6   c                 3   s   | ]}   | ”V  qd S rq   rÄ   r;   rĘ   r*   r+   rĆ   n  r6   )r   Ślog)rĀ   rx   rY   ©r   r   r   r    )r$   rĀ   r+   Ś	log_diffsg  s    
’’’z_hypq1fq.<locals>.log_diffsc                 3   sF     dd D dd  D ”} | ”D ]}|| }|V  q.d S )Nc                 S   s   g | ]}|qS r*   r*   r;   r*   r*   r+   r5   u  r6   z1_hypq1fq.<locals>.hyper_diffs.<locals>.<listcomp>c                 S   s   g | ]}|qS r*   r*   r8   r*   r*   r+   r5   u  r6   )r³   Z	diffs_exp)rĀ   ŚCr'   rY   )r   r   r   rÉ   r*   r+   Śhyper_diffst  s     z_hypq1fq.<locals>.hyper_diffsi   é2   rA   é   c                 3   s   | ]} |V  qd S rq   r*   )r4   r!   )r   r*   r+   rĆ     r6   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 ]²  |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” qH|S )	NTr   r   c                    s    g | ]}|kr |  qS r*   r*   ©r4   r   ©r   Śakr!   r*   r+   r5   ”  r6   z'_hypq1fq.<locals>.h.<locals>.<listcomp>c                    s   g | ]}|   qS r*   r*   rĻ   ©rŃ   r   r*   r+   r5   ¢  r6   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   ¤  r6   )ŚlistrH   r   rI   r   )
ŚargsZTsZreczZnegzrŹ   ZCpZGnZGdZFnZFd)r   rn   ro   r    )r   rŃ   r   r!   r+   rX     s    
(z_hypq1fq.<locals>.h)rM   rŌ   rµ   r   rm   r   r	   r   rL   rQ   r³   ZnsumrC   r   rH   ŚreplacerF   r“   r   Zdpsr   rN   Zsumemr\   )r   rn   ro   r   r   r    rU   Śa_typesŚb_typesr·   Zispolyr9   ŚSr)   Śinitialr½   rĖ   r©   r   Śtruncr$   ŚheadŚtailŚerrrY   rX   r*   )rv   r{   r   r   rw   rx   r   r   rÉ   rn   ro   r   r    r+   rk   ß  s    $ 
, 

’"

ž
"

ü


’
rk   c                    s   rt   \ }t  n
g d  }r>t  \}tn
g d }| dj”|d< z$j||||   fi |¤W S  jy   Y n0 j}	z| djd ”}
 jd7  _djif fdd	j}td	jD ]0}|}||7 }t	||
krź|  W |	_S qźW |	_n|	_0 ||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                    sl   | |v r||  S | d } D ]}||| d  9 }q D ]}||| d   }q:|9 }||  }||| < |S r   r*   )r!   Ścacher®   r9   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   )rc   rL   )r®   rČ   r*   r+   rØ   ą  s    z_hyp_borel.<locals>.grĪ   Tr   )rM   rŌ   rC   r   rm   r   r“   rH   r   rµ   ŚargrO   rQ   Zquad)r   rn   ro   r   r   r    rU   r×   rŲ   r   r©   Śsr!   r®   rį   r)   rā   rØ   ŚIrŽ   r*   )r   r   r   r   r    r+   rl   ©  sT    



$
ž

rl   c                    s(  |\\}}\}}|\\}	}
\}}t }  ”} j}|}| d” oT  |”dk}| ržzzx  j|7  _ fdd} j||||	|gdd j d}t fdd	|||	|fD d
krŹ  |”}|W W | _S   jyź   Y n0 W | _n| _0  jdd|||
|f|||	|gfi |¤S )Nr_   r^   c                    sp  | | | | }| | }|| }i } j |d< |d | ||  | |  |d< d}d}	d}
|	|vr"d| d|   | d  d|  |d  ||  | |  ||  d| d|d   |	  d|	d   }|	| | d |	| | d  |	| d  } j |	 |||	d   |||	d     ||	< ||	 |	   }t|d j k rLq|	dkrrt|
t| dk rr j||7 }|}
|	d7 }	qZ  ”| }|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   )rH   rµ   r“   r   rc   )rv   r{   rw   rx   ŚXŚA2ZB2r>   Śs1r!   ŚtprevŚuu1Śuu2Śt1rŁ   r   r   ŚT3©r   r    r*   r+   rX     s4    
 
d,. 
"VXz_hyp2f2.<locals>.hTr   ©r_   rß   c                 3   s   | ]}   |”V  qd S rq   ©r   ©r4   r)   r:   r*   r+   rĆ   !  r6   z_hyp2f2.<locals>.<genexpr>rĶ   r   )	rµ   r?   r   rC   r\   r   r	   r   rm   )r   r   r   r    rU   rv   Śa1typer{   Śa2typerw   Śb1typerx   Śb2typer·   r   rV   Śasymp_extraprecŚcan_use_asymptoticrX   rY   r*   rš   r+   rh   č  s0    
’ $
ürh   c                    s4  |\\}}|\\}}\}	}
t }  ”} j}o<|d }| d” oh  |”dkoh  |”d| k}|rzzt  j|7  _ fdd} j||||	gdd j d	}t fd
d|||	fD dkrŚ  |”}|W W | _S   jyś   Y n0 W | _n| _0  j	dd|||
f|||	gfi |¤S )Nr   r_   é   rē   c                    sT   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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 rLq|dkrrt|t| dk rr 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   rH   Śmpq_1_4Śmpq_3_16Śmpq_1_16Zmpq_5_2r   r”   rµ   r“   r   Śexpjr   r   )rv   rw   rx   rč   r>   rź   Śs2r!   rė   rģ   rķ   r"   rī   Śt2rŁ   r   r   rš   r*   r+   rX   I  s`    
<:.’’’
6
’’’*’2  "$’"’  ’z_hyp1f2.<locals>.hTr   rń   c                 3   s   | ]}   |”V  qd S rq   rņ   ró   r:   r*   r+   rĆ   r  r6   z_hyp1f2.<locals>.<genexpr>r   ©
rµ   r?   r   rC   r   r\   r   r	   r   rm   )r   r   r   r    rU   rv   rō   rw   rö   rx   r÷   r·   r   rV   rų   rł   rX   rY   r*   rš   r+   re   -  s4    

’ž("
üre   c              	      sR  |\\}}\}}|\\}	}
\}}\}}t }  ”}oB|d } j}| d” ot  |”dkot  |”d| k}|r$zz|  j|7  _ fdd} j||||	||gdd j d	}t fd
d|||	||fD dkrī  |”}|W W | _S   jy   Y n0 W | _n| _0  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 r&ql|dkrLt|t| dk rL 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Ķ   iö’’’rž   rę   rē   r’   )r   rH   r   r  r  r=   r   r”   rµ   r“   r   r  r   r   )rv   r{   rw   rx   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+   rX     s     
42.’’
>’*2’
’žžžžžž@B  "$’&’04’06’z_hyp2f3.<locals>.hTr   rń   c                 3   s   | ]}   |”V  qd S rq   rņ   ró   r:   r*   r+   rĆ   Ē  r6   z_hyp2f3.<locals>.<genexpr>r  r^   r  )r   r   r   r    rU   rv   rō   r{   rõ   rw   rö   rx   r÷   r}   Zb3typer·   r   rų   rV   rł   rX   rY   r*   rš   r+   ri     s4    
’’."&
üri   c                    s   |\\}}\}}z>|  ” }	|	 d j”|	d<  jdd||f||gfi |	¤W S   jyn   | d”rj Y n0  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   )r9   r<   r"   r   r   r   rš   r*   r+   rX   Ž  s
    
0Bz_hyp2f0.<locals>.hr   )ŚcopyrC   r   rm   r   r\   )r   r   r   r    rU   r9   r   r<   r   ZkwargsbrX   r*   rš   r+   rj   Ń  s    $
rj   Nc                    s.  |\}}|\}	}
t |t | t |	t |
 || }|	|
 } fdd|D } fdd|D }  ”|d u 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i |¤S )Nc                    s   g | ]}   |”qS r*   ©r`   ©r4   Ś_r:   r*   r+   r5   š  r6   zmeijerg.<locals>.<listcomp>c                    s   g | ]}   |”qS r*   r  r  r:   r*   r+   r5   ń  r6   r   r   r-   zMeijer G m,n,p,q,series =c            	   
      s  | d   | d  g }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$|S )Nc                    s$   g | ]}|kr |    qS r*   r*   rĻ   ©r<   r!   r*   r+   r5     r6   ś&meijerg.<locals>.h.<locals>.<listcomp>c                    s    g | ]}d  |    qS rÓ   r*   rĻ   ©r9   r<   r!   r*   r+   r5     r6   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     r6   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   
  r6   )rI   rH   r   ©	rÕ   r   ŚbasesZexptsZgnŚgdZhnZhdŚhz©r   r¼   r&   rn   ro   Śrr    r  r+   rX   ž  s    "zmeijerg.<locals>.hc            	   
      sB  | d   | d  g }t D ]	g}dkrH  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Ļ   ©r9   r!   r*   r+   r5     r6   r  c                    s    g | ]}d    |  qS rÓ   r*   rĻ   r  r*   r+   r5     r6   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     r6   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     r6   )rI   r`   rH   r   r  r  r  r+   rX     s"    ")rJ   r`   rµ   rC   rF   r\   )r   r   r   r    r  ZseriesrU   ZanZapZbmŚbqr9   r<   rX   r*   r  r+   Śmeijergę  s0    

r  c           
      K   s  t |t |kr$|| }}|| }}dd }|  |”r8n|  |”rDn|  |”rd||||f\}}}}nr||sÖ|| |d  }	||	st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 )Ng®Gįz®ļ?)rµ   )r%   r*   r*   r+   r(   +  s    zappellf1.<locals>.okr   z%Analytic continuation not implemented©śm+nr¼   r&   r  )rµ   r   rD   Śappellf1Śhyper2d)
r   r9   rw   rx   r>   r%   ŚyrU   r(   Ś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   r9   rw   rx   Ś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   rv   r{   rw   rx   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   r9   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  |rĪtd| ” d  d} j}  d”d} j}| dd| ”}z¬  jd7  _ j
 }d}d}t	|
}t	|}fdd|	D }fdd|D }|D ]"}| }| 
|” | 
|” qV|D ]"}| }| 
|” | 
|” q~|D ]&}| 
| ” | 
| d ” q¦|D ]<}|d9 }|d 9 }| 
d|  ” | 
|  ” qŅ|D ]:}| 
|d  ” | 
|d  d| d   ” q|D ]F}|d9 }| 
d| d  ” | 
|d  d| d   ” qT|D ]H}|d9 }| 
d|  ” | 
d| d  ” | 
| d ” q  j|||| fd ji|¤} ||  | }!t|!|k r.|d7 }nd}|dks¢|sFq¢||!7 }|D ]}||9 }qR|D ]}|| }qfd7 ||  }|kr  d”qW | _n| _0 |
 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                    sD   |   |g ”}zt|}W n ty0   |g}Y n0  fdd|D S )Nc                    s   g | ]}   |”qS r*   r  )r4   rć   r:   r*   r+   r5   ę  r6   z*hyper2d.<locals>.parse.<locals>.<listcomp>)ŚpoprŌ   Ś	TypeError)Ś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ß   rA   r1   r   c                    s   g | ]}|  qS r*   r*   r8   ©r¼   r*   r+   r5     r6   zhyper2d.<locals>.<listcomp>c                    s   g | ]}|  qS r*   r*   r;   r/  r*   r+   r5     r6   r   r   r   r’   r/   r^   zmaxterms exceeded in hyper2d)r`   ŚdictrD   ŚkeysrH   r”   r   rC   r“   rŌ   r   rL   rµ   r   )"r   r9   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ä   Ś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                    st   |   ”|| }t|t|}|fdks:|fdkrD| 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   s   g | ]}d | qS ©r   r*   r;   r*   r*   r+   r5   ~  r6   z&bihyper.<locals>.h.<locals>.<listcomp>c                 S   s   g | ]}d | qS r4  r*   r8   r*   r*   r+   r5     r6   r   c                 S   s   g | ]}d | qS rÓ   r*   r;   r*   r*   r+   r5     r6   c                 S   s   g | ]}d | qS rÓ   r*   r8   r*   r*   r+   r5     r6   r   )rŌ   rJ   )	r   r   r   Zaa_sZbb_sŚrpŚrcr   r   ©Śnegrn   r    r*   r+   rX   {  s    *" zbihyper.<locals>.h)r`   rJ   rB   r\   )r   r   r   r    rU   r   ro   rX   r*   r7  r+   ŚbihyperD  s    0


r9  )r   N)#Zlibmp.backendr   Z	functionsr   r   r,   rE   r\   rL   rs   ru   ry   rz   r|   r~   r   r   rf   rb   rd   r­   rg   rk   rl   rh   re   ri   rj   r  r  r'  r(  r)  r   r9  r*   r*   r*   r+   Ś<module>   sz   / 
*









#
#6
O
 J
>
D
Q
Q
=


	

 n