
    bi'                     d    d 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  G d d      Zy)	a3  
Copyright, 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

    https://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)trace)von_neumann_entr)solver_test_helpers)onb_for_orthogonal_complementc                       e Zd Zd ej                         v rdddZndddddZed        Zd	 Zd
 Z	ed        Z
d Zd Zedej                  dedefd       Zedd       Zd Zd Zd Zd Zed        Zd Zy)Test_von_neumann_entrMOSEKT)solververboseSCSgư>i  )r
   eps	max_itersr   c                    d}t        t        j                  d      r t        j                  j                  d      }nt        j                  j	                  d      }| rFt        j                  ||fd      }|j                  ||f      d|j                  ||f      z  z   }n-t        j                  ||fd      }|j                  ||f      }t        j                  j                  |      d   d	d	d	d
f   }t        j                  ddg      }d}||z  ||z  k(  }t        |      |k  }t        j                  t        |            }	t        |      j!                  |df      }
|t        j"                  |      z
  }t        j$                  ||gg      }t        j&                  ||
g      }| r!||z  |j)                         j*                  z  }n||z  |j*                  z  }t        j"                  t        j,                  |            j.                  }|	|f}|d	f|d	fg}||fg}t1        j2                  |||      }|S )z^Enforce an upper bound of 0.8 on trace(N);
        Expect N's unspecified eigenvalue to be 0.2   default_rngr   Tshape	hermitiansize              ?r   PSDN         ?g?g?   )hasattrnprandomr   RandomStatecpVariablenormalsplinalgqrarrayr   Maximizer   r   reshapesumconcatenatecolumn_stackconjTentrvalueSTHSolverTestHelper)complexnrngNV12mu12trace_boundcons1cons2	objectiveV3mu3	expect_muexpect_Vexpect_N
expect_objobj_pair	con_pairs	var_pairssths                       \/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/cvxpy/tests/test_von_neumann_entr.pymake_test_1z!Test_von_neumann_entr.make_test_1#   s    299m,))''*C))''*C1a&D9A**1a&*)B!Q1H,HHC1a&d3A**1a&*)Ciill3"1bqb5)xxc
#C3:%aK'KK 0 34	*3/77A?BFF4L(NND3%=1	??C9- 9,0A0AAH 9,

:HVVBGGI./55
z*T]UDM2	]O	""8Y	B
    c                     t         j                  d      } |j                  di | j                   |j	                  d       |j                  d       y NFr   places r   rH   solve
SOLVE_ARGSverify_objectiveverify_primal_valuesselfrF   s     rG   test_1_realz!Test_von_neumann_entr.test_1_realI   I    #//6		$DOO$A&   *rI   c                     t         j                  d      } |j                  di | j                   |j	                  d       |j                  d       y NTr   rL   rN   rO   rT   s     rG   test_1_complexz$Test_von_neumann_entr.test_1_complexO   I    #//5		$DOO$A&   *rI   c                    d}t        j                  ||fd      }t        j                  ddgddgdd	gg      }t        j                  d
dg      }d}||z  ||z  k(  }t	        |      |k\  }| r t        j
                  t        |d            }nt        j
                  t        |            }t        |      j                  |df      }	|t        j                  |      z
  }
t        j                  ||
gg      }t        j                  ||	g      }||z  |j                  z  }t        j                  t        j                  |            j                  }||f}|df|dfg}||fg}t        j                   |||      }|S )z]Enforce a lower bound of 0.9 on trace(N);
        Expect N's unspecified eigenvalue to be 0.4r   Tr   gE삿gY?gE߿g+8K?gg+8Kӿg333333?g?g?)   r]   r   N)r!   r"   r   r'   r   r(   r   r   r)   r*   r+   r,   r.   r/   r0   r1   r2   )quad_approxr4   r6   r7   r8   trMinr:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   s                      rG   make_test_2z!Test_von_neumann_entr.make_test_2U   sn    KKq!f$/hhj1$j1$k24 5 xxc
#C3:%aE!$4Q$?@I$4Q$78I*3/77A?bffTl"NND3%=1	??C9-y(HJJ6VVBGGI./55
z*T]UDM2	]O	""8Y	B
rI   c                     t         j                  d      } |j                  di | j                   |j	                  d       |j                  d       y rK   r   r`   rP   rQ   rR   rS   rT   s     rG   test_2_exactz"Test_von_neumann_entr.test_2_exactt   rW   rI   c                     t         j                  d      } |j                  di | j                   |j	                  d       |j                  d       y rY   rb   rT   s     rG   test_2_approxz#Test_von_neumann_entr.test_2_approxz   r[   rI   aapx_mapx_kc                 4   | j                   }t        j                  |      }t        j                  t	        j
                  |            }t        j                  j                  | ||||      }t        j                  t        j                  |            }||fS )Nr   )
r   r!   r"   Constantr   onesconstraintsRelEntrConeQuadMinimizer*   )rf   rg   rh   r4   epi_vecbconr<   s           rG   sum_entr_approxz%Test_von_neumann_entr.sum_entr_approx   sk    FF++A&KK
#nn,,Q7E5IKKw0	#~rI   c                    t         j                  j                  d       d\  }}t        j                  g dg dg dg      }t        j                  g dg dg dg      }|rt        j                  d	      }|}|}nd
t         j                  j                  d      z  }	|	t         j                  j                  d      z  }	t        j                  j                  |	      d   }||z  |j                         j                  z  }||z  |j                         j                  z  }t        j                  ddg      }
t        j                  d      }t        j                  |      }|r)t        ||z        |
d   k(  t        ||z        |
d   k(  g}nH||z  |j                         j                  z  }t        ||z        |
d   k(  t        ||z        |
d   k(  g}| r,t        j!                  |||      \  }}|j#                  |       n<t        j$                  t        j&                  t        j(                  |                   }t        j*                  ||      }|j-                         }|ryt        j                  dd      }t        ||z        |
d   k(  t        ||z        |
d   k(  |t        j                  t        j                  |            z
  dk(  g}|j.                  }nt        j                  dd      }|j                         j                  |z  |z  }t        ||z        |
d   k(  t        ||z        |
d   k(  |t        j                  t        j                  |            z
  dk(  g}j.                  }| r#t        j$                  t1        |||f             }nt        j$                  t1        |             }||f}||fg}|D cg c]  }|d f }}t3        j4                  |||      }|S c c}w )Nr   r   r   )g1=a @Zwgm?*-9(?)rv   g? @Tol@@)rw   rx   g	@)geF ^@\].@F%uz@)ry   gX9v@hUM@)rz   r{   gڏa@r   r   )r   r   r   g')3@g*Ral!1@)r   rj   r   Tr   r   )r   r   seedr'   eyer#   r$   r%   r&   r-   r.   r!   r"   diagr   r   rs   appendro   r*   r/   ProblemrP   r0   r   r1   r2   )r^   realrg   rh   A1_realA2_realUA1A2randmatrq   diag_Xref_Xref_consconjugated_Xref_objectiverr   ref_probref_obj_valr6   consrA   aconj_Nr<   rC   rE   rD   rF   s                               rG   make_test_3z!Test_von_neumann_entr.make_test_3   s}   
		q u((7779 : ((7779 : q	ABB299+++88Gryy''V'44G		W%a(AWqvvxzz)BWqvvxzz)BHHh)* 4(b5j)QqT1b5j)QqT13H u9qvvxzz1Lb</0AaD8b</0AaD8:H!6!F!FvuV[!\M3OOC KK)@(@AM::mX6nn& &d3A"q&MQqT)"q&MQqT)
++q02D {{H&D9Affhjj1nq(G"q&MQqT)"q&MQqT)bggbggg&6771<>D $))H%5a%%H$HII%5a%8$89I {+]O	,01Sc4[1	1""8Y	B
 2s   O4c                     | j                  dd      } |j                  di | j                   |j                  d       |j	                  d       y )NFTr^   r   r   rL   rN   r   rP   rQ   rR   rS   rT   s     rG   test_3_exact_realz'Test_von_neumann_entr.test_3_exact_real   sN    5t<		$DOO$A&   *rI   c                     | j                  dd      } |j                  di | j                   |j                  d       |j	                  d       |j                  d       y )NTr   r   rL   rN   r   rP   rQ   rR   rS   check_primal_feasibilityrT   s     rG   test_3_approx_realz(Test_von_neumann_entr.test_3_approx_real   s_    4d;		$DOO$A&   *$$A$.rI   c                     | j                  dd      } |j                  di | j                   |j                  d       |j	                  d       y )NFr   r   rL   rN   r   rT   s     rG   test_3_exact_complexz*Test_von_neumann_entr.test_3_exact_complex   sN    5u=		$DOO$A&   *rI   c                     | j                  dd      } |j                  di | j                   |j                  d       |j	                  d       |j                  d       y )NTFr   r   rL   rN   r   rT   s     rG   test_3_approx_complexz+Test_von_neumann_entr.test_3_approx_complex   s_    4e<		$DOO$A&   *$$A$.rI   c                  p   t        j                  ddgddgg      } dt        j                  d      z  }t        j                  |       }t        j                  |      }t        j
                         }t        j
                         }d}d}||f||fg}t        j                  || z  ||z  z         }	t        j                  |	      ||z  z
  ||z  z
  t        j                  d      z  }
t        j                  |
      }d}||f}|dk\  }|dk\  }||z   dk(  }|df|df|dfg}t        j                  |||      }|S )z2
        Compute capacity of a cq-channel
        r   r   r   ru   r   g_Ah:?N)r   r'   rl   r!   r   r"   hermitian_wraplogr(   r1   r2   )rho1rho2H1H2p1p2	p1_expect	p2_expectrE   vne_argobj_argobj
obj_expectrC   r:   r;   cons3	cons_pairrF   s                      rG   make_test_4z!Test_von_neumann_entr.make_test_4   sA   
 xx!QA  !RWWV_$  &  &[[][[]		)_r9o6	##BIT	$9:&&w/"r'9BGCRVVAYNkk'"
$aaR1T]UDME4=A	""8Y	B
rI   c                     t         j                         } |j                  di | j                   |j	                  d       |j                  d       y )Nr   rL   rN   )r   r   rP   rQ   rR   rS   rT   s     rG   test_4zTest_von_neumann_entr.test_4  sG    #//1		$DOO$A&   *rI   N)FF)__name__
__module____qualname__r!   installed_solversrQ   staticmethodrH   rV   rZ   r`   rc   re   
Expressionintrs   r   r   r   r   r   r   r   rN   rI   rG   r   r      s    &"&&(( 'D9
 %d!%'
 # #J++  <++ 2==  S   R Rh+/+/  >+rI   r   )__doc__numpyr   scipyr$   cvxpyr!   r   cvxpy.atomsr   cvxpy.testsr   r1   cvxpy.utilities.linalgr   r   rN   rI   rG   <module>r      s-         ( 2 @A+ A+rI   