U
    /d                     @   s\   d Z ddlZddlmZ ddlmZmZmZm	Z	 edddZ
edddd	ZG d
d dZdS )z}
Unit tests for Krylov space trust-region subproblem solver.

To run it in its simplest form::
  nosetests test_optimize.py

    N)get_trlib_quadratic_subproblem)assert_assert_almost_equalassert_equalassert_array_almost_equalg:0yE>ư>)	tol_rel_i	tol_rel_bT)r   r	   Zdispc                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )TestKrylovQuadraticSubproblemc                    s4  t dddgdddgdddgg t dddgd}tddd	 fd
d	dd	  fdd	d}||\}}t|t dddg t|d tt j 	||j
|   d tt j|| d}||\}}t|t dddg t|d tt j 	||j
|   d tt j|| d S )N      ?              @       @      @g      @r   c                 S   s   dS Nr    xr   r   P/tmp/pip-unpacked-wheel-9gxwnfpp/scipy/optimize/tests/test_trustregion_krylov.py<lambda>!       zFTestKrylovQuadraticSubproblem.test_for_the_easy_case.<locals>.<lambda>c                    s    S Nr   r   gr   r   r   "   r   c                 S   s   d S r   r   r   r   r   r   r   #   r   c                    s
     |S r   dotr   yHr   r   r   $   r   r   ZfunZjacZhessZhessp      T      ?gb5m1ݿgp돬ӳȿ)nparrayKrylovQPsolver   r   r   linalgnormr   lamselftrust_radiussubprobphits_boundaryr   r   r   r   test_for_the_easy_case   s>    



z4TestKrylovQuadraticSubproblem.test_for_the_easy_casec                    s   t dddgdddgdddgg t dddgd}tddd fd	dd
d  fddd}||\}}t|t dddg tt j ||j	|   d tt j|| d}||\}}t|t dddg tt j ||j	|   d tt j|| d S )Nr   r   r   r   r   r   c                 S   s   dS r   r   r   r   r   r   r   K   r   zFTestKrylovQuadraticSubproblem.test_for_the_hard_case.<locals>.<lambda>c                    s    S r   r   r   r   r   r   r   L   r   c                 S   s   d S r   r   r   r   r   r   r   M   r   c                    s
     |S r   r   r   r   r   r   r   N   r   r    r!   r"   g      )
r#   r$   r%   r&   r   r   r'   r(   r   r)   r*   r   r0   r   test_for_the_hard_case=   s6    

z4TestKrylovQuadraticSubproblem.test_for_the_hard_casec                    s   t dddddgddddd	gddd
ddgdddddgdd	dddgg t dddddgd}tddd fdddd  fddd}||\}}tt j ||j|   d t	|ddd d!d"g t	|d# d S )$Ngno?gu?g,wn)?g/Kg뚘G?g켮wO@g٢yn*?gr<8ٿg&Î?g6
@gĽCԿg8K?gc?g>ڿg-Q?g*<sA?gE?gM x?gz?g=޿皙?r   c                 S   s   dS r   r   r   r   r   r   r   p   r   zMTestKrylovQuadraticSubproblem.test_for_interior_convergence.<locals>.<lambda>c                    s    S r   r   r   r   r   r   r   q   r   c                 S   s   d S r   r   r   r   r   r   r   r   r   c                    s
     |S r   r   r   r   r   r   r   s   r   r    r   g8b҄gO
L?gp4OF̿g qgo-7?F
r#   r$   r%   r&   r   r'   r(   r   r)   r   r*   r   r0   r   test_for_interior_convergenced   s0    


 z;TestKrylovQuadraticSubproblem.test_for_interior_convergencec                    s   t dddddgddddd	gddd
ddgdddddgdd	dddgg t dddddgd}tddd fdddd  fddd}||\}}tt j ||j|   d tt j|| t	|dddddg t	|d d S ) NgVaU?g`A@g5F?g9)n@gcѿg{g.<?g~g:]?g@33g 5:gIgйTgFKտg&Rr   r   r3   c                 S   s   dS r   r   r   r   r   r   r      r   zKTestKrylovQuadraticSubproblem.test_for_very_close_to_zero.<locals>.<lambda>c                    s    S r   r   r   r   r   r   r      r   c                 S   s   d S r   r   r   r   r   r   r      r   c                    s
     |S r   r   r   r   r   r   r      r   r    r   giG7㰱?gl$WgZg-O|οgm/Tr4   r*   r   r0   r   test_for_very_close_to_zero   s4    

 z9TestKrylovQuadraticSubproblem.test_for_very_close_to_zeroc                    s   t d  t dddddgd}tddd fdddd  fd	dd
}||\}}| \}}t|dt| d S )N   r   r   r3   c                 S   s   dS r   r   r   r   r   r   r      r   z9TestKrylovQuadraticSubproblem.test_disp.<locals>.<lambda>c                    s    S r   r   r   r   r   r   r      r   c                 S   s   d S r   r   r   r   r   r   r      r   c                    s
     |S r   r   r   r   r   r   r      r   r    z  TR Solving trust region problem)	r#   Zeyer$   KrylovQP_dispr&   Z
readouterrr   
startswithrepr)r+   Zcapsysr,   r-   r.   r/   outerrr   r0   r   	test_disp   s    

z'TestKrylovQuadraticSubproblem.test_dispN)__name__
__module____qualname__r1   r2   r5   r6   r=   r   r   r   r   r
      s
   *'r
   )__doc__Znumpyr#   Zscipy.optimize._trlibr   Znumpy.testingr   r   r   r   r%   r8   r
   r   r   r   r   <module>   s   