
    bi              
           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 dej                   dej"                  ded	eeef   fd
Z G d d      Zy)    N)kron)partial_trace)hermitian_wrap)solver_test_helperschanrhorepdimc                 d   d\  }}}|dk(  rB|\  }}| t        |j                  t        j                  |            z  }t	        |||gd      }|S |dk(  r^| j
                  d   }|d   }t        | j
                  d   |z        }t	        | |z  | j                         j                  z  ||gd      }|S y )N)NNNchoi2r   isom   )r   Tnpeyer   shapeintconj)	r   r   r	   r
   dimAdimBdimEargrho_outs	            \/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/cvxpy/tests/test_quantum_rel_entr.py	applychanr      s    'D$
g~
dT#%%..dD\15	zz!}1v4::a=%&s
TYY[]] :T4L!L 
    c                   t   e Zd ZdZd ej
                         v ZdddZdddZe	d        Z
e	d        Ze	d        Zej                  j                   ej"                         d	k(  d
      d        Zej                  j                  e d      d        Zej                  j                  e d      d        Zy)TestQuantumRelEntrz
    Test class for `quantum_rel_entr` & `quantum_cond_entr`
    - All of the reference solutions for the problem come from equivalent
    CVXQUAD implementations
    - These problems also show up in a Marimo notebook linked on the CVXPY docs
    MOSEKT)solververboseCLARABELc                     d} t        j                  g dg dg dg dg      }||j                  z  }t        j                  | | fd      }t        j                  g dg d	g d
g dg      }||fg}t        j
                  t        j                  ||            }d}||f}t        j                  |      t        j                  | f      k(  }|dfg}	t        j                  |||	      }
|
S )zR
        Nearest correlation matrix in the quantum relative entropy sense
           )ga4?gH}8g?g-@gz6?)g&W?gΪVgV/'@ge`TR')gng6ۿg)0g;pΈ?)gSt$?g(?gyG@g=
ףp=ʿT)r   	symmetric)      ?R!u?LJ-C6?)r'   r&   ^)fa?)r(   r*   r&   ؁sF)r)   r+   r,   r&   g1BN)r   arrayr   cpVariableMinimizequantum_rel_entrdiagonesSTHSolverTestHelper)nMXexpect_X	var_pairsobj
expect_objobj_paircons1	con_pairssths              r   make_test_1zTestQuantumRelEntr.make_test_1(   s    
 HH68979 : GKKq!f588>5757 8 ]O	kk"--a34
$
bggqdm+T]O	""8Y	B
r   c                     d\  } }t        j                  g dg dg dg dg      }t        j                  | |z  | |z  fd      }t        j                  g dg d	g d
g dg      }||fg}t        j                  t        j
                  ||d      t        j                  d      z        }d}||f}|dz	  }	t        j                  |      dk(  }
t        j                  || |gd      dz	  }|	df|
df|dfg}t        j                  |||      }|S )zZ
        Compute lower bound on relative entropy of entanglement (PPT relaxation)
        )   rC   )yQ?        y&1?+yZd;O{Gzty;On{Gz)y&1?+?yPn?        y;On?I+?yMb㥛 ¿)yZd;O{Gzt?y;On?I+ym?        y9v~jth)y;On{Gz?yMb㥛 ?y9v~jth?yq=
ףp?        Tr   	hermitian)yeX?        y@߾?X9vyŏ1w-!QIy|гYŏ1w-!_)y@߾?X9v?y=U?        yHPsr?tF_yu$(~k)yŏ1w-!QI?yHPsr?tF_?y&1?        yaTR'H)y|гYŏ1w-!_?yu$(~k?yaTR'H?y[Ӽ?        )   rF   rC   g^o%;?r   r   N)r   r-   r.   r/   r0   r1   logtracepartial_transposer4   r5   )nanbr   tau
expect_taur:   r;   r<   r=   r>   cons2cons3
cons_pairsr@   s                 r   make_test_2zTestQuantumRelEntr.make_test_2F   s"   
 BhhTTTTV W
 kkb"r' 2dC
\[\]_ 	` 	
 :&'	kk"--c3>rvvayHI
$q"$$S2r(A6!;dmeT]UDMB
""8Y
C
r   c                     d\  dt         fd} d} | |       | dd|z  z
  d|z
  z        dt        j                  ffd}t        j                  fd	
      }t        j                  ddgddgg      }||fg}t        j
                   ||            }d}||f}|dz	  }	t        j                  |      dk(  }
|	df|
dfg}t        j                  |||      }|S )a  
        % Quantum capacity of degradable channels

        % Example: amplitude damping channel
        % na = channel input dimension
        % nb = channel output dimension
        % ne = channel environment dimension
        % nf = degrading map environment dimension
        )rC   rC   rC   rC   gammac           	          t        j                  ddgdt        j                  |       gdt        j                  d| z
        gddgg      S )Nr   r   )r   r-   sqrt)rS   s    r   ADz*TestQuantumRelEntr.make_test_3.<locals>.ADs   sB    88aVQ$7BGGAeG<L8MqRSfUVVr   g?r   rC   r   c                     t        j                  t        t        | df      z  j	                         j
                  z        gd      t        j                  d      z  S )Nr   r   rC   )r.   quantum_cond_entrr   r   r   r   r   rG   )r   UWrJ   rK   nenfs    r   Icz*TestQuantumRelEntr.make_test_3.<locals>.Icz   sb    ''&q9QVb"X+N'NQRQWQWQYQ[Q['[\R! ffQi   r   TrD   gQkw?r   g_)Ǻ?gس2?N)	floatr.   r/   r   r-   MaximizerH   r4   r5   )rV   rS   r]   r   
rho_expectr:   r;   
obj_expectr=   r>   rN   rP   r@   rY   rZ   rJ   rK   r[   r\   s                @@@@@@r   make_test_3zTestQuantumRelEntr.make_test_3g   s    &BB	We 	WuI!E'	AeG$%	 BKK 	  	  kkRD9XX{K) *
:&'	kk"S'"
$q"dmeT]3
""8Y
C
r   WindowszThis test is skipped on Windows)reasonc                 P   t        d       t        dt        j                                 t        dt        j                          t        d       t
        j                         } |j                  di | j                   |j                  d       |j                  d       y )Nz*****************************z
Platform: zPython version: rF   places )printplatformsystemsysversion_infor   rA   solveCLARABEL_ARGSverify_objectiveverify_primal_valuesselfr@   s     r   test_1zTestQuantumRelEntr.test_1   s    
 	-.
8??,-./ !1!1 234-. ,,.		'D&&'A&   *r   z/These tests are too slow to solve with CLARABELc                     t         j                         } |j                  di | j                   |j	                  d       |j                  d       y )NrC   rf   rh   )r   rQ   rn   
MOSEK_ARGSrp   rq   rr   s     r   test_2zTestQuantumRelEntr.test_2   I     !,,.		$DOO$A&   *r   c                     t         j                         } |j                  di | j                   |j	                  d       |j                  d       y )NrF   rf   rh   )r   rb   rn   rv   rp   rq   rr   s     r   test_3zTestQuantumRelEntr.test_3   rx   r   N)__name__
__module____qualname____doc__r.   installed_solversrun_full_test_suiterv   ro   staticmethodrA   rQ   rb   pytestmarkskipifrj   rk   rt   rw   rz   rh   r   r   r   r      s    "%9R%9%9%;;#5J)d;M :  @ ' 'R [[Y&0  +	+ [[//P  R+R+ [[//P  R+R+r   r   )rj   rl   numpyr   r   cvxpyr.   cvxpy.atoms.affine.kronr    cvxpy.atoms.affine.partial_tracer   cvxpy.atoms.affine.wrapsr   cvxpy.testsr   r4   ndarrayr/   strtupler   r   r   rh   r   r   <module>r      s]     
    ( : 3 2BJJ R[[ s sCx P+ P+r   