ó
Ê½÷Xc           @` sÚ   d  Z  d d l m Z m Z m Z d d l Z d d l m Z m Z m	 Z	 m
 Z
 d d l j j Z d d l m Z d d l Z d d d d	 „ Z d d d
 „ Z d „  Z d „  Z d d d „ Z d e f d „  ƒ  YZ d S(   s    
Tests for line search routines
i    (   t   divisiont   print_functiont   absolute_importN(   t   assert_t   assert_equalt   assert_array_almost_equalt   assert_array_almost_equal_nulp(   t   LineSearchWarningg-Cëâ6?gÍÌÌÌÌÌì?t    c         C` sš   | |  ƒ } | d ƒ } | d ƒ } | |  ƒ }	 d |  | | | |	 | f }
 t  | | | |  | k d |
 ƒ t  t |	 ƒ t | | ƒ k d |
 ƒ d S(   s2   
    Check that strong Wolfe conditions apply
    i    s@   s = %s; phi(0) = %s; phi(s) = %s; phi'(0) = %s; phi'(s) = %s; %ss   Wolfe 1 failed: s   Wolfe 2 failed: N(   R   t   abs(   t   st   phit   derphit   c1t   c2t   err_msgt   phi1t   phi0t   derphi0t   derphi1t   msg(    (    sC   /tmp/pip-build-7oUkmx/scipy/scipy/optimize/tests/test_linesearch.pyt   assert_wolfe   s    #c         C` sQ   | |  ƒ } | d ƒ } d |  | | | f } t  | d | |  | k | ƒ d S(   s-   
    Check that Armijo condition applies
    i    s$   s = %s; phi(0) = %s; phi(s) = %s; %si   N(   R   (   R
   R   R   R   R   R   R   (    (    sC   /tmp/pip-build-7oUkmx/scipy/scipy/optimize/tests/test_linesearch.pyt   assert_armijo   s    c         ` s;   t  | d ‡  ‡ ‡ f d †  d ‡ ‡ ‡ f d †  | d  S(   NR   c         ` s   ˆ  ˆ ˆ |  ƒ S(   N(    (   t   sp(   t   ft   pt   x(    sC   /tmp/pip-build-7oUkmx/scipy/scipy/optimize/tests/test_linesearch.pyt   <lambda>)   s    R   c         ` s   t  j ˆ  ˆ ˆ |  ƒ ˆ ƒ S(   N(   t   npt   dot(   R   (   t   fprimeR   R   (    sC   /tmp/pip-build-7oUkmx/scipy/scipy/optimize/tests/test_linesearch.pyR   *   s    (   R   (   R   R   R
   R   R   t   kw(    (   R   R   R   R   sC   /tmp/pip-build-7oUkmx/scipy/scipy/optimize/tests/test_linesearch.pyt   assert_line_wolfe(   s    c         ` s&   t  | d ‡  ‡ ‡ f d †  | d  S(   NR   c         ` s   ˆ  ˆ ˆ |  ƒ S(   N(    (   R   (   R   R   R   (    sC   /tmp/pip-build-7oUkmx/scipy/scipy/optimize/tests/test_linesearch.pyR   .   s    (   R   (   R   R   R
   R   R   (    (   R   R   R   sC   /tmp/pip-build-7oUkmx/scipy/scipy/optimize/tests/test_linesearch.pyt   assert_line_armijo-   s    i2   c         C` sD   y t  |  | | ƒ Wn) t k
 r? } t d | | f ƒ ‚ n Xd S(   sE   Assert two arrays are equal, up to some floating-point rounding errors   %s
%sN(   R   t   AssertionError(   R   t   yR   t   nulpt   e(    (    sC   /tmp/pip-build-7oUkmx/scipy/scipy/optimize/tests/test_linesearch.pyt   assert_fp_equal1   s    t   TestLineSearchc           B` s¡   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   c         C` sN   |  j  d 7_  | | d | d } d d | d d | d } | | f S(   Ni   i   i   iÿÿÿÿi   (   t   fcount(   t   selfR
   R   t   dp(    (    sC   /tmp/pip-build-7oUkmx/scipy/scipy/optimize/tests/test_linesearch.pyt   _scalar_func_1;   s    c         C` sS   |  j  d 7_  t j d | ƒ | d } d t j d | ƒ d | } | | f S(   Ni   iüÿÿÿi   (   R(   R   t   exp(   R)   R
   R   R*   (    (    sC   /tmp/pip-build-7oUkmx/scipy/scipy/optimize/tests/test_linesearch.pyt   _scalar_func_2A   s    c         C` sD   |  j  d 7_  t j d | ƒ } d t j d | ƒ } | | f S(   Ni   i
   iöÿÿÿ(   R(   R   t   sint   cos(   R)   R
   R   R*   (    (    sC   /tmp/pip-build-7oUkmx/scipy/scipy/optimize/tests/test_linesearch.pyt   _scalar_func_3G   s    c         C` s5   |  j  d 7_  t j | | ƒ } d | } | | f S(   Ni   i   (   R(   R   R   (   R)   R   R   t   df(    (    sC   /tmp/pip-build-7oUkmx/scipy/scipy/optimize/tests/test_linesearch.pyt   _line_func_1O   s    
c         C` s]   |  j  d 7_  t j | t j |  j | ƒ ƒ d } t j |  j |  j j | ƒ } | | f S(   Ni   (   R(   R   R   t   At   T(   R)   R   R   R1   (    (    sC   /tmp/pip-build-7oUkmx/scipy/scipy/optimize/tests/test_linesearch.pyt   _line_func_2U   s    %c         C` sæ   g  |  _  g  |  _ d |  _ d |  _ d „  } x² t t |  ƒ ƒ D]ž } | j d ƒ r’ t |  | ƒ } |  j  j | | | d ƒ | | d ƒ f ƒ q@ | j d ƒ r@ t |  | ƒ } |  j j | | | d ƒ | | d ƒ f ƒ q@ q@ Wd  S(   Ni   i    c         ` s   ‡  ‡ f d †  S(   Nc          ` s   ˆ  |  | Ž  ˆ S(   N(    (   t   aR   (   t   funct   idx(    sC   /tmp/pip-build-7oUkmx/scipy/scipy/optimize/tests/test_linesearch.pyR   e   s    (    (   R7   R8   (    (   R7   R8   sC   /tmp/pip-build-7oUkmx/scipy/scipy/optimize/tests/test_linesearch.pyt
   bind_indexc   s    t   _scalar_func_i   t   _line_func_(	   t   scalar_funcst
   line_funcst   NR(   t   sortedt   dirt
   startswitht   getattrt   append(   R)   R9   t   namet   value(    (    sC   /tmp/pip-build-7oUkmx/scipy/scipy/optimize/tests/test_linesearch.pyt   __init__]   s    						%	c         C` s2   t  j j d ƒ t  j j |  j |  j ƒ |  _ d  S(   NiÒ  (   R   t   randomt   seedt   randnR>   R3   (   R)   (    (    sC   /tmp/pip-build-7oUkmx/scipy/scipy/optimize/tests/test_linesearch.pyt   setUpq   s    c         c` sO   xH |  j  D]= \ } } } x+ t j j d ƒ D] } | | | | f Vq, Wq
 Wd  S(   Ni   (   R<   R   RG   RI   (   R)   RD   R   R   t   old_phi0(    (    sC   /tmp/pip-build-7oUkmx/scipy/scipy/optimize/tests/test_linesearch.pyt   scalar_iteru   s    c         c` s¾   x· |  j  D]¬ \ } } } d } x” | d k  rµ t j j |  j ƒ } t j j |  j ƒ } t j | | | ƒ ƒ d k r| q" n  | d 7} t t j j ƒ  ƒ } | | | | | | f Vq" Wq
 Wd  S(   Ni    i	   i   (   R=   R   RG   RI   R>   R   t   float(   R)   RD   R   R   t   kR   R   t   old_fv(    (    sC   /tmp/pip-build-7oUkmx/scipy/scipy/optimize/tests/test_linesearch.pyt	   line_iterz   s    
c   	      C` s¹   d } xœ |  j  ƒ  D]Ž \ } } } } | d 7} t j | | | d ƒ | | d ƒ ƒ \ } } } t | | d ƒ | ƒ t | | | ƒ | ƒ t | | | d | ƒq Wt | d k ƒ d  S(   Ni    i   R   i   (   RL   t   lst   scalar_search_wolfe1R&   R   R   (	   R)   t   cRD   R   R   RK   R
   R   R   (    (    sC   /tmp/pip-build-7oUkmx/scipy/scipy/optimize/tests/test_linesearch.pyt   test_scalar_search_wolfe1‰   s    
c   	   	   C` sË   xÄ |  j  ƒ  D]¶ \ } } } } t j | | | d ƒ | | d ƒ ƒ \ } } } } t | | d ƒ | ƒ t | | | ƒ | ƒ | d  k	 r£ t | | | ƒ | ƒ n  t | | | d d | | f ƒq Wd  S(   Ni    R   s   %s %g(   RL   RQ   t   scalar_search_wolfe2R&   t   NoneR   (	   R)   RD   R   R   RK   R
   R   R   R   (    (    sC   /tmp/pip-build-7oUkmx/scipy/scipy/optimize/tests/test_linesearch.pyt   test_scalar_search_wolfe2•   s    -c         C` s   xz |  j  ƒ  D]l \ } } } } t j | | d ƒ | d ƒ ƒ \ } } t | | | ƒ | ƒ t | | d d | | f ƒq Wd  S(   Ni    R   s   %s %g(   RL   RQ   t   scalar_search_armijoR&   R   (   R)   RD   R   R   RK   R
   R   (    (    sC   /tmp/pip-build-7oUkmx/scipy/scipy/optimize/tests/test_linesearch.pyt   test_scalar_search_armijoŸ   s    'c         C` sM  d } d } x*|  j  ƒ  D]\ } } } } } } | | ƒ }	 | | ƒ }
 d |  _ t j | | | | |
 |	 | d | ƒ\ } } } } } } t |  j | | ƒ t | | | ƒ ƒ | d  k rÄ q n  t | | | | | ƒ ƒ t | | | | | ƒ d d ƒ| | k  r | d 7} t | | | | | d | ƒq q Wt	 | d k ƒ d  S(	   Ni    id   t   amaxt   decimali   i   R   i   (
   RP   R(   RQ   t   line_search_wolfe1R   R&   RV   R   R    R   (   R)   RS   t   smaxRD   R   R   R   R   t   old_ft   f0t   g0R
   t   fct   gct   fvt   ofvt   gv(    (    sC   /tmp/pip-build-7oUkmx/scipy/scipy/optimize/tests/test_linesearch.pyt   test_line_search_wolfe1§   s&    %	!
#c         C` sm  d } d } xJ|  j  ƒ  D]<\ } } } } } } | | ƒ }	 | | ƒ }
 d |  _ t j ƒ  N t j d t ƒ t j | | | | |
 |	 | d | ƒ\ } } } } } } Wd  QXt |  j | | ƒ t	 | | | ƒ ƒ t	 | | | | | ƒ ƒ | d  k	 r t | | | | | ƒ d d ƒn  | | k  r | d 7} t | | | | | d | ƒq q Wt | d	 k ƒ d  S(
   Ni    id   t   ignoreRZ   R[   i   i   R   i   (   RP   R(   t   warningst   catch_warningst   simplefilterR   RQ   t   line_search_wolfe2R   R&   RV   R   R    R   (   R)   RS   R]   RD   R   R   R   R   R^   R_   R`   R
   Ra   Rb   Rc   Rd   Re   (    (    sC   /tmp/pip-build-7oUkmx/scipy/scipy/optimize/tests/test_linesearch.pyt   test_line_search_wolfe2½   s(    %	!$
#c         C` sÖ   d } x¹ |  j  ƒ  D]« \ } } } } } } | | ƒ } | | ƒ }	 d |  _ t j | | | |	 | ƒ \ }
 } } | d 7} t |  j | ƒ t | | | |
 | ƒ ƒ t | | |
 | d | ƒq Wt | d k ƒ d  S(   Ni    i   R   i	   (   RP   R(   RQ   t   line_search_armijoR   R&   R!   R   (   R)   RS   RD   R   R   R   R   R^   R_   R`   R
   Ra   Rc   (    (    sC   /tmp/pip-build-7oUkmx/scipy/scipy/optimize/tests/test_linesearch.pyt   test_line_search_armijoÓ   s    %	$
c         ` sn   d g ‰  ‡  f d †  } t  j | | d ƒ d d d ƒ\ } } t | d ƒ t ˆ  d d ƒ t | | ƒ d  S(   Ni    c         ` s!   ˆ  d c d 7<|  d |  d S(   Ni    i   g{®Gáz„?i   (    (   R
   (   t   count(    sC   /tmp/pip-build-7oUkmx/scipy/scipy/optimize/tests/test_linesearch.pyR   ç   s    iÿÿÿÿt   alpha0i   i   (   RQ   RX   R   R   (   R)   R   R
   R   (    (   Ro   sC   /tmp/pip-build-7oUkmx/scipy/scipy/optimize/tests/test_linesearch.pyt   test_armijo_terminate_1â   s    	'c         ` sÆ   ‡  f d †  } ‡  f d †  } x¡ t  j t  j g D] } d g ‰  | | | | d ƒ d  | d ƒ ƒ } t | d d  k	 | | f ƒ t ˆ  d d k ˆ  | f ƒ t | d | | d t | ƒ ƒq1 Wd  S(   Nc         ` s!   ˆ  d c d 7<|  d |  d S(   Ni    i   gš™™™™™©?i   (    (   R
   (   Ro   (    sC   /tmp/pip-build-7oUkmx/scipy/scipy/optimize/tests/test_linesearch.pyR   ó   s    c         ` s   ˆ  d c d 7<d d |  S(   Ni    i   iÿÿÿÿgš™™™™™©?i   gš™™™™™¹?(    (   R
   (   Ro   (    sC   /tmp/pip-build-7oUkmx/scipy/scipy/optimize/tests/test_linesearch.pyR   ÷   s    i    i   R   i   (   RQ   RR   RU   RV   R   R   t   str(   R)   R   R   R7   t   r(    (   Ro   sC   /tmp/pip-build-7oUkmx/scipy/scipy/optimize/tests/test_linesearch.pyt   test_wolfe_terminateï   s    	$(   t   __name__t
   __module__R+   R-   R0   R2   R5   RF   RJ   RL   RP   RT   RW   RY   Rf   Rl   Rn   Rq   Rt   (    (    (    sC   /tmp/pip-build-7oUkmx/scipy/scipy/optimize/tests/test_linesearch.pyR'   9   s"   											
					(   t   __doc__t
   __future__R    R   R   Rh   t   numpy.testingR   R   R   R   t   scipy.optimize.linesearcht   optimizet
   linesearchRQ   R   t   numpyR   R   R   R    R!   R&   t   objectR'   (    (    (    sC   /tmp/pip-build-7oUkmx/scipy/scipy/optimize/tests/test_linesearch.pyt   <module>   s   "
		