a
    a.                  	   @   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)LooseVersion)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   h/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/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   sJ   t | tkr"tjjd| jdS tjjt| j	t|k d| j
|dS )Nz{} is not installedreasonz{} version >= {} required)typer   pytestmarkskipformatr	   Zskipifr   __version__r   )moduleZ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    n1 s00    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r6|d d d f }|jd }t |drX|}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shapeZc_ranger   check)r$   resultsZpointsr,   r-   r.   r/   r1   dtyper0   r2   r3   nparamsdatar*   r+   fdatar   r   r   r   5   s*    




r   c                   @   s4   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 as
        equal. Sets ignore_inf_sign to be True.

    NFTc                 C   s   || _ || _|
| _t|ds"|f}t|| _|d ur`t|dsD|f}t|| _|d urxtdn|d urpd | _ntd|| _|| _	|| _
t|ds|f}|| _|	| _|| _|| _|| _|| _| jsd| _d S )N__len__z5Only result_func or result_columns should be providedz7Either result_func or result_columns should be providedT)r$   r?   datanamer4   tupleparam_columnsr*   
ValueErrorr+   r,   r-   r.   r/   r0   r1   r2   r3   )r
   r$   r?   rD   r*   r+   r,   r-   r.   r/   rB   r0   r1   r2   r3   r   r   r   r      s8    





zFuncData.__init__c                 C   s\   t |t jst t}t |}| j| j }}|d u rBd|j }|d u rTd|j	 }||fS )N   )
r6   
issubdtypeZinexactr=   floatZfinfor,   r-   ZepsZtiny)r
   r=   infor,   r-   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
rt jd ftj}tjj
D ](\}|r|t| ddf M }q |  g tjD ]\}	trtj ddf t q|r0|	t|k r0 ddf ||	  q ddf  qdfdd	}
|
j}jdurt fddjD }n6d}jrt|d	krt|d }|
j|d
}tt|t|k tt||D ]\}\}}t |jtj!sj"r2t#|}t#|}t#|}t#|}n(t$|}t$|}t%|}t%|}t|}t|}tj&ddf t'|}d|t(| < t'|| }d|t(| < |t'| }d|t(| < W d   n1 s0    Y  ||||  k}||k}||k}||k}||@ |@ |@  }|j)}jr^|| M }|| M }|||B * 8 }j+sjst#|} t#|}!| |@ ||!@ B }"||" M }||"* 8 }t,|rdg}#|#d|| -   |#d|| -   |#dt*|||f  t.|d D ]htfdd}$d/t0|$}%d/t0|$|}&d/t0|$|}'|$|}(|#d|%|&|'|(f  qtdd/|# qdS )z,Check the special function against the data.Zerrisinstancer   Nr   c              	      s   j r|  }nlg }ttd D ]L |d urF|  rF|tj q$|| t fddttD   q$t|}t|ts|f}|S )Nr   c                    s   g | ]}|   qS r   r   ).0i)jparamsr   r   
<listcomp>       z?FuncData.check.<locals>.eval_func_at_params.<locals>.<listcomp>)	r1   r:   lenappendr6   nanrC   r7   
isinstance)r$   	skip_maskgot)rN   r
   rM   r   eval_func_at_params   s    
,

z+FuncData.check.<locals>.eval_func_at_paramsc                    s   g | ]} d d |f qS r   r   )rK   Zicol)r?   r   r   rO      rP   z"FuncData.check.<locals>.<listcomp>r)   )rU   ignorer    zMax |adiff|: %gzMax |rdiff|: %gzCBad results (%d out of %d) for the following points (in output %d):c                    s   dt j|   dd S )Nz%30s   )Z	precision)r6   Zarray2string)xrW   r   r   <lambda>*  rP   z FuncData.check.<locals>.<lambda>z  z%s => %s != %s  (rdiff %s)F
)N)1operatormethodcallerAssertionErrorr/   r   Zxfailr?   r=   ZastyperJ   r.   r6   Zonesr9   Zbool_ziprD   r5   	enumerateiscomplexobjintimagrR   complexrQ   r$   r*   rC   r0   isnanr+   r   rG   Zcomplexfloatingr2   isinfZisposinfZisneginfr   absoluteisfinitesizesumr3   anymaxZnonzerojoinmap))r
   r?   r=   ZdtypesZ__tracebackhide__r,   r-   Z
param_maskfilteridxrX   rV   wantedrU   Z
output_numr\   yZpinf_xZpinf_yZminf_xZminf_yZnan_xZnan_yZabs_ydiffZrdiffZtol_maskZ	pinf_maskZ	minf_maskZnan_maskZbad_jZpoint_countZinf_xZinf_yZboth_nonfinitemsgfmtr    bcdr   )r?   rM   rN   r
   r   r;      s    


"










0




zFuncData.checkc                 C   sX   t ttt j| jrd}nd}| jrDd| jj|t	j
| jf S d| jj|f S dS )z%Pretty-printing, esp. for Nose outputz
 (complex)rZ   z<Data for %s%s: %s>z<Data for %s%s>N)r6   rn   r5   rq   rd   rD   rB   r$   r   ospathbasename)r
   Z
is_complexr   r   r   __repr__2  s    
zFuncData.__repr__)NNNNNNNFTFT)NNN)r   r   r   __doc__r   rJ   r;   r   r   r   r   r   r   V   s   (    
"
 r   )	NNNNTNFFT)r|   r&   r_   Zdistutils.versionr   Znumpyr6   Znumpy.testingr   r   Zscipy.specialZspecialr   __all__r   r   r   r   r   r   r   r   r   <module>   s"       
!