
    bi                     r    d Z ddlZddlZddlmZmZmZ ddlm	Z	 ddl
mZ ddlmZ ddlmZ  G d d	e      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)MaximizeMinimizeProblem)Variable)BaseTest)	linearize)partial_optimizec                      e Zd ZdZd#dZd#dZd#dZd#dZd#dZd#dZ	d#d	Z
d#d
Zd#dZd#dZd#dZd#dZd#dZd#dZd#dZd#dZd#dZd#dZd#dZd#dZd#dZd#dZd#dZd#dZd#dZd#dZd#dZd#dZd#dZ d#d Z!d#d!Z"d#d"Z#y)$TestGradz! Unit tests for the grad module. Nc                     t        d      | _        t        dd      | _        t        dd      | _        t        dd      | _        t        dd      | _        t        d	d
      | _        t        dd      | _        y )Na)name   xyr   r   AB)   r   C)   r   D)r   r   r   r   r   r   r   r   )selfs    P/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/cvxpy/tests/test_grad.pysetUpzTestGrad.setUp   sb    s#!#&!#&&s+&s+&s+&s+    c           
      L   | j                   | j                  z  }t        j                  ddgddgddgg      | j                   _        t        j                  ddgddgg      | j                  _        t        j                  g d	g d
g dg dg dg dg      }| j                  |j                  | j                      j                         |       | j                  |j                  | j                     j                         t        j                  g dg dg dg dg             y)z&Test gradient for affine_prod
        r   r      r   )r   r   r   r   r   r   )r   r   r   r   r   r   )r   r   r   r   r   r   )r"   r   r   r   r   r   )r   r"   r   r   r   r   )r   r   r"   r   r   r   )r   r   r    r   r   r   )r   r   r!   r   r   r   )r   r   r   r   r   r    )r   r   r   r   r   r!   N)r   r   nparrayvalueassertItemsAlmostEqualgradtoarray)r   exprarr_vals      r   test_affine_prodzTestGrad.test_affine_prod)   s     vvxx!R1a&2r( ;<xx!Q"a 12((.0BDV/1DFY[ \##DIIdff$5$=$=$?I##DIIdff$5$=$=$?$&HH.ACW.ACW.Y %Z	[r   c           
         t        j                  | j                  d      }ddg| j                  _        | j	                  |j
                  | j                     j                         ddg       ddg| j                  _        | j	                  |j
                  | j                     j                         ddg       t        j                  | j                  d      }ddg| j                  _        | j	                  |j
                  | j                     j                         t        j                  dgd	gg             t        j                  | j                  d
      }ddg| j                  _        | j                  |j
                  | j                     d       t        j                  | j                  d
      }ddg| j                  _        | j                  |j
                  | j                     d       t        j                  | j                  d      }ddg| j                  _        | j	                  |j
                  | j                     j                         ddg       t        j                  | j                  dddf   dd      }ddg| j                  _        t        j                  d      }| j	                  |j
                  | j                     j                         |       t        j                  | j                  d      }t        j                  ddgddgg      | j                  _        | j	                  |j
                  | j                     j                         g d       t        j                  | j                  dd      }t        j                  ddgddgg      | j                  _        | j	                  |j
                  | j                     j                         t        j                  ddgd	dgddgdd	gg             d }t        j                  ddddg      }t        j                  |      }|j
                  |   }| j                  |       | j                  t!        |dt        j"                  |      j$                        j&                  d       | j)                  t        j*                   ||      d
d
g             t        j                  | j                  d      }t        j                  ddg      | j                  _        |j
                  | j                     }| j                  |       | j                  t!        |dt        j"                  |      j$                        j&                  d       t        j                  | j                  d      }t        j                  ddg      | j                  _        |j
                  | j                     } ||      }| j-                  |d   d       | j/                  |d   d       t        j0                  j3                  | j                  j                  d      dz  }t        j4                  | j                  j                        t        j6                  | j                  j                        dz  z  |z  }| j)                  t        j*                  ||             t        j                  dd      }	t        j                  dgdgdgg      |	_        t        j                  |	d      }|j
                  |	   }| j                  |       | j                  t!        |dt        j"                  |      j$                        j&                  d       t        j                  | j                  dd      }t        j                  dd gddgg      | j                  _        | j	                  |j
                  | j                     j                         t        j                  ddgdd	gd!dgddgg             t        j                  | j                  dd      }t        j                  ddgddgg      | j                  _        | j	                  |j
                  | j                     j                         t        j                  ddgddgddgddgg             t        j                  | j                  dd      }t        j                  ddgddgg      | j                  _        | j	                  |j
                  | j                     j                         t        j                  ddgddgddgddgg             t        j2                  | j8                  dd      }t        j                  ddgg      | j8                  _        | j	                  |j
                  | j8                     j                         t        j                  ddgddgg             t        j2                  | j8                  dd      }t        j                  ddgg      | j8                  _        | j	                  |j
                  | j8                     j                         t        j                  dgdgg             t        j                  | j                  d
      }t        j                  dd gddgg      | j                  _        | j                  |j
                  | j                     d       y)"z Test gradient for pnorm
        r   r    r   
   r   r!   r   333333g?      ?Naxisr   )r/   r/         r/   r   g333333?c                     t        | d      r| j                         nt        j                  |       }|j	                  d      S )Nr(   Forder)hasattrr(   r#   asarrayravel)gg_arrs     r   _flatz"TestGrad.test_pnorm.<locals>._flat`   s1    #*1i#8AIIKbjjmE;;S;))r   r         ?)r   r%   dtype)fc       @       g      @)ord)r   r   T)posg      @r2   g)cppnormr   r%   r&   r'   r(   r#   r$   assertAlmostEqualeyer   r   harmonic_meanassertIsNotNoneassertIngetattrr8   r>   kind
assertTrueallclose
assertLessassertGreaterlinalgnormsignabsr   )
r   r)   valr<   r   r'   r:   denexpectedr   s
             r   
test_pnormzTestGrad.test_pnorm7   s     xx"Aw##DIIdff$5$=$=$?"aI2w##DIIdff$5$=$=$?!QHxx"Aw##DIIdff$5$=$=$?F8V[U\J]A^_xx$Awtyy0$7xx$1vtyy0$7xx"1v##DIIdff$5$=$=$?!QHxxq$w31vffQi##DIIdff$5$=$=$?Exx"xx!R1a& 12##DIIdff$5$=$=$?AVWxx*xx!R1a& 12##DIIdff$5$=$=$?$&HHsAha1d)aQTX-V$W	Y	*
 KKC:6"yy|T"gdGRZZ-=-C-CDII:VE$K#s<= xx#xxc
+yy T"gdGRZZ-=-C-CDII:V xx"xxs,yy $K!a 1Q4#yy~~dffll~4<77466<<(266$&&,,+?#+FFLAx01 KKD)((SEC53%01xx4 yy|T"gdGRZZ-=-C-CDII:Vxx*xx!R1a& 12##DIIdff$5$=$=$?$&HHsAhC4)aQTX-V$W	Y xx*xx!Q"a 12##DIIdff$5$=$=$?$&HHq!fq!fq!fq!f-M$N	P xx*xx!Q"a 12##DIIdff$5$=$=$?$&HHq!fq!fq!fq!f-M$N	P wwtvvqq)xx!R	*##DIIdff$5$=$=$?Aq6TUWXSYJZA[\wwtvvqq)xx!R	*##DIIdff$5$=$=$?A3QRPS*AUVxx$xx!R1a& 12tyy0$7r   c                 0   t        j                  | j                        }ddg| j                  _        t	        j
                  d      }| j                  |j                  | j                     j                         dd|z   z  |d|z   z  g       t        j                  | j                        }t	        j                  ddgddgg      | j                  _        | j                  |j                  | j                     j                         dd|z   d|z  z   z  d|z  d|z   d|z  z   z  |d|z   d|z  z   z  dd|z   d|z  z   z  g       t        j                  | j                  d      }t	        j                  ddgddgg      | j                  _        | j                  |j                  | j                     j                         t	        j                  t	        j                  ddd|z  z   z  d|z  dd|z  z   z  ddgdd|d|z   z  dd|z   z  gg                   y )Nr   r   r=   r    r   r0   )rF   log_sum_expr   r%   r#   expr&   r'   r(   r   r$   	transpose)r   r)   es      r   test_log_sum_expzTestGrad.test_log_sum_exp   s   ~~dff%1vFF1I##DIIdff$5$=$=$?#qs)QPQRSPSWAUV~~dff%xx!Q"a 12##DIIdff$5$=$=$?%(!A#c!e)_c!eQqSQY6G%&!CE	]C1SUO%E	F ~~dff1-xx!Q"a 12##DIIdff$5$=$=$?$&LLC3q5M3q5RSTWXYTYRY?\]_`;a<=q!QqS'3PQRSPS9;U;W 2X %Y	Zr   c                    t        j                  | j                        }ddg| j                  _        | j	                  |j
                  | j                     j                         t        j                  d      dz  dt        j                  d      z  g       ddg| j                  _        | j                  |j
                  | j                     d       t        j                  | j                  ddg      }ddg| j                  _        | j	                  |j
                  | j                     j                         ddg       ddg| j                  _        | j                  |j
                  | j                     d       y)z#Test gradient for geo_mean
        r   r   r/   r   Nr    )
rF   geo_meanr   r%   r&   r'   r(   r#   sqrtrH   r   r)   s     r   test_geo_meanzTestGrad.test_geo_mean   s    {{466"1v##DIIdff$5$=$=$?"''!*Q,PUVXV]V]^_V`P`Aab1vtyy0$7{{466Aq6*1v##DIIdff$5$=$=$?!QH Awtyy0$7r   c                 "   t        j                  | j                        }ddgddgg| j                  _        | j	                  |j
                  | j                     j                         g d       ddgddgg| j                  _        | j	                  |j
                  | j                     j                         g d       ddgddgg| j                  _        | j	                  |j
                  | j                     j                         g d       y)z%Test gradient for lambda_max
        r   r   r   r   r   r   r   r   r   r   r   N)rF   
lambda_maxr   r%   r&   r'   r(   rd   s     r   test_lambda_maxzTestGrad.test_lambda_max   s     }}TVV$AA'##DIIdff$5$=$=$?NAA'##DIIdff$5$=$=$?NAA'##DIIdff$5$=$=$?Nr   c                    t        j                  | j                  | j                        }t	        j
                  d      | j                  _        t	        j
                  d      | j                  _        | j                  |j                  | j                     j                         g d       | j                  |j                  | j                     j                         g d       t	        j                  d      | j                  _        | j                  |j                  | j                     d       | j                  |j                  | j                     d       t        j                  | j                  dddf   | j                        }ddg| j                  _        t	        j
                  d      | j                  _        | j                  |j                  | j                     j                         ddg       | j                  |j                  | j                     j                         g d	       t        j                  | j                  | j                        }ddg| j                  _        t	        j
                  d      | j                  _        | j                  |j                  | j                     j                         ddg       | j                  |j                  | j                     j                         g d	       y)
z&Test gradient for matrix_frac
        r   )r   r   r   r   )r    r   r   r    r   Nr   r      )rE   rm   i)rF   matrix_fracr   r   r#   rI   r%   r&   r'   r(   zerosrH   r   rd   s     r   test_matrix_fraczTestGrad.test_matrix_frac   s    ~~dffdff-vvayvvay##DIIdff$5$=$=$?N##DIIdff$5$=$=$?Pxx'tyy0$7tyy0$7~~dffQWotvv61vvvay##DIIdff$5$=$=$?!QH##DIIdff$5$=$=$?AQR~~dffdff-1vvvay##DIIdff$5$=$=$?!QH##DIIdff$5$=$=$?AQRr   c                    t        j                  | j                        }ddgddgg| j                  _        | j	                  |j
                  | j                     j                         g d       t        j                  | j                        }t        j                  ddgddgddgg      | j                  _        | j	                  |j
                  | j                     j                         g d       y	)
z#Test gradient for norm_nuc
        r-   r      r   r   r   r   r   r   r   )r   r   r   r   r   r   N)
rF   normNucr   r%   r&   r'   r(   r   r#   r$   rd   s     r   test_norm_nuczTestGrad.test_norm_nuc   s     zz$&&!Q!R)##DIIdff$5$=$=$?N zz$&&!xx!Q!Q!Q 89##DIIdff$5$=$=$?ASTr   c                    t        j                  | j                        }dt        j                  d      z  | j                  _        | j                  |j                  | j                     j                         dt        j                  d      z         t        j                  ddgddgg      }|j                  j                  |      | j                  _        t        j                  j                  | j                  j
                        j                  }| j                  |j                  | j                     j                         |       t        j                  d      | j                  _        | j                  |j                  | j                     d       t        j                  ddgddgg       | j                  _        | j                  |j                  | j                     d       t!        d	      }t        j                  |ddg   ddddgf         }t        j                  d
      |_        t        j                  d	      }d|ddgddgf<   | j                  |j                  |   j                         |       y)z"Test gradient for log_det
        r   r/   r   r      r   Nr   )   rx   rx   )rF   log_detr   r#   rI   r%   r&   r'   r(   r$   TdotrS   invro   rH   r   )r   r)   matrW   Ks        r   test_log_detzTestGrad.test_log_det   s    zz$&&!{##DIIdff$5$=$=$?rvvayQhhAA'(uuyy~iimmDFFLL)++##DIIdff$5$=$=$?Exx'tyy0$71a&1a&!122tyy0$7Vzz!QF)A1vI./&&)hhvQFQFN##DIIaL$8$8$:C@r   c                 "   t        j                  | j                  | j                        }ddg| j                  _        d| j                  _        | j                  |j                  | j                     j                         ddg       | j                  |j                  | j                     dg       d| j                  _        | j                  |j                  | j                     d       | j                  |j                  | j                     d       t        j                  | j                  | j                        }t        j                  d      | j                  _        d| j                  _        | j                  |j                  | j                     j                         g d       | j                  |j                  | j                     dg       t        j                  | j                  | j                        t        j                  | j                  | j                        z   }ddg| j                  _        d| j                  _        ddg| j                  _        d| j                  _        | j                  |j                  | j                     j                         ddg       | j                  |j                  | j                     j                         ddg       | j                  |j                  | j                     dg       y)	z(Test gradient for quad_over_lin
        r   r   g      r   Nrs   r2   g      )rF   quad_over_linr   r   r%   r&   r'   r(   rH   r   r#   rI   r   rd   s     r   test_quad_over_linzTestGrad.test_quad_over_lin  s    /1v##DIIdff$5$=$=$?!QHtyy05':tyy0$7tyy0$7/vvay##DIIdff$5$=$=$?Ntyy04&9/"2B2B4664662RR1v1v##DIIdff$5$=$=$?!QH##DIIdff$5$=$=$?!QHtyy04&9r   c           
         d}t         j                  j                  d       t         j                  j                  ||      }|j                  |z  }t         j                  j                  |      }t        j                  |      }t        j                  t        j                  |j                  |z  dt        j                  ||      z  z
        t        j                  |d      dk  t        j                  ||      dk  t        j                  |      dk  g      }|j                  t
        j                         |j                  d   j                  j                    t        j                  |df      }t        j                  t        j                  |j                  |z  dt        j                  ||      z  z
        t        j                  |d      dk  t        j                  ||      dk  t        j                  |      dk  g      }|j                  t
        j                         |j                  d   j                  j                    y)z%Test gradient for quad_form.
        r-   r   r/   r=   g{Gz?solverN)r#   randomseedrandnrz   rF   r   r   r   	quad_formrT   rV   solveSCSconstraintsr)   r'   )r   nPqr   probs         r   test_quad_formzTestGrad.test_quad_form1  s    
		qIIOOAq!CC!GIIOOA KKNzz"++accAgbll1a6H0H&HI771a=C/<<1-366!9,./ 	

"&&
! 	  %% KKAzzKKa5BLLA,>">>?1$Q"b(q	T!
 	

"&&
! 	  %%r   c           
      b   t        j                  | j                        }ddg| j                  _        | j	                  |j
                  | j                     j                         ddg       t        j                  | j                        }t        j                  ddgddgg      | j                  _        | j	                  |j
                  | j                     j                         g d       t        j                  | j                  d      }t        j                  ddgddgg      | j                  _        | j	                  |j
                  | j                     j                         t        j                  ddgddgddgddgg             t        j                  | j                  d      }t        j                  ddgddgg      | j                  _        | j	                  |j
                  | j                     j                         t        j                  ddgddgddgddgg             y)	zTest gradient for max
        r   r   r   r   r   )r   r   r   r   r0   N)
rF   maxr   r%   r&   r'   r(   r   r#   r$   rd   s     r   test_maxzTestGrad.test_maxU  s    vvdff~1v##DIIdff$5$=$=$?!QHvvdff~xx!Q!Q 01##DIIdff$5$=$=$?Nvvdff1%xx!Q!Q 01##DIIdff$5$=$=$?$&HHq!fq!fq!fq!f-M$N	P vvdff1%xx!Q!Q 01##DIIdff$5$=$=$?$&HHq!fq!fq!fq!f-M$N	Pr   c                    t        j                  | j                        }ddgddgg| j                  _        | j	                  |j
                  | j                     j                         g d       ddgddgg| j                  _        | j	                  |j
                  | j                     j                         g d       y)zTest sigma_max.
        r   r   r   rh   rg   N)rF   	sigma_maxr   r%   r&   r'   r(   rd   s     r   test_sigma_maxzTestGrad.test_sigma_maxj  s     ||DFF#AA'##DIIdff$5$=$=$?NAA'##DIIdff$5$=$=$?Nr   c                    t        j                  | j                  d      }ddgddgg| j                  _        | j	                  |j
                  | j                     j                         g d       ddgddgg| j                  _        | j	                  |j
                  | j                     j                         g d       y)	zTest sum_largest.
        r   r   r   r   r   r   r   r   r/   r   r   r   r   N)rF   sum_largestr   r%   r&   r'   r(   rd   s     r   test_sum_largestzTestGrad.test_sum_largestt  s     ~~dffa(AA'##DIIdff$5$=$=$?NAC)##DIIdff$5$=$=$?Nr   c                    t        j                  | j                  ddg      }ddgddgg| j                  _        | j	                  |j
                  | j                     j                         g d       ddgddgg| j                  _        | j	                  |j
                  | j                     j                         g d	       t        j                  | j                  ddg      }ddgddgg| j                  _        | j	                  |j
                  | j                     j                         g d
       ddgddgg| j                  _        | j	                  |j
                  | j                     j                         g d       t        j                  | j                  ddg       }ddgddgg| j                  _        | j	                  |j
                  | j                     j                         g d       ddgddgg| j                  _        | j	                  |j
                  | j                     j                         g d       y)zTest dotsort.
        皙?r   r   r   r   r   )r   r   r   r   r/   )r   r   r   r   r   r   r    r   r   r   r   rs   N)rF   dotsortr   r%   r&   r'   r(   rd   s     r   test_dotsortzTestGrad.test_dotsort  s    zz$&&3),AA'##DIIdff$5$=$=$?QAC)##DIIdff$5$=$=$?Q zz$&&1a&)AA'##DIIdff$5$=$=$?NAC)##DIIdff$5$=$=$?N 

466B8,,AA'##DIIdff$5$=$=$?NAC)##DIIdff$5$=$=$?Nr   c                 8   t        j                  | j                        }ddgddgg| j                  _        t	        j
                  d      t	        j                  g d      z   }| j                  |j                  | j                     j                         |       y)zTest abs.
        r   r   r    r   r   r   )r   r   r    r   N)
rF   rV   r   r%   r#   ro   diagr&   r'   r(   r   r)   rW   s      r   test_abszTestGrad.test_abs  so     vvdff~AQ(hhv!77##DIIdff$5$=$=$?Er   c           
         d| j                   z  dz
  d   }ddg| j                   _        t        |      }ddg| j                   _        | j                  |j                  |j                         ddg| j                   _        | j                  |j                  |j                         | j                  dz  dz   }| j                  t              5 }t        |       d	d	d	       | j                  t        j                        d
       ddgddgg| j                  _        t        |      }|j                  dt        j                  t        j                  t        j                  | j                  d            j                  t        j                  | j                  | j                  j                  z
  d      z  dd      z  z   }| j                  |j                  |j                         ddgddgg| j                  _        |j                  |j                  k  j                         sJ | j                  |j                  |j                         t        j                   | j                         dz  }ddg| j                   _        t        |      }|j                  t        j                  d| j                   dz  z        j                  | j                   | j                   j                  z
  z  z   }| j                  |j                  |j                         ddg| j                   _        |j                  |j                  k\  j                         sJ | j                  |j                  |j                         y	# 1 sw Y   xY w)zTest linearize method.
        r   rw   r   r   7      r    r"   NzDCannot linearize non-affine expression with missing variable values.r   r   r4   r5   r   gffffff @g@r/   )r   r%   r   rH   r   assertRaises	ExceptionassertEqualstr	exceptionrF   reshaper   vecr&   alllog)r   r)   lin_exprcmmanuals        r   test_linearizezTestGrad.test_linearize  s    $&&1a 1vT?Bxx~~tzz:Bxx~~tzz: vvqy1}y) 	RdO	R\\*_	a AA'T?a

GGBFF466-.44rvvdfftvv||>S[^7__!
 
 

 	##HNNDJJ?R3*-$**,11333##HNNFLLA vvdff~a1vT?bggc$&&"*n5;;tvv?TUU##HNNDJJ?3x$**,11333##HNNFLLA3	 	s   M::Nc                    t        j                  | j                        }d| j                  _        | j	                  |j
                  | j                     d       d| j                  _        | j	                  |j
                  | j                     d       d| j                  _        | j	                  |j
                  | j                     d       t        j                  | j                        }ddg| j                  _        t        j                  d      t        j                  dd	g      z   }| j                  |j
                  | j                     j                         |       t        j                  | j                        }d
dg| j                  _        | j	                  |j
                  | j                     d       t        j                  | j                        }ddgddgg| j                  _        t        j                  d      t        j                  g d      z   }| j                  |j
                  | j                     j                         |       y)zTest gradient for log.
        r   r/   r   UUUUUU?r    Nr   r         ?&.r   r   )r   r/   r   r   )rF   r   r   r%   rH   r'   r   r#   ro   r   r&   r(   r   r   s      r   test_logzTestGrad.test_log  s    vvdff~tyy0%8tyy0%8tyy0$7vvdff~1vhhv#s!44##DIIdff$5$=$=$?Evvdff~qztyy0$7vvdff~AA'hhv);!<<##DIIdff$5$=$=$?Er   c                    t        j                  | j                        }d| j                  _        | j	                  |j
                  | j                     d       d| j                  _        | j	                  |j
                  | j                     d       d| j                  _        | j	                  |j
                  | j                     d       t        j                  | j                        }ddg| j                  _        t        j                  d      t        j                  dd	g      z   }| j                  |j
                  | j                     j                         |       t        j                  | j                        }d
dg| j                  _        | j	                  |j
                  | j                     d       t        j                  | j                        }ddgddgg| j                  _        t        j                  d      t        j                  g d      z   }| j                  |j
                  | j                     j                         |       y)zTest domain for log1p.
        r   r   r   r   r    Nr   r   皙?g0D   r   r   )r/   r   r   r   )rF   log1pr   r%   rH   r'   r   r#   ro   r   r&   r(   r   r   s      r   
test_log1pzTestGrad.test_log1p  s    xxtyy0%8tyy0%8tyy0$7xx1vhhv#s!44##DIIdff$5$=$=$?Exx|tyy0$7xxAA'hhv)=!>>##DIIdff$5$=$=$?Er   c                 l   t        j                  | j                        }d| j                  _        | j	                  |j
                  | j                     t        j                  d       dz
         d| j                  _        | j	                  |j
                  | j                     t        j                  d      dz           d| j                  _        | j	                  |j
                  | j                     d       t        j                  | j                        }ddg| j                  _        t        j                  d      t        j                  t        j                  ddg      dz          z   }| j                  |j
                  | j                     j                         |       t        j                  | j                        }ddg| j                  _        | j	                  |j
                  | j                     d       t        j                  | j                        }ddgddgg| j                  _        t        j                  d	      t        j                  t        j                  g d
      dz          z   }| j                  |j
                  | j                     j                         |       y)zTest domain for entr.
        r   r   r   r    Nr   r   r   r   r   r   r   r   )rF   entrr   r%   rH   r'   r#   r   r   ro   r   r&   r(   r   r   s      r   	test_entrzTestGrad.test_entr   s    wwtvvtyy0266!9*q.Atyy0BFF1IM2BCtyy0$7wwtvv1vhhv2661a&>A+=)>!??##DIIdff$5$=$=$?Ewwtvvqztyy0$7wwtvvAA'hhv266,+?!+C)D!EE##DIIdff$5$=$=$?Er   c                    t        j                  | j                        }d| j                  _        | j	                  |j
                  | j                     t        j                  d             d| j                  _        | j	                  |j
                  | j                     t        j                  d             d| j                  _        | j	                  |j
                  | j                     t        j                  d             t        j                  | j                        }ddg| j                  _        t        j                  d      t        j                  t        j                  ddg            z   }| j                  |j
                  | j                     j                         |       t        j                  | j                        }ddg| j                  _        t        j                  d      t        j                  t        j                  ddg            z   }| j                  |j
                  | j                     j                         |       t        j                  | j                        }ddgddgg| j                  _        t        j                  d      t        j                  t        j                  g d	            z   }| j                  |j
                  | j                     j                         |       y
)zTest domain for exp.
        r   r   r    r   r   r   r   r   r   N)rF   r]   r   r%   rH   r'   r#   r   ro   r   r&   r(   r   r   s      r   test_expzTestGrad.test_exp  s    vvdff~tyy0"&&)<tyy0"&&)<tyy0"&&*=vvdff~1vhhvA!88##DIIdff$5$=$=$?Evvdff~qzhhv
);!<<##DIIdff$5$=$=$?Evvdff~AA'hhv)=!>>##DIIdff$5$=$=$?Er   c           	      F   t        j                  | j                        }d| j                  _        | j	                  |j
                  | j                     t        j                  d      dt        j                  d      z   z         d| j                  _        | j	                  |j
                  | j                     t        j                  d      dt        j                  d      z   z         d| j                  _        | j	                  |j
                  | j                     t        j                  d      dt        j                  d      z   z         t        j                  | j                        }ddg| j                  _        t        j                  d      t        j                  t        j                  ddg      dt        j                  ddg      z   z        z   }| j                  |j
                  | j                     j                         |       t        j                  | j                        }ddg| j                  _        t        j                  d      t        j                  t        j                  ddg      dt        j                  ddg      z   z        z   }| j                  |j
                  | j                     j                         |       t        j                  | j                        }ddgddgg| j                  _        t        j                  d      t        j                  t        j                  g d	      dt        j                  g d	      z   z        z   }| j                  |j
                  | j                     j                         |       y
)z"Test domain for logistic.
        r   r   r   r    r   r   r   r   r   N)rF   logisticr   r%   rH   r'   r#   r]   r   ro   r   r&   r(   r   r   s      r   test_logisticzTestGrad.test_logistic7  sm    {{466"tyy0"&&)Qrvvay[2IJtyy0"&&)Qrvvay[2IJtyy0"&&*ar
l2KL{{466"1vhhvA2661a&>9I)J!KK##DIIdff$5$=$=$?E{{466"qzhhv
);Qrvvuaj?Q=Q)R!SS##DIIdff$5$=$=$?E{{466"AA'hhv)=qAU?U)V!WW##DIIdff$5$=$=$?Er   c                 p   t        j                  | j                        }d| j                  _        | j	                  |j
                  | j                     d       t        j                  | j                  d      }d| j                  _        | j	                  |j
                  | j                     d       d| j                  _        | j	                  |j
                  | j                     d       t        j                  | j                        }ddg| j                  _        t        j                  d      t        j                  ddg      z   }| j                  |j
                  | j                     j                         |       t        j                  | j                        }ddg| j                  _        t        j                  d      t        j                  d	dg      z   }| j                  |j
                  | j                     j                         |       t        j                  | j                  d      }d
dgddgg| j                  _        t        j                  d      t        j                  g d      z   }| j                  |j
                  | j                     j                         |       y)zTest domain for huber.
        r   )Mr   r   r    r   r   r   r   r   r   )r   r   rl   rl   N)rF   huberr   r%   rH   r'   r   r#   ro   r   r&   r(   r   r   s      r   
test_huberzTestGrad.test_huberS  s    xxtyy0!4xx!$tyy0!4tyy0"5xx1vhhv!Q0##DIIdff$5$=$=$?Exxqzhhv!Q0##DIIdff$5$=$=$?Exx!$AA'hhv!66##DIIdff$5$=$=$?Er   c                 	   t               }t        j                  | j                  |      }d| j                  _        d|_        | j                  |j                  | j                     t        j                  d             | j                  |j                  |   d       d| j                  _        d|_        | j                  |j                  | j                     d       | j                  |j                  |   d       d| j                  _        d|_        | j                  |j                  | j                     d       | j                  |j                  |   d       t        d      }t        j                  | j                  |      }ddg| j                  _        dd	g|_        t        j                  d
      t        j                  t        j                  ddg      t        j                  dd	g      z
        z   }| j                  |j                  | j                     j                         |       t        j                  d
      t        j                  ddg      z   }| j                  |j                  |   j                         |       t        j                  | j                  |      }ddg| j                  _        ddg|_        | j                  |j                  | j                     d       | j                  |j                  |   d       t        j                  | j                  | j                        }ddgddgg| j                  _        ddgddgg| j                  _        | j                  j                  | j                  j                  z  j!                  d      }t        j                  d      t        j                  t        j                  |            z   }| j                  |j                  | j                     j                         |       t        j                  d      t        j                  d|z
        z   }| j                  |j                  | j                     j                         |       y)z Test domain for kl_div.
        r   r   r/   r   r   Nr    rw   rx   r   g?r   r         @ffffff@r4   r5   r   )r   rF   kl_divr   r%   rH   r'   r#   r   r   ro   r   r&   r(   r   r   r9   r   br)   r   rW   divs         r   test_kl_divzTestGrad.test_kl_divp  s7    Jyy#tyy0"&&+>tyy|Y7tyy0$7tyy|T2tyy0$7tyy|T2QKyy#1va&hhvA"&&!Q.)H!II##DIIdff$5$=$=$?Ehhv'7);!<<##DIIaL$8$8$:C@yy#qza&tyy0$7tyy|T2yy(AA'Ac
+vv||DFFLL(//c/:hhv!55##DIIdff$5$=$=$?EhhvS!11##DIIdff$5$=$=$?Er   c                 	   t               }t        j                  | j                  |      }d| j                  _        d|_        | j                  |j                  | j                     t        j                  d      dz          | j                  |j                  |   d       d| j                  _        d|_        | j                  |j                  | j                     d       | j                  |j                  |   d       d	| j                  _        d|_        | j                  |j                  | j                     d       | j                  |j                  |   d       t        d      }t        j                  | j                  |      }ddg| j                  _        d
dg|_        t        j                  d      t        j                  t        j                  ddg      t        j                  d
dg      z
  dz         z   }| j                  |j                  | j                     j                         |       t        j                  d      t        j                  ddg      z   }| j                  |j                  |   j                         |       t        j                  | j                  |      }ddg| j                  _        ddg|_        | j                  |j                  | j                     d       | j                  |j                  |   d       t        j                  | j                  | j                        }ddgddgg| j                  _        d
dgddgg| j                  _        | j                  j                  | j                  j                  z  j!                  d      }t        j                  d      t        j                  t        j                  |      dz         z   }| j                  |j                  | j                     j                         |       t        j                  d      t        j                  |       z   }| j                  |j                  | j                     j                         |       y)z"Test domain for rel_entr.
        r   r   r/   r   r2   r   r   Nr    rw   rx   r   r.   r   r   r   r4   r5   r   )r   rF   rel_entrr   r%   rH   r'   r#   r   r   ro   r   r&   r(   r   r   r9   r   s         r   test_rel_entrzTestGrad.test_rel_entr  sB    J{{4661%tyy0"&&-!2CDtyy|Y7tyy0$7tyy|T2tyy0$7tyy|T2QK{{4661%1va&hhvA"&&!Q.)H1)L!MM##DIIdff$5$=$=$?Ehhv'7);!<<##DIIaL$8$8$:C@{{4661%qza&tyy0$7tyy|T2{{466466*AA'Ac
+vv||dffll*111<hhvq!99##DIIdff$5$=$=$?Ehhv3/##DIIdff$5$=$=$?Er   c                 
   t               }t        j                  | j                  |      }d| j                  _        d|_        | j                  |j                  | j                     d       | j                  |j                  |   d       d| j                  _        d|_        | j                  |j                  | j                     d       | j                  |j                  |   d       d| j                  _        d|_        | j                  |j                  | j                     d       | j                  |j                  |   d       t        d      }t        j                  | j                  |      }ddg| j                  _        ddg|_        t        j                  d	      t        j                  ddg      z   }| j                  |j                  | j                     j                         |       t        j                  d	      t        j                  ddg      z   }| j                  |j                  |   j                         |       t        j                  | j                  |      }d
dg| j                  _        ddg|_        t        j                  d	      t        j                  ddg      z   }| j                  |j                  | j                     j                         |       t        j                  d	      t        j                  ddg      z   }| j                  |j                  |   j                         |       t        j                  | j                  | j                        }ddgddgg| j                  _        ddgddgg| j                  _        t        j                  d      t        j                  g d      z   }| j                  |j                  | j                     j                         |       t        j                  d      t        j                  g d      z   }| j                  |j                  | j                     j                         |       t        j                  | j                        }ddg| j                  _        t        j                  d	      }d|d<   | j                  |j                  | j                     j                         |       t        j                  | j                  dddf   d      }ddg| j                  _        t        j                   d      }| j                  |j                  | j                     j                         |       y)z!Test domain for maximum.
        r   r   r   r   r   r    rw   r"   r   r   r   r   )r   r   r   r   rg   )r   r   Nr0   )r   rF   maximumr   r%   rH   r'   r   r#   ro   r   r&   r(   r   r   cummaxrI   r   r   r)   r   rW   s        r   test_maximumzTestGrad.test_maximum  s    Jzz$&&!$tyy0!4tyy|Q/tyy0!4tyy|Q/tyy0!4tyy|Q/QKzz$&&!$1vb'hhv!Q0##DIIdff$5$=$=$?Ehhv!Q0##DIIaL$8$8$:C@zz$&&!$qza&hhv!Q0##DIIdff$5$=$=$?Ehhv!Q0##DIIaL$8$8$:C@zz$&&$&&)AA'AC)hhv!66##DIIdff$5$=$=$?Ehhv!66##DIIdff$5$=$=$?E yy 1vhhvD	##DIIdff$5$=$=$?Eyy4q11vffQi##DIIdff$5$=$=$?Er   c                    t               }t        j                  | j                  |      }d| j                  _        d|_        | j                  |j                  | j                     d       | j                  |j                  |   d       d| j                  _        d|_        | j                  |j                  | j                     d       | j                  |j                  |   d       d| j                  _        d|_        | j                  |j                  | j                     d       | j                  |j                  |   d       t        d      }t        j                  | j                  |      }ddg| j                  _        ddg|_        t        j                  d	      t        j                  ddg      z   }| j                  |j                  | j                     j                         |       t        j                  d	      t        j                  ddg      z   }| j                  |j                  |   j                         |       t        j                  | j                  |      }d
dg| j                  _        ddg|_        t        j                  d	      t        j                  ddg      z   }| j                  |j                  | j                     j                         |       t        j                  d	      t        j                  ddg      z   }| j                  |j                  |   j                         |       t        j                  | j                  | j                        }ddgddgg| j                  _        ddgddgg| j                  _        t        j                  d      t        j                  g d      z   }| j                  |j                  | j                     j                         |       t        j                  d      t        j                  g d      z   }| j                  |j                  | j                     j                         |       y)z!Test domain for minimum.
        r   r   r   r   r   r    rw   r"   r   r   r   r   r   r   N)r   rF   minimumr   r%   rH   r'   r   r#   ro   r   r&   r(   r   r   r   s        r   test_minimumzTestGrad.test_minimum  s/    Jzz$&&!$tyy0!4tyy|Q/tyy0!4tyy|Q/tyy0!4tyy|Q/QKzz$&&!$1vb'hhv!Q0##DIIdff$5$=$=$?Ehhv!Q0##DIIaL$8$8$:C@zz$&&!$qza&hhv!Q0##DIIdff$5$=$=$?Ehhv!Q0##DIIaL$8$8$:C@zz$&&$&&)AA'AC)hhv!66##DIIdff$5$=$=$?Ehhv!66##DIIdff$5$=$=$?Er   c                    t        j                  | j                        }d| j                  _        | j	                  |j
                  | j                     dt        j                  d      z         d| j                  _        | j	                  |j
                  | j                     dt        j                  d      z         d| j                  _        | j	                  |j
                  | j                     d       | j                  dz  }ddg| j                  _        | j                  |j
                  | j                     j                         t        j                  ddgdd	gg             | j                  dz  }d
dg| j                  _        | j                  |j
                  | j                     j                         t        j                  ddgdd	gg             | j                  dz  }ddgddgg| j                  _        t        j                  d      t        j                  g d      z   }| j                  |j
                  | j                     j                         |       | j                  dz  }| j	                  |j
                  | j                     d       | j                  dz  }| j                  |j
                  | j                     j                         t        j                  d             y)zTest grad for power.
        r   r/   r   r    Nr      r   0   r   r   r   r   )r   rE   rl   rx   r   )rF   rc   r   r%   rH   r'   r#   r   r&   r(   r$   r   ro   r   r   s      r   
test_powerzTestGrad.test_power.  s-    wwtvvtyy0#bggaj.Atyy0#bggaj.Atyy0$7{1v##DIIdff$5$=$=$?$&HHr1g2w-?$@	B {qz##DIIdff$5$=$=$?Aq6TUWYSZJ[A\]{B!Q(hhv!77##DIIdff$5$=$=$?E {tyy0!4{##DIIdff$5$=$=$?&AQRr   c                    t        | j                  dz        t        t        j                  | j                              fD ]  }t        || j                  | j                  z   ddgk\  g      }t        || j                  | j                  gt        j                        }d| j                  _	        d| j                  _	        |j                  }| j                  || j                     d       | j                  || j                     d       d| j                  _	        ddg| j                  _	        |j                  }| j                  || j                     d       | j                  || j                     d       d| j                  _	        ddg| j                  _	        |j                  }| j                  || j                     |j                  d	   j                  | j                            | j                  || j                     j                         g d
       t        || j                  gt        j                        }d| j                  _	        |j                  }| j                  || j                     |j                  d	   j                  | j                     d	z          t        || j                  | j                  z   ddgk\  | j                  d	k(  g      }|j                  t        j                         |j                   d	   j"                  d	   j                  }t        || j                  gt        j                        }d	d	g| j                  _	        |j                  }| j                  || j                     j                         |       t        || j                  | j                  gt        j                        }|j                  }| j                  |i         y)zBTest grad for partial minimization/maximization problems.
        r    rw   rx   )dont_opt_varsr   Nr=   r   r-   r   )r   r   r   r   )opt_varsr   r   )r   r   r   rF   r   r   r   r	   CLARABELr%   r'   rH   argsr&   r(   r   r   dual_variables)r   objr   r)   r'   fix_probdual_vals          r   test_partial_problemzTestGrad.test_partial_problemP  s    dffr\*HRWWTVV_,EF (	-C3$&&QF!: ;<D#D8HQSQ\Q\]DDFFLDFFL99D""4<6""4<6DFFLq6DFFL99D""4<6""4<6DFFL8DFFL99D""4<!1A1A$&&1IJ''TVV(<(<(>M $DDFF8BKKPDDFFL99D""4<!1A1A$&&1IA1MN sTVVdff_A%>!$LMHNN"++N.++A.==a@FFH#DDFF8BKKPDq6DFFL99D''TVV(<(<(>I $DDFFDFF3CBKKXD99D""4,Q(	-r   c                    | j                    }d| j                   _        | j                  |j                  | j                      d       d| j                   z  }d| j                   _        | j                  |j                  | j                      d       | j                   dz  }d| j                   _        | j                  |j                  | j                      d       | j                   }ddg| j                  _        t        j                  d      t        j                  ddg      z
  }| j                  |j                  | j                     j                         |       | j                   }ddgddgg| j                  _        t        j                  d      t        j                  g d	      z
  }| j                  |j                  | j                     j                         |       | j                  d
   }ddgddgg| j                  _        t        j                  d      }d|d<   | j                  |j                  | j                     j                         |       t        d      }t        j                  | j                  |g      }ddg| j                  _        g d|_        t        j                  d      }t        j                  d      |ddddf<   | j                  |j                  | j                     j                         |       t        j                  d      }t        j                  d      |ddddf<   | j                  |j                  |   j                         |       t        j                  | j                        }ddg| j                  _        t        j                   d      }d|d<   | j                  |j                  | j                     j                         |       t        j                  | j                  dddf   d      }ddg| j                  _        t        j                  d      }| j                  |j                  | j                     j                         |       y)z$Test grad for affine atoms.
        r   r    r/   r   r   r   r   r   )r   r   r   r   )r   r   )r   r   r   r   r   )r   rw   Nr   )r   rw   )r   r   r0   )r   r%   rH   r'   r   r#   ro   r   r&   r(   r   r   rF   hstackrI   cumsumones)r   r)   rW   zs       r   test_affinezTestGrad.test_affine}  sL    wtyy0"5xtyy0!4vvaxtyy0#6y1vhhv!Q0##DIIdff$5$=$=$?EyAA'hhv!66##DIIdff$5$=$=$?Evvd|AA'hhvA##DIIdff$5$=$=$?EQKyy$&&!%1vhhvffQiAqsF##DIIdff$5$=$=$?EhhvVVAYAqrE
##DIIaL$8$8$:C@ yy 1vggfoD	##DIIdff$5$=$=$?Eyy4q11vffQi##DIIdff$5$=$=$?Er   c           	         dD ]  }| j                  |      5  t        j                  d|dz         }t        j                  d|dz          }t        j                  ||      }t        j                  ||      }||z  }|j
                  |   }|j
                  |   }|j                  J |j                  J |dk(  r[|j                  dk(  sJ |j                  dk(  sJ | j                  ||j                         | j                  ||j                         n|j                  |dfk(  sJ |j                  |dfk(  sJ | j                  |j                         |j                  j                  dd             | j                  |j                         |j                  j                  dd             ddd        y# 1 sw Y   xY w)z#Test grad for bilinear expressions.r   )r   r   r%   N r    )subTestr#   arangerF   r   r'   r%   shaperH   r&   r(   r   )	r   r   x_valsy_valsr   r   r)   grad_xgrad_ys	            r   test_bilinearzTestGrad.test_bilinear  s    	ZA" Z1a!e,))Aq1u--KK0KK0 1u11ww***ww***6!<<2---!<<2---**6177;**6177;!<<Aq6111!<<Aq6111//0@!''//RTVWBXY//0@!''//RTVWBXY3Z Z	ZZ Zs   FG  G
	c                 N   t        j                  ddgddgg      }t        j                  ddgddgg      }t        j                  d|      }t        j                  d|      }||z  }|j                  |   }|j                  |   }|j
                  J |j
                  J t        j                  g dg d	g d
g dg      }t        j                  g dg dg dg dg      }	| j                  |j                         |       | j                  |j                         |	       y)zTest matrix-matrix product.r   r    r   r   r   r   N)              r=   r  )r  r  r  r=   )rB   r  rA   r  )r  rB   r  rA   )r=   rA   r  r  )r  rB   r  r  )r  r  r=   rA   )r  r  r  rB   )r#   r$   rF   r   r'   r%   r&   r(   )
r   r   r   r   r   r)   r   r   expected_grad_xexpected_grad_ys
             r   test_matrix_productzTestGrad.test_matrix_product  s   Ar7QG,-B7RG,-KKf-KKf-1u11ww"""ww""" (($8#7#7#7$9 : (($8#7#7#7$9 :
 	##FNN$4oF##FNN$4oFr   )returnN)$__name__
__module____qualname____doc__r   r+   rZ   r`   re   rj   rp   ru   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r   r      s    +	,[l8\Z$8$OS2UA2:8"&HP*O	OO2F(BTF6F6F6F8F8F:*FX*FX7Fr+FZ SD+-Z5FnZ<Gr   r   )r
  numpyr#   cvxpyrF   r   r   r   cvxpy.expressions.variabler   cvxpy.tests.base_testr   cvxpy.transformsr   !cvxpy.transforms.partial_optimizer	   r   r   r   r   <module>r     s4       - - / * & >NGx NGr   