
    bia                     r    d Z ddlZddlZddlZddlmZ ddlm	Z	m
Z
 ddlZddlmZ ddlmZ  G d de      Zy)a,  
Copyright 2013 Steven Diamond

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
    N)assert_allcloseassert_equal)
EIGVAL_TOL)BaseTestc                   d    e Zd ZddZddZddZddZddZddZddZ	dd	Z
dd
ZddZddZy)TestNonOptimalNc           
      @   t         j                  j                  d       dD ]y  }t        d      D ]g  }t        j                  t         j                  j                  |            }|t        j                  |      z  }t         j                  j                  ||      }t        j                  ||j                        }t        j                  |      t        j                  ||      t        j                  ||      z  z
  }t        j                  |t        j                  ||j                              }t         j                  j                  |      }|dz
  }t        ||       dD ]-  }	t        j                   |      }
|	dk(  r,t        j"                  |
|      }t        j$                  |      }n1|	dk(  r,t        j"                  |
|       }t        j&                  |      }d|
k  t        j                  |
      dk(  g}t        j(                  |      }|j+                  t        j,                  	       |
j.                  j1                         }t        j                  |t        j                  ||            }t3        |dd
       t3        ||d
       0 j | y)z/Test quad form with a singular matrix.
        i  )         r      )minimizemaximizer   r   r   solvergMbP?)atolN)nprandomseedrangeexprandnsumdotTidentityouterinnerlinalgmatrix_rankr   cpVariable	quad_formMinimizeMaximizeProblemsolveOSQPvalueflattenr   )selfnivAQEobserved_rankdesired_rankactionxq	objectiveconstraintspxoptyopts                    U/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/cvxpy/tests/test_quad_form.pytest_singular_quad_formz&TestNonOptimal.test_singular_quad_form   s    			t &	8A1X %8 FF299??1-.q	M IIOOAq)FF1accN KKNRXXa^bhhq!n%DDFF1bffQn- "		 5 5a 8 s]L94 8F AA+LLA.$&KKN	:-LLQB/$&KKN	#$6266!9>":K

9k:AGG277G+ 77??,D66$q$8D#D!$7#D!$7'8%%8&	8    c                 <   t        j                  d      }t        j                  d      }t        j                  ||      }t        j
                  t        j                  |      |ddgk(  g      }| j                  |j                  t        j                        d       t        j                  t        j                  d            }t        j                  d      j                  d      }t        j                  d      }t        j                  ||      t        j                  ||      z
  }t        j                  |      }t        j
                  |      }	|	j                  t        j                         | j                  t!        |j"                        d       y)z-Test quad form with a sparse matrix.
           r   r   r   r   )r   r   N)sp	eye_arrayr!   r"   r#   r&   r$   assertAlmostEqualr'   r(   Constantr   onesreshapematmulassertEquallenr)   )
r+   r0   r5   costprobr/   cfunctionr7   problems
             r<   test_sparse_quad_formz$TestNonOptimal.test_sparse_quad_formK   s    LLOKKN||Aq!zz"++d+aAq6k];tzzz91= KKQ(GGAJv& KKN <<1%		!Q7KK)	**Y'RWW%X^^,a0r>   c                    t        j                  dd      }t        j                  d      }t        j                  d      }t        j
                  ||      }||_        t        j                  t        j                  |      |ddgk(  g      }t        j                         5  t        j                  d       | j                  |j                  t         j                        d       d	d	d	       y	# 1 sw Y   y	xY w)
z)Test quad form with a parameter.
        r@   r@   T)PSDr@   r   ignorer   r   N)r!   	Parameterr   eyer"   r#   r)   r&   r$   warningscatch_warningssimplefilterrC   r'   SCS)r+   Pr0   r5   rJ   rK   s         r<   test_param_quad_formz#TestNonOptimal.test_param_quad_formc   s     LLT*FF1IKKN||Aq!zz"++d+aAq6k];$$& 	A!!(+""4::RVV:#<a@	A 	A 	As   "AC11C:c                 0   t        j                  ddgddgg      }t        j                  d      }| j	                  t
              5 }t        j                  ||       ddd       | j                  dt        j                        v        y# 1 sw Y   0xY w)z3Test when P is constant and not symmetric.
        r@   r
   r   Nz4Quadratic form matrices must be symmetric/Hermitian.)
r   arrayr!   r"   assertRaises	Exceptionr#   
assertTruestr	exception)r+   rZ   r5   cms       r<   test_non_symmetricz!TestNonOptimal.test_non_symmetricp   s     HHq!fq!f%&KKNy) 	RLLA	Nr||,- 	.	 	s   BBc                 J   t        j                  ddgddgg      }t        j                  d      }t	        j
                         5  t	        j                  d       t        j                  ||      }ddd       t        j                  t        j                        |ddgk(  g      }| j                  t              5 }|j                  t        j                         ddd       | j                  dt        j                         v        y# 1 sw Y   xY w# 1 sw Y   <xY w)	z9Test error when P is symmetric but not definite.
        r   r   r@   rS   Nr   z"Problem does not follow DCP rules.)r   r]   r!   r"   rV   rW   rX   r#   r&   r$   r^   r_   r'   rY   r`   ra   rb   )r+   rZ   r5   rJ   rK   rc   s         r<   test_non_psdzTestNonOptimal.test_non_psdz   s     HHq!fq"g&'KKN$$& 	&!!(+<<1%D	& zz"++d+aAq6k];y) 	&RJJbffJ%	&<r||,- 	.	& 	&	& 	&s   ,D=!DDD"c                    t        j                  dt        z  dgddgg      }t        j                  d      }t        j                         5  t        j                  d       t        j                  ||      }t        j                  t        j                  |      |ddgk(  g      }|j                  t        j                         ddd       y# 1 sw Y   yxY w)	zCTest that PSD check when eigenvalue is exactly -EIGVAL_TOL
        g+r   
   r@   rS   r   r   N)r   r]   r   r!   r"   rV   rW   rX   r#   r&   r$   r'   rY   r+   rZ   r5   rJ   rK   s        r<   test_psd_exactly_tolerancez)TestNonOptimal.test_psd_exactly_tolerance   s     HHvj(!,q"g67KKN$$& 	&!!(+<<1%D::bkk$/!1v+?DJJbffJ%		& 	& 	&   A;CCc                    t        j                  dt        z  dgddgg      }t        j                  d      }t        j                         5  t        j                  d       t        j                  ||      }t        j                  t        j                  |      |ddgk(  g      }|j                  t        j                         ddd       y# 1 sw Y   yxY w)	zBTest that NSD check when eigenvalue is exactly EIGVAL_TOL
        g+?r   ir@   rS   r   r   N)r   r]   r   r!   r"   rV   rW   rX   r#   r&   r%   r'   rY   rj   s        r<   test_nsd_exactly_tolerancez)TestNonOptimal.test_nsd_exactly_tolerance   s     HHuZ'+aX67KKN$$& 	&!!(+<<1%D::bkk$/!1v+?DJJbffJ%		& 	& 	&rl   c                    t        j                  d      }t        j                  dgg      }t        j                  ddgg      j                  }|j                   |z  }t        j
                  |j                  |z  |      }t        j                  t        j                  ||z               }|j                  t         j                         | j                  |j                  |j                  j                         y)zBTest case where objective evaluation differs from result.
        )r@   r   g      ?r   N)r!   r"   r   r]   r   r#   r&   r$   r'   rY   rC   r)   r7   )r+   r5   r/   Bobj0obj1rK   s          r<   test_obj_evalzTestNonOptimal.test_obj_eval   s     KKHHseWHHsCj\"$$tax||ACC!GQ'zz"++dTk23

"&&
!tzz4>>+?+?@r>   c                 N   t         j                  j                  d      }t         j                  j                  d      j                  d      }t        j                  |j
                  d         }d}t        j                  d      }t        j                  |      }t        j                  t        j                  ||z  |z
        |t        j                  ||      z  z         }|d   |z  dk(  g}t        j                  ||      }	|	j                  t        j                         y)	z-Test a quad form multiplied by zero.
        r   ri   )r   r@   r   r   rQ   r   N)r   r   rF   r!   r"   shaperE   rD   r$   sum_squaresr#   r&   r'   rY   )
r+   	data_normMrL   loptlaplacian_matrixdesign_matrixr7   r8   rK   s
             r<   test_zero_termzTestNonOptimal.test_zero_term   s     II$$Q'	IIS!))&1KK
#776?AKKNN=1,y892<<#3445
	 !qQ'zz)[1

"&&
!r>   c                    t        j                  d      }t        j                  d      }t        j                  d      }t        j                  d       }t        j
                  d      }dt        j                  ||      z  |j                  |z  z   }t        j                  t        j                  |      ||z  |k  g      }|j                  t         j                         y)z#Test quad_form with P = 0.
        r
   )r
   r
   g      ?r   N)r!   r"   r   rU   rE   zerosr#   r   r&   r$   r'   rY   )r+   r5   r/   brL   rZ   exprrK   s           r<   test_zero_matrixzTestNonOptimal.test_zero_matrix   s     KKNFF1IGGAKWWQ[LHHVr||Aq))ACC!G3zz"++d+q5A:,(

"&&
!r>   c                 ,   t        j                  d      }t        j                  d      }t        j                  ||d      }|j                         sJ t        j                  d       }t        j                  ||d      }|j                         sJ t        j                  t        j                  |            }t        j                  t         j                        5  |j                  t         j                         ddd       y# 1 sw Y   yxY w)z"Test assume_PSD argument.
        r
   T)
assume_PSDr   N)r!   r"   r   rU   r#   	is_convexr&   r$   pytestraisesSolverErrorr'   r(   )r+   r5   r/   r   rK   s        r<   test_assume_psdzTestNonOptimal.test_assume_psd   s     KKNFF1I||AqT2~~VVAYJ||AqT2~~zz"++d+,]]2>>* 	'JJbggJ&	' 	' 	's    !D

D)returnN)__name__
__module____qualname__r=   rO   r[   rd   rg   rk   rn   rs   r|   r   r    r>   r<   r   r      s<    +8Z10A..
&
&
A"""'r>   r   )__doc__rV   numpyr   r   scipy.sparsesparserA   numpy.testingr   r   cvxpyr!   cvxpy.settingsr   cvxpy.tests.base_testr   r   r   r>   r<   <module>r      s2         7  % *}'X }'r>   