σ
ξ&]\c        
   @` sπ   d  d l  m Z m Z m Z d  d l Z d  d l m Z d  d l Z d  d l Z	 d  d l
 m Z d  d l Z d  d l j Z d d d g Z d e f d	     YZ d
   Z d   Z d d d d e d e e e d 	 Z d e f d     YZ d S(   i    (   t   divisiont   print_functiont   absolute_importN(   t   LooseVersion(   t   assert_t   with_special_errorst   assert_func_equalt   FuncDatat   MissingModulec           B` s   e  Z d    Z RS(   c         C` s   | |  _  d  S(   N(   t   name(   t   selfR	   (    (    s7   lib/python2.7/site-packages/scipy/special/_testutils.pyt   __init__   s    (   t   __name__t
   __module__R   (    (    (    s7   lib/python2.7/site-packages/scipy/special/_testutils.pyR      s   c         C` sk   t  |   t k r1 t j j d d j |  j   St j j t |  j	  t |  k  d d j |  j
 |  S(   Nt   reasons   {} is not installeds   {} version >= {} required(   t   typeR   t   pytestt   markt   skipt   formatR	   t   skipifR   t   __version__R   (   t   modulet   min_ver(    (    s7   lib/python2.7/site-packages/scipy/special/_testutils.pyt   check_version   s    $c         ` s"   t  j      f d    } | S(   sc   
    Enable special function errors (such as underflow, overflow,
    loss of precision, etc.)
    c          ` s,   t  j d d     |  |   } Wd  QX| S(   Nt   allt   raise(   t   sct   errstate(   t   at   kwt   res(   t   func(    s7   lib/python2.7/site-packages/scipy/special/_testutils.pyt   wrapper+   s    (   t	   functoolst   wraps(   R    R!   (    (   R    s7   lib/python2.7/site-packages/scipy/special/_testutils.pyR   &   s    c         C` s#  t  | d  r t |  } n  t j |  } | j d k rU | d  d   d  f } n  | j d } t  | d  r | } d  } | } n5 t j | | f } t t | | j d   } d  } t	 |  | t t |   d | d | d | d | d | d	 | d
 |	 d | d |
 d | 
} | j
   d  S(   Nt   nexti   R   t   result_columnst   result_funct   rtolt   atolt   param_filtert   knownfailuret   nan_okt
   vectorizedt   ignore_inf_signt   distinguish_nan_and_inf(   t   hasattrt   listt   npt   asarrayt   ndimt   Nonet   shapet   c_t   rangeR   t   check(   R    t   resultst   pointsR'   R(   R)   R*   R,   t   dtypeR+   R-   R.   t   nparamst   dataR%   R&   t   fdata(    (    s7   lib/python2.7/site-packages/scipy/special/_testutils.pyR   8   s(    		c           B` s\   e  Z d  Z d d d d d d d e e e e d  Z d   Z d d d d  Z d   Z	 RS(   sπ  
    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.

    c         C` sB  | |  _  | |  _ |
 |  _ t | d  s6 | f } n  t |  |  _ | d  k	 r t | d  sl | f } n  t |  |  _ | d  k	 r½ t d   q½ n$ | d  k	 r± d  |  _ n t d   | |  _	 | |  _
 | |  _ t | d  sσ | f } n  | |  _ |	 |  _ | |  _ | |  _ | |  _ | |  _ |  j s>t |  _ n  d  S(   Nt   __len__s5   Only result_func or result_columns should be provideds7   Either result_func or result_columns should be provided(   R    R=   t   datanameR/   t   tuplet   param_columnsR4   R%   t
   ValueErrorR&   R'   R(   R)   R*   R+   R,   R-   R.   t   True(   R
   R    R=   RB   R%   R&   R'   R(   R)   R*   R@   R+   R,   R-   R.   (    (    s7   lib/python2.7/site-packages/scipy/special/_testutils.pyR      s8    													c         C` s   t  j | t  j  s' t  j t  } n  t  j |  } |  j |  j } } | d  k re d | j	 } n  | d  k r d | j
 } n  | | f S(   Ni   (   R1   t
   issubdtypet   inexactR;   t   floatt   finfoR'   R(   R4   t   epst   tiny(   R
   R;   t   infoR'   R(   (    (    s7   lib/python2.7/site-packages/scipy/special/_testutils.pyt   get_tolerances€   s    c   *      ` s6   j  r t j d  j   n  | d k r7  j } n  | d k rO | j } n | j |  }  j |  \ } }  j rύ t	 j
 | j d f t	 j  } xR t  j  j  D]; \   } | r± | t | | d d    f   M} q± q± W| | } n  g   xΖ t  j  D]΅ \ }   t	 j    rft   j     j | d d    f j t   q| r«| t |  k  r« j | d d    f j | |   q j | d d    f  qWd   f d  }	 |	  j  }
  j d k	 r4t g   j D] } | d d  | f ^ q } nL d }  j rkt |
  d k rkt	 j |
 d  } n  |	  j d | } t t |
  t |  k  xt t |
 |   D]|\ } \ } } t	 j | j t	 j  sε j  r$t	 j! |  } t	 j! |  } t	 j! |  } t	 j! |  } n< t	 j" |  } t	 j" |  } t	 j# |  } t	 j# |  } t	 j |  } t	 j |  } t	 j$ d d  } zu t	 j% |  } d | t	 j& |  <t	 j% | |  } d | t	 j& |  <| t	 j% |  } d | t	 j& |  <Wd t	 j$ |   X| | | | k } | | k } | | k } | | k } | | @| @| @} | j' }   j r | | M} | | M} |  | | Bj(   8}  n   j) r j rt	 j! |  }! t	 j! |  }" |! | @| |" @B}# | |# M} |  |# j(   8}  n  t	 j* |  r²d	 g }$ |$ j d
 | j+    |$ j d | j+    |$ j d t	 j( |  |  | f  x§ t	 j, |  d D]   t        f d   }% d j- t. |%    }& d j- t. |% |
   }' d j- t. |% |   }( |% |  }) |$ j d |& |' |( |) f  qWt t/ d j- |$   q²q²Wd S(   s,   Check the special function against the data.R   i    Nc         ` sΩ    j  r |      } n’ g  } x t t   d   D]r } | d  k	 rg | | rg | j t j  q5 n  | j |  t g  t t     D] }   | | ^ q     q5 Wt j |  } t	 | t  sΥ | f } n  | S(   Ni    (
   R,   R7   t   lenR4   t   appendR1   t   nanRA   R2   t
   isinstance(   R    t	   skip_maskt   gott   jt   i(   t   paramsR
   (    s7   lib/python2.7/site-packages/scipy/special/_testutils.pyt   eval_func_at_paramsΣ   s    	Di   RQ   R   t   ignoret    s   Max |adiff|: %gs   Max |rdiff|: %gsC   Bad results (%d out of %d) for the following points (in output %d):c         ` s   d t  j |    d d S(   Ns   %30st	   precisioni   (   R1   t   array2string(   t   x(   RS   (    s7   lib/python2.7/site-packages/scipy/special/_testutils.pyt   <lambda>-  s    s     s   %s => %s != %s  (rdiff %s)s   
(0   R*   R   t   xfailR4   R=   R;   t   astypeRL   R)   R1   t   onesR5   t   bool_t   zipRB   R0   t	   enumeratet   iscomplexobjt   intt   imagRN   t   complexRM   R    R%   RA   R+   t   isnanR&   R   RE   t   complexfloatingR-   t   isinft   isposinft   isneginft   seterrt   absolutet   isfinitet   sizet   sumR.   t   anyt   maxt   nonzerot   joint   mapt   False(*   R
   R=   R;   t   dtypesR'   R(   t
   param_maskt   filtert   idxRV   RR   t   icolt   wantedRQ   t
   output_numR[   t   yt   pinf_xt   pinf_yt   minf_xt   minf_yt   nan_xt   nan_yt   olderrt   abs_yt   difft   rdifft   tol_maskt	   pinf_maskt	   minf_maskt   nan_maskt   bad_jt   point_countt   inf_xt   inf_yt   both_nonfinitet   msgt   fmtR   t   bt   ct   d(    (   RS   RU   R
   s7   lib/python2.7/site-packages/scipy/special/_testutils.pyR8   ―   s¦    		"-)-!5(!				!c         C` sz   t  j t t t  j |  j    r- d } n d } |  j rb d |  j j | t	 j
 j |  j  f Sd |  j j | f Sd S(   s%   Pretty-printing, esp. for Nose outputs
    (complex)RX   s   <Data for %s%s: %s>s   <Data for %s%s>N(   R1   Rq   R0   Ru   Rc   RB   R@   R    R   t   ost   patht   basename(   R
   t
   is_complex(    (    s7   lib/python2.7/site-packages/scipy/special/_testutils.pyt   __repr__5  s    $		N(
   R   R   t   __doc__R4   Rv   RD   R   RL   R8   R   (    (    (    s7   lib/python2.7/site-packages/scipy/special/_testutils.pyR   Y   s   '	(   t
   __future__R    R   R   R   t   distutils.versionR   R"   t   numpyR1   t   numpy.testingR   R   t   scipy.specialt   specialR   t   __all__t   objectR   R   R   R4   RD   Rv   R   R   (    (    (    s7   lib/python2.7/site-packages/scipy/special/_testutils.pyt   <module>   s    			