
    bi                     r    d Z ddlmZ ddlZddlZddlmZ  G d de      Z	 G d de	      Z
 G d	 d
e	      Zy)a4  
Copyright 2022, 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.
    )TupleN)BaseTestc                   B    e Zd ZdZedee   dee   dededef
d       Zy)	TestKrona   
    The Kronecker product of matrices M, N is :

        kron(M, N) = [M[0,0] * N   , ..., M[0, end] * N  ]
                     [M[1,0] * N   , ..., M[1, end] * N  ]
                     ...
                     [M[end, 0] * N, ..., M[end, end] * N]
    z_dimsc_dimsparamvar_leftseedc                    t         j                  j                  |       t        j                  j                  | j	                  d      }|rt        j                  |      }||_        nt        j                  |      }t        j                  |       }t        j                  j                  |j                   j	                  d      }|r3t        j                  ||      t        j                  ||      k\  |dk\  g}	n2t        j                  ||      t        j                  ||      k\  |dk\  g}	t        j                  |      }
t        j                  t        j                  |
      |	      }||||fS )ai  
        Construct random nonnegative matrices (C, L) of shapes
        (c_dims, z_dims) respectively. Define an optimization
        problem with a matrix variable of shape z_dims:

            min sum(Z)
            s.t.  kron(Z, C) >= kron(L, C)   ---   if var_left is True
                  kron(C, Z) >= kron(C, L)   ---   if var_left is False
                  Z >= 0

        Regardless of whether var_left is True or False, the optimal
        solution to that problem is Z = L.

        If param is True, then C is defined as a CVXPY Parameter.
        If param is False, then C is a CVXPY Constant.

        A small remark: the constraint that Z >= 0 is redundant.
        It's there because it's easier to set break points that distinguish
        objective canonicalization and constraint canonicalization
        when there's more than one constraint.
           )decimalsshaper   )nprandomr   randroundcp	ParametervalueConstantVariabler   kronsumProblemMinimize)r   r   r	   r
   r   C_valueCZLconstraintsobj_exprprobs               V/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/cvxpy/tests/test_kron_canon.pymake_kron_probzTestKron.make_kron_prob"   s   6 			t))..&)///;6*AAGG$AKKf%IINNAGG$**A*6771a=BGGAqM916BK 771a=BGGAqM916BK66!9zz"++h/=!Q}    N)	__name__
__module____qualname____doc__staticmethodr   intboolr&    r'   r%   r   r      sN     0uSz 0$Sz0"0 "&0 !	0 0r'   r   c                        e Zd Zg dZd Zd Zy)TestKronRightVar   r4   )r   r4   )r4   r   r   r   c                    d}t         j                  D ]  }| j                  ||ddd      \  }}}}|j                  t        j
                         | j                  |j                  t        j                         |j                  d   j                         }| j                  t        j                  |      d       | j                  |j                  |d	        y )
Nr5   TFr   r	   r
   r   solver-C6?   placesr1   C_DIMSr&   solver   CLARABELassertEqualstatusOPTIMALr"   	violationassertLessEqualr   maxassertItemsAlmostEqualr   selfr   r   r    r   r!   r$   	con_violss           r%   test_gen_kronr_paramz%TestKronRightVar.test_gen_kronr_paramZ   s    &-- 	>F //d9>Q 0 HMAq!TJJbkkJ*T[["**5((+557I  	!2D9''1'=	>r'   c                    d}t         j                  D ]  }| j                  ||ddd      \  }}}}|j                  t        j
                         | j                  |j                  t        j                         |j                  d   j                         }| j                  t        j                  |      d       | j                  |j                  |d        y )	Nr5   Fr   r7   r8   r:   r;   r<   r>   rI   s           r%   test_gen_kronr_constz%TestKronRightVar.test_gen_kronr_conste   s    &-- 	>F //e9>Q 0 HMAq!TJJbkkJ*T[["**5((+557I  	!2D9''1'=	>r'   N)r(   r)   r*   r?   rL   rN   r/   r'   r%   r1   r1   V   s    -F	>	>r'   r1   c                   D    e Zd Zg dZd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)TestKronLeftVarr2   c                    t        j                  dd      }dt        j                  d      z  }|rt        j                  d      }||_        nt        j                  |      }t        j                  ddgd	d
gg      }t        j                  ddgddgg      }t        j                  ||      }t        j                  t        j                  |j                  d                  }||k\  ||k\  g}	t        j                  ||	      }
|
j                          | j                  |j
                  t        j                  dd	gd	d
gg      dz         t        j                  t        j                  |j                  d                  }t        j                  ||	      }
|
j                          | j                  |j
                  t        j                  ddgddgg      dz         y )Nr5   T)r   	symmetricg      ?r3   r         ?r4   r      
            F)order)r   r   r   onesr   r   r   arrayr   r   r   flattenr   r@   rH   Maximize)rJ   r	   Xb_valbr!   UkronX	objectiver"   r$   s              r%   symvar_kronlzTestKronLeftVar.symvar_kronlu   sx   KKf5bggfo%6*AAGE"AHHsAhA'(HHr2hR)*1KKqyysy'; <=	Ez5A:.zz)[1

##AGGRXXQx!Q6H-IC-OPKKqyysy'; <=	zz)[1

##AGGRXXBx"b6J-Kc-QRr'   c                 (    | j                  d       y NTr	   re   rJ   s    r%   test_symvar_kronl_paramz'TestKronLeftVar.test_symvar_kronl_param       %r'   c                 (    | j                  d       y NFrh   ri   rj   s    r%   test_symvar_kronl_constz'TestKronLeftVar.test_symvar_kronl_const       &r'   c           	         t        j                  d      }t        j                  ddgddgg      }t        j                  ddgd	d
gg      }t        j                  ddgddgg      }|rt        j                  d      }||_        nt        j                  |      }t        j                  ||      }||k\  ||k\  g}t        j                  |      }	t        j                  |	|      }
|
j                          | j                  |j
                  t        j                  t        j                  ||z        gg             t        j                  |      }	t        j                  |	|      }
|
j                          | j                  |j
                  t        j                  t        j                  ||z        gg             y )Nr3   r   g      ?g       @g      @g      @rS   r4   r   rT   rU   rV   rW   rX   r5   )r   r   r   r\   r   r   r   r   r   r   r@   rH   rG   r^   min)rJ   r	   yA_valr!   rb   Akronyr"   rd   r$   s              r%   scalar_kronlzTestKronLeftVar.scalar_kronl   sW   KKf%2r(RH-.HHsAhA'(HHr2hR)*6*AAGE"A1Ez5A:.KKN	zz)[1

##AGGRXXq5y8I7J6K-LMKKN	zz)[1

##AGGRXXq5y8I7J6K-LMr'   c                 (    | j                  d       y rg   rw   rj   s    r%   test_scalar_kronl_paramz'TestKronLeftVar.test_scalar_kronl_param   rl   r'   c                 (    | j                  d       y rn   ry   rj   s    r%   test_scalar_kronl_constz'TestKronLeftVar.test_scalar_kronl_const   rp   r'   c                    d}t         j                  D ]  }| j                  ||ddd      \  }}}}|j                  t        j
                         | j                  |j                  t        j                         |j                  d   j                         }| j                  t        j                  |      d       | j                  |j                  |d        y )	Nr5   Tr   r7   r8   r:   r;   r<   rP   r?   r&   r@   r   rA   rB   rC   rD   r"   rE   rF   r   rG   rH   r   rI   s           r%   test_gen_kronl_paramz$TestKronLeftVar.test_gen_kronl_param   s    %,, 	>F //d9=A 0 GMAq!TJJbkkJ*T[["**5((+557I  	!2D9''1'=	>r'   c                    d}t         j                  D ]  }| j                  ||ddd      \  }}}}|j                  t        j
                         | j                  |j                  t        j                         |j                  d   j                         }| j                  t        j                  |      d       | j                  |j                  |d	        y )
Nr5   FTr   r7   r8   r:   r;   r<   r~   rI   s           r%   rN   z$TestKronLeftVar.test_gen_kronr_const   s    %,, 	>F //e9=A 0 GMAq!TJJbkkJ*T[["**5((+557I  	!2D9''1'=	>r'   N)r(   r)   r*   r?   re   rk   ro   rw   rz   r|   r   rN   r/   r'   r%   rP   rP   q   s/    -F2&'0&'	>	>r'   rP   )r+   typingr   numpyr   cvxpyr   cvxpy.tests.base_testr   r   r1   rP   r/   r'   r%   <module>r      s?       *;x ;|>x >6U>h U>r'   