
    bi	u                        d Z ddlZddlZddlZddlZddlZddlm	Z
 ddlmZ ddlmZ ddlmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlm Z  ddl!m"Z" ddl#m$Z% ddl#m&Z' ddl(m)Z* ddl+m,Z,  G d de,      Z- G d de,      Z. G d de,      Z/ G d de,      Z0d Z1 ejd                   e1       d       G d de,             Z3y)a4  
Copyright 2020, the CVXPY developers.

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)settings)trace)ExpCone)	PowCone3D	PowConeND)SOC)Chain)affine2direct)CvxAttr2Constr)ConeMatrixStuffing)Dcp2Cone)Solution)ConicSolver)INSTALLED_MI_SOLVERS)MI_SOCP_SOLVERS)solver_test_helpers)BaseTestc                   p    e Zd Ze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y)TestDualizec           
      
   t               t               t               g}t        d |      }|j	                  |       \  }}t        j                  |g d      }t        j                  j	                  |      \  }}|t        j                     |t        j                     |t        j                     |d   f\  }}}	}
t        j                  |j                  d   f      }||z  |k(  g}|
t        j                      }t        j                   |d | t        j"                  g i}|
t        j$                     rK|
t        j$                     }||||z    |t        j$                  <   |j'                  ||||z    dk\         ||z  }|
t        j"                     D ]V  }|t        j"                     j'                  ||||z           |j'                  t#        ||   ||dz   ||z                 ||z  }X |
t        j(                     rd|
t        j(                     z  }||||z    |t        j(                  <   t        j*                  ||||z    |dz  dfd	      }|j'                  t-        |d d df    |d d df    t/        j0                  d      |d d d
f   z               ||z  }|
t        j2                     rt/        j4                  |
t        j2                           }||d  |t        j2                  <   t        j*                  ||d  |j6                  dfd	      }t9        |d d df   |z  |d d df   d|z
  z  |d d d
f   |      }|j'                  |       t        j:                  |	|z        }t        j<                  ||      }|j?                  dd       |t        j                      j@                  |t        j                   <   |
t        j$                     r.|t        j$                     j@                  |t        j$                  <   |t        j"                     D cg c]  }|j@                   c}|t        j"                  <   |
t        j(                     r.|t        j(                     j@                  |t        j(                  <   |
t        j2                     r.|t        j2                     j@                  |t        j2                  <   t        jB                  |d   jD                  i}tG        |jH                  |j@                  ||tK                     }t        j                  jM                  ||      }|jM                  ||      }| jO                  |       y c c}w )Nr         exp_cone_orderK_dirr   shaper      Corderr   SCS:0yE>solvereps)(r   r   r   r	   applyr   format_constraintsa2dDualizesABr    cpVariabler   FREEr   NONNEGappendDUAL_EXPreshaper   npexp
DUAL_POW3Darraysizer   MaximizeProblemsolvevalueEQ_DUAL
dual_valuer   statusdictinvertunpack)in_prob
reductionschain	cone_proginv_prob2conedatainv_datar-   bcr   yconstraintsi
dual_primsdimexp_leny_dealphay_dppow_con	objective	dual_probexpr
dual_dualsdual_solcone_solin_prob_sols                               U/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/cvxpy/tests/test_cone2cone.pysimulate_chainzTestDualize.simulate_chain+   sO    j."24F4HI
dJ'#(;;w#7 	=  229YW	**95haccDItACCy$w-G1aKKqwwqzm,1uzl#((Ohh"1sww3


#C%&q3ZJszz"q1S5zQ/HA> 	Csww&&q1S5z2s1Q41Q3qu67HA	 %--G'(1W9~Js||$::a!G)nwz1oSIDwQT
{T!Q$ZK4PQSTPT:AUVWLA HHU3>>23E)*12Js~~&::aeejj!_C@DQT
U 2DAJ!E'4JDQRTUQUJX]^Gw'KKA&	JJy+6	u$/)#((399
388%/

%;%A%AJszz"6@6IJdtzzJ
377'1#,,'?'E'EJs||$ )3CNN)C)I)IJs~~&iiQ!:!:;
I,,iooz:W[W]^;;%%h9 ll8];{# Ks   Uc                     t        j                         }t        j                  |j                         |j                  d       |j                  d       |j                  d       y N   places)STHlp_1r   r`   probverify_objectiveverify_primal_valuesverify_dual_valuesselfsths     r_   	test_lp_1zTestDualize.test_lp_1c   R    hhj""388,A&   *a(    c                     t        j                         }t        j                  |j                         |j                  d       |j                  d       |j                  d       y rb   )rf   lp_2r   r`   rh   ri   rj   rk   rl   s     r_   	test_lp_2zTestDualize.test_lp_2k   rp   rq   c                     t        j                         }t        j                  |j                         |j                  d       y rb   )rf   lp_3r   r`   rh   ri   rl   s     r_   	test_lp_3zTestDualize.test_lp_3s   0    hhj""388,A&rq   c                     t        j                         }t        j                  |j                         |j                  d       y rb   )rf   lp_4r   r`   rh   ri   rl   s     r_   	test_lp_4zTestDualize.test_lp_4y   rx   rq   c                     t        j                         }t        j                  |j                         |j                  d       |j                  d       |j                  d       |j                  d       y rb   )	rf   lp_5r   r`   rh   ri   check_primal_feasibilitycheck_complementaritycheck_dual_domainsrl   s     r_   	test_lp_5zTestDualize.test_lp_5   sc    hhj""388,A&$$A$.!!!+a(rq   c                     t        j                         }t        j                  |j                         |j                  d       |j                  d       y rb   )rf   socp_0r   r`   rh   ri   rj   rl   s     r_   test_socp_0zTestDualize.test_socp_0   sA    jjl""388,A&   *rq   c                     t        j                         }t        j                  |j                         |j                  d       |j                  d       |j                  d       y rb   )rf   socp_1r   r`   rh   ri   rj   rk   rl   s     r_   test_socp_1zTestDualize.test_socp_1   R    jjl""388,A&   *a(rq   c                     t        j                         }t        j                  |j                         |j                  d       |j                  d       |j                  d       y rb   )rf   socp_2r   r`   rh   ri   rj   rk   rl   s     r_   test_socp_2zTestDualize.test_socp_2   r   rq   c                     t        j                  |      }t        j                  |j                         |j                  d       |j                  d       |j                  d       y rb   )rf   socp_3r   r`   rh   ri   rj   rk   rm   axisrn   s      r_   _socp_3zTestDualize._socp_3   sU    jj""388,A&   *a(rq   c                 &    | j                  d       y Nr   r   rm   s    r_   test_socp_3_axis_0zTestDualize.test_socp_3_axis_0       Qrq   c                 &    | j                  d       y )Nr   r   r   s    r_   test_socp_3_axis_1zTestDualize.test_socp_3_axis_1   r   rq   c                     t        j                         }t        j                  |j                         |j                  d       |j                  d       |j                  d       y rb   )rf   	expcone_1r   r`   rh   ri   rj   rk   rl   s     r_   test_expcone_1zTestDualize.test_expcone_1   sR    mmo""388,A&   *a(rq   c                     t        j                         }t        j                  |j                         |j                  d       |j                  d       |j                  d       y rb   )rf   expcone_socp_1r   r`   rh   ri   rj   rk   rl   s     r_   test_expcone_socp_1zTestDualize.test_expcone_socp_1   sU      """388,A&   *a(rq   c                     t        j                         }t        j                  |j                         |j                  d       |j                  d       |j                  d       y )Nr   rd   )rf   pcp_2r   r`   rh   ri   rj   rk   rl   s     r_   
test_pcp_2zTestDualize.test_pcp_2   sR    iik""388,A&   *a(rq   N)__name__
__module____qualname__staticmethodr`   ro   rt   rw   r{   r   r   r   r   r   r   r   r   r   r    rq   r_   r   r   )   s[    5$ 5$n))'')+))))))rq   r   c            	          e Zd Zej                  gg gZej                  ej                  gej                  gej                  gg gZej                  ej                  gej                  gej                  gg gZ	ej                  gej                  gg gZej                  gg gZed        Zed        Zed        Zed        Zd Zd Zd Zd Zd	 Zd
 Zd Zd Zd Zej8                  j;                  devd      d        Zej8                  jA                  d      d        Z! e"jF                  eD  cg c]  }|tH        v s| c}}} d      d        Z%yc c}}} w )
TestSlacksc                 b   t               t               t               g}t        d |      }|j	                  |       \  }}t        j                  |g d      }t        j                  j	                  ||      \  }}|t        j                     |t        j                     |t        j                     |d   |d   f\  }	}
}}}t        j                  j                  |	      }	t!        j"                  |	j$                  d   f      }t!        j&                  ||z        }t(        j+                  |	|
||      }t(        j-                  ||      }t(        j/                  ||      }||z   |z   }t!        j0                  ||      } |j2                  di | t        j4                  |d |j6                  j8                   j:                  i}t=        |j>                  |j:                  |d tA                     }t        j                  jC                  ||      }|jC                  ||      }| jE                  |       y )Nr   r   r   K_affr   r   r   )#r   r   r   r	   r(   r   r)   r*   Slacksr,   r-   r.   r    spsparse	csc_arrayr/   r0   r   Minimizer   set_affine_constraintsset_direct_constraintsset_integer_constraintsr<   r=   r1   xr:   r>   r   rA   rB   rC   rD   )rE   affinesolve_kwargsrF   rG   rH   rI   rJ   rK   Ghfr   r   rN   rX   aff_condir_conint_conrO   
slack_probslack_prims	slack_solr]   r^   s                            r_   r`   zTestSlacks.simulate_chain   s    j."24F4HI
dJ'#(;;w#7 	=  229YW	)))V<h $QSS	49d133igPTU\P] ]1aII"KKqwwqzm,KKA&	33Aq!UC33Au=44Q=''1ZZ	;7

(<(xx#4IKK$4$4!5!;!;<Z..
0@0@+tUYU[\	::$$Y9 ll8];{#rq   c           	      x   g }d}|t         j                     rA|t         j                     }|j                  | |||z   d d f   |z  ||||z    k(         ||z  }|t         j                     rA|t         j                     }|j                  | |||z   d d f   |z  ||||z    k         ||z  }|t         j                     D ]B  }||||z    | |||z   d d f   |z  z
  }|j                  t	        |d   |dd               ||z  }D |t         j
                     rd|t         j
                     z  }t        j                  ||||z    | |||z   d d f   |z  z
  |dz  dfd      }|j                  t        |d d df   |d d df   |d d df                ||z  }|t         j                     rt        j                  |t         j                           }t        j                  ||d  | |d d d f   |z  z
  |j                  dfd      }|j                  t        |d d df   |d d df   |d d df   |             |S Nr   r   r   r    r!   r   )r*   ZEROr3   r2   r   EXPr/   r5   r   POW3Dr6   r9   r:   r   )	r   r   rN   r   rO   rP   rR   rZ   rU   s	            r_   r   z!TestSlacks.set_affine_constraints   s?   ?/Cq1S5!}q0Aa#J>?HA

#Cq1S5!}q0Aa#J>?HA> 	CQqu:!AcE'1* 11Ds47DH56HA	 >eCGGn$C::a!C%j1QquWaZ=1+<<sAvqkQTUDwtAqDz41:tAqDzJKHAHHU399-.E::aeaAhl2UZZO3ODyadT!Q$ZadUSTrq   c           
      j   g }|t         j                     }|t         j                     r2|t         j                     }|j                  | |||z    dk\         ||z  }|t         j                     D ].  }|j                  t	        | |   | |dz   ||z                 ||z  }0 |t         j
                     rod|t         j
                     z  }t        j                  | |||z    |dz  dfd      }|j                  t        |d d df   |d d df   |d d df                ||z  }|t         j                     rt        j                  |t         j                           }t        j                  | |d  |j                  dfd      }|j                  t        |d d df   |d d df   |d d df   |             |S r   )r*   r1   r2   r3   r   r   r/   r5   r   r   r6   r9   r:   r   )rN   r   rO   rP   rR   rZ   rU   s          r_   r   z!TestSlacks.set_direct_constraints   s   #((O

#Cq1S5zQ/HA> 	Cs1Q41Q3qu67HA	 >eCGGn$C::a!C%j361+SADwtAqDz41:tAqDzJKHAHHU399-.E::aeejj!_C@DyadT!Q$ZadUSTrq   c                    g }|t         j                     rL| |t         j                        }t        j                  |j                  fd      }|j                  ||k(         |t         j                     rL| |t         j                        }t        j                  |j                  fd      }|j                  ||k(         |S )NT)r   boolean)r   integer)r,   BOOL_IDXr/   r0   r:   r3   INT_IDX)rN   rJ   rO   rZ   zs        r_   r   z"TestSlacks.set_integer_constraints  s    

T!**%&D499,=Atqy)		?T!))_%D499,=Atqy)rq   c                     t        j                         }t        j                  D ]H  }t        j	                  |j
                  |d       |j                  d       |j                  d       J y NCLARABELr&   rc   rd   )rf   rs   r   AFF_LP_CASESr`   rh   ri   rj   rm   rn   r   s      r_   rt   zTestSlacks.test_lp_2"  s]    hhj -- 	/F%%chhz%J   *$$A$.	/rq   c                     t        j                         }t        j                  D ]6  }t        j	                  |j
                  |d       |j                  d       8 y r   )rf   rv   r   r   r`   rh   ri   r   s      r_   rw   zTestSlacks.test_lp_3*  L    hhj -- 	+F%%chhz%J   *	+rq   c                     t        j                         }t        j                  D ]6  }t        j	                  |j
                  |d       |j                  d       8 y r   )rf   rz   r   r   r`   rh   ri   r   s      r_   r{   zTestSlacks.test_lp_41  r   rq   c                     t        j                         }t        j                  D ]H  }t        j	                  |j
                  |d       |j                  d       |j                  d       J y r   )rf   r   r   AFF_SOCP_CASESr`   rh   ri   rj   r   s      r_   r   zTestSlacks.test_socp_28  s]    jjl // 	/F%%chhz%J   *$$A$.	/rq   c                     dD ]]  }t        j                  |      }t        j                  |j                  g d       |j                  d       |j                  d       _ y )N)r   r   r   r   rc   rd   )rf   r   r   r`   rh   ri   rj   r   s      r_   test_socp_3zTestSlacks.test_socp_3?  sZ     	/D**T"C%%chh:%F   *$$A$.		/rq   c                     t        j                         }t        j                  D ]H  }t        j	                  |j
                  |d       |j                  d       |j                  d       J y r   )rf   r   r   AFF_EXP_CASESr`   rh   ri   rj   r   s      r_   r   zTestSlacks.test_expcone_1F  s]    mmo .. 	/F%%chhz%J   *$$A$.	/rq   c                     t        j                         }t        j                  D ]H  }t        j	                  |j
                  |d       |j                  d       |j                  d       J y )Nr#   r   rc   rd   )rf   r   r   AFF_MIXED_CASESr`   rh   ri   rj   r   s      r_   r   zTestSlacks.test_expcone_socp_1M  s`      " 00 	/F%%chhu%E   *$$A$.	/rq   c                     t        j                         }t        j                  D ]I  }t        j	                  |j
                  |dd       |j                  d       |j                  d       K y Nr#   r$   r%   r   rd   )rf   pcp_1r   AFF_PCP_CASESr`   rh   ri   rj   r   s      r_   
test_pcp_1zTestSlacks.test_pcp_1T  _    iik .. 	/F%%chhu$%O   *$$A$.	/rq   c                     t        j                         }t        j                  D ]I  }t        j	                  |j
                  |dd       |j                  d       |j                  d       K y r   )rf   r   r   r   r`   rh   ri   rj   r   s      r_   r   zTestSlacks.test_pcp_2[  r   rq   HIGHSzHiGHS solver is not installed.)reasonc                     t        j                         }t        j                  D ]V  }t        j	                  |j
                  |t        j                         |j                  d       |j                  d       X y Nr   rc   rd   )
rf   mi_lp_1r   r   r`   rh   r/   r   ri   rj   r   s      r_   test_mi_lp_1zTestSlacks.test_mi_lp_1b  sc    
 kkm -- 	/F%%chhrxx%H   *$$A$.	/rq   zKnown bug in ECOS BBc                     t        j                         }t        j                  D ]V  }t        j	                  |j
                  |t        j                         |j                  d       |j                  d       X y r   )
rf   	mi_socp_1r   r   r`   rh   r/   SCIPYri   rj   r   s      r_   test_mi_socp_1zTestSlacks.test_mi_socp_1m  sa    mmo // 	/F%%chhrxx%H   *$$A$.	/rq   z6No appropriate mixed-integer SOCP solver is installed.c                     t        j                         }t        j                  D ]F  }t        j	                  |j
                  |       |j                  d       |j                  d       H y rb   )rf   	mi_socp_2r   r   r`   rh   ri   rj   r   s      r_   test_mi_socp_2zTestSlacks.test_mi_socp_2u  sZ     mmo // 	/F%%chh7   *$$A$.	/rq   N)&r   r   r   r*   r2   r   r   r   r   r   r   r   r   r   r`   r   r   r   rt   rw   r{   r   r   r   r   r   r   pytestmarkskipifINSTALLED_MIr   skipr   unittest
skipUnlessMI_SOCPr   ).0svrr   s   000r_   r   r      s   ZZL"%Lzz377+cjj\CGG9bINjj#''*SZZL377)RHMjj\CII;3M

|R(O$ $8  4  * 
 
/++////// [[|#/  /	/ [[34/ 5/ XHH##HQS/S/ Is   6EEr   c                   L    e Zd Zed        Zd Zd Zed	defd       Zd Z	d Z
y)
	TestPowNDc                 f   t        j                  d      }t        j                  g d      }t        j                  d      }d}t        j                  t        j
                  |      |d   z
        }t        j                  |d   |d   g|d   d	gg      }t        j                  d
dgddgg      }| dk(  r|j                  }|j                  }|d   |d   z   d|d   z  z   dk(  dft         j                  j                  ||||       dfg}|df}	||f||fg}
t        j                  |	|
|      }|S )a  
        A modification of pcp_2. Reformulate

            max  (x**0.2)*(y**0.8) + z**0.4 - x
            s.t. x + y + z/2 == 2
                 x, y, z >= 0
        Into

            max  x3 + x4 - x0
            s.t. x0 + x1 + x2 / 2 == 2,

                 W := [[x0, x2],
                      [x1, 1.0]]
                 z := [x3, x4]
                 alpha := [[0.2, 0.4],
                          [0.8, 0.6]]
                 (W, z) in PowND(alpha, axis=0)
        r   r   )gLP^?g?g'Vr@)r   Nr   r   r         ?皙?g?g?g333333?g      ?r   gy6?)r/   r0   r6   r9   r;   sumbmatTrO   r   rf   SolverTestHelper)r   r   expect_xhyposexpect_hyposrX   WrU   	con_pairsobj_pair	var_pairsrn   s               r_   pcp_3zTestPowND.pcp_3  sC   ( KKd#88@A$'KKu! 45	GGadAaD\dC[" #3**& '19AGGEqTAaD[31:%*D1^^%%aD%A4H
	 12ML!
	 ""8Y	B
rq   c                     t         j                  d      }|j                  dd       |j                  d       |j	                  d       |j                  d       y )Nr   r   r#   r$   r%   r   rd   r   r  r=   ri   rj   r   rl   s     r_   test_pcp_3azTestPowND.test_pcp_3a  X    oo1o%		D	)A&   *!!!+rq   c                     t         j                  d      }|j                  dd       |j                  d       |j	                  d       |j                  d       y )Nr   r   r#   r$   r%   r   rd   r  rl   s     r_   test_pcp_3bzTestPowND.test_pcp_3b  r  rq   ceeic           
         t         j                  j                  d       d}d}t         j                  j                  ||      }t	        j
                  ||fd      }t	        j                  t	        j                  ||      d      }| rt        j                  |      |z  }nt        j                  g d      }t	        j                  t	        j                  t	        j                  |t	        j                  |                        }t	        j                  |d      dk  g}t	        j                  ||      }	|	j                  d	d
       |j                  }
t	        j
                         }t	        j                  |      t        j                  |	j                        f}t	        j                  |d      dk  dft!        |||      dfg}||
fg}t#        j$                  |||      }|S )z
        A power cone formulation of a Fisher market equilibrium pricing model.
        ceei = Competitive Equilibrium from Equal Incomes
        r   rc      T)r   nonnegr   r   )g333333?g333333?r   gffffff?r#   r$   r%   N)r  r   rU   )r6   randomseedrandr/   r0   r  multiplyonesr9   r;   logr<   r=   r>   r7   r   rf   r  )r  n_buyern_itemsVXurL   log_objectivelog_conslog_probexpect_Xr   pow_objectivepow_conspow_varsrn   s                   r_   pcp_4zTestPowND.pcp_4  sp    			qIINN7G,KKw0>FF2;;q!$1- 7*A/0ABFF2;;q"&&)+D$EFFF11%*+::mX6e.77KKMQ)?@VVAA&!+T2aq148:M?""=(HE
rq   c                     t         j                  d      }|j                  dd       |j                  d       |j	                  d       |j                  d       y )NTr  r#   r$   r%   r   rd   r   r)  r=   ri   rj   r   rl   s     r_   test_pcp_4azTestPowND.test_pcp_4a  sX    oo4o(		D	)A&   *!!!+rq   c                     t         j                  d      }|j                  dd       |j                  d       |j	                  d       |j                  d       y )NFr+  r#   r$   r%   r   rd   r,  rl   s     r_   test_pcp_4bzTestPowND.test_pcp_4b  sX    oo5o)		D	)A&   *!!!+rq   N)T)r   r   r   r   r  r  r  boolr)  r-  r/  r   rq   r_   r   r     sD    ) )V D  <rq   r   c                   X    e Zd Zdej                  fdZd Zdej                  fdZd Zy)TestRelEntrQuadreturnc                    t        j                  d      }t        |d   |d   |d         j                  dd      }t        j                  |      dk  t        j                  |      dk\  |dk\  |g}t        j
                  d	|d   z  d|d   z  z   |d   z         }|d
f}t        j                  dg      t        j                  dg      t        j                  dg      g}|d   df|d   df|d   t        j                  d      f|d	   |fg}t        j                  dgdgdgg      }||fg}	t        j                  ||	|      }
|
S )ah  
        min   3 * x[0] + 2 * x[1] + x[2]
        s.t.  0.1 <= x[0] + x[1] + x[2] <= 1
              x >= 0
              and ...
                x[0] >= x[1] * exp(x[2] / x[1])
              equivalently ...
                x[0] / x[1] >= exp(x[2] / x[1])
                log(x[0] / x[1]) >= x[2] / x[1]
                x[1] log(x[1] / x[0]) <= -x[2]
        )r   r   r   r   r   r      r   g?r   gs?gq ܧgmsֿgUYF?gn@g; ?gS?g
uན?)r/   r0   r   as_quad_approxr  r   r6   r9   zerosrf   r  )rm   r   cone_conrO   objr
  
expect_expr	  r  r  rn   s              r_   r   zTestRelEntrQuad.expcone_1  sT    KKf%1Q41qt,;;AqAvvayC'vvayC'Av! kk!ad(Q1X-!45,-hh}-rxx/FR\Q]H^_
!!na(!!n&89!!nbhhV&<=!!nj13	 88j\J<*FG]O	""8Y	B
rq   c                     | j                         }|j                  d       |j                  d       |j                  d       y )Nr   r   r   rd   )r   r=   rj   ri   rl   s     r_   r   zTestRelEntrQuad.test_expcone_1  s>    nn			$   *A&rq   c                    t        j                  g dg dg dg      }t         j                  j                  |      }d}t	        j
                  d      }t	        j
                  dd	      }t	        j
                  dd
	      }t	        j                  t        j                  d            }t	        j                  |||z  |z  z
        }t	        j                  |j                  |z  d      |k  }	t        |||      j                  dd      }
|df}|t        j                  g d      f|t        j                  g d      fg}|	df|
g dfg}t        j                  |||      }|S )zF
        A random risk-parity portfolio optimization problem.
        )gHzG?p=
ף?(\	@)r=  gq=
ףp@q=
ףp	@)r>  r?  gzGa!@g      ?t)namer   r   )r   rA  r,   r   r   )pr5  g.$-L@)g펔Fo?ga?g/?)gSg+ٱgC4Xr   )NNN)r6   r9   linalgcholeskyr/   r0   Constantr  r   normr  r   r6  rf   r  )rm   sigmaLrM   r@  r   r,   erX   con1con2r
  r  r	  rn   s                  r_   r   zTestRelEntrQuad.expcone_socp_1  s>    ,,,. / IIu%KKS!KKd-KKd-KK%KKAEAI.	wwqssQw!$)q!Q..q!4y)=>?789
	
 3K  
	 ""8Y	B
rq   c                     | j                         }|j                  t        j                         |j	                  d       |j                  d       y )Nr   r   rd   )r   r=   r/   r#   rj   ri   rl   s     r_   r   z#TestRelEntrQuad.test_expcone_socp_13  sD    !!#			    *A&rq   N)	r   r   r   rf   r  r   r   r   r   r   rq   r_   r2  r2    s1    3// <' 4 4 @'rq   r2  c                      t         j                  t         j                  t         j                  hj	                  t        j
                               } t        |       dkD  S r   )r/   CVXOPTMOSEKCOPTintersectioninstalled_solverslen)viables    r_   sdp_ipm_installedrU  :  s<    ii277+889M9M9OPFv;?rq   z:First-order solvers are too slow for the accuracy we need.c            	          e Zd ZdddZedej                  dej                  dej                  fd       Zedej                  dej                  de
d	e
fd
       Zdej                  fdZd Zd Zd Zd Zd Zdej                  fdZd Zy)TestOpRelConeQuadr3  Nc                    || _         t        j                  |fd      | _        t        j                  |fd      | _        t        t        j                  d      r%t        j                  j                  d      | _	        n$t        j                  j                  d      | _	        t        | j                  d      r| j                  j                  }n| j                  j                  }t        j                   ||            | _        | j                  d ||      z  z   | _        t        j                   ||            | _        | j                  d ||      z  z   | _        | j                  | j                  k  | j                  | j                  k  | j                  | j                  k  | j                  | j                   k  g| _        t        j$                         }t        j&                  |v rt        j&                  | _        y t        j*                  |v rt        j*                  | _        y t        j,                  |v rt        j,                  | _        y t/        d      )NTr   posdefault_rngr   r  g?zNo viable solver installed.)nr/   r0   arL   hasattrr6   r  r[  rngRandomStaterandom_samplecumsuma_lowera_upperb_lowerb_upper	base_consrR  rO  r&   rN  rP  RuntimeError)rm   r\  rand_gen_funcrR  s       r_   setUpzTestOpRelConeQuad.setUpC  s   A4T2A4T2299m,yy,,Q/DHyy,,Q/DH488X& HHOOM HH22Myyq!12||d=+;&;;yyq!12||d=+;&;;LLDFF"FFdll"LLDFF"FFdll"	
 00288((((DK 	 YY++))DK
 		 WW))''DK 	 <==rq   r]  rL   Uc                     t        j                  | t        j                  | |z        z        }t        j                  |      r"||z  |j	                         j
                  z  }|S ||z  |j
                  z  }|S )N)r6   diagr  iscomplexobjconjr  )r]  rL   rk  Douts        r_   Dop_commutezTestOpRelConeQuad.Dop_commutee  sc    GGAqsO$??1a%!&&(**$C 
 a%!##+C
rq   apx_mapx_kc                    | j                   }||j                   k(  sJ t        j                  |      }t        j                  j	                  | ||||      }t        j
                  t        j                  |            }||fS )Nr   )r:   r/   r0   rO   RelEntrConeQuadr   r  )r]  rL   rs  rt  r\  epi_vecconrX   s           r_   sum_rel_entr_approxz%TestOpRelConeQuad.sum_rel_entr_approxn  sg     FFAFF{{++A&nn,,Q7E5IKKw0	#~rq   c                    t         j                  | j                  | j                  ||      \  }}| j                  D cg c]  }| }}|j                  |       t        j                  ||      }|j                          | j                  j                  }	| j                  j                  }
|j                  }| j                  }|r| j                  j                  ||f      }t        j                  j                  |      d   }t        j                   |t        j"                  | j                        z  |j$                  z        }t        j                   |t        j"                  | j                        z  |j$                  z        }t        j&                  ||fd      }nd| j                  j                  ||f      z  }|| j                  j                  ||f      z  }t        j                  j                  |      d   }t        j(                  |t        j"                  | j                        z  |j+                         j$                  z        }t        j(                  |t        j"                  | j                        z  |j+                         j$                  z        }t        j&                  ||fd      }t        j,                  j/                  |||||      }t        j0                  t3        |            }t         j5                  |	|
|      }| j                  D cg c]  }|df }}|j                  |df       ||f}||fg}t7        j8                  |||      }|S c c}w c c}w )a$  
        These tests construct two matrices that commute (imposing all eigenvectors equal)
        and then use the fact that: T=Dop(A, B) for (A, B, T) in OpRelEntrConeQuad
        i.e. T >> Dop(A, B) for an objective that is an increasing function of the
        eigenvalues (which we here take to be the trace), we compute the reference
        objective value as tr(Dop) whose correctness can be seen by writing out
        tr(T)=tr(T-Dop)+tr(Dop), where tr(T-Dop)>=0 because of PSD-ness of (T-Dop),
        and at optimality we have (T-Dop)=0 (the zero matrix of corresponding size)
        For the case that the input matrices commute, Dop takes on a particularly
        simplified form, i.e.: U @ diag(a * log(a/b)) @ U^{-1} (which is implemented
        in the Dop_commute method above)
        )r:   r   Tr   	symmetricy              ?)r   	hermitianN)rW  ry  r]  rL   rg  r3   r/   r<   r=   r>   r\  r_  normalr   rC  qrsymmetric_wraprm  r  r0   hermitian_wrapro  rO   OpRelEntrConeQuadr   r   rr  rf   r  )rm   rs  rt  realtemp_objtemp_conrx  temp_constraints	temp_probexpect_aexpect_bexpect_objectiver\  randmatrk  r-   r.   r  main_conr9  expect_Tr	  r
  r  rn   s                            r_   oprelcone_1zTestOpRelConeQuad.oprelcone_1x  s    /BBFFDFFE5
( ,0>>:CC::)JJx)9:	66<<66<<#>> FFhhooAq6o2G		W%a(A!!!bggdffo"5";<A!!!bggdffo"5";<A1a&D9A488??A?77GtxxQF33G		W%a(A!!!bggdffo"5

"BCA!!!bggdffo"5

"BCA1a&D9A>>33Aq!UEJkk%(#$008QG -1NN;Sc4[;	;(D)*)*]O	""8Y	B
E ;: <s   	M*(M/c                     | j                  ddd      }|j                  | j                         |j                  d       |j	                  d       y )Nr   r   Trd   r  r=   r&   rj   ri   rl   s     r_   test_oprelcone_1_m1_k3_realz-TestOpRelConeQuad.test_oprelcone_1_m1_k3_real  K    q!T*		$++   *A&rq   c                     | j                  ddd      }|j                  | j                         |j                  d       |j	                  d       y )Nr   r   Trd   r  rl   s     r_   test_oprelcone_1_m3_k1_realz-TestOpRelConeQuad.test_oprelcone_1_m3_k1_real  r  rq   c                     | j                  ddd      }|j                  | j                         |j                  d       |j	                  d       y )Nrc   Tr   rd   r  rl   s     r_   test_oprelcone_1_m4_k4_realz-TestOpRelConeQuad.test_oprelcone_1_m4_k4_real  r  rq   c                     | j                  ddd      }|j                  | j                         |j                  d       |j	                  d       y )Nr   r   Frd   r  rl   s     r_   test_oprelcone_1_m1_k3_complexz0TestOpRelConeQuad.test_oprelcone_1_m1_k3_complex  K    q!U+		$++   *A&rq   c                     | j                  ddd      }|j                  | j                         |j                  d       |j	                  d       y )Nr   r   Frd   r  rl   s     r_   test_oprelcone_1_m3_k1_complexz0TestOpRelConeQuad.test_oprelcone_1_m3_k1_complex  r  rq   c                    d\  }}}t        j                  g dg dg dg dg      }t        j                  g dg dg dg d	g      }t        j                  |fd
      }t        j                  |fd
      }|t        j                  |      z  |j
                  z  }|t        j                  |      z  |j
                  z  }	t        j                  ||fd
      }
t        j                  g d      }t        j                  g d      }t        j                  g d      }t        j                  g d      }t        j                  j                  ||	|
||      }||k  }||k  }||k  }||k  }|df|df|df|df|dfg}t        j                  t        |
            }d}t        j                  g dg dg dg dg      }||f}|
|fg}t        j                  |||      }|S )a  
        This test uses the same idea from the tests with commutative matrices,
        instead, here, we make the input matrices to Dop, non-commutative,
        the same condition as before i.e. T=Dop(A, B) for (A, B, T) in OpRelEntrConeQuad
        (for an objective that is an increasing function of the eigenvalues) holds,
        the difference here then, is in how we compute the reference values, which
        has been done by assuming correctness of the original CVXQUAD matlab implementation
        )rc   r   r   )gƪgL=gc1߿g~+׿)g-슕?gsX~*xпg?g- ֿ)gv?gp*?g*Kxgj`]޿)gB%?ggDƿg}jԿgY8ź#?)ggX3ۿgY=qJ
?gpO%=?gD.K?)gBg@g/o?g?)g1!ga?gL.gQi?)gڥ?g$Ntgjg?gqNiP?TrY  r{  )g'=	?glǷ?g%?gUh@)g
]?g#li?g!DK?g4}@)g4U朎?gطrz?gRĴ?g?)gMV?gDa?g+aYa?g+?Ng^?)gO?CA?Be6Z?`7)r  g~ç?[
?=`2)r  r  g	(un?#i)r  r  r  gtK?)r6   r9   r/   r0   rm  r  rO   r  r   r   rf   r  )rm   r\  mkU1U2a_diagb_diagr-   r.   r  rc  rd  re  rf  rJ  rK  con3con4con5r	  r9  
expect_objr  r
  r  rn   s                              r_   oprelcone_2zTestOpRelConeQuad.oprelcone_2  s    1a XXKIIIK L XXGGIGI J A4T2A4T2 244' 244'KKq!f5((KL((KL((KL((KL~~//1aA>&  &  D\D\D\D\D\	#	
 kk%(#
88MLLNP Q
 $]O	""8Y	B
rq   c                     | j                         }|j                  | j                         |j                  d       |j	                  d       y )Nr   rd   )r  r=   r&   rj   ri   rl   s     r_   test_oprelcone_2z"TestOpRelConeQuad.test_oprelcone_2  sB     		$++   *A&rq   r   )r3  N)r   r   r   rj  r   r6   ndarrayrr  r/   
Expressionintry  rf   r  r  r  r  r  r  r  r  r  r   rq   r_   rW  rW  ?  s     D rzz bjj RZZ   r}}  #&/2 31E1E 3j2S11 2h'rq   rW  )4__doc__r   numpyr6   r   scipyr   cvxpyr/   r   r,   cvxpy.atoms.affine.tracer   cvxpy.constraints.exponentialr   cvxpy.constraints.powerr   r   cvxpy.constraints.second_orderr   cvxpy.reductions.chainr	   cvxpy.reductions.cone2coner
   r*    cvxpy.reductions.cvx_attr2constrr   .cvxpy.reductions.dcp2cone.cone_matrix_stuffingr   "cvxpy.reductions.dcp2cone.dcp2coner   cvxpy.reductions.solutionr   3cvxpy.reductions.solvers.conic_solvers.conic_solverr    cvxpy.reductions.solvers.definesr   r   r   r   cvxpy.testsr   rf   cvxpy.tests.base_testr   r   r   r   r2  rU  r   rW  r   rq   r_   <module>r     s          * 1 8 . ( ; ; M 7 . K Q G 2 *S)( S)l}/ }/@k k\J'h J'Z
 &(QSG' G'SG'rq   