U
    9%e8                     @   s`  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k
rl   Y nX 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 dlZdeekZW n ek
r   dZY nX 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 )
ArgzGenerate 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rFdttj }|| | _| _|| | _| _	d S )Nz#a should be less than or equal to bg            ?)

ValueErrornpinfZfinfofloatmaxabinclusive_ainclusive_b)selfr   r   r   r    r   Y/var/www/html/Darija-Ai-API/env/lib/python3.8/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||}nV|dkr|dk rt|||}n4|dkrtj|d|dd}tdt||}t||f}n|dkr"|dkr"td||}|jdkrt|d }	nd}	tjd|	|dd}t||f}n|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)Zendpointi)r   r   Zlogspacelog10Zlinspacehstacksizesort)r   r   r   nZnlogptsZnlinptsptsZlinptsZlogptsrightZnlogpts1Znlogpts2Zlogpts1Z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rV|d }|}n|d }|d }|dkr| |||}g }nR|dkrg }| | | | }n0| 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   Zzerosr   r   r   r   )	r   r   r   r   Zn1Zn2ZposptsZnegptsr   r   r   r   values_   s6    
z
Arg.valuesN)	__name__
__module____qualname____doc__r   r	   r   r   r    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   r    r   r   r   r      s    zFixedArg.__init__c                 C   s   | j S r&   )r(   )r   r   r   r   r   r       s    zFixedArg.valuesNr!   r"   r#   r   r    r   r   r   r   r%      s   r%   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 r&   )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+   r    r,   Zravel)r   r   mxyr   r   r   r       s    zComplexArg.valuesN)r!   r"   r#   complexr   r	   r   r    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 r&   )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   r    r   astyper.   r   ZarangeuniqueZr_)r   r   Zv1Zv2vr   r   r   r       s
    ,zIntArg.valuesN)r6   r7   r)   r   r   r   r   r5      s   
r5   c                 C   s   t | tjr|  }njt| }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   )r    )r?   r@   r1   r   r   r   rA      s     r   )r>   r   ndarraycopylenr'   sumr:   r.   ziparrayZbroadcast_arraysZix_ZreshapeT)Zargspecr   argsnargsmsr   r   r   get_args   s    
 rL   c                
   @   s&   e Zd ZdddZdd	 Zd
d ZdS )
MpmathDataNHz>YnFTc                 C   s  |d krDzt tjdd}W n tk
r6   d}Y nX |r@dnd}|| _|| _|| _|| _|| _	|| _
|| _|	| _|
| _|| _t| jtjrt| jjtj| _ntdd | jD | _|
| _|| _|r|dkrt|d	d }|r|dkrt|d	d }|| _|| _d S )
NZSCIPY_XSLOW0Fi  i  c                 S   s   g | ]}t |tqS r   r=   )r?   argr   r   r   rA      s     z'MpmathData.__init__.<locals>.<listcomp>z<lambda>r!   )r.   osenvirongetr   
scipy_funcmpmath_funcarg_specdpsprecr   rtolatolignore_inf_signnan_okr>   r   rB   
issubdtypedtypecomplexfloating
is_complexanydistinguish_nan_and_infgetattrnameparam_filter)r   rU   rV   rW   re   rX   rY   r   rZ   r[   r\   rc   r]   rf   Zis_xslowr   r   r   r      s6    
zMpmathData.__init__c           
         sV  t jd tjj}tjjtjj	 }}zjd k	rDjg}ndg}j	d k	r^j	tj_	t 
|jt jr|tdd  ndd  dd t|D ]\}}|tj_zBtj fdd	|d
jjjjjjd
 W  q:W q tk
r6   |t|d kr2t \}}}	|j|	k	r.||	|Y qX qW 5 || tj_tj_	X d S )Ni     c                 S   s   t t| S r&   )mpmathmpcr4   r2   r   r   r   mptype   s    z MpmathData.check.<locals>.mptypec                 S   s   t t| S r&   )rh   Zmpfr
   rj   r   r   r   rk      s    c                 S   s0   t | jddt | j  kr"tjS t| jS d S )NgؗҜ<r   )absr,   r+   r   nan	mpf2floatrj   r   r   r   pytype   s    z MpmathData.check.<locals>.pytypec                     s   j t |  S r&   )rV   map)r   rk   ro   r   r   r   <lambda>      z"MpmathData.check.<locals>.<lambda>F)Z
vectorizedrZ   r[   r\   rc   r]   rf   r   )r   randomseedrL   rW   r   rh   mprX   rY   r^   r_   r`   mpc2complex	enumerater   rU   rZ   r[   r\   rc   r]   rf   AssertionErrorrD   sysexc_info__traceback__with_traceback)
r   ZargarrZold_dpsZold_precZdps_listjrX   tpvaluetbr   rq   r   check   sH    




 	
zMpmathData.checkc                 C   s"   | j rd| jf S d| jf S d S )Nz<MpmathData: %s (complex)>z<MpmathData: %s>)ra   re   )r   r   r   r   __repr__  s    zMpmathData.__repr__)
NNNNrN   rO   FTTN)r!   r"   r#   r   r   r   r   r   r   r   rM      s                   
';rM   c                  O   s   t | |}|  d S r&   )rM   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   Z	min_fixedZ	max_fixed)r
   rh   nstrrj   r   r   r   rn   +  s    	rn   c                 C   s   t t| jt| jS r&   )r4   rn   r+   r,   rj   r   r   r   rw   7  s    rw   c                    s   dd  fdd}|S )Nc                 S   s    t | tjrt| S t| S d S r&   )r>   rh   ri   r4   r
   rj   r   r   r   tofloat<  s    ztrace_args.<locals>.tofloatc               	      sb   t jdtt| f  t j  z | |}t jd|  W 5 t jd t j  X |S )Nz%r: 
z-> %r)rz   stderrwritetuplerp   flush)r   r   rr   r   r   r   wrapB  s    

ztrace_args.<locals>.wrapr   r   r   r   r   r   
trace_args;  s    
r   	setitimerFc                   @   s   e Zd ZdS )TimeoutErrorN)r!   r"   r#   r   r   r   r   r   W  s   r   r   Tc                    s4   t r"|r"dd  fdd}n 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  d S r&   )r   )signumframer   r   r   sigalrm_handlerk  s    z%time_limited.<locals>.sigalrm_handlerc                    s    fdd}|S )Nc               
      sr   t  t j}t t j z2z | |W W "S  tk
rJ    Y W S X W 5 t t jd t  t j| X d S )Nr   )signalSIGALRMr   ITIMER_REALr   )r   r   Zold_handler)r   
return_valr   timeoutr   r   r   o  s    (time_limited.<locals>.deco.<locals>.wrapr   r   r   r   r   r   r   decon  s    
ztime_limited.<locals>.decoc                    s    fdd}|S )Nc               	      sp   t     fddt z<z| |W W ,S  tk
rZ   td   Y W S X W 5 td  X d S )Nc                    s   t     krt S r&   )timer   )r   eventrQ   )
start_timer   tracer   r   r     s    z7time_limited.<locals>.deco.<locals>.wrap.<locals>.trace)r   rz   settracer   r   r   )r   r   r   )r   r   r   r   |  s    

r   r   r   )r   r   r   r   r   {  s    )POSIX)r   r   Zuse_sigalrmr   r   r   r   time_limited[  s
    r   c                    s    fdd}|S )z9Decorate function to return nan if it raises an exceptionc                     s,   z | |W S  t k
r&   tj Y S X d S r&   )	Exceptionr   rm   r   r   r   r   r     s    zexception_to_nan.<locals>.wrapr   r   r   r   r   exception_to_nan  s    r   c                    s    fdd}|S )z1Decorate function to return nan if it returns infc                     s    | |}t |st jS |S r&   )r   isfiniterm   )r   r   r<   r   r   r   r     s    

zinf_to_nan.<locals>.wrapr   r   r   r   r   
inf_to_nan  s    r   FFg<c              	   C   s2  g }t t| |D ]T\}\}}|dks.|dkr6tdt|| ||t|  kr||||f qt|}|dkr.ttt	
|}	dg}
|
d||d  |D ]p\}}}tj||	ddd}tj||	ddd}|dkrd}nt|| | }t|d	}|
d
|||| qtdd|
 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    z4Bad results ({} out of {}) for the following points:r   r   r	      z{}: {} != {} (rdiff {})Fr   )rx   r   r   rh   fabsappendrD   r.   rl   r   r   formatr   r   join)resZstdr[   rZ   ZfailureskZresvalZstdvalZnfailndigitsmsgZresrepZstdrepZrdiffr   r   r   mp_assert_allclose  s2     
 r   )r   r   )$rR   rz   r   	itertoolsr   numpyr   Znumpy.testingr   r   Zscipy.special._testutilsr   rh   ImportErrorr   r%   r*   r5   rL   rM   r   r   rn   rw   r   posixr   dirr   r   r   rm   r   r   r   r   r   r   r   r   <module>   sB   oj
4

