o
    Ö­ji8  ã                   @   sR  d dl Z d dlZd dlZd dlmZ d dlZd dlmZ d dl	Z	d dl
mZ zd dlZW n	 ey5   Y nw G dd„ dƒZG dd„ dƒZG d	d
„ d
ƒZG dd„ dƒZdd„ ZG dd„ dƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zzd dlZdeeƒv ZW n eyˆ   dZY nw G dd„ deƒZdejd fd!d"„Zd#d$„ Z d%d&„ Z!d*d(d)„Z"dS )+é    N)Úzip_longest)Úassert_)Úassert_func_equalc                   @   s8   e Zd ZdZej ejddfdd„Zdd„ Zdd„ Zd	S )
ÚArgz‚Generate a set of numbers on the real axis, concentrating on
    'interesting' regions and covering all orders of magnitude.

    Tc                 C   sf   ||krt dƒ‚|tj krdt t¡j }|tjkr#dt t¡j }||| _| _||| _| _	d S )Nz#a should be less than or equal to bg      à¿ç      à?)
Ú
ValueErrorÚnpÚinfÚfinfoÚfloatÚmaxÚaÚbÚinclusive_aÚinclusive_b)Úselfr   r   r   r   © r   úW/var/www/html/CropPilot/venv/lib/python3.10/site-packages/scipy/special/_mptestutils.pyÚ__init__   s   
zArg.__init__c                 C   s´  |dk rt dƒ‚|d dkr|d }|}n|d }|d }|dkr/t t |¡t |¡|¡}n¦|dkr?|dk r?t |||¡}n–|dkr^tj|d|dd�}t dt |¡|¡}t ||f¡}nw|dkr�|dkr�t d||¡}|jdkrzt |d ¡}	nd}	tjd|	|dd�}t ||f¡}nH|d dkrš|d }
|
}n|d }
|
d }tjdd|dd�}|jdkr¸t |d ¡}	nd}	tjd|	|
dd�}t dt |¡|¡}t |||f¡}t |¡S )	Nr   za should be positiveé   é   é
   F)Úendpointiâÿÿÿ)r   r   ÚlogspaceÚlog10ÚlinspaceÚhstackÚsizeÚsort)r   r   r   ÚnÚnlogptsÚnlinptsÚptsÚlinptsÚlogptsÚrightÚnlogpts1Únlogpts2Úlogpts1Úlogpts2r   r   r   Ú_positive_values'   sF   


zArg._positive_valuesc           	      C   s  | j | j}}||krt |¡S | js|d7 }| js|d7 }|d dkr+|d }|}n|d }|d }|dkrA|  |||¡}g }n)|dkrRg }|  | | |¡ }n|  d||¡}|  d| |d ¡ }|dd… }t |ddd… |f¡}| js|dd… }| jsˆ|dd… }|S )z%Return an array containing n numbers.r   r   r   Néÿÿÿÿ)r   r   r   Úzerosr   r   r*   r   )	r   r   r   r   Ún1Ún2ÚposptsÚnegptsr"   r   r   r   Úvalues_   s6   
z
Arg.valuesN)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r	   r   r*   r1   r   r   r   r   r      s
    8r   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚFixedArgc                 C   s   t  |¡| _d S ©N)r   ÚasarrayÚ_values)r   r1   r   r   r   r   †   s   zFixedArg.__init__c                 C   s   | j S r7   )r9   )r   r   r   r   r   r1   ‰   ó   zFixedArg.valuesN©r2   r3   r4   r   r1   r   r   r   r   r6   …   s    r6   c                   @   s:   e Zd Zeej ej ƒeejejƒfdd„Zdd„ ZdS )Ú
ComplexArgc                 C   s$   t |j|jƒ| _t |j|jƒ| _d S r7   )r   ÚrealÚimag©r   r   r   r   r   r   r   Ž   s   zComplexArg.__init__c                 C   sX   t t t |¡¡ƒ}| j |¡}| j |d ¡}|d d …d f d|d d d …f    ¡ S )Nr   y              ð?)Úintr   ÚfloorÚsqrtr=   r1   r>   Úravel)r   r   ÚmÚxÚyr   r   r   r1   ’   s   (zComplexArg.valuesN)r2   r3   r4   Úcomplexr   r	   r   r1   r   r   r   r   r<   �   s    &r<   c                   @   s   e Zd Zddd„Zdd„ ZdS )	ÚIntArgéüÿÿéè  c                 C   s   || _ || _d S r7   )r   r   r?   r   r   r   r   š   s   
zIntArg.__init__c                 C   sh   t | j| jƒ td|d  |d ƒ¡ t¡}t dd¡}t 	tj
||f ¡}||| jk|| jk @  }|S )Nr   r   é   éûÿÿÿ)r   r   r   r1   r   Úastyper@   r   ÚarangeÚuniqueÚr_)r   r   Úv1Úv2Úvr   r   r   r1   ž   s
   ,zIntArg.valuesN)rI   rJ   r;   r   r   r   r   rH   ™   s    
rH   c                 C   s†   t | tjƒr|  ¡ }|S t| ƒ}t dd„ | D ƒ¡}||t|ƒ   t¡d }dd„ t	| |ƒD ƒ}t 
tjtj|Ž Ž ¡ |d¡j}|S )Nc                 S   s   g | ]}t |tƒrd nd‘qS )g      ø?g      ð?©Ú
isinstancer<   )Ú.0Úspecr   r   r   Ú
<listcomp>¬   s    zget_args.<locals>.<listcomp>r   c                 S   s   g | ]	\}}|  |¡‘qS r   )r1   )rV   rW   rD   r   r   r   rX   °   s    r+   )rU   r   ÚndarrayÚcopyÚlenr8   ÚsumrM   r@   ÚzipÚarrayÚbroadcast_arraysÚix_ÚreshapeÚT)Úargspecr   ÚargsÚnargsÚmsr   r   r   Úget_args¦   s   ÷ÿ rg   c                   @   s.   e Zd Z				ddd„Zdd	„ Zd
d„ ZdS )Ú
MpmathDataNçH¯¼šò×z>çYóøÂn¥FTc                 C   s  |d u r!zt tj dd¡ƒ}W n ty   d}Y nw |rdnd}|| _|| _|| _|| _|| _	|| _
|| _|	| _|
| _|| _t| jtjƒrQt | jjtj¡| _ntdd„ | jD ƒƒ| _|
| _|| _|rh|dkrnt|d	d ƒ}|rt|dkrzt|d	d ƒ}|| _|| _d S )
NÚSCIPY_XSLOWÚ0Fiˆ  iô  c                 S   s   g | ]}t |tƒ‘qS r   rT   )rV   Úargr   r   r   rX   Õ   s    z'MpmathData.__init__.<locals>.<listcomp>z<lambda>r2   )r@   ÚosÚenvironÚgetr   Ú
scipy_funcÚmpmath_funcÚarg_specÚdpsÚprecr   ÚrtolÚatolÚignore_inf_signÚnan_okrU   r   rY   Ú
issubdtypeÚdtypeÚcomplexfloatingÚ
is_complexÚanyÚdistinguish_nan_and_infÚgetattrÚnameÚparam_filter)r   rq   rr   rs   r�   rt   ru   r   rv   rw   rx   r   ry   r‚   Úis_xslowr   r   r   r   ·   s<   ÿÿ
zMpmathData.__init__c           
         sl  t j d¡ tˆjˆjƒ}tjjtjj	}}z•ˆjd ur!ˆjg}ndg}ˆj	d ur.ˆj	tj_	t  
|jt j¡r=t‰dd„ ‰ ndd„ ‰ dd„ ‰t|ƒD ]J\}}|tj_ztˆj‡ ‡‡fdd	„|d
ˆjˆjˆjˆjˆjˆjd�
 W  n0 ty“   |t|ƒd kr‘t ¡ \}}}	|j|	ur�| |	¡‚|‚Y qIw W ||tj_tj_	d S W ||tj_tj_	d S ||tj_tj_	w )NiÒ  é   c                 S   ó   t  t| ƒ¡S r7   )ÚmpmathÚmpcrG   ©rE   r   r   r   Úmptypeö   ó   z MpmathData.check.<locals>.mptypec                 S   r…   r7   )r†   Úmpfr   rˆ   r   r   r   r‰   ù   rŠ   c                 S   s,   t | jƒddt | jƒ  krtjS t| jƒS )Ng¼‰Ø—²Òœ<r   )Úabsr>   r=   r   ÚnanÚ	mpf2floatrˆ   r   r   r   Úpytypeü   s   
z MpmathData.check.<locals>.pytypec                     s   ˆˆj tˆ | ƒŽ ƒS r7   )rr   Úmap)r   ©r‰   r�   r   r   r   Ú<lambda>	  s    z"MpmathData.check.<locals>.<lambda>F)Ú
vectorizedrv   rw   rx   r   ry   r‚   r   )r   ÚrandomÚseedrg   rs   r   r†   Úmprt   ru   rz   r{   r|   Úmpc2complexÚ	enumerater   rq   rv   rw   rx   r   ry   r‚   ÚAssertionErrorr[   ÚsysÚexc_infoÚ__traceback__Úwith_traceback)
r   ÚargarrÚold_dpsÚold_precÚdps_listÚjrt   ÚtpÚvalueÚtbr   r‘   r   Úcheckà   sT   




ö

ûÿï÷*	zMpmathData.checkc                 C   s"   | j r
d| j› d�S d| j› d�S )Nz<MpmathData: z (complex)>ú>)r}   r�   )r   r   r   r   Ú__repr__  s   zMpmathData.__repr__)
NNNNri   rj   FTTN)r2   r3   r4   r   r¦   r¨   r   r   r   r   rh   ¶   s    
ý)>rh   c                  O   s   t | i |¤Ž}| ¡  d S r7   )rh   r¦   )r   ÚkwÚdr   r   r   Úassert_mpmath_equal%  s   r«   c                 C   s   t jjdd�| ƒS )Nz8    Test not yet functional (too slow), needs more work.)Úreason)ÚpytestÚmarkÚskip©Úfuncr   r   r   Únonfunctional_tooslow*  s
   ÿþr²   c                 C   s   t tj| dddd�ƒS )zá
    Convert an mpf to the nearest floating point number. Just using
    float directly doesn't work because of results like this:

    with mp.workdps(50):
        float(mpf("0.99999999999999999")) = 0.9999999999999999

    é   r   ©Ú	min_fixedÚ	max_fixed)r   r†   Únstrrˆ   r   r   r   rŽ   4  s   	rŽ   c                 C   s   t t| jƒt| jƒƒS r7   )rG   rŽ   r=   r>   rˆ   r   r   r   r—   @  s   r—   c                    s   dd„ ‰‡ ‡fdd„}|S )Nc                 S   s   t | tjƒr
t| ƒS t| ƒS r7   )rU   r†   r‡   rG   r   rˆ   r   r   r   ÚtofloatE  s   ztrace_args.<locals>.tofloatc               	      s|   t j ttˆ| ƒƒ›d�¡ t j ¡  zˆ | i |¤Ž}t j d|›�¡ W t j d¡ t j ¡  |S t j d¡ t j ¡  w )Nú: z-> Ú
)rš   ÚstderrÚwriteÚtupler�   Úflush)r   r©   Úr©r±   r¸   r   r   ÚwrapK  s   

þztrace_args.<locals>.wrapr   ©r±   rÁ   r   rÀ   r   Ú
trace_argsD  s   
rÃ   Ú	setitimerFc                   @   s   e Zd ZdS )ÚTimeoutErrorN)r2   r3   r4   r   r   r   r   rÅ   _  s    rÅ   r   Tc                    s6   t r|rdd„ ‰‡ ‡‡fdd„}|S ‡ ‡fdd„}|S )a  
    Decorator for setting a timeout for pure-Python functions.

    If the function does not return within `timeout` seconds, the
    value `return_val` is returned instead.

    On POSIX this uses SIGALRM by default. On non-POSIX, settrace is
    used. Do not use this with threads: the SIGALRM implementation
    does probably not work well. The settrace implementation only
    traces the current thread.

    The settrace implementation slows down execution speed. Slowdown
    by a factor around 10 is probably typical.
    c                 S   s   t ƒ ‚r7   )rÅ   )ÚsignumÚframer   r   r   Úsigalrm_handlers  r:   z%time_limited.<locals>.sigalrm_handlerc                    s   ‡ ‡‡‡fdd„}|S )Nc               
      s    t   t jˆ¡}t  t jˆ¡ z2zˆ | i |¤ŽW W t  t jd¡ t   t j|¡ S  ty@   ˆ Y W t  t jd¡ t   t j|¡ S w t  t jd¡ t   t j|¡ w )Nr   )ÚsignalÚSIGALRMrÄ   ÚITIMER_REALrÅ   )r   r©   Úold_handler)r±   Ú
return_valrÈ   Útimeoutr   r   rÁ   w  s   üüú(time_limited.<locals>.deco.<locals>.wrapr   rÂ   ©rÍ   rÈ   rÎ   r°   r   Údecov  s   
ztime_limited.<locals>.decoc                    s   ‡ ‡‡fdd„}|S )Nc               	      sz   t   ¡ ‰ ‡ ‡‡fdd„‰t ˆ¡ z%zˆ| i |¤ŽW W t d ¡ S  ty6   t d ¡ ˆ Y W t d ¡ S w t d ¡ w )Nc                    s   t   ¡ ˆ  ˆkrtƒ ‚ˆS r7   )ÚtimerÅ   )rÇ   Úeventrm   )Ú
start_timerÎ   Útracer   r   rÕ   ‡  s   z7time_limited.<locals>.deco.<locals>.wrap.<locals>.trace)rÒ   rš   ÚsettracerÅ   ©r   r©   )r±   rÍ   rÎ   )rÔ   rÕ   r   rÁ   „  s   
ü
ürÏ   r   rÂ   )rÍ   rÎ   r°   r   rÑ   ƒ  s   )ÚPOSIX)rÎ   rÍ   Úuse_sigalrmrÑ   r   rÐ   r   Útime_limitedc  s   ïrÚ   c                    ó   ‡ fdd„}|S )z9Decorate function to return nan if it raises an exceptionc                     s*   zˆ | i |¤ŽW S  t y   tj Y S w r7   )Ú	Exceptionr   r�   r×   r°   r   r   rÁ   ™  s
   
ÿzexception_to_nan.<locals>.wrapr   rÂ   r   r°   r   Úexception_to_nan—  ó   rÝ   c                    rÛ   )z1Decorate function to return nan if it returns infc                     s"   ˆ | i |¤Ž}t  |¡st jS |S r7   )r   Úisfiniter�   )r   r©   rS   r°   r   r   rÁ   £  s   
zinf_to_nan.<locals>.wrapr   rÂ   r   r°   r   Ú
inf_to_nan¡  rÞ   rà   ç—ÔFFõg<c                 C   sF  g }t t| |ƒƒD ]*\}\}}|du s|du rtdƒ‚t || ¡||t |¡  kr3| |||f¡ q	t|ƒ}|dkr¡ttt	 
|¡ƒƒ}	dg}
|
 d|› d|d › d�¡ |D ]>\}}}tj||	ddd	�}tj||	ddd	�}|dkrvd
}nt || | ¡}t |d¡}|
 |› d|› d|› d|› d�¡ qXtdd |
¡ƒ dS dS )z|
    Compare lists of mpmath.mpf's or mpmath.mpc's directly so that it
    can be done to higher precision than double.
    Nz,Lengths of inputs res and std are not equal.r   Ú zBad results (z out of r   z) for the following points:r´   r	   é   r¹   z != z (rdiff ú)Frº   )r˜   r   r   r†   ÚfabsÚappendr[   r@   rŒ   r   r   r·   r   Újoin)ÚresÚstdrw   rv   ÚfailuresÚkÚresvalÚstdvalÚnfailÚndigitsÚmsgÚresrepÚstdrepÚrdiffr   r   r   Úmp_assert_allclose«  s,    €$órô   )r   rá   )#rn   rš   rÒ   Ú	itertoolsr   Únumpyr   Únumpy.testingr   r­   Úscipy.special._testutilsr   r†   ÚImportErrorr   r6   r<   rH   rg   rh   r«   r²   rŽ   r—   rÃ   rÉ   ÚdirrØ   rÜ   rÅ   r�   rÚ   rÝ   rà   rô   r   r   r   r   Ú<module>   sF    ÿoo
ÿ4

