
    bi/t                     6   d Z ddlZddlZddlmZ ddlmZ ddl	Z
ddlmc mZ ddl	mZmZmZmZ ddlmZmZmZmZmZmZmZmZmZ ddlmZ ddlm Z m!Z! ddl"m#Z# dd	lm$Z$m%Z%  G d
 de#      Z& ejN                  de v d       G d dejP                               Z)y)aE  

Copyright 2013 Steven Diamond, 2017 Robin Verschueren

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)lstsq)MaximizeMinimize	ParameterProblem)	QuadFormabshubermatrix_fracnormpowerquad_over_linsumsum_squares)Variable)INSTALLED_SOLVERS
QP_SOLVERS)BaseTest)StandardTestLPsStandardTestQPsc                   .   e Zd ZdZd'd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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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&d'd&Z'y)(TestQpz# Unit tests for the domain module. Nc                 D   t        d      | _        t        d      | _        t        d      | _        t        dd      | _        t        dd      | _        t        dd	      | _        t        d
d      | _        t        dd      | _        t        dd      | _	        t        dd      | _
        t        dd      | _        t        dd      | _        t        dd      | _        d}t        d|fd      | _        t        d|fd      | _        t        d|dz
  fd      | _        t        dd      | _        t        dd      | _        t        dd      | _        t(        D cg c]  }|t*        v s| c}| _        d }d }d  }d!| j,                  v r" |       s| j,                  j/                  d!       d"| j,                  v r" |       s| j,                  j/                  d"       d#| j,                  v r$ |       s| j,                  j/                  d#       y y y c c}w )$Na)namebc   x   yz   w)r   r   AB)r    r   C   slopeoffsetquadratic_coeff   positionvelocityforceP   xs2   xsrxefc                      dt         vry	 ddl} | j                         }|j                         }|| j                  j
                  k(  S # t        $ r Y yw xY w)z7Check if MOSEK is installed and a license is available.MOSEKFr   N)r   mosekEnv
getlicenserescodeok	Exception)r7   envstatuss      V/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/cvxpy/tests/test_qp_solvers.pyis_mosek_availablez(TestQp.setUp.<locals>.is_mosek_availableL   sT    //iik)!1!111 s   <A 	AAc                      dt         vry	 ddl} | j                         }|y| j                  |       y# t        $ r Y yw xY w)z8Check if KNITRO is installed and a license is available.KNITROFr   NT)r   knitroKN_newKN_freer<   )rC   kcs     r?   is_knitro_availablez)TestQp.setUp.<locals>.is_knitro_availableY   sJ    00	]]_: r" s   4 4 	A A c                      dt         vry	 ddl} | j                         }|j                         }|dk(  S # t        $ r Y yw xY w)z8Check if XPRESS is installed and a license is available.XPRESSFr   N)r   xpressr=   r9   r<   )rJ   r=   r>   s      r?   is_xpress_availablez)TestQp.setUp.<locals>.is_xpress_availableh   sI    00jjl){" s   (4 	A A rI   r6   rB   )r   r   r   r   r   r!   r"   r$   r%   r&   r'   r)   r*   r+   r-   r.   r/   r1   r3   r4   r   r   solversremove)selfTr   r@   rG   rK   s         r?   setUpzTestQp.setUp.   s   s#s#s#!#&!#&!#&!#&&s+&s+&s+ag.
qx0'0AB !Qj9 !Qj9q!a%jw7
2D)BU+BU+ $.Ha6G1GH		
	 t||#,?,ALL)dll"+=+?LL(t||#,?,ALL) -B#] Is   'H5Hc                 (    |j                  |d      S )NF)solververbose)solve)rN   problemsolver_names      r?   solve_QPzTestQp.solve_QP{   s    }}K}??    c                    | j                   D ]h  }| j                  |       | j                  |       | j                  |       | j	                  |       | j                  |       | j                  |       | j                  |       | j                  |       | j                  |       | j                  |       | j                  |       | j                  |       | j                  |       | j                  |       | j                  |       | j!                  |       | j#                  |       | j%                  |       | j'                  |       | j)                  |       | j+                  |       k y )N)rL   r   r   power_matrixsquare_affine	quad_formaffine_problemmaximize_problemr	   quad_form_coeffquad_form_boundregression_1regression_2rep_quad_formcontrolsparse_systemsmooth_ridgehuber_smallr
   equivalent_forms_1equivalent_forms_2equivalent_forms_3)rN   rR   s     r?   test_all_solverszTestQp.test_all_solvers~   s5   ll 	,Fv&JJvf%v&NN6"'!!&)HHV   (  (f%f%v& LL v&f%V$JJv##F+##F+##F+9	,rX   c                    t        t        dt        t        | j                  dz
        d      z        | j                  dk  g      }| j                  ||       |j                         D ]5  }| j                  t        j                  ddg      |j                  d       7 |j                  D ]5  }| j                  t        j                  ddg      |j                  d       7 y )N      ?r(   g         placesg       @)r   r   r   r	   r   rW   	variablesassertItemsAlmostEqualnparrayvalueconstraints
dual_value)rN   rR   pvarcons        r?   r   zTestQp.quad_over_lin   s    HS=TVVAX#BBCVVr\N$a ;;= 	=C''#s(<(+		! ( =	= == 	BC''"b(:(+q ( B	BrX   c                 L   t        d      }g }|t        |d   |d   z
        dk  gz  }t        t        t	        |            |      }t        d|j                                | j                  |j                         d       |j                  |      }| j                  |d       y )Nr   r(   r   d   zThe problem is QP: TrR   )
r   r	   r   r   r   printis_qpassertEqualrT   assertAlmostEqual)rN   rR   uconstrprobresults         r?   r	   z
TestQp.abs   s    QK3qtad{#s*++xA/8#TZZ\2t,6*vq)rX   c           
          t        t        t        t        | j                  d                  g       }| j                  ||       |j                         D ]"  }| j                  ddg|j                  d       $ y )Nr           ro   rp   )	r   r   r   r   r   rW   rr   rs   rv   rN   rR   ry   rz   s       r?   r   zTestQp.power   se    HStvvq!123R8a ;;= 	GC''R#))A'F	GrX   c           
          t        t        t        t        | j                  dz
  d                  g       }| j                  ||       |j                         D ]"  }| j                  g d|j                  d       $ y )N      @r   )r   r   r   r   ro   rp   )	r   r   r   r   r%   rW   rr   rs   rv   r   s       r?   rZ   zTestQp.power_matrix   si    HStvv{A!678"=a ;;= 	=C''(8(+		! ( =	=rX   c                    t         j                  j                  dd      }t         j                  j                  d      }t        t	        t        || j                  z  |z
                    }| j                  ||       |j                         D ]=  }| j                  t        ||      d   j                  d      |j                  d       ? y )N
   r   r   Forderr(   rp   )rt   randomrandnr   r   r   r   rW   rr   rs   r   flattenrv   rN   rR   r%   r   ry   rz   s         r?   r[   zTestQp.square_affine   s    IIOOB"IIOOBH[TVVa89:a ;;= 	2C''aA(>(>S(>(I399/0 ( 2	2rX   c                 ,   t         j                  j                  d       t         j                  j                  dd      }t         j                  j                  d      }|j                  j                  |      }d|j                  |      z  }t        t        t        | j                  |      |j                  | j                  z  z               }| j                  ||       |j                         D ]   }| j                  ||j                  d       " y Nr   r#   ro   rp   rt   r   seedr   rO   dotr   r   r   r$   rW   rr   rs   rv   rN   rR   r%   r"   Pqry   rz   s           r?   r\   zTestQp.quad_form       
		qIIOOAq!IIOOACCGGAJquuQxKHXdffa0133<?@Aa ;;= 	@C''399Q'?	@rX   c                 B   t         j                  j                  d       t         j                  j                  dd      }t         j                  j                  d      }|j                  j                  |      }d|j                  |      z  }t        | j                  |      }t        t        d|z  d|z  z   |j                  | j                  z  z               }| j                  ||       |j                         D ]   }| j                  ||j                  d       " y)zCA problem where the quad_form term is used multiple times.
        r   r#   r   rm   ro   rp   N)rt   r   r   r   rO   r   r   r$   r   r   rW   rr   rs   rv   )	rN   rR   r%   r"   r   r   qfry   rz   s	            r?   rc   zTestQp.rep_quad_form   s     			qIIOOAq!IIOOACCGGAJquuQxKdffa HSVc"f_qssTVV|;<=a ;;= 	@C''399Q'?	@rX   c                    t         j                  j                  dd      }t        j                  |d      }t         j                  j                  d      }t        j                  |d      }t	        t        t        | j                              | j                  dk\  || j                  z  |k  g      }| j                  ||       |j                         D ]"  }| j                  ddg|j                  d       $ y Nr#   r   r   r   r    rp   )rt   r   r   maximumr   r   r   r   rW   rr   rs   rv   r   s         r?   r]   zTestQp.affine_problem   s    IIOOAq!JJq!IIOOAJJq!HS[)DFFaKTVVq+IJa ;;= 	GC''R#))A'F	GrX   c                    t         j                  j                  dd      }t        j                  |d      }t         j                  j                  d      }t        j                  |d      }t	        t        t        | j                               | j                  dk\  || j                  z  |k  g      }| j                  ||       |j                         D ]"  }| j                  ddg|j                  d       $ y r   )rt   r   r   r   r   r   r   r   rW   rr   rs   rv   r   s         r?   r^   zTestQp.maximize_problem   s    IIOOAq!JJq!IIOOAJJq!Hc$&&k\*TVVq[!dff*/,JKa ;;= 	GC''R#))A'F	GrX   c                    t         j                  j                  dd      }t         j                  j                  d      }t        t	        t        || j                  z  |z
  d                  }| j                  ||       |j                         D ]=  }| j                  t        ||      d   j                  d      |j                  d       ? y )	Nr   r#   r   r   r   r   r(   rp   )rt   r   r   r   r   r   r$   rW   rr   rs   r   r   rv   r   s         r?   norm_2zTestQp.norm_2   s    IIOOB"IIOOBHT!dff*q.!456a ;;= 	2C''aA(>(>S(>(I399/0 ( 2	2rX   c                    t         j                  j                  dd      }t         j                  j                  dd      }t        t	        t        || j                  z  |z
  d                  }| j                  ||      }|j                         D ]:  }| j                  t        ||      d   |j                  |j                     d       < y )Nr#   r    r   r   r(   rp   )rt   r   r   r   r   r   r'   rW   rr   rs   r   primal_varsid)rN   rR   r%   r&   ry   srz   s          r?   
mat_norm_2zTestQp.mat_norm_2   s    IIOOAq!IIOOAq!HT!dff*q.!456MM!V$;;= 	IC''aA()cff(=a ( I	IrX   c                 ,   t         j                  j                  d       t         j                  j                  dd      }t         j                  j                  d      }|j                  j                  |      }d|j                  |      z  }t        t        t        | j                  |      |j                  | j                  z  z               }| j                  ||       |j                         D ]   }| j                  ||j                  d       " y r   r   r   s           r?   r_   zTestQp.quad_form_coeff  r   rX   c           	         t        j                  g dg dg dg      }t        j                  dgdgdgg      }d}t        j                  dgdgd	gg      }t        t        dt	        | j
                  |      z  |j                  | j
                  z  z   |z         | j
                  d	k\  | j
                  dk  g      }| j                  ||       |j                         D ]   }| j                  ||j                  d
       " y )N)      r   )r         )r   r   r   ig      -r   r(   rm   rn   ro   rp   )rt   ru   r   r   r   r!   rO   rW   rr   rs   rv   )rN   rR   r   r   ry_starry   rz   s           r?   r`   zTestQp.quad_form_bound  s    HHlK=>HHseeWrd+,A3t,-HS$&&!!44qssTVV|CaGHVVr\466Q;/1a ;;= 	EC''		!'D	ErX   c           	      L   t         j                  j                  d       d}t        j                  g dg      j                  }t         j                  j                  |      dz  }t        j                  |      }t        j                  t        dd      D cg c]  }t        j                  ||       c}      }t        j                  |      }|j                  j                  |      dt         j                  j                  |d      z  z   }t        j                  |      }| j                  || j                  z  z   }|j                  |z
  }	t        |	      }
t        t        |
      g       }| j!                  ||       | j#                  d|j$                  d       y c c}w )	Nr(   r}   r   r   rm   r#   ro   rm   gDfN@rp   )rt   r   r   ru   rO   rand
atleast_2dvstackranger   r   r*   r)   r   r   r   rW   r   rv   )rN   rR   ntrue_coeffsx_dataix_data_expandedy_dataline	residuals	fit_errorry   s               r?   ra   zTestQp.regression_1  s=   
		qhh~.00"Q&v&)).3Aqk%;)* &(XXfa%8 %; <--8 ""&&{3cBIINN1a<P6PPv&{{Vdjj00FFVO		*	HY',a }agga@%;s   F!c           	      >   t         j                  j                  d       d}t        j                  g d      }t         j                  j	                  |      dz  }t        j
                  t        dd      D cg c]  }t        j                  ||       c}      }t        |j                  |j                         |j                  j                  |      dt         j                  j	                  |      z  z   }| j                  || j                  z  z   | j                  t        j                  |d      z  z   }|j                  |z
  }	t        |	      }
t!        t#        |
      g       }| j%                  ||       | j'                  d|j(                  d	       y c c}w )
Nr(   r}   r   r#   ro   rm   r   gW8ga@rp   )rt   r   r   ru   r   r   r   r   r   shaperO   r   r*   r)   r+   r   r   r   rW   r   rv   )rN   rR   r   r   r   r   r   r   	quadraticr   r   ry   s               r?   rb   zTestQp.regression_23  s>   
		qhh|,"Q&)).3Aqk%;)* &(XXfa%8 %; <o##[%6%67 ""&&{3cBIINN1<M6MMKK&4::"55  &!!445	KK&(		*	HY',a }agga@%;s   8Fc                    t        j                  ddg      }t        j                  ddg      }d}d}d}d}t        j                  ddg      }g }	t        |dz
        D ]  }
|	| j                  d d |
dz   f   | j                  d d |
f   || j                  d d |
f   z  z   k(  gz  }	| j
                  d d |
f   |z  |z   || j                  d d |
f   z  z
  }|	| j                  d d |
dz   f   | j                  d d |
f   ||z  z   k(  gz  }	 |	| j                  d d df   dk(  gz  }	|	| j                  d d df   |k(  gz  }	|	| j                  d d df   |k(  gz  }	|	| j                  d d df   dk(  gz  }	t        t        d	t        | j
                        z        |	      }| j                  ||       | j                  d
|j                  d       y )Nir}   r,   皙?r(   r   g#rn   g{Gz?gX9v@rp   )rt   ru   r   r-   r.   r/   r   r   r   rW   r   rv   )rN   rR   initial_velocityfinal_positionrO   hmassdraggrw   r   accelerationry   s                r?   rd   zTestQp.controlI  s    88S#J/3*-HHaYq1u 	.ADMM!QU(3t}}QT7Jad 3384 4 5 5K::ad+D014t}}QT**+LDMM!QU(3t}}QT7J,8- - . .K	. 	ad+q011ae,>??ad+/??@@ae,122HS;tzz#::;[Ia x;rX   c                    d}d}t         j                  j                  d       d}t        j                  ||f|      }t         j                  j                  |      }t        t        t        || j                  z  |z
              | j                  dk(  g      }| j                  ||       | j                  |j                  j                  |      |j                  d       y )	Nr}   r0   r(   g?)densityr   ro   rp   )rt   r   r   sprandom_arrayr   r   r   r   r1   rW   r   rO   r   rv   )rN   rR   mr   r   r%   r   ry   s           r?   re   zTestQp.sparse_systemi  s    
		qOOQFG4IIOOAH[TWWq9:TWW\NKa qsswwqz1771=rX   c                    t         j                  j                  d       d}d}d}t        j                  ||f      }t        j                  |      }t	        || j
                  z  |z
        |t	        | j
                  d d | j
                  dd  z
        z  z   }t        t        |      g       }| j                  ||       | j                  d|j                  d       y )Nr(   r2      rn   r   ro   rp   )rt   r   r   onesr   r3   r   r   rW   r   rv   )	rN   rR   r   ketar%   r   objry   s	            r?   rf   zTestQp.smooth_ridgeu  s    
		qGGQFOGGQL!dhh,*+DHHSbM$((12,6778HSM2&a q!''!4rX   c                    t        d      }t        t        |            }t        t	        |      |d   dk\  g      }| j                  ||       | j                  d|j                  d   d       | j                  d|j                  d       y )Nr    r   ro   rp   r#   )r   r   r
   r   r   rW   r   rv   )rN   rR   r   	objectivery   s        r?   rg   zTestQp.huber_small  sy    QKaM	 HY'!A$!)5a q!''!*Q7q)//!<rX   c                 F   d}d}g d}g d}g d}t        j                  |||f||f      }t        j                  j	                  |      t        j
                  |      z  }t        j                  j                  |      dk  j                  t              }	|j                  |      t        j                  dt        j                  j	                  |      z  |	      z   t        j                  d	t        j                  j                  |      z  d
|	z
        z   }
t        |      }t        t        ||z  |
z
              }t        t        |            }| j!                  ||       | j#                  d|j$                  d       | j'                  |j$                  g dd       y )Nr    r#   )g{Gz?g(\?gQ?g(\?g(\?g
ףp=
?g)\(?gzG?gRQ?gQ?gQ?gp=
ף?)r   r(   r   r    ro   r   r    r   r(   r   r    ro   )r   r#      r   )r   gffffff?rm   g      $@      ?gʷ2>?rp   )geH?gspIgb~D)r   	csc_arrayrt   r   r   sqrtr   astypefloatr   multiplyr   r   r
   r   r   rW   r   rv   rs   )rN   rR   r   r   dataindicesindptrr%   x_trueind95r   r   r   ry   s                 r?   r
   zTestQp.huber  sH   W6LL$01>#bggaj0"T)11%8EE&MBKKBIIOOA,>(>FFkk#biinnQ//e<= QKa!eai()	 HY'(a ~yqI##AGG$J+, 	$ 	.rX   c                 <   d}d}d}t         j                  j                  d       t         j                  j                  ||      }t         j                  j                  |      }t         j                  j                  ||      }t         j                  j                  |      }dt	        || j
                  z  |z
  dz        z  }	|| j
                  z  |k(  g}
t        t        |	      |
      }| j                  ||       | j                  |j                  dd	       y )
Nr}   r0   F   r(   r   r   *Q@ro   rp   )rt   r   r   r   r   r4   r   r   rW   r   rv   )rN   rR   r   r   r   r%   r   Gr   obj1consp1s               r?   rh   zTestQp.equivalent_forms_1  s    
		qIIOOAq!IIOOAIIOOAq!IIOOACTXX)a/00DHH!"Xd^T*b&!rxxqArX   c                 ,   d}d}d}t         j                  j                  d       t         j                  j                  ||      }t         j                  j                  |      }t         j                  j                  ||      }t         j                  j                  |      }t        j                  |j
                  |      }	dt        j                  |j
                  |      z  }
t        j                  |j
                  |      }dt        | j                  |	      |
j
                  | j                  z  z   |z   z  }|| j                  z  |k(  g}t        t        |      |      }| j                  ||       | j                  |j                  dd	       y 
Nr}   r0   r   r(   r   r   r   ro   rp   )rt   r   r   r   r   rO   r   r4   r   r   rW   r   rv   )rN   rR   r   r   r   r%   r   r   r   r   r   obj2r   p2s                 r?   ri   zTestQp.equivalent_forms_2  s$   
		qIIOOAq!IIOOAIIOOAq!IIOOA FF133Nrvvacc1~FF133N8DHHa(txx79:DHH!"Xd^T*b&!rxxqArX   c                 j   d}d}d}t         j                  j                  d       t         j                  j                  ||      }t         j                  j                  |      }t         j                  j                  ||      }t         j                  j                  |      }t        j                  |j
                  |      }	dt        j                  |j
                  |      z  }
t        j                  |j
                  |      }t         j                  j                  |	      }dt        | j                  |      |
j
                  | j                  z  z   |z   z  }|| j                  z  |k(  g}t        t        |      |      }| j                  ||       | j                  |j                  dd	       y r   )rt   r   r   r   r   rO   linalginvr   r4   r   r   rW   r   rv   )rN   rR   r   r   r   r%   r   r   r   r   r   Pinvobj3r   p3s                  r?   rj   zTestQp.equivalent_forms_3  s6   
		qIIOOAq!IIOOAIIOOAq!IIOOA FF133Nrvvacc1~FF133Nyy}}Q[40txx?ABDHH!"Xd^T*b&!rxxqArX   c                 l   d}d}t         j                  j                  d       t         j                  j                  ||      }t	        |      }t        |      }t        t        t        ||z  |z
                    }t         j                  j                  |      |_	        |j                  dd      }|j                  dd      }| j                  ||       t         j                  j                  |      |_	        |j                  dd      }|j                  dd      }| j                  ||       y)	Test warm start.
           r}   r(   OSQPFrR   
warm_startTN)rt   r   r   r   r   r   r   r   r   rv   rT   r   	rN   r   r   r%   r   r   r   r   result2s	            r?   test_warm_startzTestQp.test_warm_start  s     
		qIIOOAq!aL QKxAEAI 678))//!$6e<**Ft*<vw/))//!$6d;**Fu*=vw/rX   c                    t         j                  t        v rddl}d}d}t	        d      }t	        ||f      }t        j                  t        j                  ||z        ||f      }t        t        |dz  t        j                  |      z         ||k(  g      }|dz   |_        |j                  t         j                  d	       |j                  j                  }|j                         }	|j                   j"                  |	d   j$                  k(  sJ t        j&                  d|	d   j(                        sJ t+        d|j,                  dz         D ]|  }
|
dz
  |j.                  d   z  }|
dz
  |j.                  d   z  }|||f   dz   |	|
   j$                  k(  sJ t        j&                  |j                  ||f   |	|
   j(                        r|J  yy)
z;Test Gurobi warm start with a user provided point.
        r   Nro   r    Tnonnegr   r(   r   )cpGUROBIr   gurobipyr   rt   reshapearanger   r   r   rv   rT   solver_statsextra_statsgetVarsGRB	UNDEFINEDstartiscloser   r   sizer   )rN   r  r   r   r!   XX_valsr   modelmodel_xr   rowcols                r?   test_gurobi_warmstartzTestQp.test_gurobi_warmstart  s    99))AA%A!Q AZZ		!A#A7F8AqD266!9$45V}EDqjAGJJbiiDJ9%%11EmmoG<<))WQZ-=-====::a...1affqj) C1u
*1u+c3h'!+wqz/?/????zz!''#s("3WQZ\\BBB	C! *rX   c                    t         j                  t        v rd}d}t        j                  j                  d       t        j                  j                  ||      }t        |      }t        |d      }t        t        t        ||z  |z
                    }t        j                  j                  |      |_        |j                  t         j                  d      }|j                  t         j                  d      }| j                  ||       |j                  j                  t        j                         |_        t        |d      }	t        t        t        ||	z  |z
                    }|j                  |	_        |j                  t         j                  d      }|j                  t         j                  d      }| j                  ||       yy)	z;Test XPRESS warm start with a user provided point.
        r   r   r(   T)integerFr   N)r  rI   r   rt   r   r   r   r   r   r   r   r   rv   rT   r   r   int64)
rN   r   r   r%   r   r   r   r   r  xprimes
             r?   test_xpress_warmstartzTestQp.test_xpress_warmstart  sN    99))AAIINN1		1%A!A D)A8KA	$:;<Diiooa(AGZZryyUZCFjj		djCG""673ggnnRXX.AGa.F8KF
Q$?@AD77FLZZryyTZBFjj		ejDG""673- *rX   c                    t         j                  t        v rmd}d}t        j                  j                  d       t        j                  j                  ||      }t        |      }t        |      }t        t        t        ||z  |z
                    }t        j                  j                  |      |_        |j                  t         j                  d      }|j                  t         j                  d      }| j                  ||       t        j                  j                  |      |_        |j                  t         j                  d      }|j                  t         j                  d      }| j                  ||       yyr   r   r}   r(   Fr   TN)r  HIGHSr   rt   r   r   r   r   r   r   r   r   rv   rT   r   r   s	            r?   test_highs_warmstartzTestQp.test_highs_warmstart/  s    88((AAIINN1		1%A!A A8KA	$:;<Diiooa(AGZZrxxEZBFjjTjBG""673iiooa(AGZZrxxDZAFjjUjCG""673% )rX   c                 :   t         j                  t        v rd}d}t        j                  j                  d       t        j                  j                  dd||f      }|j                  d      }d	}t        j                  |d
      }t        j                  ||z  d|z
        }||z  }t        j                  |      }	|dk  g}
t        j                  |	|
      }|j                  t         j                         |j                  t         j                  k(  sJ yy)zbTest problem with CVaR constraint from
        https://github.com/cvxpy/cvxpy/issues/2836
        r#      r(   r   r   )lowhighr  r   )axisg?Tr  rm   r~   N)r  r!  r   rt   r   r   uniformmeanr   cvarr   r   rT   r>   OPTIMAL)rN   
num_stocksnum_samplespnl_samplespnl_expectedquantiler$   r*  pnlr   rw   rU   s               r?   test_highs_cvarzTestQp.test_highs_cvarF  s     88((JKIINN1))++#[R\D]+^K&+++3L HJt4A77;?AL9Dl"C C(I3;-KjjK8GMMxx   >>RZZ///+ )rX   c                    t         j                  t        v rmd}d}t        j                  j                  d       t        j                  j                  ||      }t        |      }t        |      }t        t        t        ||z  |z
                    }t        j                  j                  |      |_        |j                  t         j                  d      }|j                  t         j                  d      }| j                  ||       t        j                  j                  |      |_        |j                  t         j                  d      }|j                  t         j                  d      }| j                  ||       yyr   )r  PIQPr   rt   r   r   r   r   r   r   r   r   rv   rT   r   r   s	            r?   test_piqp_warmstartzTestQp.test_piqp_warmstartb  s    77''AAIINN1		1%A!A A8KA	$:;<Diiooa(AGZZrww5ZAFjjDjAG""673iiooa(AGZZrww4Z@FjjEjBG""673% (rX   c                    t               }d}ddg}| j                  D ]T  }t        |       g }g }|D ]a  }t        ||dz  z  ||z  z         }d|k  |dk  g}	t	        ||	      }
|
j                  |       ||j                  gz  }||
j                  gz  }c g }g }t               }t        ||dz  z  ||z  z         }d|k  |dk  g}	t	        ||	      }
|D ];  }||_        |
j                  |       ||j                  gz  }||
j                  gz  }= t        |       t        |       t        t        |            D ]4  }| j                  ||   ||   d	       | j                  ||   ||          6 W y
)z-Test solve parametric problem vs full problemr   ig       r   r   r(   r~   r    rp   N)r   rL   r   r   r   rT   rv   r   r   lenrs   r   )rN   r   r   b_vecrR   x_fullobj_fullr   r   rw   r   x_param	obj_paramb_valuer   s                  r?   test_parametriczTestQp.test_parametricy  s   Jc
ll 	BF&MFH )qAF|a!e34 AvqAv.sK0

&
)177)#TZZL() GIA1Q<!a%/0C616*K3,D  *!

&
)AGG9$djj\)		* &M'N3u:& B++F1Iwqz!+L&&x{IaLAB;	BrX   c                     t        d      }t               }t        |dz  t        |      z         }t	        |      }|j                  d       | j                  |j                  d       y)z7Test issue arising with square plus parameter.
        r(   )rv   r   SCSr~   r   N)r   r   r   r	   r   rT   r   rv   )rN   r   r   r   r   s        r?   test_square_paramzTestQp.test_square_param  sV     AJqAvA's|

%
 syy#.rX   c           	      ^   ddl m} |t        v rddl}t	        | j
                  d         }| j
                  d   dk\  g}t        ||      }	 |j                  |d       d}t        |dd      }|rt        |d	d      }| j                  |d
       t        |dd      }	|	r| j                  d       t        |dd      }
|
|j                  j                  k7  r| j                  d       yy| j                  t              5 }t        t	        t!        | j
                  d            | j
                  dk(  g      }|j                  |d       ddd       | j#                  t%        j&                        d|z         y# t        $ r}| j                  d|z         Y d}~=d}~ww xY w# 1 sw Y   ]xY w)at  Make sure that if Gurobi terminates due to a time limit before finding a solution:
            1) no error is raised,
            2) solver stats are returned.
            The test is skipped if something changes on Gurobi's side so that:
            - a solution is found despite a time limit of zero,
            - a different termination criteria is hit first.
        r   r  Nr(   r   rR   	TimeLimitz8An exception %s is raised instead of returning a result.r  r  z$Solver stats have not been returned.SolCountz>Gurobi has found a solution, the test is not relevant anymore.StatuszdGurobi terminated for a different reason than reaching time limit, the test is not relevant anymore.The solver %s is not installed.)cvxpyr  r   r  r   r   r   rT   r<   failgetattr
assertTrueskipTestr  
TIME_LIMITassertRaisesr   r   str	exception)rN   r  r  r   rw   r   er  r  nb_solutionssolver_statuscms               r?   "test_gurobi_time_limit_no_solutionz)TestQp.test_gurobi_time_limit_no_solution  s    	!&& +I66!9>*K9k2DZ

&C
8 K"4>L%lM4HOOK)OP";
DAL^_#K4@M 7 77 B C 8
 ""9- 7xTVVQ8466Q;-H

&A
67 S.0QTZ0Z[-  Z		TWXXYYZ&7 7s%   E8 <AF#8	F FF #F,c           	         ddl m} |t        v rddl}t        j
                  j                         t        j
                  j                  d      t        j
                  j                         d}|j                         }|j                         D ]  \  }}|j                  ||        t        j                  d|      }|j                  j                  j                  }|j                         D ]/  \  }}|j                  |      \  }	}
}}}}| j!                  ||       1 y| j#                  t$              5 }t'        t)        t+        | j,                  d            | j,                  dk(  g      }|j/                  |d	       ddd       | j!                  t1        j2                        d
|z         y# 1 sw Y   2xY w)zTests that Gurobi environments can be passed to Model.
        Gurobi environments can include licensing and model parameter data.
        r   rC  Nr   )MIPGapAggFillPerturbValuer  )rR   r=   r(   rD  rH  )rI  r  r   r  rt   r   randintr8   itemssetParamr   	test_lp_0r   r  r  getParamInfor   rO  r<   r   r   r   r   rT   rP  rQ  )rN   r  r  params
custom_envr   vsthr  r   p_typep_valp_minp_maxp_defrU  r   s                    r?   test_gurobi_environmentzTestQp.test_gurobi_environment  sq    	!&& ))**,99,,R0 "		 0 0 2F "J *1##Aq)* "++8LCHH))55E +1;@;M;Ma;P8feUE5  E*+ ""9- 7xTVVQ8466Q;-H

&A
67 S.0QTZ0Z[7 7s   8AF44F=returnN)(__name__
__module____qualname____doc__rP   rW   rk   r   r	   r   rZ   r[   r\   rc   r]   r^   r   r   r_   r`   ra   rb   rd   re   rf   rg   r
   rh   ri   rj   r  r  r  r"  r2  r5  r>  rA  rV  ri   rX   r?   r   r   +   s    -K*Z@,>	B*G=2	@@GG2I	@	EA,A,<@
>5	=.2B"B,B.0,C2464.084.&BP	/&\P \rX   r   MPAXzMPAX is not installed.c                   T    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y)TestMPAXNc                 0    t        j                  d       y Nrq  r~   )r   r^  rN   s    r?   test_mpax_lp_0zTestMPAX.test_mpax_lp_0      !!0rX   c                 0    t        j                  d       y ru  )r   	test_lp_1rv  s    r?   test_mpax_lp_1zTestMPAX.test_mpax_lp_1  rx  rX   c                 0    t        j                  d       y ru  )r   	test_lp_2rv  s    r?   test_mpax_lp_2zTestMPAX.test_mpax_lp_2   rx  rX   c                 4   t        j                         }| j                  t              5  |j                  j                  d       | j                  |j                  j                  t        j                  j                         d d d        y # 1 sw Y   y xY wru  )sthslp_3assertWarnsWarningr   rT   r   r>   r  settingsINFEASIBLE_OR_UNBOUNDEDrN   rc  s     r?   test_mpax_lp_3zTestMPAX.test_mpax_lp_3  sh    iikg& 	SHHNN&N)SXX__bkk.Q.QR	S 	S 	S   ABBc                 4   t        j                         }| j                  t              5  |j                  j                  d       | j                  |j                  j                  t        j                  j                         d d d        y # 1 sw Y   y xY wru  )r  lp_4r  r  r   rT   r   r>   r  r  r  r  s     r?   test_mpax_lp_4zTestMPAX.test_mpax_lp_4	  sh    ))+C!!'* Wf-  "++2U2UVW W Wr  c                 0    t        j                  d       y ru  )r   	test_lp_5rv  s    r?   test_mpax_lp_5zTestMPAX.test_mpax_lp_5  rx  rX   c                 0    t        j                  d       y ru  )r   	test_lp_6rv  s    r?   test_mpax_lp_6zTestMPAX.test_mpax_lp_6  rx  rX   c                    t        j                  dd      }t        j                  d|d   z  d|d   z  z
        }d|d   z  |d   z   d	k  |d   d|d   z  z   d	k  |d   dk\  |d   dk\  g}t        j                  ||      }|j	                  d
d      }| j                  |dd       |j	                  d
d      }| j                  |dd       y )N)r   r   )r   r   r   r#   r(   r   r    rq  Fr   iro   rp   T)r  r   r   r   rT   r   )rN   r   r   rw   r   result1r  s          r?   test_mpax_warmstartzTestMPAX.test_mpax_warmstart  s    KKd-KKQqT	A!H 45	1Q4x!A$!+aD1qt8Oq(aDAIaDAI zz)[1**Fu*=w15**Ft*<w15rX   c                 0    t        j                  d       y ru  )r   	test_qp_0rv  s    r?   test_MPAX_qp_0zTestMPAX.test_MPAX_qp_0"  rx  rX   rj  )rl  rm  rn  rw  r{  r~  r  r  r  r  r  r  rp  rX   r?   rs  rs    s1    111SW1161rX   rs  )*ro  unittestnumpyrt   scipy.sparsesparser   scipy.linalgr   rI  r  cvxpy.tests.solver_test_helperstestssolver_test_helpersr  r   r   r   r   cvxpy.atomsr   r	   r
   r   r   r   r   r   r   cvxpy.expressions.variabler    cvxpy.reductions.solvers.definesr   r   cvxpy.tests.base_testr   r   r   r   
skipUnlessTestCasers  rp  rX   r?   <module>r     s          . . 8 8
 
 
 0 J * LI\X I\X V002JK+1x   +1 L+1rX   