ó
î&]\c           @` sä   d  Z  d d l m Z m Z m Z d d l m Z m Z m Z m	 Z	 m
 Z
 d d l 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_import(   t   assert_t   assert_equalt   assert_array_almost_equalt   assert_array_almost_equal_nulpt   assert_warns(   t   suppress_warningsN(   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   lib/python2.7/site-packages/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   lib/python2.7/site-packages/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   lib/python2.7/site-packages/scipy/optimize/tests/test_linesearch.pyt   <lambda>(   s    R   c         ` s   t  j ˆ  ˆ ˆ |  ƒ ˆ ƒ S(   N(   t   npt   dot(   R   (   t   fprimeR   R   (    sC   lib/python2.7/site-packages/scipy/optimize/tests/test_linesearch.pyR   )   s    (   R   (   R   R   R   R   R    t   kw(    (   R   R    R   R   sC   lib/python2.7/site-packages/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   lib/python2.7/site-packages/scipy/optimize/tests/test_linesearch.pyR   -   s    (   R   (   R   R   R   R   R!   (    (   R   R   R   sC   lib/python2.7/site-packages/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   lib/python2.7/site-packages/scipy/optimize/tests/test_linesearch.pyt   assert_fp_equal0   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   lib/python2.7/site-packages/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   lib/python2.7/site-packages/scipy/optimize/tests/test_linesearch.pyt   _scalar_func_2@   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   lib/python2.7/site-packages/scipy/optimize/tests/test_linesearch.pyt   _scalar_func_3F   s    c         C` s5   |  j  d 7_  t j | | ƒ } d | } | | f S(   Ni   i   (   R*   R   R   (   R+   R   R   t   df(    (    sC   lib/python2.7/site-packages/scipy/optimize/tests/test_linesearch.pyt   _line_func_1N   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   R3   (    (    sC   lib/python2.7/site-packages/scipy/optimize/tests/test_linesearch.pyt   _line_func_2T   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@ Wt	 j
 j d ƒ t	 j
 j |  j |  j ƒ |  _ d  S(   Ni   i    c         ` s   ‡  ‡ f d †  S(   Nc          ` s   ˆ  |  | Ž  ˆ S(   N(    (   t   aR!   (   t   funct   idx(    sC   lib/python2.7/site-packages/scipy/optimize/tests/test_linesearch.pyR   d   s    (    (   R9   R:   (    (   R9   R:   sC   lib/python2.7/site-packages/scipy/optimize/tests/test_linesearch.pyt
   bind_indexb   s    t   _scalar_func_i   t   _line_func_iÒ  (   t   scalar_funcst
   line_funcst   NR*   t   sortedt   dirt
   startswitht   getattrt   appendR   t   randomt   seedt   randnR5   (   R+   R;   t   namet   value(    (    sC   lib/python2.7/site-packages/scipy/optimize/tests/test_linesearch.pyt   setup_method\   s     						%	)c         c` sO   xH |  j  D]= \ } } } x+ t j j d ƒ D] } | | | | f Vq, Wq
 Wd  S(   Ni   (   R>   R   RF   RH   (   R+   RI   R   R   t   old_phi0(    (    sC   lib/python2.7/site-packages/scipy/optimize/tests/test_linesearch.pyt   scalar_iters   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   RF   RH   R@   R   t   float(   R+   RI   R   R    t   kR   R   t   old_fv(    (    sC   lib/python2.7/site-packages/scipy/optimize/tests/test_linesearch.pyt	   line_iterx   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   (   RM   t   lst   scalar_search_wolfe1R(   R   R   (	   R+   t   cRI   R   R   RL   R   R   R   (    (    sC   lib/python2.7/site-packages/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(   RM   RR   t   scalar_search_wolfe2R(   t   NoneR   (	   R+   RI   R   R   RL   R   R   R   R   (    (    sC   lib/python2.7/site-packages/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(   RM   RR   t   scalar_search_armijoR(   R   (   R+   RI   R   R   RL   R   R   (    (    sC   lib/python2.7/site-packages/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   (
   RQ   R*   RR   t   line_search_wolfe1R   R(   RW   R   R"   R   (   R+   RT   t   smaxRI   R   R    R   R   t   old_ft   f0t   g0R   t   fct   gct   fvt   ofvt   gv(    (    sC   lib/python2.7/site-packages/scipy/optimize/tests/test_linesearch.pyt   test_line_search_wolfe1¥   s&    %	!
#c         C` s|  d } d } xY|  j  ƒ  D]K\ } } } } } } | | ƒ }	 | | ƒ }
 d |  _ t ƒ  ` } | j t d ƒ | j t d ƒ 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    i   s3   The line search algorithm could not find a solutions*   The line search algorithm did not convergeR[   R\   i   i   R   i   (   RQ   R*   R   t   filterR	   RR   t   line_search_wolfe2R   R(   RW   R   R"   R   (   R+   RT   R^   RI   R   R    R   R   R_   R`   Ra   t   supR   Rb   Rc   Rd   Re   Rf   (    (    sC   lib/python2.7/site-packages/scipy/optimize/tests/test_linesearch.pyt   test_line_search_wolfe2»   s.    %			!$
#c         C` sû   d „  } d „  } t  j d d g ƒ } d | } d } t j | | | | d d d	 | ƒ\ } } } } } } t | | | | | ƒ t t t j | | | | d d
 d	 | ƒ\ } } } } } } t | d  k ƒ t t t j | | | | d	 | d d ƒd  S(   Nc         S` s   t  j |  |  ƒ S(   N(   R   R   (   R   (    (    sC   lib/python2.7/site-packages/scipy/optimize/tests/test_linesearch.pyR   Ú   s    c         S` s   d |  S(   Ni   (    (   R   (    (    sC   lib/python2.7/site-packages/scipy/optimize/tests/test_linesearch.pyR   Û   s    i   i    iÄÿÿÿg      à?R[   i   R   i   t   maxiteri   (	   R   t   arrayRR   Ri   R"   R   R	   R   RW   (   R+   R   t   fpR   R   R   R   t   _(    (    sC   lib/python2.7/site-packages/scipy/optimize/tests/test_linesearch.pyt   test_line_search_wolfe2_boundsÔ   s    		
6!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	   (   RQ   R*   RR   t   line_search_armijoR   R(   R#   R   (   R+   RT   RI   R   R    R   R   R_   R`   Ra   R   Rb   Rd   (    (    sC   lib/python2.7/site-packages/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   lib/python2.7/site-packages/scipy/optimize/tests/test_linesearch.pyR     s    iÿÿÿÿt   alpha0i   i   (   RR   RY   R   R   (   R+   R   R   R   (    (   Rs   sC   lib/python2.7/site-packages/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   (   Rs   (    sC   lib/python2.7/site-packages/scipy/optimize/tests/test_linesearch.pyR     s    c         ` s   ˆ  d c d 7<d d |  S(   Ni    i   iÿÿÿÿgš™™™™™©?i   gš™™™™™¹?(    (   R   (   Rs   (    sC   lib/python2.7/site-packages/scipy/optimize/tests/test_linesearch.pyR     s    i    i   R   i   (   RR   RS   RV   RW   R   R   t   str(   R+   R   R   R9   t   r(    (   Rs   sC   lib/python2.7/site-packages/scipy/optimize/tests/test_linesearch.pyt   test_wolfe_terminate
  s    	$(   t   __name__t
   __module__R-   R/   R2   R4   R7   RK   RM   RQ   RU   RX   RZ   Rg   Rk   Rp   Rr   Ru   Rx   (    (    (    sC   lib/python2.7/site-packages/scipy/optimize/tests/test_linesearch.pyR)   8   s"   										
						(   t   __doc__t
   __future__R    R   R   t   numpy.testingR   R   R   R   R   t   scipy._lib._numpy_compatR   t   scipy.optimize.linesearcht   optimizet
   linesearchRR   R	   t   numpyR   R   R   R"   R#   R(   t   objectR)   (    (    (    sC   lib/python2.7/site-packages/scipy/optimize/tests/test_linesearch.pyt   <module>   s   (
		