o
    Ö­jÇ.  ã                   @   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 g d¢ZG dd„ dƒZdd„ Zd	d
„ Z				ddd„ZG dd„ dƒZdS )é    N)Ú_pep440)Úassert_)Úwith_special_errorsÚassert_func_equalÚFuncDatac                   @   s   e Zd Zdd„ ZdS )ÚMissingModulec                 C   s
   || _ d S ©N)Úname)Úselfr	   © r   úU/var/www/html/CropPilot/venv/lib/python3.10/site-packages/scipy/special/_testutils.pyÚ__init__   s   
zMissingModule.__init__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r      s    r   c                 C   sR   t | ƒtu rtjj| j› d�d�S tjjt | j	¡t 
|¡k | j› d|› d�d�S )Nz is not installed©Úreasonz version >= z	 required)Útyper   ÚpytestÚmarkÚskipr	   Úskipifr   ÚparseÚ__version__ÚVersionr   )ÚmoduleÚmin_verr   r   r   Úcheck_version   s   þr   c                    s   t  ˆ ¡‡ fdd„ƒ}|S )zc
    Enable special function errors (such as underflow, overflow,
    loss of precision, etc.)
    c                     s@   t jdd�� ˆ | i |¤Ž}W d   ƒ |S 1 sw   Y  |S )NÚraise©Úall)ÚscÚerrstate)ÚaÚkwÚres©Úfuncr   r   Úwrapper*   s   
ÿþz$with_special_errors.<locals>.wrapper)Ú	functoolsÚwraps)r'   r(   r   r&   r   r   %   s   r   TFc                 C   s´   t |dƒr	t|ƒ}t |¡}|jdkr|d d …d f }|jd }t |dƒr,|}d }|}ntj||f }tt||jd ƒƒ}d }t| |tt|ƒƒ|||||||	||
|d�}| 	¡  d S )NÚnexté   r   )
Úresult_columnsÚresult_funcÚrtolÚatolÚparam_filterÚknownfailureÚnan_okÚ
vectorizedÚignore_inf_signÚdistinguish_nan_and_inf)
ÚhasattrÚlistÚnpÚasarrayÚndimÚshapeÚc_Úranger   Úcheck)r'   ÚresultsÚpointsr/   r0   r1   r2   r4   Údtyper3   r5   r6   ÚnparamsÚdatar-   r.   Úfdatar   r   r   r   7   s*   




ûr   c                   @   s<   e Zd ZdZ				ddd„Zdd„ Zdd	d
„Zdd„ ZdS )r   aí  
    Data set for checking a special function.

    Parameters
    ----------
    func : function
        Function to test
    data : numpy array
        columnar data to use for testing
    param_columns : int or tuple of ints
        Columns indices in which the parameters to `func` lie.
        Can be imaginary integers to indicate that the parameter
        should be cast to complex.
    result_columns : int or tuple of ints, optional
        Column indices for expected results from `func`.
    result_func : callable, optional
        Function to call to obtain results.
    rtol : float, optional
        Required relative tolerance. Default is 5*eps.
    atol : float, optional
        Required absolute tolerance. Default is 5*tiny.
    param_filter : function, or tuple of functions/Nones, optional
        Filter functions to exclude some parameter ranges.
        If omitted, no filtering is done.
    knownfailure : str, optional
        Known failure error message to raise when the test is run.
        If omitted, no exception is raised.
    nan_ok : bool, optional
        If nan is always an accepted result.
    vectorized : bool, optional
        Whether all functions passed in are vectorized.
    ignore_inf_sign : bool, optional
        Whether to ignore signs of infinities.
        (Doesn't matter for complex-valued functions.)
    distinguish_nan_and_inf : bool, optional
        If True, treat numbers which contain nans or infs as
        equal. Sets ignore_inf_sign to be True.

    NFTc                 C   sÖ   || _ || _|
| _t|dƒs|f}t|ƒ| _|d ur2t|dƒs"|f}t|ƒ| _|d ur1d}t|ƒ‚n|d ur:d | _ntdƒ‚|| _|| _	|| _
t|dƒsO|f}|| _|	| _|| _|| _|| _|| _| jsid| _d S d S )NÚ__len__z5Only result_func or result_columns should be providedz7Either result_func or result_columns should be providedT)r'   rD   Údatanamer7   ÚtupleÚparam_columnsr-   Ú
ValueErrorr.   r/   r0   r1   r2   r3   r4   r5   r6   )r
   r'   rD   rI   r-   r.   r/   r0   r1   r2   rG   r3   r4   r5   r6   Úmessager   r   r   r   �   s>   



þ

ÿzFuncData.__init__c                 C   s\   t  |t j¡st  t¡}t  |¡}| j| j}}|d u r!d|j }|d u r*d|j	 }||fS )Né   )
r9   Ú
issubdtypeÚinexactrB   ÚfloatÚfinfor/   r0   ÚepsÚtiny)r
   rB   Úinfor/   r0   r   r   r   Úget_tolerances¤   s   



zFuncData.get_tolerancesc           )         s–  t  dt¡}ˆjrtjˆjd� ˆ du rˆj‰ |du rˆ j}nˆ  |¡‰ ˆ 	|¡\}}ˆj
rYt ˆ jd ftj¡}tˆjˆj
ƒD ]\‰}|rT|t|ˆ dd…ˆf ƒƒM }q@ˆ | ‰ g ‰tˆjƒD ]A\}	‰t ˆ¡r}tˆjƒ‰ˆ ˆ dd…ˆf  t¡¡ q`|r–|	t|ƒk r–ˆ ˆ dd…ˆf  ||	 ¡¡ q`ˆ ˆ dd…ˆf ¡ q`d‡‡fdd„	}
|
ˆjƒ}ˆjdurÁt‡ fdd„ˆjD ƒƒ}nd}ˆjrÓt|ƒd	krÓt |d ¡}|
ˆj|d
�}tt|ƒt|ƒkƒ tt||ƒƒD �]\\}\}}t  |jtj!¡sþˆj"�rt #|¡}t #|¡}t #|¡}t #|¡}nt $|¡}t $|¡}t %|¡}t %|¡}t |¡}t |¡}tj&dd��3 t '|¡}d|t (|¡ < t '|| ¡}d|t (|¡ < |t '|¡ }d|t (|¡ < W d  ƒ n	1 �snw   Y  ||||  k}||k}||k}||k}||@ |@ |@  }|j)}ˆj�r©|| M }|| M }|||B  *¡ 8 }ˆj+�sÎˆj�sÎt #|¡} t #|¡}!| |@ ||!@ B }"||" M }||" *¡ 8 }t ,|¡�rHdg}#|# d||  -¡ d›�¡ |# d||  -¡ d›�¡ |# dt *|¡||f ¡ t .|¡d D ]:‰tˆƒ‰‡fdd„}$d /t0|$ˆƒ¡}%d /t0|$|ƒ¡}&d /t0|$|ƒ¡}'|$|ƒ}(|# |%› d|&› d|'› d|(› d�¡ �qtdd /|#¡ƒ qëdS )z,Check the special function against the data.Úerrisinstancer   Nr   c              	      s�   ˆj r| ˆŽ }n6g }ttˆd ƒƒD ]&‰ |d ur#|ˆ  r#| tj¡ q| | t‡ ‡fdd„ttˆƒƒD ƒƒŽ ¡ qt |¡}t|tƒsF|f}|S )Nr   c                    s   g | ]}ˆ| ˆ  ‘qS r   r   )Ú.0Úi)ÚjÚparamsr   r   Ú
<listcomp>ß   s    z?FuncData.check.<locals>.eval_func_at_params.<locals>.<listcomp>)	r4   r>   ÚlenÚappendr9   ÚnanrH   r:   Ú
isinstance)r'   Ú	skip_maskÚgot)rY   r
   ©rX   r   Úeval_func_at_paramsÖ   s   
,

z+FuncData.check.<locals>.eval_func_at_paramsc                    s   g | ]
}ˆ d d …|f ‘qS r   r   )rV   Úicol)rD   r   r   rZ   ë   s    z"FuncData.check.<locals>.<listcomp>r,   )r_   Úignorer   Ú zMax |adiff|: ÚgzMax |rdiff|: zCBad results (%d out of %d) for the following points (in output %d):c                    s   dt j| ˆ  dd� S )Nz%30sé   )Ú	precision)r9   Úarray2string)Úxra   r   r   Úfmt.  s   zFuncData.check.<locals>.fmtz  z => z != z	  (rdiff ú)FÚ
r   )1ÚoperatorÚmethodcallerÚAssertionErrorr2   r   ÚxfailrD   rB   ÚastyperT   r1   r9   Úonesr<   Úbool_ÚziprI   r8   Ú	enumerateÚiscomplexobjÚintÚimagr\   Úcomplexr[   r'   r-   rH   r3   Úisnanr.   r   rM   Úcomplexfloatingr5   ÚisinfÚisposinfÚisneginfr"   ÚabsoluteÚisfiniteÚsizeÚsumr6   ÚanyÚmaxÚnonzeroÚjoinÚmap))r
   rD   rB   ÚdtypesÚ__tracebackhide__r/   r0   Ú
param_maskÚfilterÚidxrb   r`   Úwantedr_   Ú
output_numrj   ÚyÚpinf_xÚpinf_yÚminf_xÚminf_yÚnan_xÚnan_yÚabs_yÚdiffÚrdiffÚtol_maskÚ	pinf_maskÚ	minf_maskÚnan_maskÚbad_jÚpoint_countÚinf_xÚinf_yÚboth_nonfiniteÚmsgrk   r#   ÚbÚcÚdr   )rD   rX   rY   r
   r   r?   ¯   s²   ÿ
€

"











ù	




þ&€ÂzFuncData.checkc                 C   s`   t  ttt j| jƒƒ¡rd}nd}| jr&d| jj› |› dt	j
 | j¡› d�S d| jj› |› d�S )zPretty-printingz
 (complex)re   z
<Data for z: ú>)r9   r„   r8   rˆ   rw   rI   rG   r'   r   ÚosÚpathÚbasename)r
   Ú
is_complexr   r   r   Ú__repr__7  s   ÿzFuncData.__repr__)NNNNNNNFTFT)NNN)r   r   r   Ú__doc__r   rT   r?   r¬   r   r   r   r   r   X   s    (
ý#
 	r   )	NNNNTNFFT)r¨   r)   rn   Ú
scipy._libr   Únumpyr9   Únumpy.testingr   r   Úscipy.specialÚspecialr!   Ú__all__r   r   r   r   r   r   r   r   r   Ú<module>   s$    
ý!