
    biz                         d Z ddlZddlZddlmZ ddlZddlm	Z	m
Z
 ddlmZmZ ddlm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)MinimizeProblem)Constant	Parameter)Variable)INSTALLED_MI_SOLVERS)BaseTestc                   t   e Z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"e#jH                  jK                  d"e&vd#$      d*d%       Z'd*d&Z(d*d'Z)d*d(Z*d*d)Z+y)+TestComplexz2 Unit tests for the expression/expression module. Nc                 F   t        dd      }t        dd      }t        dd      }|j                         rJ |j                         rJ |j                         sJ |j                         rJ |j                         sJ |j                         sJ | j                  t              5 }t        j                  ddg      |_        ddd       | j                  t        j                        d	       t        j                  d
dg      |_        t        j                  ddg      |_        | j                  t              5 }t        j                  d
dg      |_        ddd       | j                  t        |j                        d       y# 1 sw Y   xY w# 1 sw Y   ;xY w)z!Test the Variable class.
           FcomplexTimag              ?        NzVariable value must be real.      ?z!Variable value must be imaginary.)r   
is_complexis_imagassertRaises	ExceptionnparrayvalueassertEqualstr	exceptionselfxyzcms        S/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/cvxpy/tests/test_complex.pytest_variablezTestComplex.test_variable    sK    Q&Q%QT"<<>!!99;||~~99;||~~yy{{y) 	)RhhBx(AG	)R\\*,JK((B8$((B8$y) 	)RhhBx(AG	)R\\*,OP	) 	)	) 	)   )F FFF c                 F   t        dd      }t        dd      }t        dd      }|j                         rJ |j                         rJ |j                         sJ |j                         rJ |j                         sJ |j                         sJ | j                  t              5 }t        j                  ddg      |_        ddd       | j                  t        j                        d	       t        j                  d
dg      |_        t        j                  ddg      |_        | j                  t              5 }t        j                  d
dg      |_        ddd       | j                  t        |j                        d       y# 1 sw Y   xY w# 1 sw Y   ;xY w)"Test the parameter class.
        r   Fr   Tr   r   r   NzParameter value must be real.r   z"Parameter value must be imaginary.)r   r   r   r   r   r   r   r   r   r   r   r   s        r%   test_parameterzTestComplex.test_parameter9   sK    a'a&ad#<<>!!99;||~~99;||~~yy{{y) 	)RhhBx(AG	)R\\*,KL((B8$((B8$y) 	)RhhBx(AG	)R\\*,PQ	) 	)	) 	)r'   c                    t        d      }t        d      }t        d      }|j                         rJ |j                         rJ |j                         sJ |j                         rJ |j                         sJ |j                         sJ y)r)   r         ?       @               @N)r   r   r   )r    r!   r"   r#   s       r%   test_constantzTestComplex.test_constantR   st     QKTNRL<<>!!99;||~~99;||~~yy{{    c                    t        d      }| j                  t              5 }t        |       ddd       | j	                  t        j                        d       | j                  t              5 }t        j                  |       ddd       | j	                  t        |j                        d       y# 1 sw Y   xY w# 1 sw Y   ;xY w)zTest objectives.
        Tr   Nz-The 'minimize' objective must be real valued.z-The 'maximize' objective must be real valued.)	r   r   r   r   r   r   r   cpMaximize)r    r!   r$   s      r%   test_objectivezTestComplex.test_objective`   s     T"y) 	RQK	R\\*,[\y) 	RKKN	R\\*,[\	 		 	s   B40C 4B= C	c                    t        d      }t        d      }t               }||z   }|j                         sJ |j                         rJ ||z   }|j                         sJ |j                         rJ ||z  }|j                         sJ |j                         sJ ||z  }|j                         rJ |j                         rJ |dz  }|j                         sJ |j                         sJ |dz  }|j                         rJ |j                         rJ t        j                  d      }||z  |z  }|j                         sJ |j                         sJ y)z+Test basic arithmetic expressions.
        Tr   r   r   r   r   r   N)r   r   r   r   ones)r    r!   r"   r#   exprAs         r%   test_arithmeticzTestComplex.test_arithmeticl   sE    T"$J1u   <<>!!1u   <<>!!s   ||~~s??$$$<<>!!s   ||~~t??$$$<<>!!GGFO!Qw   ||~~r/   c                    t        j                  d      }t        |      dt        |      z  z   }t        j                  |      }|j                         sJ |j                         rJ |j                         rJ | j                  |j                  |       t        d      }t        j                  |      t        j                  |      z   }|j                         sJ y)zTest real.
        r5   r   Tr   N)r   r6   r   r1   realis_realr   r   assertItemsAlmostEqualr   r   r   )r    r8   r7   r!   s       r%   	test_realzTestComplex.test_real   s     GGFO{R^+wwt}||~~??$$$<<>!!##DJJ2T"wwqzBGGAJ&||~~r/   c                 6   t        j                  d      }t        |      dt        |      z  z   }t        j                  |      }|j                         sJ |j                         rJ |j                         rJ | j                  |j                  d|z         y)Test imag.
        r5   r-   r   N)
r   r6   r   r1   r   r<   r   r   r=   r   r    r8   r7   s      r%   	test_imagzTestComplex.test_imag   sy     GGFO{R^+wwt}||~~??$$$<<>!!##DJJ!4r/   c                 <   t        j                  d      }t        |      dt        |      z  z   }t        j                  |      }|j                         rJ |j                         sJ |j                         rJ | j                  |j                  |d|z  z
         y)r@   r5   r   N)
r   r6   r   r1   conjr<   r   r   r=   r   rA   s      r%   	test_conjzTestComplex.test_conj   s~     GGFO{R^+wwt}<<>!!   <<>!!##DJJBqD9r/   c                 	   t               }t        j                  |d|z  z         }t        t	        |      |dk\  g      }|j                  dd      }| j                  |d       | j                  |j                  d       t        d      }d|z  }t        t	        |      t        j                  |      dk  g      }|j                  dd      }| j                  |d	       | j                  |j                  d       t        d
      }|dz  }t        t	        |d   dz  |d   dz  z         t        j                  |dz         dk\  g      }|j                  dd      }| j                  |t        j                          t        t	        |d   dz  |d   dz  z         t        j                  |dz         dk  g      }|j                  dd      }| j                  |d       | j                  |j                  ddg       t        t	        |d   dz  |d   dz  z         t        j                  |dz         dk\  t        j                  |      dk  g      }|j                  dd      }| j                  |t        j                         t        d      }t        dd      }t        j                  ||g      }t        t	        t        j                  t        j                  t        j                  |                        |dk(  t        j                  |      dk(  t        j                  |      dk  g      }|j                  dd      }| j                  |d       | j                  |j                  dt        j                  d      z         | j                  |j                  t        j                   d             t        d      }t        dd      }t        j                  ||g      }t        t	        t        j                  t        j                  |j"                  j%                                           |dk(  t        j                  |      dk(  t        j                  |      dk  g      }|j                  dd      }| j                  |d       | j                  |j                  dt        j                  d      z         | j                  |j                  t        j                   d             y)z0Test canonicalization for affine atoms.
        r   r   SCSư>solverepsTr      r   r5   )   r   r   iN)r   r1   r   r   r   solveassertAlmostEqualr   r;   r   infr=   rD   vstacksumr6   zerosT	conjugate)r    r!   r7   probresultr"   s         r%   test_affine_atoms_canonz#TestComplex.test_affine_atoms_canon   s    Jwwq2a4x x~Qx05d3vq)qww*$!tx~
a'895d3vr*qww+QKtxQ
T!WRZ 782771r6?a;O:PQ5d3vw/xQ
T!WRZ 782771r6?a;O:PQ5d3vr*##AGGaV4xQ
T!WRZ 782771r6?a;OQSQXQXYZQ[_`Q`:ab5d3vrvv.VVT*yy!Q xrwwrwwt}'= >?Q
aqAC5d3vr*##AGGR-?@##AGGRXXf-=>VVT*yy!Q xrwwtvv/?/?/A'B CDQ
aqAC5d3vr*##AGGR-?@##AGGRXXf-=>r/   c           
      F   t        j                  dd      }t        dd      }t        t        j                  t        j
                  t        j                  |      t        j                  |      z               t        j                  ||z        dk  g      }|j                  dd      }| j                  |d	t        j                  d      z         t        j                  d      t        j                  d      z  }| j                  |j                  |d|z  z          y
)zTest with parameters.
        Tr   )r   r   r   r   rG   rH   rI      N)r1   r   r   r   r2   rT   r   r;   absrP   rQ   r   sqrtr6   r=   r   )r    pr!   rX   rY   vals         r%   test_paramszTestComplex.test_params   s     LLd"-Q%r{{266"''!*rwwqz*A#BCbffQqSkUVFVEWX5d3vq|4ggaj###AGGS2c6\:r/   c                 Z   t               }t        j                  ddt        j                        }d|_        ||z   }t        j
                  |j                  |      sJ t        j                  ddt        j                        }||z   }t        j
                  |j                  |      sJ y)z7Test ndarray of type complex64 and complex128.
        rL   r   )dtyper   N)r   r   full	complex64r   isclose
complex128)r    r!   r#   r7   s       r%   test_complex_ndarrayz TestComplex.test_complex_ndarray   s     JGGAr.1uzz$**a(((GGAr/1uzz$**a(((r/   c                    t        dd      }t        j                  t        j                  |            dk(  g}t        j                  d      }t        j
                  ||      }|j                  d       t        dd      }t        j                  t        j                  t        j                  |                  }t        j
                  ||      }|j                  d      }| j                  |d       y	)
z2Test problems where imaginary is missing.
        r5   T	hermitianrL   r   rG   rJ   r   N)r   r1   tracer;   r   r   rP   rQ   )r    ZconstraintsobjrX   rY   s         r%   test_missing_imagzTestComplex.test_missing_imag   s     Vt,xx
+q01kk!nzz#{+

%
 V$'kk"((2771:./zz#{+5)vq)r/   c           
         t        dd      }t        t        j                  t        j                  t        j
                  |      t        j                  |      z               t        j                  |      dk  g      }|j                  dd      }| j                  |dt        j                  d      z         t        j                  d      t        j                  d      z  }| j                  |j                  |d|z  z          y	)
z"Test with absolute value.
        r   Tr   rG   rH   rI   r\   r   N)r   r   r1   r2   rT   r   r;   r]   rP   rQ   r   r^   r6   r=   r   r    r!   rX   rY   r`   s        r%   test_abszTestComplex.test_abs  s     Q%r{{266"''!*rwwqz*A#BCbffQiSTnEUV5d3vq|4ggaj###AGGS2c6\:r/   c                 T   t        dd      }t               }t        t        j                  |      t        j                  ||      |dk(  g      }|j                  dd      }| j                  |dt        j                  d      z         | j                  |j                  ddg       y)	zTest with SOC.
        r   Tr   r-   rG   rH   rI   N)r   r   r1   r   SOCrP   rQ   r   r^   r=   r   )r    r!   trX   rY   s        r%   test_soczTestComplex.test_soc  s     Q%Jr{{1~q!a2g'>?5d3vq|4##AGGb"X6r/   c           
         t        dd      }t        t        j                  t        j                  t        j
                  |      t        j                  |      z               t        j                  |      dk  g      }|j                  t        j                        }| j                  |dt        j                  d      z         t        j                  d      t        j                  d      z  dz  }t        dd      }t        t        j                  t        j                  t        j
                  |      t        j                  |      z               t        j                  |d      t        j                  d      k  g      }|j                  t        j                        }| j                  |d       t        j                  d      }| j                  |j                   |d	|z  z          y
)z!Test complex with pnorm.
        )rL   r   Tr   r   rl   r5   )r_      r   N)r   r   r1   r2   rT   r   r;   norm1rP   CLARABELrQ   r   r^   r6   pnormr=   r   rs   s        r%   
test_pnormzTestComplex.test_pnorm#  sO    VT*r{{266"''!*rwwqz*A#BCbhhqkUVFVEWX2;;/vq|4ggaj#A% VT*r{{266"''!*rwwqz*A#BCa(BGGAJ6792;;/vq)ggfo##AGGS2c6\:r/   c                    t        j                  d      dt        j                  d      z  z
  }t        j                  |d      }t         j                  j	                  |d      }t        dd      }t        t        t        j                  |d            ||k(  g      }|j                  d      }| j                  ||d	
       t         j                  j	                  |d      }t        dd      }t        t        t        j                  |d            ||k(  g      }|j                  t        j                  d      }| j                  ||d	
       y)zTest matrix norms.
        rz   r-   )r   r\   r   Tr   rG   rl   rL   placesnucg-C6?rI   N)r   arangereshapelinalgnormr   r   r   r1   rP   rQ   rG   )r    P	sigma_maxXrX   rY   norm_nucs          r%   test_matrix_normszTestComplex.test_matrix_norms5  s    IIaL2biil?*JJq&!IINN1a(	VT*x1.a95)vy;99>>!U+VT*x5 12Q!VH=266t4vx:r/   c                 Z   t        j                  d      dt        j                  d      z  z
  }t        j                  |d      }t        j                  |j                        j                  |      dz  t        j                  d      dz  z   }t        j                  |      j                  }t        dd      }t        j                  |      }t        t        j                  |      ||k(  g      }|j                  t        j                  d	
      }| j                  ||d       |j                  }t         j                   j#                  |      \  }}	| j                  ||	d       |dz	  t        j$                  t        j&                  |            dk  g}
t        j                  t        j                  |            }t        j                  ||
      }|j                  t        j                  d	
       | j                  |j                  dt        j(                  d      z         y)zTest log det.
        	   r-   rO   rO   d   rO   皙?Tr   rH   rI   r   r   r   )	objectivero   N)r   r   r   rD   rV   doteyer1   log_detr   r   r   r2   rP   rG   rQ   r   slogdetr;   rm   log)r    r   logdet_valuer   r   rX   rY   objective_value_ldconsrp   s               r%   test_log_detzTestComplex.test_log_detF  s    IIaL2biil?*JJq&!GGACCLQ#bffQil2zz!}**VT*JJqM	r{{9-Qx8266t4v|A>#//		!!!$21= Q,12kk"**Q-(zzCT:

"&&d
+syy!BFF1I+6r/   c           	         t        j                  d      dt        j                  d      z  z
  }t        j                  |d      }t        j                  |j                        j                  |      dz  t        j                  d      dz  z   }t        j                  g dg dg d	g      }||fD ]1  }t        j                  |      j                  }t        |j                  d
      }t        t        j                  t        j                  |            ||k(  g      }|j                  t        j                   d      }| j#                  ||d       t         j$                  j'                  |      j(                  }t        j*                  |d      j                  }t        |j                  d
      }t        t        j                  t        j,                  |d            ||k(  g      }|j                  t        j                   d      }| j#                  ||d       | j/                  |j                  |d       t        j0                  |d      j                  }t        |j                  d
      }t        t        j2                  t        j4                  |d            ||k(  g      }|j                  t        j                   d      }| j#                  ||d       4 y)zTest eigenvalue atoms.
        r   r-   r   
   rO   r   )r   r   r   )             r   r   )r   r   rL   Tr   rH   rI   r   r   g:0yE>N)r   r   r   rD   rV   r   r   r   r1   
lambda_maxr   r   shaper   r   rP   rG   rQ   r   eigvalsr;   sum_largestlambda_sum_largestr=   sum_smallestr2   lambda_sum_smallest)	r    r   P1P2r   r   rX   rY   eigss	            r%   test_eigval_atomszTestComplex.test_eigval_atoms`  s$    IIaL2biil?*JJq&!WWQSS\a #bffQil2XX{L)<=b 	<AMM!$**E$/A2;;r}}Q'7816(CDZZrvv4Z8F""65";99$$Q',,DNN4+11E$/A2;;r'<'<Q'BCa1fXNDZZrvv4Z8F""65";''1'=OOD!,22E$/A2;;r'='=a'CDqAvhODZZrvv4Z8F""65";'	<r/   c                    t         j                  j                  d       t         j                  j                  dd      dt         j                  j                  dd      z  z
  }t        j                  |j
                        j                  |      }t        j                  d      }t        dd      }t        j                  ||      j                  }t        t        j                  t        j                  ||            ||k(  g      }|j                  d      }| j                  ||       t        j                  d      dt        j                  d      d	z   z  z   }t        dd
      }t        j                  ||      j                  }t        t        j                  t        j                  ||            ||k(  g      }|j                  d      }t!        t#        |      t#        |            }| j                  ||z  ||z  d       dt        j                  d      d	z   z  }t        dd
      }t        j                  ||      j                  }t        j                  ||      }t        t        j                  |      ||k(  g      }|j                  d      }t!        t#        |      t#        |            }| j                  ||z  ||z         y)zTest quad_form atom.
        *   rO   r   Fr   r|   rl                 @r   T   r   r   N)r   randomseedrandnrD   rV   r   r   r   r1   	quad_formr   r   r   rP   rQ   maxr]   )	r    r   br!   r   rX   rY   normalizationr7   s	            r%   test_quad_formzTestComplex.test_quad_form|  s*    			rIIOOAq!Bryyq!'<$<<GGACCLQ IIaLQ&Q"((r{{2<<1#56aA:.vu- IIaL2ryy|b011Q%Q"((r{{2<<1#56aA:.CKU4v5u}7LUVW 		!r!"QT"Q"((||Aq!r{{4(16(3:.CKU4v5u}7LMr/   c                    t        j                  ddgddgg      }t        dd      }t        j                  d      }t        dd      }t	        j
                  ||      j                  }t	        j
                  ||      }t        t	        j                  |      ||k(  ||k(  g      }|j                  t        j                  d	d
d      }| j                  ||d       t        j                  d      dt        j                  d      dz   z  z   }t        dd      }t	        j
                  ||      j                  }t	        j
                  ||      }t        t	        j                  |      ||k(  ||k(  g      }|j                  t        j                  d	      }| j                  ||d       t        j                  d      dz   dz  }t        dd      }t	        j
                  ||      j                  }t	        j
                  ||      }t        t	        j                  |      ||k(  ||k(  g      }|j                  t        j                  dd
      }| j                  ||d       y)zTest matrix_frac atom.
        r   r   r   r5   Tr   r   FrH   L  rJ   rK   	max_itersverboserO   r   r   rI   y              $@r   gh㈵>)rJ   rK   r   N)r   r   r   r   r1   matrix_fracr   r   r   rP   rG   rQ   )	r    r   Yr   r!   r   r7   rX   rY   s	            r%   test_matrix_fraczTestComplex.test_matrix_frac  s    HHr2hb	*+VT*IIaLQ&q!$**~~a#r{{4(1616*:;266ttTRvuQ7YYq\B		!r 122Q%q!$**~~a#r{{4(1616*:;266t4vuQ7YYq\B#QT"q!$**~~a#r{{4(1616*:;266ttDvuQ7r/   c                    t         j                  t         j                  fD ]  }t        j                  g d      }t        j                  ddg      }t        j
                  dd      } |||      }|j                         sJ t        j                  t        j                  ||z
              }t        j                  |      }|j                  d      }| j                  |d	d
       | j                  |j                  ddgd
       t        j                  ddg      }	t        j
                  dd      }
 ||	|
      }|j                         sJ t        j                  t        j                  ||z
              }t        j                  |      }|j                  d      }| j                  |d	d
       | j                  |
j                  ddgd
        y)zTest convolve atom with complex variables.

        Tests the factorization (x - j)(x + 1) = x^2 + (1-j)x - j
        by solving for both factors in the convolution.
        )r         ?      rL   r   rL   r   Fr   r|   rl   r   r   r   TN)r1   convconvolver   r   r   r   r   r   r   rP   rQ   r=   r   )r    conv_fnexpected_productfactor_afactor_b_varproduct1
objective1prob1result1factor_bfactor_a_varproduct2
objective2prob2result2s                  r%   test_convolvezTestComplex.test_convolve  s    - 	PG!xx(89 xxa)H;;q%8Lx6H&&(((RWWX8H-H%IJJJJz*Ekkk4G""7Aa"8''(:(:QF1'M xxA'H;;q$7Lx6H&&(((RWWX8H-H%IJJJJz*Ekkk4G""7Aa"8''(:(:S!HQ'O5	Pr/   c                    t        j                  ddgddgg      }t        dd      }d}t        d      }t        j                  ||      j
                  }t        j                  ||      }t        t        j                  |      ||k(  ||k(  g      }|j                  t        j                  d	d
d      }| j                  ||d       t        j                  ||z
  |      }t        t        j                  |      ||k(  g      }|j                  t        j                  d	d
d      }| j                  |dd       | j                  |j
                  |d       y)z!Test quad_over_lin atom.
        r   r   r   r5   Tr   rL   FrH   r   r   rO   r   r   N)r   r   r   r1   quad_over_linr   r   r   rP   rG   rQ   r=   )	r    r   r   r   r"   r   r7   rX   rY   s	            r%   test_quad_over_linzTestComplex.test_quad_over_lin  s.    HHr2hb	*+VT*U#  A&,,1%r{{4(1616*:;266ttTRvuQ7Aq)r{{4(16(3266ttTRvq3##AGGQq#9r/   c                    t        dd      }t        t        j                  t        j                  |d               |d   dk(  |d   dk(  |d	   d
k(  g      }|j                  d       | j                  |j                  g d       y)"Test Hermitian variables.
        r5   Trj   rL   r   r   r   r   )rL   rL   rO   )r   rL         ?      ?rG   rl   )r   r   r   rO   N)r   r   r1   r   r   rP   r=   r   r    r   rX   s      r%   test_hermitianzTestComplex.test_hermitian  sx     Vt,r{{2771T7#34$1aglAdGtODF

%
 ##AGG-?@r/   c                     t        dd      }t        t        j                  t        j                  |d               |dz	  |d   dk(  g      }|j                  d	       |j                  t        j                  u sJ y
)r   r5   Trj   r   r   r   rM   rG   rl   N)r   r   r1   r   r   rP   status
INFEASIBLEr   s      r%   test_psdzTestComplex.test_psd  sj     Vt,r{{2771T7#34Q$2.0

%
 {{bmm+++r/   c           
      d   t        d      }t        j                  t        j                  t        j                  |t        j                  d      z                    }t        j                  |      dk  g}t        j                  ||      }|j                  d      }| j                  |d       y)	z-Test promotion of complex variables.
        Tr   r5   rL   r|   rl   g      @N)r   r1   r2   r;   rT   r   r6   r   r   rP   rQ   )r    vrp   conrX   rY   s         r%   test_promotezTestComplex.test_promote  s     T"kk"''"&&RWWV_)<"=>?wwqzQzz#s#:.vs+r/   c                    t        j                  ddg      }t        j                  ddg      }t        j                  ddg      }t        j                  |||ffd      }t	        j
                  dd      }t        j                  d	      }t	        j                  d      }||z  |k(  g}t	        j                  ||      }	|	j                  d
       |j                  }
t	        j
                  dd      }t        j                  d	      }t	        j                  d      }|j                         |z  |k(  g}t	        j                  ||      }	|	j                  d
       | j                  |j                  |
       y)z1Test problem with complex sparse matrix.
        r   rL   r   r   r5   r   Tr   r   rG   rl   N)r   r   sp	csr_arrayr1   r   identityr2   r   rP   r   toarrayr=   )r    rowcoldatar8   rhoIdrp   r   rX   
rho_sparses              r%   test_sparsezTestComplex.test_sparse  s+    hh1vhh1vxxS	"LL$c
+6: kk&$/[[^kk!nC2zz#t$

%
 YY
 kk&$/[[^kk!n		c!R'(zz#t$

%
 ##CIIz:r/   c                 "   ddg}t        |      }t        j                  ||fd      }|dz	  g}t        d|      D ]d  }t        ||z
  |      D cg c]  }||z  |z   ||z
  z
   }}|t        j                  t        j
                  |d      |         |||z
     k(  gz  }f t        j                  |d   t        j                  t        j                  |            z
        }t        j                  ||      }	|	j                  d       y	c c}w )
z!Test with special index.
        r   rL   Trj   F)orderrG   rl   N)lenr1   r   rangerT   vecr2   r;   rm   r   rP   )
r    cnfro   kiindicesrp   rX   s
             r%   test_special_idxzTestComplex.test_special_idx+  s     FFKKA$/Avhq! 	OA6;AE1oFA{a!e,FGFBFF266!3#7#@AQq1uXMNNK	O kk!A$!!556zz#{+

%
  Gs   Dc           	      	   t        d      }| j                  t              5 }|dk\   ddd       | j                  t	        j
                        d       | j                  t              5 }t        j                  ||       ddd       | j                  t	        |j
                        d       | j                  t              5 }t        j                  |d       ddd       | j                  t	        |j
                        d       | j                  t              5 }t        j                  |d       ddd       | j                  t	        |j
                        d	       | j                  t              5 }t        j                  t        j                   d      t        j                  d
g             ddd       | j                  t	        |j
                        d	       t        dd      }t        j                  t        j                  t        j                  t        j                  t        j                   t        j"                  t        j$                  t        j&                  t        j(                  f	D ]g  }|j*                  }| j                  t              5 }t-        |        ||       ddd       | j                  t	        |j
                        d|z         i t        dd      }t        j.                  t        j0                  fD ]h  }|j*                  }| j                  t              5 }t-        |        |||       ddd       | j                  t	        |j
                        d|z         j t        dd      }t        j2                  t        j4                  d fD ]M  }| j                  t              5 } ||       ddd       | j                  t	        |j
                        d       O t        dd      }t        j6                  d fD ]M  }| j                  t              5 } ||       ddd       | j                  t	        |j
                        d       O y# 1 sw Y   BxY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   ^xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   rxY w# 1 sw Y   xY w# 1 sw Y   xY w)z2Test that complex arguments are rejected.
        Tr   r   Nz)Inequality constraints cannot be complex.z7The second argument to quad_over_lin cannot be complex.r   z+Arguments to sum_largest cannot be complex.z'Arguments to dotsort cannot be complex.r,   z"Arguments to %s cannot be complex.c                 .    t        j                  | d      S Ng?)r1   powerr!   s    r%   <lambda>z-TestComplex.test_validation.<locals>.<lambda>i  s    BHHQO r/   z%Arguments to power cannot be complex.c                 .    t        j                  | d      S r   )r1   r}   r  s    r%   r  z-TestComplex.test_validation.<locals>.<lambda>o  s    !R r/   z,pnorm(x, p) cannot have x complex for p < 1.)r   r   r   r   r   r   r1   r   r   dotsortr   r   geo_meanlog_sum_expr   entrexphuberr   log1plogistic__name__printmaximumkl_divinv_posr^   harmonic_mean)r    r!   r$   atomnames        r%   test_validationzTestComplex.test_validation=  s    T"y) 	R!V	R\\*,WXy) 	#RQ"	#R\\*R	T y) 	!RNN1a 	!R\\*,YZy) 	RJJq!	R\\*,UVy) 	9RJJr{{1~rxx'78	9R\\*,UVQ%[[".."&&WWbffbhhVVRXXr{{4 	]D ==D""9- dQ S.0TW[0[\	] Q%ZZ+ 	]D==D""9- dQ
 S.0TW[0[\	] Q%ZZ*CD 	YD""9- QS.0WX	Y
 Q%%%'@A 	`D""9- QS.0^_	`]	 		# 	#
	! 	!	 		9 	9    sk   Q(*Q5RR5>RR)1R6?	S/	S(Q25Q?RRR&)R3	6S 	S	S	c                    t        j                  dd      }t        j                  t        j                  t        j                  |                  }t        j
                  |      dk(  g}t        j                  ||      }|j                  d      }| j                  |d       t        j                  dd      }t        j
                  |      }t        j                  t        j                  t        j                  |                  }t        j
                  |      dk(  g}t        j                  ||      }|j                  d      }| j                  |d       y)	z)Test diag of mat, and of vector.
        r5   Tr   rL   rG   rl   r   N)	r1   r   r2   rm   r;   diagr   rP   rQ   )r    r   rp   r   rX   rY   r!   s          r%   	test_diagzTestComplex.test_diagt  s     KK-kk"((2771:./
a zz#t$5)vq)KK4(GGAJkk"((2771:./
a zz#t$5)vq)r/   c                    t        j                  ddg      }t        j                  ddgddgg      }t        j                  d      }t        j                  d      }t        j                  d	d
g      }t        j                  t        j
                  ||z  ||z  z   |z
              }t        j                  |      }|j                  d       | j                  |j                  t        j                         |dk\  g}t        j                  ||      }|j                  d       | j                  |j                  t        j                         |d   j                  J y)z+Test a QP with a complex variable.
        r   y       @      r   y            ?y      @      y             @Tr   y       @      ?y              rG   rl   r   N)r   r   r1   r   r   sum_squaresr   rP   r   r   OPTIMAL
dual_value)	r    A0A1rn   r   Br   rX   ro   s	            r%   test_complex_qpzTestComplex.test_complex_qp  s    XXtTl#XX5zD%=12KK%KKNHHdC[!KKr!tbd{Q ?@	zz)$

%
 bjj1Avhzz)[1

%
 bjj11~((444r/   c                    t        j                  dd      }t        j                  d      }t        j                  ddgddgg      }t        dt        j                  ||      j                         t        dt        j                  ||      j                         t        j                  ||      j                         sJ y)	z&Test PSD checking from #1491.
        r   Tr   y      ?        y                zP1 is real:zP2 is complex:N)	r1   r   r   r   r   r  r   	curvatureis_dcp)r    r!   r   r   s       r%   test_quad_psdzTestComplex.test_quad_psd  s     KK4(VVAYXXd|d|% &mR\\!R0::;Q 3 = =>||Ar"))+++r/   HIGHSzHiGHS solver is not installed.)reasonc                    t        j                  d      }t        j                  d      }t        j                  |      |k  g}t        j                  t        j                  |            }t        j                  ||      }|j                  t         j                         | j                  |j                  dd       y )NT)booleanr   rl   rL   r\   r   )	r1   r   r;   r2   r   rP   r%  rQ   r   )r    bool_varcomplex_varro   rp   rX   s         r%   	test_boolzTestComplex.test_bool  s     ;;t,kk$/ GGK H,
 kk"''+./zz#{+

"((
#tzz1Q7r/   c                 l   t         j                  j                  d       t         j                  j                  d      dt         j                  j                  d      z  z   }|t        j                  |      z  }t         j                  j                  d      dt         j                  j                  d      z  z   }|t        j                  |      z  }t         j                  j                  d      dt         j                  j                  d      z  z   }|t        j                  |      z  }t        j                  ||      }t        j                  ||      }t        j                  ||      }t        j                  |j                  d      }||k(  |t        j                  |g dd	
      k(  |t        j                  |g dd
      k(  g}t        j                  t        j                  d      |      }	|	j                          t        |       t        j                  |j                  |      sJ y)z
        Test a problem with partial_trace.
        rho_ABC = rho_A \otimes rho_B \otimes rho_C.
        Here \otimes signifies Kronecker product.
        Each rho_i is normalized, i.e. Tr(rho_i) = 1.
        rL   r\   r\   r   r   r5   Tr   r   )r\   rO   r   r   axisr   N)r   r   r   rm   kronr1   r   r   partial_tracer   r   rP   r  allcloser   )
r    rho_Arho_Brho_Crho_ABrho_ACrho_ABC_valrho_ABCr   rX   s
             r%   test_partial_tracezTestComplex.test_partial_trace  s    			q 		  (2bii.>.>v.F+FF% 		  (2bii.>.>v.F+FF% 		  (2bii.>.>v.F+FF% && ggfe,++K$5$5tD7"b&&w	BBb&&w	BB

 zz"++a.$/

k{{7==+666r/   c                    t         j                  j                  d       t         j                  j                  d      dt         j                  j                  d      z  z   }|t        j                  |      z  }t         j                  j                  d      dt         j                  j                  d      z  z   }|t        j                  |      z  }t         j                  j                  d      dt         j                  j                  d      z  z   }|t        j                  |      z  }t        j                  t        j                  ||      |j
                        }t        j                  t        j                  ||j
                        |      }t        j                  t        j                  ||      |      }t        j                  |j                  d      }||k(  |t        j                  |dd	
      k(  |t        j                  |dd
      k(  g}t        j                  t        j                  d      |      }	|	j                          t        j                  |j                  |      sJ y)z
        Test a problem with partial_transpose.
        rho_ABC = rho_A \otimes rho_B \otimes rho_C.
        Here \otimes signifies Kronecker product.
        Each rho_i is normalized, i.e. Tr(rho_i) = 1.
        rL   )   r=  r   r-  r5   Tr.  )r=  r\   r   r   r/  r   N)r   r   r   rm   r1  rV   r1   r   r   partial_transposer   r   rP   r3  r   )
r    r4  r5  r6  rho_TCrho_TBr9  r:  r   rX   s
             r%   test_partial_transposez"TestComplex.test_partial_transpose  s    			q 		  (2bii.>.>v.F+FF% 		  (2bii.>.>v.F+FF% 		  (2bii.>.>v.F+FF% .80%8 ggbggeU3U;++K$5$5tD7"b**7IAFFb**7IAFF

 zz"++a.$/

{{7==+666r/   c                 B   t         j                  j                  d       t         j                  j                  d      }t         j                  j                  d      }|d|z  z   }t	        j
                  d      }t	        j                  t	        j                  ||z
              }t	        j                  |d   |d   |d   dg      }t	        j                  ||g      }|j                          |j                  }t	        j                  |d   |d   |d         }	t	        j                  ||	g      }
|
j                          |	j                  }t	        j                  |d   |d d       }t	        j                  ||g      }|j                          |j                  }t	        j
                  dd	
      }t	        j                  t	        j                  ||z
              }t	        j                  |      |k(  }|j                         }t	        j                  |||g      }|j                          |j                  }| j!                  ||d       |	j                         }t	        j                  |||g      }|j                          |j                  }| j!                  ||d       |j                         }t	        j                  |||g      }|j                          |j                  }| j!                  |d   |d   d       | j!                  |d   |d   d       y )Nr   rO   r   rO   r   rL   r   g      ?Tr.  r   )r   r   r   randr1   r   r   r   	PowCone3Dr   rP   r  ExpConerv   r;   copyr=   )r    u_realu_imagur"   helper_objectivecon_ahelper_prob_aexpect_dual_acon_bhelper_prob_bexpect_dual_bcon_chelper_prob_cexpect_dual_cr!   actual_objectivecoupling_con
con_a_testprob_aactual_dual_a
con_b_testprob_bactual_dual_b
con_c_testprob_cactual_dual_cs                              r%   
test_dualszTestComplex.test_duals  s   
		q""R&[ KKd#;;rwwq6z':; QqT1Q41v6

#3eW=((

1Q41qt,

#3eW=((qtQrU#

#3eW=(( KKdD1;;rwwq1u~6wwqzQZZ\
,|Z.HI"--##M=#KZZ\
,|Z.HI"--##M=#KZZ\
,|Z.HI"--##M!$4mA6Fq#Q##M!$4mA6Fq#Qr/   c                    t        j                  dd      }| j                  t              5  t        j                  |d   |d   |d          d d d        | j                  t              5  t        j
                  |d   |d   |d   dg       d d d        | j                  t              5  t        j                  |d   |d d ddg       d d d        | j                  t              5  t        j                  |d   |d   |d   dd       d d d        | j                  t              5  t        j                  |       d d d        | j                  t              5  t        j                  |       d d d        y # 1 sw Y   .xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   nxY w# 1 sw Y   y xY w)NrC  Tr.  r   rL   r   g      ?)
r1   r   r   
ValueErrorrF  rE  	PowConeNDRelEntrConeQuadNonNegNonPos)r    r!   s     r%   test_illegal_complex_argsz%TestComplex.test_illegal_complex_args8  s{   KKdD1z* 	)JJqtQqT1Q4(	)z* 	2LL1qtQqTC51	2z* 	2LL1q!usCj1	2z* 	7qtQqT1Q4A6	7z* 	IIaL	z* 	IIaL	 		) 	)	2 	2	2 	2	7 	7	 		 	sG   !E:+#F+ F(#F(F+F7:FFFF(+F47G )returnN),r  
__module____qualname____doc__r&   r*   r.   r3   r9   r>   rB   rE   rZ   ra   rh   rq   rt   rx   r~   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r$  pytestmarkskipifr   r+  r;  rA  r`  rg   r/   r%   r   r      s    <Q2R2
]"H	5	:1?f	;)*;7;$;"74<8!NF8:!PF:(A,,;8!$5`n*$5(	, [[++/  8	8$ 7D 7D7Rrr/   r   )rk  numpyr   rl  scipy.sparsesparser   cvxpyr1   r   r   cvxpy.expressions.constantsr   r   cvxpy.expressions.variabler    cvxpy.reductions.solvers.definesr   cvxpy.tests.base_testr	   r   ro  r/   r%   <module>rx     s5         # ; / A *h( hr/   