
    bi               	          d Z ddlmZmZmZ ddlZddlmZm	Z	m
Z
mZmZmZmZmZ ddlmZ ddlmZ ddlmZ ddlmZ d	ee   d
ee   fdZded	ee   d
ee   fdZdedeeedf      deeedf      fdZdedeeedf      deeedf      fdZde
deeedf      deeedf      fdZde	deeedf      deeedf      fdZdedeeedf      deeedf      fdZdedeeedf      deeedf      fdZdedeeedf      deeedf      fdZ defdZ!deeedf      deeedf      fdZ"deeedf      deeedf      fdZ#deeedf      deeedf      fdZ$y)aD  
Copyright 2013 Steven Diamond, 2022 the CVXPY Authors

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.
    )ListOptionalUnionN)bmatlambda_sum_largestnormNucquantum_rel_entrreshapesymmetric_wrapvon_neumann_entrvstack)psd_wrap)OpRelEntrConeQuad)Constant)
Expression	real_part	imag_partc                 *   | )t        t        j                  |j                              } n*|(t        t        j                  | j                              }t	        | | g|| gg      }| j                         r|j                         rt        |      }|S )ah  
    We expand the matrix A to B = [[Re(A), -Im(A)], [Im(A), Re(A)]].

    The resulting matrix has special structure if A is Hermitian.
    Specifically, if x is an eigenvector of A, then [Re(x), Im(x)]
    and [Im(x), -Re(x)] are eigenvectors of B with same eigenvalue.
    Therefore, the eigenvalues of B are the same as those of A,
    repeated twice.
    )r   npzerosshaper   is_symmetricis_skew_symmetricr   )r   r   matrixs      t/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/cvxpy/reductions/complex2real/canonicalizers/matrix_canon.pyexpand_complexr   %   s     RXXioo67			RXXioo67	I	z*y)+ ,FI$?$?$A'M    exprc                 H    ||}nt        ||      }| j                  |g      S N)r   copy)r   r   r   r   s       r   expand_and_reapplyr"   ;   s,     	9599fXr   	real_args	imag_argsc                 l    t        |      dk(  rt        |      dk(  sJ t        | |d   |d         }|dfS )z9Canonicalize functions that take a Hermitian matrix.
       r   N)lenr"   )r   r#   r$   	real2imag
expr_canons        r   hermitian_canonr*   F   sB    
 y>Q3y>Q#666#D)A,	!EJtr   c                     |d   d }n| j                  |d   g      }|d   | j                         rd }||fS | j                  |d   g      }||fS )Nr   )r!   is_hermitian)r   r#   r$   r(   r   r   s         r   trace_canonr-   P   so     |	IIy|n-	!!2!2!4	 i IIy|n-	ir   c                 @    t        | |||      \  }}|d   |dz  }||fS )z;Canonicalize nuclear norm with Hermitian matrix input.
    r      )r*   r   r#   r$   r(   realimags         r   norm_nuc_canonr3   ^   s5     !y)YGJD$|	:r   c                 j    t        | |||      \  }}|xj                  dz  c_        |d   |dz  }||fS )zKCanonicalize sum of k largest eigenvalues with Hermitian matrix input.
    r/   r   )r*   kr0   s         r   lambda_sum_largest_canonr6   j   sB     !y)YGJD$FFaKF|	:r   c                 D    t        | |d   |d         }|d   |dz  }|dfS )z
    The von Neumann entropy of X is sum(entr(eigvals(X)).
    Each eigenvalue of X appears twice as an eigenvalue of the Hermitian dilation of X.
    r   Nr/   )r"   )r   r#   r$   r(   
canon_exprs        r   von_neumann_entr_canonr9   w   s8     $D)A,	!EJ|a
tr   c                     t        d |D              }|r| j                  |      S t        d |D              sJ t        |d   |d         }t        |d   |d         }| j                  ||g      }|dz  }|dfS )zmTransform Hermitian input for quantum_rel_entr into equivalent
    symmetric input for quantum_rel_entr.
    c              3   $   K   | ]  }|d u  
 y wr     ).0ias     r   	<genexpr>z)quantum_rel_entr_canon.<locals>.<genexpr>   s     1"*1   c              3   $   K   | ]  }|d u 
 y wr    r<   )r=   ras     r   r?   z)quantum_rel_entr_canon.<locals>.<genexpr>   s     2"r~2r@   r   r&   r/   N)allr!   r   )r   r#   r$   r(   no_imag
expanded_X
expanded_Yr8   s           r   quantum_rel_entr_canonrG      s     1y11Gyy##2	2222	!il;J	!il;JJ
34JaJtr   c                     t        d |D              }|rKt        |d   |d         }t        |d   |d         }t        |d   |d         }| j                  |||g      }n| j                  |      }|gdfS )znTransform Hermitian input for OpRelEntrConeQuad into equivalent
    symmetric input for OpRelEntrConeQuad
    c              3   $   K   | ]  }|d u 
 y wr    r<   )r=   as     r   r?   z)op_rel_entr_cone_canon.<locals>.<genexpr>   s     7atm7r@   r   r&   r/   N)anyr   r!   )	r   r#   r$   r(   must_expand
X_dilation
Y_dilation
Z_dilationr8   s	            r   op_rel_entr_cone_canonrP      s     7Y77K#IaL)A,?
#IaL)A,?
#IaL)A,?
YY
J
CD
YYy)
<r   c                 X    | j                   dk  rt        | | j                  dfd      S | S )zUpcast 0D and 1D to 2D.
    r/   r&   F)order)ndimr
   size)r   s    r   at_least_2DrV      s+     yy1}tdii^377r   c                    |d   |d   }|d   }n|d   |d   }|d   }nt        t        |d         t        |d         g      }|d   &t        j                  |d   j                        |d<   n*|d   %t        j                  |d   j                        |d<   t        |d   |d    g|d   |d   gg      }t        |      }| j                  ||g      dfS )zConvert quad_form to real.
    r   Nr&   )r   rV   r   r   r   r   r   r!   r   r#   r$   r(   vecr   s         r   
quad_canonrZ      s    
 |l1	1	l1k)A,/!)A,/1 2Q<88IaL$6$67IaLq\!88IaL$6$67IaL	!y|m4!!il35 6&!99c6]#T))r   c                 n    |d   |d   }nt        |d   |d   g      }| j                  ||d   g      dfS )z#Convert quad_over_lin to real.
    r   Nr&   )r   r!   )r   r#   r$   r(   r   s        r   quad_over_lin_canonr\      sK    
 |1y|Yq\2399fil+,d22r   c                    |d   %t        j                  |d   j                        |d<   |d   %t        j                  |d   j                        |d<   t        t	        |d         t	        |d         g      }|d   &t        j                  |d   j                        |d<   n*|d   %t        j                  |d   j                        |d<   t        |d   |d    g|d   |d   gg      }| j                  ||g      dfS )z!Convert matrix_frac to real.
    r   Nr&   )r   r   r   r   rV   r   r!   rX   s         r   matrix_frac_canonr^      s
   
 |xx	! 2 23	!|xx	! 2 23	!
+il+il+- .C|xx	! 2 23	!	1	xx	! 2 23	!IaL9Q<-0aL)A,/1 2F99c6]#T))r   )%__doc__typingr   r   r   numpyr   cvxpy.atomsr   r   r   r	   r
   r   r   r   cvxpy.atoms.affine.wrapsr   cvxpy.constraints.exponentialr   $cvxpy.expressions.constants.constantr   cvxpy.expressions.expressionr   r   r"   r*   r-   r3   r6   r9   rG   rP   rV   rZ   r\   r^   r<   r   r   <module>rg      s    ) ( 	 	 	 . ; 9 3hz2 &z2,Z "*:"6"*:"6* #E*d*:$;<#E*d*:$;< j  j$&6 78 j$&6 78 	 	"5T)9#:;	"5T)9#:;	
#5 
(,U:t3C-D(E
(,U:t3C-D(E

!1 
&*5T1A+B&C
&*5T1A+B&C
!1 &*5T1A+B&C&*5T1A+B&C"!2 &*5T1A+B&C&*5T1A+B&C"j *uZ%567*uZ%567*0	3#'j$.>(?#@	3#'j$.>(?#@	3*!%eJ,<&=!>*!%eJ,<&=!>*r   