
    bi                       d Z ddlZddlZddlZddlmZ ddlm	Z	m
Z
 ddlmZmZmZmZ ddlZddlmc mZ ddlmZ ddlmZmZ ddlmZ ddlmZmZm Z m!Z!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- G d d      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)assumegiven)arraysbasic_indicesbroadcastable_shapesinteger_array_indices)MinimizeProblem)AddExpression)hermitian_wrapnonneg_wrapnonpos_wrappsd_wrapskew_symmetric_wrapsymmetric_wrap)Constant	Parameter)Variable)BaseTest)gershgorin_psd_checkc                   z   e Zd ZdZd1dZd1dZd1dZd1dZd1dZd Z	d1d	Z
d1d
Zd1dZd1dZd1dZd1dZd1dZd1dZd1dZd1dZd1dZd1dZd1dZd1dZd1dZd1dZd1dZd1dZd1dZd1dZd1dZd1dZd1dZ d1d Z!d1d!Z"d1d"Z#d1d#Z$d1d$Z%d1d%Z&d1d&Z'd1d'Z(d1d(Z)d1d)Z*d1d*Z+d1d+Z,d1d,Z-d1d-Z.d1d.Z/d/ Z0d0 Z1y)2TestExpressionsz2 Unit tests for the expression/expression module. Nc                 (   t        d      | _        t        dd      | _        t        dd      | _        t        dd      | _        t        dd	      | _        t        dd
      | _        t        dd      | _        t        j                  | _        y )Naname   x   yzr   r   ABr   r   C)
r   r   r   r    r!   r#   r$   r&   intfDEFAULT_INTFselfs    W/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/cvxpy/tests/test_expressions.pysetUpzTestExpressions.setUp4   so    s#!#&!#&!#&&s+&s+&s+%%	    c                    t        d      }t        d      }|j                         |j                         k7  sJ t        dd      }t               }| j                  |j                         d       | j                  |j                  d       | j                  |j                  t	                      | j                  |j
                  t        j                         | j                  t        | j                        d       | j                  t        | j                        d       | j                  t        t        j                   dd            d	       | j                  t        t        j                                j                  d
             | j                  t        j                   dgd      j                  d       | j                  t              5 }t        d       d d d        | j                  t!        j"                        d       | j                  t              5 }t        d       d d d        | j                  t!        |j"                        d       | j                  t              5 }t        dd       d d d        | j                  t!        |j"                        d       y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   GxY w)Nr   r   r   r   zVariable((2,), x)zVariable((2, 2), A)Tr   nonnegzVariable((), x, nonneg=True)zVariable((), var)shapeintegerr   r   zInvalid dimensions (2, 0).)r         ?zInvalid dimensions (2, 0.5).   z!Variable name 1 must be a string.)r   r   assertEqualr2   tuple	curvaturesAFFINEreprr   r#   cp
assertTrue
startswithassertRaises	Exceptionstr	exception)r*   r   r    cms       r+   test_variablezTestExpressions.test_variableA   s   QKQKvvx1668###QS!J3'$'%'*ahh/dff':;dff'<=bkks4@A7	9R[[]+667IJK 	A3=CCTJy) 	RV	R\\*,HIy) 	RW	R\\*,JKy) 	RQN	R\\*<	>	 		 		 	s$   J.%J:3K.J7:KKc                    t               }d|_        | j                  |j                  d       | j                  t              5 }ddg|_        ddd       | j                  t        j                        d       d|_        d|_        |j                  J t        d      }ddg|_        | j                  |j                  ddg       t        d      }t        j                  d      |_        | j                  |j                  t        j                  d             t        d      }| j                  t              5 }d|_        ddd       | j                  t        |j                        d	       y# 1 sw Y   (xY w# 1 sw Y   <xY w)
z.Test assigning a value to a variable.
        r6   r   Nz+Invalid dimensions (2,) for Variable value.r%   Tr1   z#Variable value must be nonnegative.)
r   valuer7   r@   rA   rB   rC   assertItemsAlmostEqualnpones)r*   r   rD   r   r#   s        r+   test_assign_var_valuez%TestExpressions.test_assign_var_valuec   sC    J!$y) 	R!fAG	R\\*,YZ ww QKa&##AGGaV4V''&/##AGGRWWV_= D!y) 	RAG	R\\*,QR-	 	(	 	s   
E3=F 3E= F	c                    | j                   j                  }| j                  |j                         d       | j                  |j                  t                      | j                   j                  d       | j                  |j                  d       | j                  }| j                  |j                         d       | j                  |j                  d       t        dd      }|j                  }| j                  |j                         d       | j                  |j                  d       |j                  t        j                  d	dgg      j                         | j                  |j                  d
   d	       | j                  |j                  d   d       | j                  j                  }| j                  |j                         d       | j                  |j                  d       |d   }| j                  |j                         d       | j                  |j                  t                      |j                  j                  }| j                  |j                         d       | j                  |j                  d       y )Nr   r   r   r/   r   r6   r   zx.Tr6   r   r6   r   r   r   r6   zC.Tr   r   r6   r   z	C.T[1, 0]zx.T.T)r   Tr7   r   r2   r8   
save_valuerI   r   r   rK   arrayr&   )r*   varr   indexs       r+   test_transpose_variablez'TestExpressions.test_transpose_variable   s   ffhhS)EG,!A&ffS)D)V#&ccU+F+	RXX1vh'))*4!,4!,ffhhU+F+ D	{3eg.cceeW-F+r-   c                    t        d      }| j                  |j                         t        d             t        d      }| j                  |j                  d       | j                  |j
                  t                      | j                  |j                  t        j                         | j                  |j                  t        j                         | j                  t        d      j                  t        j                         | j                  t        d      j                  t        j                         t        dgdgg      }| j                  |j
                  d       | j                  |j                  t        j                         | j                  | j                  t        j                         | j                  d|z  j                  t        j                         t        dgdgg      }| j                  |j                  t        j                         t        t        j                   d            }| j                  |j
                  d       t        ddg      }| j                  |j
                  d       t        ddgddgg      }|j"                  |z  |z  }| j                  |j                  t        j                         | j                  |j"                  |z  j                  t        j                         |j"                  j"                  }| j                  |j                  t        j                         |j"                  | j$                  z  }| j                  |j                  t        j                         | j                  t'        |      d	       t        dd
      }| j                  t        |      d
       | j                  |j                         d
       | j                  t'        |      d       y )N       @r   rH   r   rP   rO   r6   r/   z%Constant(CONSTANT, NONNEGATIVE, (2,))testr   z#Constant(CONSTANT, NONNEGATIVE, ()))r   r7   r   rB   rI   r2   r8   r9   r:   CONSTANTsignNONNEGNONPOSZEROUNKNOWNrK   zerosrU   r#   r<   )r*   cr#   exps       r+   test_constantszTestExpressions.test_constants   s   SM3s8,QK!$%'*ajj1*"**AHH5!))1662 qcA3Z &)*1"AHH-!A#QVV,qcB4[!+RXXf%&&) aV$'q!fq!f%&ccAgk188,!##'2ccee188,ccDFFl199- 	a"IJ QV$Q(6*a"GHr-   c                 
   d}t         j                  j                  d       t         j                  j                  ||      }||j                  z  }t         j                  j                  |      \  }}t        j                  g d      }t        |t        j                  |      z  |j                  z        }| j                  |j                                | j                  |j                                t        j                  g d      }t        |t        j                  |      z  |j                  z        }| j                  |j                                | j                  |j                                t        j                  g d      }t        |t        j                  |      z  |j                  z        }| j                  |j                                | j                  |j                                t        j                  g d      }t        |t        j                  |      z  |j                  z        }| j                  |j                                | j                  |j                                t        t        j                  ddgddgg            }t        d	
      }	t        j                  |	|      }
| j                  |
j                                | j                  |
 j                                | j                  t!        |j"                  d             t        t        j                  ddgddgg            }| j%                  t!        |j"                  d             t        t        j                  ddgz  dgz               }| j                  |j                                | j                  |j                                t        t        j&                  d
            }| j%                  |j                                | j                  |j                                t        t)        j*                  d            }| j%                  t!        |j"                  t,        j.                               | j%                  |j                                | j%                  | j                                t,        j.                   dz  |z  }| j%                  t!        |j"                  t,        j.                               dt,        j.                  z  |z  }| j                  t!        |j"                  t,        j.                               | j                  |j                                y )N   r   r   r   r6   g:0yE>r   r   r   gư>rk   r   r   r   -C6?gưrk   r   r   r   r   r6   r   r/   r2   gGz?)tol        	   rn   g     ri   ri   
   皙)rK   randomrandnrU   linalgeighrW   r   diagassertFalseis_psdis_nsdr   r=   	quad_formis_dcpr   rI   r>   rL   sp	eye_arrayr:   
EIGVAL_TOL)r*   nUevalsv1Pv2v3v4r   exprQs               r+   test_constant_psd_nsdz%TestExpressions.test_constant_psd_nsd   s   
		IIOOAq!GYY^^A&
 XX)*Q_qss*+$$XX)*Q_qss*+$$XX,-Q_qss*+$$XX&'Q_qss*+$$ RXX1v1v./04 ||Aq!'4%)*-agg4@A RXX1v1v./0,QWW#>? RWWQvX./0$$ RWW6*+
#$ R\\"%&,QWWallCD
#!&\\M!Oa,QWWallCDa-aggq||DE$r-   c                    t        j                  d      }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      }t        j                  ddgddgg      }t        j                  ddgddgg      }t	        |      }| j                  |j                                t	        |      }| j                  |j                                t	        |      }| j                  |j                                t	        |      }| j                  |j                                t	        |      }| j                  |j                                t	        |      }| j                  |j                                t	        |      }| j                  |j                                t	        t        j                  |            }| j                  |j                                t	        t        j                  |            }| j                  |j                                t	        t        j                  |            }| j                  |j                                t	        t        j                  |            }| j                  |j                                t	        t        j                  |            }| j                  |j                                t	        t        j                  |            }| j                  |j                                t	        d|z        }| j                  |j                                t	        d|z        }| j                  |j                                t	        d|z        }| j                  |j                                y )Nr   r   r   r   r6   rk   rv                 ?)
rK   eyerd   rW   r   r|   is_skew_symmetricr>   r   	csc_array)	r*   M1_falseM2_trueM3_trueM4_trueM5_falseM6_falseM7_falser&   s	            r+   test_constant_skew_symmetricz,TestExpressions.test_constant_skew_symmetric  s   66!9((6"((QFRG,-((QGaV,-88aVa!W-.88aVb!W-.88aVdAY/0 X,,./W++-.W++-.W++-.X,,./X,,./X,,./ R\\(+,,,./R\\'*+++-.R\\'*+++-.R\\(+,,,./R\\(+,,,./R\\(+,,,./ R'\",,./
 R'\",,./R'\",,./r-   c                     t        j                  ddg      }t        d      }ddg|_        | j	                  ||z  j                  d       | j	                  || j
                  z  j                  t                      y)z+Test NumPy 1D arrays as constants.
        r6   r   r   N)rK   rW   r   rI   r7   r   r2   r8   )r*   re   ps      r+   test_1D_arrayzTestExpressions.test_1D_arrayN  sb     HHaVaLa&!a%*!dff*++UW5r-   c                    t        d      }| j                  |j                         d       | j                  |j                  t	                      t        j                  d       }d|d<   t        d      }||_        t        d      }| j                  |j                  d       d|_        d |_        | j                  |j                  d        t        dd	      }| j                  t        |      d
       t        dd      }t        j                  t        j                  d            |_        | j                  |j                  j                         t        j                  d      d       y )Nr   r      r   r   rQ   ru   )rI   TnonposzParameter((4, 3), nonpos=True)r"   r{   places)r   r7   r   r2   r8   rK   rL   rI   r<   r   r   r   rJ   todense)r*   r   vals      r+   test_parameters_successesz)TestExpressions.test_parameters_successesX  s   33'%'* wwvD	f B"%$' fT*a"BC f4(,,rvvay)##AGGOO$5rvvay#Lr-   c           	         t         j                  j                  d       t         j                  j                  d      }|j	                  |j
                        }t        dd      }||_        | j                  |j                  |d       d	\  }}t         j                  j                  ||      d
t         j                  j                  ||      z  z   }t        j                  |j
                  j                         |      }t        j                  t        j                  t        j                  |      t        j                  |       g      t        j                  t        j                  |      t        j                  |      g      g      }t        d|z  d|z  fd      }||_        | j                  |j                  |       t        dd      }| j                  d|z  j!                                | j                  ||z   j!                                | j                  | j#                                | j                  d| z  j!                                d}t        ||fd      }t        ||fd      }t         j                  j                  d       t         j                  j                  ||      }	|	|	j
                  z  }	t         j$                  j'                  |	      \  }
}	t        j(                  g d      }t        j(                  g d      }t        j(                  g d      }t        j(                  g d      }||||g}|D ]  }| j+                  t,              5 }|	t        j.                  |      z  |	j
                  z  |_        d d d        | j1                  t3        j4                        d       | j+                  t,              5 }|	 t        j.                  |      z  |	j
                  z  |_        d d d        | j1                  t3        |j4                        d        y # 1 sw Y   xY w# 1 sw Y   =xY w)N*   )d   _   )size)r   r   TPSDru   r   )ru   ri   r   r   )r2   r   r"   rH   ri   )r2   NSDr   rj   rl   rm   ro   z.Parameter value must be positive semidefinite.z.Parameter value must be negative semidefinite.)rK   rw   seednormaldotrU   r   rI   rJ   rx   conjvstackhstackrealimagr>   r}   r~   ry   rz   rW   r@   rA   r{   r7   rB   rC   )r*   r   a2r   mr   r#   r   Nr   r   r   r   r   r   vsvirD   s                     r+   test_psd_nsd_parametersz'TestExpressions.test_psd_nsd_parameterst  s/   
		rII),UU133Zjd+##AGGR#; 1IIOOAq!BA)>$>>FF13388:q!IIryy"''!*rwwqzk!:;yy"''!*bggaj!9:< = QqS!A#JD1##AGGQ/ F-1'Q()!&"r**,- QF-QF-
		IIOOAq!GYY^^A&
XX)*XX)*XX,-XX&'"b" 	bB""9- 0bggbk/ACC/0S.0`a""9- 1"rwwr{*QSS01S.0`a	b0 01 1s   *+P3,P?3P<	?Q	c                 h	   t        d      }| j                  |j                         d       | j                  |j                  t	                      t        dd      }| j                  t              5 }d|_        d d d        | j                  t        j                        d       t        j                  d       }d|d	<   t        dd      }| j                  t              5 }||_        d d d        | j                  t        |j                        d
       t        dd      }| j                  t              5 }||_        d d d        | j                  t        |j                        d       | j                  t              5 }t        dddddg      }d d d        | j                  t        |j                        d       | j                  t              5 }t        ddddg      }d d d        | j                  t        |j                        d       | j                  t              5 }t        ddddgddgg      }d d d        | j                  t        |j                        d       | j                  t              5 }t        ddddgddgg      }d d d        | j                  t        |j                        d       | j                  t              5 }t        dd	dgddgddgg      }d d d        | j                  t        |j                        d       | j                  t              5 }t        dd	dgddgddgg      }d d d        | j                  t        |j                        d       | j                  t              5 }t        ddddgddgg      }d d d        | j                  t        |j                        d       | j                  t              5 }t        ddddgddgg      }d d d        | j                  t        |j                        d       y # 1 sw Y   xY w# 1 sw Y   Ix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# 1 sw Y   xY w# 1 sw Y   FxY w# 1 sw Y   xY w# 1 sw Y   xY w)Nr   r   r   TrG   r6   z*Invalid dimensions () for Parameter value.r   rQ   z$Parameter value must be nonnegative.r   z$Parameter value must be nonpositive.)r   rI   )r1   rI   z,Invalid dimensions (2,) for Parameter value.r"   rk   )booleanrI   z Parameter value must be boolean.g      ?)r3   rI   z Parameter value must be integer.rR   r   gffffff?gffffff@)r{   rI   z!Parameter value must be diagonal.)	symmetricrI   z"Parameter value must be symmetric.)r   r7   r   r2   r8   r@   rA   rI   rB   rC   rK   rL   )r*   r   rD   r   s       r+   test_parameters_failuresz(TestExpressions.test_parameters_failures  s8   33'%'*fT*y) 	RAG	R\\*,XYwwvD	fT*y) 	RAG	R\\*,RSfT*y) 	RAG	R\\*,RSy) 	;R!QtAq6:A	;R\\*,RSy) 	=R&aV<A	=R\\*,Z[ y) 	IR&$1v2w6GHA	IR\\*,NO y) 	KR&$3x!R6IJA	KR\\*,NO y) 	UR6FF+;QFQPQFCSTQ	UR\\*,NO y) 	[R6FF+;QHsTWjCYZQ	[R\\*,NO y) 	FR&tQFQG3DEA	FR\\*,OP y) 	LR&D!Q"b8JKA	LR\\*,PQk	 		 	
	 		; 	;	= 	=
	I 	I
	K 	K
	U 	U
	[ 	[
	F 	F
	L 	Ls   3P'%P4<QQQ-Q(Q5R4RR$R('P14P>QQQ%(Q25Q?RRR%(R1c                    | j                  t              5 }t        dd      }ddd       | j                  t	        j
                        d       t        dd      }|j                         sJ t        dd      }|j                         sJ t        dd      }|j                         sJ t        dd	      }|j                         sJ | j                  j                         sJ | j                  j                         rJ t        dd      }||z   }|j                         sJ | }|j                         sJ |j                  }|j                         sJ t        j                  |      }|j                         sJ t        j                  |      }|j                         sJ t        j                  |      }|j                         sJ t        j                  t               d      }|j                         sJ y# 1 sw Y   xY w)
z"Test symmetric variables.
        r   Tr   N3Invalid dimensions (4, 3). Must be a square matrix.r"   r   r   r   )r@   rA   r   r7   rB   rC   is_symmetricr   r#   rU   r=   r   r   r   promoter*   rD   vr   s       r+   test_symmetriczTestExpressions.test_symmetric  s    y) 	1R40A	1R\\*,abVt,~~V&~~V&~~V$'~~vv""$$$66&&(((Vt,1u  """r  """ss  """wwqz  """wwqz  """wwqz  """zz(*f-  """;	1 	1s   HHc                 2   | j                  t              5 }t        dd      }ddd       | j                  t	        j
                        d       t        dd      }|j                         sJ t        dd      }|j                         sJ t        dd      }||z   }|j                         sJ | }|j                         sJ |j                  }|j                         sJ t        j                  |      }|j                         sJ t        j                  |      }|j                         sJ t        j                  |      }|j                         sJ t        j                  t               d      }|j                         sJ y# 1 sw Y   jxY w)z"Test Hermitian variables.
        r   T	hermitianNr   r"   r   )r@   rA   r   r7   rB   rC   is_hermitianrU   r=   r   r   r   r   r   s       r+   test_hermitianzTestExpressions.test_hermitian  se    y) 	1R40A	1R\\*,abVt,~~
 V$'~~Vt,1u  """r  """ss  """wwqz  """wwqz  """wwqz  """zz(*f-  """7	1 	1s   FFc           	      R   t        dd      }| j                  |j                  d      d       t        dd      }| j                  |j                  t	        j
                  ddg            ddg       t        dd      }| j                  |j                  d      d       t        dd      }| j                  |j                  t	        j
                  ddg            ddg       t        dd	      }| j                  |j                  t	        j
                  ddgddgg      j                        g d
       t        dd      }| j                  |j                  t	        j
                  ddgddgg      j                        g d       t        dd      }| j                  |j                  t	        j
                  ddgddgg            g d       t        dd      }| j                  |j                  t	        j
                  ddgddgg            g d       t        dd      }| j                  |j                  t	        j
                  ddgddgg            g d       t        dd      }| j                  |j                  t	        j
                  ddgddgg            j                         g d       t        dd      }| j                  |j                  t	        j
                  ddgddgg            g d       t        t	        j
                  dgg            }| j                  |j                         d       | j                  |j                         d       t        t	        j
                  dgg            }| j                  |j                         d       | j                  |j                         d       t        t	        j
                  dgg            }| j                  |j                         d       | j                  |j                         d       y)z&Test rounding for attributes.
        r6   Tr   r   r   rk   rG   r"   r   )r6   r   r6   r   r3   g)r6   rH   r6   r   r   )r6   r   r   r   r   r   )r   r   r   rk   r   r   y             )r6   y      ?      ?y      ?      r         ?Fg      rr   N)r   assertAlmostEqualprojectrJ   rK   rW   rU   r   r   r7   r}   r~   )r*   r   r#   s      r+   test_round_attrzTestExpressions.test_round_attr$  s[    Qt$qyy|Q/Qt$##AIIbhh2w.?$@1b'J Qt$qyy}a0Qt$##AIIbhh2w.?$@1a&I VT*##AIIbhhB!Q7H.I.K.K$L$0	2 VT*##AIIbhhD	Aq67J.K.M.M$N$1	3 Vt,##AIIbhhB!Q7H.I$J$0	2 V&##AIIbhhB!R7I.J$K$0	2 V&##AIIbhhB!R7I.J$K$1	3 V$'##AIIbhhB!Q7H.I$J$R$R$T$0	2 Vt,##AIIbhhC1a&7I.J$K$>	@ RXXug&'T*U+RXXvh'(U+T*RXXug&'T*T*r-   c                    t        j                  ddg      f}t        j                  d|      }t        j                  g d      }|j	                  |      }|t        j                  g d      k(  j                         sJ y )Nr   r   r   r   )gɿr5   g333333?)r   r5   r6   rK   rW   r=   r   r   allr*   idxleafr   	projecteds        r+   test_project_boolean_indicesz,TestExpressions.test_project_boolean_indices`  sd    xxA!{{4-hh'(LL%	RXXk2277999r-   c                    t        j                  dg      f}t        j                  d|      }t        j                  g d      }|j	                  |      }|t        j                  g d      k(  j                         sJ y )Nr6   r   r   )333333?g@皙)r   r   r   r   r   s        r+   test_project_integer_indicesz,TestExpressions.test_project_integer_indicesh  sa    xx}{{4-hh'(LL%	RXXn55::<<<r-   c                 t   t        ddg      }| j                  |z   }| j                  |j                  t        j
                         | j                  |j                  t        j                         | j                  |j                  d       t        dd      }||z   | j                  z   }| j                  t              5  | j                  | j                  z    d d d        | j                  | j                  z   }| j                  |j                  t        j
                         | j                  |j                  d       | j                  t              5  | j                  | j                  z    d d d        | j                  t              5  t!        | j                  | j                  g       d d d        | j                  |z   | j                  z   }| j                  t#        |j$                        d       | j                  t'        |      d       y # 1 sw Y   <xY w# 1 sw Y   xY w# 1 sw Y   xY w)Nr   r/   r!   r   r"   r   !Expression(AFFINE, UNKNOWN, (2,)))r   r   r7   r9   r:   r;   r_   rc   r2   r   r@   
ValueErrorr    r#   r$   r&   r   lenargsr<   r*   re   rf   r!   s       r+   test_add_expressionz#TestExpressions.test_add_expressionp  s   aVffqj1199- 	D)QS!Ag z* 	VVdff_	 fftvvo1F+ z* 	VVdff_	 z* 	,466466*+	, ffqj466!SXX* 	c$GH+	 		 		, 	,s$   HH""H.H"H+.H7c                 t   t        ddg      }| j                  |z
  }| j                  |j                  t        j
                         | j                  |j                  t        j                         | j                  |j                  d       t        dd      }||z
  | j                  z
  }| j                  t              5  | j                  | j                  z
   d d d        | j                  | j                  z
  }| j                  |j                  t        j
                         | j                  |j                  d       | j                  t              5  | j                  | j                  z
   d d d        | j                  t!        | j                  |z
        d       y # 1 sw Y   xY w# 1 sw Y   >xY w)Nr   r/   r!   r   r"   r   )r   r   r7   r9   r:   r;   r_   rc   r2   r   r@   r   r    r#   r$   r&   r<   r   s       r+   test_sub_expressionz#TestExpressions.test_sub_expression  sH   aVffqj1199- 	D)QS!Ag z* 	VVdff_	 fftvvo1F+ z* 	VVdff_	 	dffqj)+NO	 		 	s   F"F."F+.F7c                    t        dgdgg      }|| j                  z  }| j                  |j                  t        j
                         | j                  |d   | j                  z  j                  t        j                         | j                  |j                  d       | j                  t              5  g d| j                  z   d d d        | j                  t              5  t        ddgddgg      | j                  z   d d d        t        j                         5  t        j                  d       | j                  | j                   z  }| j#                  |j%                                d d d        t        g dg dg      }||z   | j                   z  }| j                  |j                  t        j
                         | j                  |j                  d	       t        dgdgd
gg      }dgdgg|| j                  z  z   }| j                  |j                  t        j                         t        dgdgg      }t        j                  d      5 }|| j                  z   | j                  dt'        |             | j                  |d   j(                  t*               | j                  |d   j(                  t,               || j                  z   | j                  dt'        |             | j                  |d   j(                  t*               | j                  |d   j(                  t,               t        j                  dt,               || j                  z   | j                  dt'        |             t        j                  dt*               || j                  z   | j                  t'        |      d       t        j                  dt*               | j                  t*              5  || j                  z   d d d        d d d        y # 1 sw Y   HxY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   9xY w# 1 sw Y   y xY w)Nr   r   r6   r   r   r   r6   ignorer6   r   r   r   ri   ri   r%   rH   T)recordr   r   ri   error)r   r   r7   r9   r:   r;   r_   rc   r2   r@   r   r&   warningscatch_warningssimplefilterr#   r$   r>   is_quadraticr   categoryUserWarningDeprecationWarning)r*   re   rf   qrU   ws         r+   test_mul_expressionz#TestExpressions.test_mul_expression  sT   qcA3Z $&&j1!A$---qyy9 	D) z* 	!	! z* 	0q!fq!f%&/	0 $$& 	.!!(+AOOANN,-	. i+,1u1F+ qcA3%&sQCj1tvv:%199- qcA3Z $$D1 	QJQA'QqT]]K8QqT]],>?JQA'QqT]]K8QqT]],>?!!(,>?JQA'!!(K8JSVQ'!!';7"";/ DFF
)	 	5	! 	!	0 	0	. 	.L )	 	sJ   4P#PAP&FP?+P3;P?PP#&P03P<	8P??Qc                 J   t        dgdgg      }|j                  | j                        }| j                  |j                  t
        j                         | j                  |j                  t
        j                         | j                  |j                  d       | j                  t              5 }| j                  j                  d       ddd       | j                  t        j                        d       | j                  t              5 }| j                  j                  t        j                   g d             ddd       | j                  t              5 }t        ddgddgg      j                  | j"                         ddd       t%        j&                         5  t%        j(                  d       | j*                  j                  | j,                        }| j/                  |j1                                ddd       t        g dg d	g      }||z   j                  | j,                        }| j                  |j                  t
        j                         | j                  |j                  d
       t        dgdgdgg      }dgdgg|j                  | j"                        z   }| j                  |j                  t
        j                         t3        d      }t5        d      }|j                  |      }| j                  |j                  d       t3        d      }t5        d      }|j                  |      }| j                  |j                  d       t3        d      }	t5        d      }
|	j                  |
      }| j                  |j                  d       t5        d      }t3        d      }|j                  |j                  cxk(  r|j6                  j                  k(  sJ  J 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)zFTest matmul function, corresponding to .__matmul__( operator.
        r   r   Nz0Scalar operands are not allowed, use '*' insteadr   r6   r   r   r   r%   rH   rp    )r   r   )r   r6   r6   r6   )r   
__matmul__r   r7   r9   r:   r;   r_   rc   r2   r@   rA   rB   rC   r   rK   rW   r&   r   r   r   r#   r$   r>   r   r   r   rU   )r*   re   rf   rD   r   rU   r   r   r   r#   r!   r   
col_scalars                r+   test_matmul_expressionz&TestExpressions.test_matmul_expression  s1    qcA3Z ll466"1199-D)y) 	!RFFa 	!R\\*K	M z* 	5bVVrxx	23	5 y) 	;Rq!fq!f%&22466:	; $$& 	.!!(+""466*AOOANN,-	. i+,1u!!$&&)1F+ qcA3%&sQCj1<<//199- dO4 ||AR( dO4 ||AR(fV||AV,Vv&
ww***@jll.@.@@@@@@c	! 	!	5 	5	; 	;	. 	.s1   0O11O>+P#AP1O;>PPP"c                 d   | j                   dz  }| j                  |j                  t        j                         | j                  |j
                  t        j                         | j                  |j                  d       | j                  t              5 }| j                   g dz   d d d        t        j                         | j                  t        |j                        d       t        g d      }| j                  |t        g d      z  j                   t#        j$                  g d             t        d      }|dz  }| j                  |j                  t        j&                         | j                  |j                  t)                      | j                  |j
                  t        j*                         t-        d	
      }d|z  }d|_        | j                  |j                   d       t-        d	
      }d|_        | j                  |j
                  t        j.                         | j                  t        d      j
                  t        j.                         | j                  t        d      t        d      z  j
                  t        j.                         | j                  t        d      |z  j
                  t        j.                         | j                  |dz  j
                  t        j.                         t1        j2                  d      }t#        j4                  dd      d d d f   }||z  }| j                  d|j                         t#        j6                  d      |_        t#        j6                  d      |z  }| j                  ||j                          y # 1 sw Y    xY w)Nr   r/   r   z Incompatible shapes for division)      @      @g      (@)r   r\   r	  )r	  r\   r
  rH   TrG   r6   r   r   )r   r7   r9   r:   r;   r_   rc   r2   r@   rA   printrC   assertRegexrB   r   rJ   rI   rK   rW   r^   r8   ra   r   r`   r=   r   arangerL   )	r*   rf   rD   re   r   rhor   r   r#   s	            r+   test_div_expressionz#TestExpressions.test_div_expression2  s   ffQh1199- 	D)y) 	RVVI	bllR\\*;	= %&##x((
/
//1J	L QKi

3EG,188, T"cA&t$	188,!))1884(1+hqk177B(1+c///:#a%qxx0 KKIIaOAtG$1u,''&/GGFOa##Atzz2O	 	s   N%%N/c                    | j                    }| j                  |j                  t        j                         | j                  |j
                  d       |j                         sJ | j                  |j                  t        j                         |j                         rJ | j                  |j
                  | j                   j
                         | j                  |j                         d| j                   j                         z         | j                   }| j                  |j                  t        j                         | j                  |j
                  d       t        j                  d      }t        j                  dd      }t        j                  dd	      }||z  |z
   }| j                  t        |      d
       y )Nr/   z-%sr%   br   rO   XrP   r#   z-(A @ X + -b))r   r7   r9   r:   r;   r2   	is_affiner_   rc   	is_nonnegr   r&   r=   r   rB   )r*   rf   r  r  r#   s        r+   test_neg_expressionz#TestExpressions.test_neg_expressionf  s;   vvg1D)}}199-==?""DFFLL1UTVV[[]%:; vvg1F+ KKS!KKC(KKC(!ajS?3r-   c                    | j                   dz   }| j                  |j                  t        j                         |j                         sJ | j                  |j                  t        j                         |j                         rJ | j                  |j                  d       | j                  d| j                   z
  j                  d       | j                  d| j                   z  j                  d       | j                  d| j                   k  j                  d       | j                  d| j                   k(  j                  d       | j                  | j                   dk\  j                  d       | j                  dz   dz   }| j                  |j                  t        j                         | j                  d| j                  z  j                  d       | j                  |j                  d       y )Nr   r/   r   r   r"   )r   r7   r9   r:   r;   r  r_   rc   	is_nonposr2   r#   r*   rf   s     r+   test_scalar_const_promotionz+TestExpressions.test_scalar_const_promotion~  sf   ffqj1}}199-==?"" 	D)!dff*++T2!dff*++T2!tvv+,,d3!tvv+,,d3$&&A+,,d3 vvzQ1!dff*++V4F+r-   c                    | j                   d   }| j                  |j                  t        j                         |j                         sJ | j                  |j                  t                      | j                  |j                  d        | j                   d   j                  }| j                  |j                  t        j                         | j                  |j                  t                      | j                  t              5 }| j                   d    d d d        | j                  t        j                        d       | j                  t              5 }| j                   d    d d d        | j                  t        |j                        d       | j                  dddf   }| j                  |j                  d       | j                  dd ddf   }| j                  |j                  d       | j                  dd ddd df   }| j                  |j                  d	       | j                  d d
d ddf   }| j                  |j                  d       | j                  dd df   }| j                  |j                  d       t        ddgddgg      }|d   }| j                  |j                  t        j                          | j                  |j"                  t        j$                         | j                  |d   j"                  t        j$                         | j                  |d   j"                  t        j$                         | j                  |j                  t                      | j                  |j                  d       t        g dg dg dg      }|dd
dddf   }| j                  |j                  t        j                          |j'                         sJ | j                  |j                  d       | j                  |d   j                  d       | j                  j                  ddddf   }| j                  |j                  d	       | j                   | j(                  z   d   }| j                  |j                  t        j                         | j                  |j"                  t        j$                         | j                  |j                  t                      | j                   | j*                  z   dd }| j                  |j                  t        j                         | j                  |j                  d       | j                   | j(                  z
  dd }| j                  |j                  t        j                         | j                  |j                  d       | j                   | j*                  z
  d   }| j                  |j                  t        j                         | j                  |j                  t                      | j                    d   }| j                  |j                  t        j                         | j                  |j                  t                      t        ddgd
dgg      }|| j                   z  d   }| j                  |j                  t        j                         | j                  |j                  t                      t        ddgd
dgg      }|| j*                  z  dddf   }| j                  |j                  t        j                         | j                  |j                  d       y # 1 sw Y   JxY w# 1 sw Y   xY w)Nr6   r4   z Too many indices for expression.r   z0Index 2 is out of bounds for axis 0 with size 2.r   r/   r%   rO   r   r   r6   r   rH   r   r  rR   rT   )r6   rH   r   )r   r   ri   )      rs   r  r   )r   r7   r9   r:   r;   r  r2   r8   rI   rU   r@   rA   rB   rC   r&   r   r^   r_   rc   is_constantr!   r   )r*   rf   rD   re   s       r+   test_index_expressionz%TestExpressions.test_index_expression  s   ffQi1}}EG, 	D)ffQikk1EG,y) 	RVVD\	R\\*,NOy) 	RVVAY	R\\*,^_ ffQqS!VnD)ffQR1WoF+ffQTT14a4Z F+ffRaR!AXF+ffQRUmD)q"g1v&'g

3199-4qyy14qyy1EG,A&j)Y78!QqU
m

3   F+T!, ffhhqsAaCx F+ vv"1199-EG,vv!$1D)vv!$1D)vv"1EG,wl1EG,q!fq!f%&466z1o1EG,q!fq!f%&466z1ac6"1D)e	 		 	s   ] ]- ]*-]7c                 X   t        d      D cg c]  }| }}t        j                  dd      |df   }| j                  dt	        |             t        d      D cg c]  }| }}t        j                  dd      |d	df   }| j                  d
t	        |             y c c}w c c}w )N   )   ru   rf   r      z%exp[[0, 1, 2, ..., 175, 176, 177], 6]ri   )ru   ru   r   zexp[[0, 1, 2, 3, 4], 2:5])ranger=   r   r7   rB   )r*   ir   rf   s       r+   test_special_idx_str_reprz)TestExpressions.test_special_idx_str_repr  s    *%Qq%%kk)%0a8@#c(K(#Qq##kk(/QqS94c#h? & $s   	B"	B'c                    | j                   d   }| j                  |j                  d       | j                  dddf   }| j                  |j                  d       | j                  dddf   }| j                  |j                  d       t	        ddg      dddf   }| j                  |j                  d       | j                  |j                  ddg       y)zTest None as index.
        )NNr  NrO   rP   r6   r   )r   r7   r2   r   r   rJ   rI   r*   r   s     r+   test_none_idxzTestExpressions.test_none_idx  s     vvj!V,vvagV,vvdAgV,Aa(V,##DJJA7r-   c                 N   | j                  t              5 }| j                  d    ddd       | j                  t	        j
                        d       | j                  t              5 }| j                  d    ddd       | j                  t	        |j
                        d       | j                  dd }| j                  |j                  d       | j                  |j                  t        j                  g              | j                  dd }| j                  |j                  d       | j                  ddd	df   }| j                  |j                  d
       | j                  ddd	df   }| j                  |j                  d       y# 1 sw Y   ixY w# 1 sw Y   $xY w)z$Test out of bounds indices.
        r   Nz2Index 100 is out of bounds for axis 0 with size 2.iz3Index -100 is out of bounds for axis 0 with size 2.r   r   r   r   i9r%   )r   r   )r@   rA   r   r7   rB   rC   r   rJ   rI   rK   rW   r&   r2   )r*   rD   rf   s      r+   test_out_of_boundsz"TestExpressions.test_out_of_bounds  sN    y) 	RFF3K	R\\*,`ay) 	RFF4L	R\\*,abffUdm1%##CIIrxx|<ffSmF+ffQQYF+ffQRZ F+'	 		 	s   F(FFF$c                 &   | j                  t              5 }| j                  d    d d d        | j                  t	        j
                        d       | j                  t              5 }| j                  d    d d d        | j                  t	        |j
                        d       | j                  t              5 }| j                  d dd    d d d        | j                  t	        |j
                        d       | j                  t              5 }| j                  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# 1 sw Y   xY w# 1 sw Y   TxY w)Nr   zfloat is an invalid index type.)r   r\   (   z;arrays used as indices must be of integer (or boolean) type)	r@   
IndexErrorr   r7   rB   rC   r&   rK   rW   )r*   rD   s     r+   test_float_is_invalid_indexz+TestExpressions.test_float_is_invalid_index-  sA   z* 	bFF3K	R\\*,MNz* 	bFF6N	R\\*,MNz* 	bFF7R7O	R\\*,MNz* 	)bFF288S#J'(	)R\\*V	X	 		 		 		) 	)s/   E"(E/:E;%F"E,/E8;FFc                    t        ddgddgg      }|d   }| j                  |j                  d       | j                  |j                  t	                      | j                  |j
                  t        j                         t        g d      }|dd }| j                  |j                  ddg       | j                  |j                  d       | j                  |j
                  t        j                         t        g d      }|d	d	d   }| j                  |j                  g d
       | j                  |j                  d       | j                  |j
                  t        j                         t        d      }| j                  |d	d	d   j                  d       t        t        d      |d	d	d   |k(  g      j                  t        j                         | j                  |j                  g d
       t        d      }| j                  |d	d	d   j                  d       t        dd      }| j                  dt        |d	d              t        ddgddgg      }|ddddf   }| j                  |j                  d       | j!                  |j                  d       |ddd	df   }| j                  |j                  d       | j                  |j                  ddg       y	)zTest negative indices.
        r6   r   r   r   )rk   rk   r6   r   r   r   rk   r/   N)r   r   r   r6   )r   r   solverr   r   r   zx[0:99]r   )r   r7   rI   r2   r8   r9   r:   r^   rJ   r   r
   r	   solver=   SCSrB   r   )r*   re   rf   r   r   s        r+   test_neg_indicesz TestExpressions.test_neg_indices?  sY    q!fq!f%&iA&EG,

3\""g##CII1v6D)

3\""g##CII|<D)

3QK4R4-a"gl^,22"&&2A##AGG\:QK4R4-Ss#C#2K0q!fq!f%&AaF|T*tzz1-AErE{T*##DJJA7r-   c                 v   t        j                  g dg dg dg      }t        |      }||dk     }| j                  |j                  d       | j                  |j
                  t        j                         | j                  ||dk     |j                         ||dz  dk(     }| j                  |j                  d       | j                  |j
                  t        j                         | j                  ||dz  dk(     |j                         |t        j                  g d      d	f   }| j                  |j                  d       | j                  |j
                  t        j                         | j                  |t        j                  g d      d	f   |j                         |d
t        j                  g d      f   }| j                  |j                  d       | j                  |j
                  t        j                         | j                  |d
t        j                  g d      f   |j                         |t        j                  g d      d
d	f   }| j                  |j                  d       | j                  |j
                  t        j                         | j                  |t        j                  g d      d
d	f   |j                         |d
dt        j                  g d      f   }| j                  |j                  d       | j                  |j
                  t        j                         | j                  |d
dt        j                  g d      f   |j                         |t        j                  g d      t        j                  g d      f   }| j                  |j                  d       | j                  |j
                  t        j                         | j                  |t        j                  g d      t        j                  g d      f   |j                         y)z+Test indexing with boolean arrays.
        r3  ri   r#  r  r  rs   ru         r   r/   r   )r#  )TFTr   r6   )TFFT)TTTr%   rk   )TFTTr6   r   r   N
rK   rW   r   r7   r2   r_   r:   r`   rJ   rI   r*   r#   r&   r   s       r+   test_logical_indicesz$TestExpressions.test_logical_indicesh  s;    HHlL/BCQK ayT*AHH-##Aa1fItzz:Q!}T*AHH-##Aa!eqjM4::> -.12T*AHH-##Abhh/B&CQ&F$GT BHH7889T*AHH-##Aa2L)M&M$N$(JJ	0 ,-qs23V,AHH-##Abhh/A&BAaC&G$H$**U 2rxx 9::;V,AHH-##AadBHH5N,O&O$P$(JJ	0
 ,-345 6T*AHH-##Abhh/A&B&(hh/H&I'J %KLPJJ	Xr-   c                 z   t        j                  g dg dg dg      }t        |      }|ddg   }| j                  |j                  d       | j                  |j
                  t        j                         | j                  |ddg   |j                         |ddgdf   }| j                  |j                  d	       | j                  |j
                  t        j                         | j                  |ddgdf   |j                         |dddgf   }| j                  |j                  d	       | j                  |j
                  t        j                         | j                  |dddgf   |j                         |ddgddf   }| j                  |j                  d
       | j                  |j
                  t        j                         | j                  |ddgddf   |j                         |ddddgf   }| j                  |j                  d       | j                  |j
                  t        j                         | j                  |ddddgf   |j                         |ddgddgf   }| j                  |j                  d	       | j                  |j
                  t        j                         | j                  |ddgddgf   |j                         |t        j                  ddg      ddgf   }| j                  |j                  d	       | j                  |j
                  t        j                         | j                  |t        j                  ddg      ddgf   |j                         |t        j                  ddg      t        j                  ddg      f   }| j                  |j                  d	       | j                  |j
                  t        j                         | j                  |t        j                  ddg      t        j                  ddg      f   |j                         y)z6Test indexing with lists/ndarrays of indices.
        r3  r:  r;  r6   r   )r   r   r   r   r/   r"   rk   rP   Nr?  r@  s       r+   test_selector_list_indicesz*TestExpressions.test_selector_list_indices  sz    HHlL/BCQK !QyV,AHH-##Aq!fItzz: !Q|T*AHH-##Aq!faiL$**= QF|T*AHH-##Aa!QiL$**= !Q1~V,AHH-##Aq!fackNDJJ? 21vV,AHH-##AadQFlOTZZ@ !Q!Q T*AHH-##Aq!fq!fn$5tzzB 1a&!Aq6)*T*AHH-##Abhh1v&6A&>$?L 1a&!288QF#334T*AHH-##Abhh1v&6!Q8H&H$I4::Vr-   c                 Z   | j                   dz  }| j                  |j                  t        j                         | j                   dz  }| j                  |j                  t        j
                         | j                   dz  }| j                  |j                  t        j                         y )Nr   r5   rk   )r   r7   r9   r:   CONVEXCONCAVEr  s     r+   test_powerszTestExpressions.test_powers  sq    ffai1ffck		2ffbj1r-   c                 8   d| j                   _        t        j                  | j                         }| j	                  |j                  d       ddg| j
                  _        t        j                  | j
                        }| j	                  |j                  d       y)z!Test cvxpy sum function.
        r6   r   r   N)r   rI   r=   sumr7   r   r(  s     r+   test_sumzTestExpressions.test_sum  sh     vvdff~Q'1vvvdff~Q'r-   c                 *   t        dd      }|j                         }| j                  |j                  d       | j                  |j	                         d       t        ddd      }|j                         }| j                  |j                  d       y)z3Test the copy function for variable types.
        r   r   r   r   rt   T)r   r   N)r   copyr7   r2   r   r*   r   r    s      r+   test_var_copyzTestExpressions.test_var_copy  sr     V#&FFH&)3'VC0FFH&)r-   c                     t        ddd      }|j                         }| j                  |j                  d       | j                  |j	                         d       | j                  |j
                  d       y)z/Test the copy function for Parameters.
        rL  r   Tr0   NONNEGATIVEN)r   rM  r7   r2   r   r_   rN  s      r+   test_param_copyzTestExpressions.test_param_copy  s[     f3t4FFH&)3'/r-   c                     t        d      }|j                         }| j                  |j                  t	                      | j                  |j
                  d       y)z.Test the copy function for Constants.
        r   N)r   rM  r7   r2   r8   rI   rN  s      r+   test_constant_copyz"TestExpressions.test_constant_copy  sB     QKFFH%'*!$r-   c                    t        j                  d      }t        j                  d      }|| j                  z  |z
  }| j                  |j	                         d       t        j                  dd| j                  z        }| j                  |j	                         d       t        j                  | j                        }| j                  |j	                         d       t        j                  d| j                  z  d      }| j                  |j	                         d       t        j                  d| j                  dz  z  d      }| j                  |j	                         d       y)zTest is_pwl()
        rS   r   Tr6   r   FN)	rK   rL   r    r7   is_pwlr=   maximumabspnorm)r*   r#   r  r   s       r+   test_is_pwlzTestExpressions.test_is_pwl  s     GGFOGGAJ466zA~-zz!QZ(-vvdff~-xxDFF
A&-xxDFFaK+.r-   c                 (   t        d      }t        d      }t        j                  d      dddf   |_        t        j                  d      dz
  dddf   |_        t        j                  ||      }| j                  |j                  |j                  |j                  z         t        j                  t        j                  t        j                  |            ||j                  k(  g      }|j                  t
        j                         | j                  |j                  |j                  |j                  z         t        j                  j                  d       d\  }}t        j                  j                  ||      }t        |      }t        d|g      }t        j                  ||      }	| j!                  |	j"                  ||f       t        |dg      }
t        j                  ||
      }| j!                  |j"                  ||f       y)	z$Test multiply broadcasting.
        r  r>  r   Nr6   r4  r   rL  )r   r   rK   r  rI   r=   multiplyrJ   r
   r	   rI  r6  r7  rw   r   randr7   r2   r*   r    r!   r   probr   r   r#   	col_scaler&   	row_scaleRs               r+   test_broadcast_mulz"TestExpressions.test_broadcast_mul  s~    fV))A,q$w'99Q<!#T1W-{{1a ##DJJ!''0ABzz"++bffTl3a177l^D

"&&
!##DJJ!''0AB
		q1IINN1a QK	aV$	KK9%1a&)aV$	KK9%1a&)r-   c                    t        d      }t        d      }t        j                  d      dddf   |_        t        j                  d      dz
  dddf   |_        ||z   }| j                  |j                  |j                  |j                  z          t        j                  t        j                  t        j                  |            ||j                  k(  g      }|j                  t        j                         | j                  |j                  |j                  |j                  z          t        j                  j                  d       d\  }}t        j                  j                  ||      }t        |      }t        d|g      }||z   }	| j                  |	j                   ||f       t        |dg      }
||
z   }| j                  |j                   ||f       y)	z$Test addition broadcasting.
        r  r>  r   Nr6   r4  r   rL  )r   r   rK   r  rI   rJ   r=   r
   r	   rI  r6  r7  rw   r   r]  r7   r2   r^  s               r+   test_broadcast_addz"TestExpressions.test_broadcast_add3  si    fV))A,q$w'99Q<!#T1W-1u##DJJ!''0ABzz"++bffTl3a177l^D

"&&
!##DJJ!''0AB
		q1IINN1a QK	aV$		M1a&)aV$		M1a&)r-   c                 ^   t        j                  ddgg      }| j                  t        j                  |t        j
                  t        d            z        j                  t        j                  g       t        j                  d      }| j                  t        j                  |j                         t        j                  d      }| j                  |j                  t        j                  t        j                  t        j                  t        j                   t        j"                  t        j$                  t        j&                  t        j(                  t        j*                  g	       ||z  |z  }| j                  |j                  t        j                   t        j"                  t        j$                  g       ||z  |z  |z   }| j                  |j                  t        j"                  g       d||z  |z  |z   z  }| j                  |j                  t        j$                  g       y)z?Test the curvatures property returns a list of valid curvaturesr6   rk   r   r   TposN)rK   rW   r7   r=   rI  squarer   
curvaturesr:   rc   r   assertInr^   r;   rE  rF  LOG_LOG_AFFINELOG_LOG_CONVEXLOG_LOG_CONCAVEQUASILINEARQUASICONVEXQUASICONCAVE)r*   matr    r   monomial
posynomialllcvs          r+   test_curvatureszTestExpressions.test_curvaturesO  s   hhBy!bii&< <=HH199+VKKOajj!,,/KKD!!((AII()(8(8!:J:JAL]L]()q}}ann(V 	W Q3q5,,q/?/?/0/?/?ARAR/T 	U qSUQY
..1A1A0BC!A#a%!)}1+<+<*=>r-   c                    t        d      }||z  |z  }|j                  t        j                  k(  sJ ||z  |z  |z   }|j                  t        j                  k(  sJ d||z  |z  |z   z  }|j                  t        j
                  k(  sJ y)zMTest that the curvature string is populated for log-log expressions.
        Trg  r6   N)r   r9   r:   rl  rm  rn  )r*   r   rs  rt  ru  s        r+   test_log_log_curvaturez&TestExpressions.test_log_log_curvaturef  s     Q3q5!!Q%5%5555qSUQY
##q'7'7777!A#a%!)}~~!2!2222r-   c                    t        d      }t        ddgddgg      }|j                  j                  |      j                  |      }t	        |t
        j                        sJ t        d      }t        ddgddgg      }d|j                  j                  |      j                  |      z  |j                  j                  |      z   }t	        |j                  d   j                  d   t
        j                        sJ |j                  d   j                  d   j                  d   |u sJ t        d      }t        ddgddgg      }t        ddg      }d|j                  j                  |      z  |j                  j                  |      j                  |      z  |j                  j                  |      z   }t	        |j                  d   j                  d   t
        j                        sJ |j                  d   j                  d   j                  d   |u sJ t        d      }t        t        j                  d            }|j                  j                  |      j                  |      }t	        |t
        j                        sJ t        d      }t        t        j                  d	            }| j                  t              5 }|j                  j                  |      j                  |       d
d
d
       t        j                   d      }t        j                  ddgddgg      }|j                  j                  t        |            j                  |      }t	        |t
        j                        sJ t        j                   d      }t        j                  g dg dg      }t        j                  g dg dg dg      }t        j                  g d      }|j                  |      |z
  }|j                  j                  |      j                  |      }t	        |t
        j                        sJ |j                  d   |u sJ |j                  d   |u sJ t        d      }t        dd      }|j                  j                  |      j                  |      }t	        |t
        j                        sJ t        d      }t        ddgddgg      }| j                  t               5 }|j                  j                  |      j                  |       d
d
d
       t        d      }t        ddgddgg      }| j                  t               5 }|j                  j                  |      j                  |       d
d
d
       t        d      }t        d      }t        ddgddgg      }|j                  j                  |      j                  |      }t	        |t
        j                        rJ t        d      }t        d      }|j                  j                  |      j                  |      }t	        |t
        j                        rJ t        ddg      }t        d      }|j                  j                  |      j                  |      }t	        |t
        j                        rJ y
# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   QxY w)z>Test conversion of native x.T @ A @ x into QuadForms.
        r/   rp   r6   r   rk   r5   r   rH   r   N)r   r   r   )r   r   r6   )r   r   r   )r   r   r   r   r"   T)r2   r   r   )r   r   rU   r  
isinstancer=   QuadFormr   r   r   rK   r   r@   rA   r   r   r   )	r*   r   r#   r   re   _Mr  r    s	            r+   test_quad_form_matmulz%TestExpressions.test_quad_form_matmuls  s   
 4 q!fq"g&'ss~~a ++A.$,,, 4 q!fq"g&'!##..+66q9:QSS^^A=NN$))A,++A.<<<yy|  #((+q000 4 q!fq"g&'aWq))accnnQ.?.J.J1.MNQRQTQTQ_Q_`aQbb$))A,++A.<<<yy|  #((+q000 4 R\\!_%ss~~a ++A.$,,, 4 RVVAYy) 	,QCCNN1((+	, KKd#KK!Q!Q()ss~~hqk*55a8$,,, KKd#KKI./KKIy9:KK	"LLOass~~a ++A.$,,,yy|q   yy|q    4 Fd3ss~~a ++A.$,,, 4 q!fq!f%&z* 	,aCCNN1((+	, 4 q"gAw'(z* 	,aCCNN1((+	, 4 4 q!fq"g&'ss~~a ++A.dBKK000 4 6"ss~~a ++A.dBKK000aV6"ss~~a ++A.dBKK0000m	, 	,<	, 	,
	, 	,s$   +Z=8+[
+[=[
[[!c                    t        j                  d      }t        j                  |t        j                  d            }t        j
                  dg      }||z  }t        j
                  ddg      |_        t        j                  d      }t        j                  |j                        |z  |j                  z  |z  }|j                  dk(  sJ | j                  |j                  |       y)zSTest evaluating a matmul that reduces one argument internally to a scalar.
        r/   r   r6   r  N)
r=   r   r   rK   r   rW   rI   	transposer2   r7   )r*   r   quadr   r   r   true_vals          r+   test_matmul_scalarsz#TestExpressions.test_matmul_scalars  s     KK||Arvvay)HHaSMax((Aq6"FF1ILL)A-71<zzRX.r-   c                    t        j                  d      }t        |      }|j                         sJ t	        |      }|j                         sJ t        j                  d      }t        j                  dd      }t        |      }|j                         sJ |j                         rJ |j                         sJ |j                         sJ t        |      }|j                         sJ |j                         sJ |j                         rJ |j                         sJ t        |      }|j                         sJ |j                         sJ t        |      }|j                         sJ t        |      }|j                         sJ y)zTest wrap classes.r   r"   T)complexN)r=   r   r   r  r   r  r   r}   
is_complexr   r   r   r   r   r   )r*   r   r   Zr   s        r+   
test_wrapszTestExpressions.test_wraps  s[   KKN1~~~1~~~KKKK-{{{}}??$$$  """  """{{{}}   $$&&&  """a   """  """"1%%%'''a   """r-   c                     ddl m}  G d d|      }t        d      }t        t	        d       ||      dk(  g      }t        j                  t        d      5  |j                          d d d        y # 1 sw Y   y xY w)	Nr   Sumc                       e Zd Zd Zy)TTestExpressions.test_expr_does_not_support_cpp_warning.<locals>.SumNotSupportedInCPPc                      yNFr  r)   s    r+   _supports_cppzbTestExpressions.test_expr_does_not_support_cpp_warning.<locals>.SumNotSupportedInCPP._supports_cpp      r-   N__name__
__module____qualname__r  r  r-   r+   SumNotSupportedInCPPr        r-   r  r   r6   zvThe problem includes expressions that don't support CPP backend. Defaulting to the SCIPY backend for canonicalization.match)	cvxpy.atoms.affine.sumr  r   r
   r	   pytestwarnsr   r6  r*   r  r  r   r_  s        r+   &test_expr_does_not_support_cpp_warningz6TestExpressions.test_expr_does_not_support_cpp_warning  sn    .	3 	 QKx{%9!%<%A$BC\\$
 	 JJL	 	 	s   A11A:c                    ddl m}  G d d|      }t        d      }t        t	        d       ||      dk(  g      }t        j                  t        d      5  |j                  t        j                  	       d d d        y # 1 sw Y   y xY w)
Nr   r  c                       e Zd Zd Zy)RTestExpressions.test_expr_does_not_support_cpp_error.<locals>.SumNotSupportedInCPPc                      yr  r  r)   s    r+   r  z`TestExpressions.test_expr_does_not_support_cpp_error.<locals>.SumNotSupportedInCPP._supports_cpp  r  r-   Nr  r  r-   r+   r  r    r  r-   r  r   r6   zZThe CPP backend cannot be used with problems that have expressions which do not support itr  canon_backend)r  r  r   r
   r	   r  raisesr   r6  r=   CPP_CANON_BACKENDr  s        r+   $test_expr_does_not_support_cpp_errorz4TestExpressions.test_expr_does_not_support_cpp_error  sy    .	3 	 QKx{%9!%<%A$BC]]<
 	;
 JJR%9%9J:	; 	; 	;s   !BB
returnN)2r  r  r  __doc__r,   rE   rM   rZ   rg   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r&  r)  r-  r1  r8  rA  rC  rG  rJ  rO  rR  rT  rZ  rc  re  rv  rx  r~  r  r  r  r  r  r-   r+   r   r   1   s   <
& >DS@$,N1If:%x3j6M8.bb;Rz #D#@:+x:=$INP>;z<A~13h40,4b*H@8 ,0X$'8R2Xh4Wl2	(
*0%/**8*8?.3X1t/#B&;r-   r   c                      e Zd Z ej                  d      dFd       ZdFdZdFdZdFdZdFdZ	dFd	Z
dFd
ZdFdZdFdZej                  j                  dg d      dFd       Zej                  j                  dg d      dFd       Zej                  j                  dg d      dFd       Z e ed            dFd       Z e edd            dFd       Z e ed            dFd       Z e ede            dFd       ZdFdZej                  j                  ddd g      ej                  j                  d!g d"      dFd#              ZdFd$Zej                  j                  d%g d&      dFd'       Zej                  j                  d%g d(      dFd)       Z ej                  j                  d*g d+      dFd,       Z!ej                  j                  d-d.gd/gfd.d0gd1d/gfg d2g d3fg      dFd4       Z"ej                  j                  d5g d6      dFd7       Z#ej                  j                  d5g d8      dFd9       Z$ej                  j                  d5g d:      dFd;       Z%ej                  j                  d5g d<      dFd=       Z&ej                  j                  d5g d>      dFd?       Z' e e(d@dAB            dFdC       Z)dFdDZ*dFdEZ+y)GTestND_ExpressionsT)autouseNc                     t        dd      | _        dt        j                  d      z   j	                  ddd      | _        t        j                  d      | _        y )Nr   r   r   r   r   r6   r  r   r   )	r   r   rK   r  reshapetargetr=   r	   objr)   s    r+   setupzTestND_Expressions.setup"  sA    ',1~..q15;;q>r-   c                     t        j                  | j                  | j                  | j                  k(  g      }|j                  t         j                         t        j                  | j                  j                  | j                        sJ y Nr  )
r=   r
   r  r   r  r6  SCIPY_CANON_BACKENDrK   allcloserI   )r*   r_  s     r+   test_nd_variablez#TestND_Expressions.test_nd_variable(  sZ    zz$((TVVt{{%:$;<

!7!7
8{{466<<555r-   c                     t        j                  | j                  | j                  | j                  k(  g      }d}t        j                  t        |      5  |j                          d d d        y # 1 sw Y   y xY w)NzrThe problem has an expression with dimension greater than 2. Defaulting to the SCIPY backend for canonicalization.r  )	r=   r
   r  r   r  r  r  r   r6  )r*   r_  warning_strs      r+   test_nd_variable_warningz+TestND_Expressions.test_nd_variable_warning-  sZ    zz$((TVVt{{%:$;<L\\+[9 	JJL	 	 	s   A00A9c                    t        j                  | j                  | j                  | j                  k(  g      }d}t        j                  t        |      5  |j                  t         j                         d d d        y # 1 sw Y   y xY w)NzjOnly the SCIPY and NUMPY backends are supported for problems with expressions of dimension greater than 2.r  r  )
r=   r
   r  r   r  r  r  r   r6  r  )r*   r_  	error_strs      r+   test_nd_variable_value_errorz/TestND_Expressions.test_nd_variable_value_error4  se    zz$((TVVt{{%:$;<Q	]]:Y7 	;JJR%9%9J:	; 	; 	;s   !B  B	c                 8   t        j                  | j                  d      }t        j                  | j                  || j
                  k(  g      }|j                  t         j                         t        j                  |j                  | j
                        sJ y )Nr   r  )r=   r\  r   r
   r  r  r6  r  rK   r  rI   r*   r   r_  s      r+   test_nd_mul_elemz#TestND_Expressions.test_nd_mul_elem;  sf    {{4661%zz$((TT[[%8$9:

!7!7
8{{4::t{{333r-   c                 *   | j                   | j                  z  }t        j                  | j                  || j                  k(  g      }|j                  t        j                         t        j                  |j                  | j                        sJ y r  
r   r  r=   r
   r  r6  r  rK   r  rI   r  s      r+   test_nd_divzTestND_Expressions.test_nd_divA  sd    vv#zz$((TT[[%8$9:

!7!7
8{{4::t{{333r-   c                 R   t        d      }t        d      }t        j                  ||g      }t        j                  | j                  || j
                  k(  g      }|j                  t        j                         t        j                  |j                  | j
                        sJ y )Nr6   r   r   r  )r   r=   r   r
   r  r  r6  r  rK   r  rI   r*   r   r!   r   r_  s        r+   test_nd_vstackz!TestND_Expressions.test_nd_vstackG  sx    YYyy!Azz$((TT[[%8$9:

!7!7
8{{4::t{{333r-   c                 ~   t        j                  d      }t        j                  d      }t        j                  ||gd      }t        j                  | j                  || j
                  k(  g      }|j                  t         j                         t        j                  |j                  | j
                        sJ y )Nr  r   axisr  )r=   r   concatenater
   r  r  r6  r  rK   r  rI   r  s        r+   test_nd_concatenatez&TestND_Expressions.test_nd_concatenateO  s    KK	"KK	"~~qeA.zz$((TT[[%8$9:

!7!7
8{{4::t{{333r-   c                 n   t        d      D cg c]  }t        j                  d       }}t        |      }t        j                  | j
                  || j                  k(  g      }|j                  t        j                         t        j                  |j                  | j                        sJ y c c}w )Nru   r  r  )r$  r=   r   rI  r
   r  r  r6  r  rK   r  rI   )r*   r|  r   r   r_  s        r+   test_nd_sum_exprz#TestND_Expressions.test_nd_sum_exprW  s    +095aR[[!551vzz$((TT[[%8$9:

!7!7
8{{4::t{{333	 6s   B2r  )r   r6   r   rR   r+  rO   c                 N   t        j                  | j                  |d      }| j                  j                  |d      }t        j                  | j
                  ||k(  g      }|j                  t         j                         t        j                  |j                  |      sJ y )NTr  keepdimsr  )r=   rI  r   r  r
   r  r6  r  rK   r  rI   )r*   r  r   r    r_  s        r+   test_nd_sumzTestND_Expressions.test_nd_sum^  st    vvdff4$7KKOOO5zz$((TQYK0

!7!7
8{{4::q)))r-   c                    t        j                  d      }t        j                  d      j	                  ddd      |_        t        j                  | j                  |      j                  |      }| j                  j                  |      }t        j                  | j                  ||k(  g      }|j                  t         j                         t        j                  |j
                  |      sJ y )Nr  r  r   r  r  )r=   r   rK   r  r  rI   r\  r   rI  r  r
   r  r6  r  r  )r*   r  paramr   r  r_  s         r+   test_nd_parametrized_sumz+TestND_Expressions.test_nd_parametrized_sumf  s    W%iil**1Qq1{{4665)--4-8d+zz$((TV^$45

!7!7
8{{4::v...r-   ))r   r   r   ri   )r   ri   )r   r   r   r6   )ri   r   r6   )r   r6   r   ri   c                 n   d}t        j                  |      j                  |d      }t        j                  |      j                  |d      }t        j
                  | j                  ||k(  g      }|j                  t         j                         t        j                  |j                  |      sJ y )Nr#  ri   r   r   r   r6   rp   Tr  r  )r=   r   rI  rK   rL   r
   r  r6  r  r  rI   r*   r  in_shaper   r    r_  s         r+   test_nd_big_sumz"TestND_Expressions.test_nd_big_sump  s     {{*..D4.HGGH!!td!;zz$((TQYK0

!7!7
8{{4::q)))r-   r  rp   c                    | j                   |   }| j                  |   }t        j                  | j                  ||k(  g      }|j                  t        j                         t        j                  |j                  |      sJ y r  r  )r*   r:   r   r    r_  s        r+   test_nd_integer_indexz(TestND_Expressions.test_nd_integer_indexy  sb    vvayKKNzz$((TQYK0

!7!7
8{{4::q)))r-   )r2   allow_newaxisr  c                 >     fd}t         ||      du         j                  |   } j                  |   }t        j                   j
                  ||k(  g      }|j                  t        j                         t        j                  |j                  |      sJ y )Nc                 :    dj                   |    j                  v S Nr   r  r2   r  r*   s    r+   is_zero_dim_outputzBTestND_Expressions.test_nd_basic_index.<locals>.is_zero_dim_output      D)////r-   Fr  r   r   r  r=   r
   r  r6  r  rK   r  rI   r*   r  r  r   r    r_  s   `     r+   test_nd_basic_indexz&TestND_Expressions.test_nd_basic_index  s~    	0 	!$'501vvd|KKzz$((TQYK0

!7!7
8{{4::q)))r-   r  c                 6   d}t        j                  |      |   }t        j                  |      |   }t        j                  | j
                  ||k(  g      }|j                  t         j                         t        j                  |j                  |      sJ y )Nr  rp   r  )
r=   r   rK   rL   r
   r  r6  r  r  rI   r  s         r+   test_nd_big_indexz$TestND_Expressions.test_nd_big_index  ss     {{*40GGHd#zz$((TQYK0

!7!7
8{{4::q)))r-   )r2   dtypec                 >     fd}t         ||      du         j                  |   } j                  |   }t        j                   j
                  ||k(  g      }|j                  t        j                         t        j                  |j                  |      sJ y )Nc                 :    dj                   |    j                  v S r  r  r  s    r+   r  zATestND_Expressions.test_nd_bool_index.<locals>.is_zero_dim_output  r  r-   Fr  r  r  s   `     r+   test_nd_bool_indexz%TestND_Expressions.test_nd_bool_index  s~    	0 	!$'501vvd|KKzz$((TQYK0

!7!7
8{{4::q)))r-   c                 h   | j                   d d d d df   j                  d      }| j                  d d d d df   j                  d      }t        j                  | j
                  ||k(  g      }|j                  t        j                         t        j                  |j                  |      sJ y )Nr   r  r  )r   rI  r  r=   r
   r  r6  r  rK   r  rI   )r*   r   r    r_  s       r+   test_nd_index_sumz$TestND_Expressions.test_nd_index_sum  s    vva!e}  a (KK!A"""*zz$((TQYK0

!7!7
8{{4::q)))r-   orderr&   Fr2   ))   r      )i,  r   r   )r6      ri   ru   )   ri   r6   c                    t        j                  d      }t        j                  d      j	                  d      }t        j                  |||      }|j	                  ||      }t        j
                  | j                  ||k(  g      }|j                  t         j                         t        j                  |j                  |      sJ y )Nri   r  ru     )r  r  )r=   r   rK   r  r  r
   r  r6  r  r  rI   )r*   r  r2   rX   r  r   r    r_  s           r+   test_nd_reshapez"TestND_Expressions.test_nd_reshape  s     kk+&4((5zz#uE2NN5N.zz$((TQYK0

!7!7
8{{4::q)))r-   c                 r   t        j                  d      }t        j                  d      j	                  d      }|j
                  }|j
                  }t        j                  | j                  ||k(  g      }|j                  t         j                         t        j                  |j                  |      sJ y )Nr  r  r  )r=   r   rK   r  r  rU   r
   r  r6  r  r  rI   )r*   rX   r  r   r    r_  s         r+   test_nd_transposez$TestND_Expressions.test_nd_transpose  s    kk+&4((5uuHHzz$((TQYK0

!7!7
8{{4::q)))r-   axes))r   r   r6   )r   r   r6   )r6   r   r   )r6   r   r   )rk   r   r6   c                    t        j                  d      }t        j                  d      j	                  d      }t        j
                  ||      }|j                  |      }t        j                  | j                  ||k(  g      }|j                  t         j                         t        j                  |j                  |      sJ y )Nr  r  r  r  )r=   r   rK   r  r  r  r
   r  r6  r  r  rI   r*   r  rX   r  r   r    r_  s          r+   test_nd_transpose_axesz)TestND_Expressions.test_nd_transpose_axes  s    kk+&4((5||Cd+T"zz$((TQYK0

!7!7
8{{4::q)))r-   ))r   r   r6   r   )r   r   r   r6   )r   r6   r   r   c                    t        j                  d      }t        j                  d      j	                  d      }t        j
                  ||      }|j                  |      }t        j                  | j                  ||k(  g      }|j                  t         j                         t        j                  |j                  |      sJ y )N)ri   r#  ri   r#  i  r  r  )r=   r   rK   r  r  permute_dimsr  r
   r  r6  r  r  rI   r   s          r+   test_permute_dimsz$TestND_Expressions.test_permute_dims  s    kk,'3''5s.T"zz$((TQYK0

!7!7
8{{4::q)))r-   zaxis1, axis2)rR   r>  r%   )r   r   rP   c                    t        j                  d      }t        j                  d      j	                  d      }t        j
                  |||      }|j                  ||      }t        j                  | j                  ||k(  g      }|j                  t         j                         t        j                  |j                  |      sJ y )N)ri   r=  r#  r     )axis1axis2r  )r=   r   rK   r  r  swapaxesr
   r  r6  r  r  rI   )r*   r  r  rX   r  r   r    r_  s           r+   test_swapaxesz TestND_Expressions.test_swapaxes  s    kk-(3''6{{3e59OOE5)zz$((TQYK0

!7!7
8{{4::q)))r-   zsource, destinationr   r   r6   r   )r   r6   r   )r   r   r6   c                    t        j                  d      }t        j                  d      j	                  d      }t        j
                  |||      }t        j
                  |||      }t        j                  | j                  ||k(  g      }|j                  t         j                         t        j                  |j                  |      sJ y )N)ri   r   r#  r=  r  )sourcedestinationr  )r=   r   rK   r  r  moveaxisr
   r  r6  r  r  rI   )r*   r  r  rX   r  r   r    r_  s           r+   test_moveaxisz TestND_Expressions.test_moveaxis  s     kk-(3''6{{3v;GKK4zz$((TQYK0

!7!7
8{{4::q)))r-   shapes))r   )   r  r   )r  r6   ri   )r  r  r#  ri   )r6   ri   r   )r   r  )   r6   ri   r  r   ri   )r   ri   r  r  r  c                    t        j                  |d         }t        j                  ||d         }|j                  |d   k(  sJ t        j                  t        j
                  t        j                  |            |dk(  g      }|j                  t         j                         t        j                  |j                  d      sJ y )Nr   r6   rp   r  )r=   r   broadcast_tor2   r
   r	   rI  r6  r  rK   r  rI   )r*   r  r   r    r_  s        r+   test_nd_broadcastz$TestND_Expressions.test_nd_broadcast  s     KKq	"OOAVAY/ww&)###zz"++bffQi016(;

!7!7
8{{177A&&&r-   ))r   r  rL  )rO   )r  r   r   c                     d}t        j                  t        |      5  t        j                  |d         }t        j
                  ||d         }|j                  |d   usJ 	 d d d        y # 1 sw Y   y xY w)Nz(operands could not be broadcast togetherr  r   r6   rp   )r  r  rA   r=   r   r  r2   )r*   r  r  r   r    s        r+   test_nd_broadcast_errorz*TestND_Expressions.test_nd_broadcast_error  sh     ?	]]9I6 	,F1I&A3A77&)+++	, 	, 	,s   AA..A7))ri   r  ))r  r6   r  )r   rO   c                    t        j                  |d         }t        j                  t        j                  |d               j                  |d         }t        j                  t        j                  |d               j                  |d         }t        j                  t        j                  |d               j                  |d         }t        j                  t        j                  t        j                  ||      |z   d            }t        j                  t        j                  |      ||k(  g      }|j                          t        j                  |j                  |      sJ y)z
        This test ensures that no error is raised when
        multiplying two broadcastable array shapes <= 2.
        Previously this would cause a segfault in the CPP backend.
        r   r6   r  N)r=   r   rK   r  prodr  rI  maxr\  r
   r	   r6  r  rI   )r*   r  r   r  r   r  r  r_  s           r+   test_no_segfault_multiplyz,TestND_Expressions.test_no_segfault_multiply  s     KKq	"2776!9-.66vayAIIbggfQi()11&)<IIbggfQi()11&)<ffRVVBKK1-1:;zz"++c*Q&[M:

{{177F+++r-   )r   )   r  r   r  )r   r6   r   )r   r   r   r  r  r  c                 ^   t        j                  |d         }t        j                  t        j                  |d               j                  |d         }t        j                  ||      }t        j                  t        j                  |d               j                  |d         }t        j                  t        j                  t        j                  |            |||z  k(  g      }|j                  t         j                         t        j                  |j                  |      sJ y Nr   r6   r  )r=   r   rK   r  r  r  r\  r
   r	   rI  r6  r  r  rI   r*   r  r   r    r   r  r_  s          r+   test_nd_multiply_broadcastz-TestND_Expressions.test_nd_multiply_broadcast  s     KKq	"IIbggfQi()11&)<{{1a 2776!9-.66vayAzz"++bffTl3dfqj6H5IJ

!7!7
8{{177F+++r-   )r"  r  r$  r  c                 <   t        j                  |d         }t        j                  t        j                  |d               j                  |d         }||z   }t        j                  t        j                  |d               j                  |d         }t        j                  t        j                  t        j                  |            |||z   k(  g      }|j                  t         j                         t        j                  |j                  |      sJ y r&  r=   r   rK   r  r  r  r
   r	   rI  r6  r  r  rI   r'  s          r+   test_nd_add_broadcastz(TestND_Expressions.test_nd_add_broadcast"  s    
 KKq	"IIbggfQi()11&)<1u2776!9-.66vayAzz"++bffTl3dfqj6H5IJ

!7!7
8{{177F+++r-   r     r     r   )max_dimsc                 $   t        j                  d      }t        j                  t        j                  |            j                  |      }||z
  }t        j                  t        j                  d            j                  dddd      }t        j                  t        j                  t        j                  |            |||z
  k(  g      }|j                  t         j                         t        j                  |j                  |      sJ y )Nr,  r  r-  r.  r  r*  )r*   r2   r   r    r   r  r_  s          r+   test_nd_broadcast_generatedz.TestND_Expressions.test_nd_broadcast_generated/  s    KK'IIbggu&'//81u277;/0882aCzz"++bffTl3dfqj6H5IJ

!7!7
8{{177F+++r-   c                     d}t        j                  t        |      5  t        j                  d      }t        j                  d      }||z   d d d        y # 1 sw Y   y xY w)Nz3Multiplication with N-d arrays is not yet supportedr  ri   r  r   )r   ru   )r  r  r   r=   r   )r*   r  r   r    s       r+   test_nd_matmul_exceptionz+TestND_Expressions.test_nd_matmul_exception:  sM    I	]]:Y7 	H%AF#AE	 	 	s   0AA c                     d}t        j                  t        |      5  t        j                  d      }t        j
                  |d       d d d        y # 1 sw Y   y xY w)Nz<cumsum is only implemented for 1D or 2D arrays and might notr  r3  r6   r  )r  r  r   r=   r   cumsum)r*   r  r   s      r+   test_nd_cumsum_warningz)TestND_Expressions.test_nd_cumsum_warningB  sF    T]];k: 	!H%AIIaa 	! 	! 	!s   -AAr  ),r  r  r  r  fixturer  r  r  r  r  r  r  r  r  markparametrizer  r  r  r   r   r  r   r  r  r   boolr  r  r  r  r  r  r
  r  r  r  r!  r(  r+  r   r1  r4  r7  r  r-   r+   r  r     sQ   V^^D!" ""
6
;44444 [[V%JK* L* [[V%JK/ L/ [[V%[\* ]*  w/0* 1* G4@A
* B
* %M:;* <* WD12	* 3	** [[WsCj1[[W 'D E*E 2** [[V%]^* _* [[V%OP* Q* [[^-UV* W* [[2qcA3Z1a&1a&AQ6?5K5M N*N* [[X (> ?'?' [[X (< =,=, [[X (7 8,8, [[X (> ?,?, [[X (> ?,	?, %nqAB, C,!r-   r  )/r  r   numpyrK   r  scipy.sparsesparser   
hypothesisr   r   hypothesis.extra.numpyr   r   r   r   cvxpyr=    cvxpy.interface.matrix_utilities	interfacematrix_utilitiesr'   cvxpy.settingssettingsr:   r	   r
   cvxpy.atoms.affine.add_exprr   cvxpy.atoms.affine.wrapsr   r   r   r   r   r   cvxpy.expressions.constantsr   r   cvxpy.expressions.variabler   cvxpy.tests.base_testr   cvxpy.utilities.linalgr   r   r  r  r-   r+   <module>rM     sl         $   / /  # 5  < / * 7l;h l;^/f! f!r-   