@@ -129,3 +129,48 @@ def test_quad_form_composition_two(self):
129129 prob .solve (solver = cp .IPOPT , nlp = True , verbose = True )
130130 checker = DerivativeChecker (prob )
131131 checker .run_and_assert ()
132+
133+ def test_matmul_composition_one (self ):
134+ np .random .seed (0 )
135+ m , n , p = 5 , 7 , 11
136+ X = cp .Variable ((m , n ), bounds = [- 1 , 1 ], name = 'X' )
137+ Y = cp .Variable ((n , p ), bounds = [- 2 , 2 ], name = 'Y' )
138+ Y .value = np .random .rand (n , p )
139+ obj = cp .sum (cp .matmul (X , cp .cos (Y )))
140+ problem = cp .Problem (cp .Minimize (obj ))
141+ problem .solve (solver = cp .IPOPT , nlp = True , verbose = True )
142+ assert (problem .status == cp .OPTIMAL )
143+ checker = DerivativeChecker (problem )
144+ checker .run_and_assert ()
145+
146+ def test_matmul_composition_two (self ):
147+ np .random .seed (0 )
148+ m , n , p = 5 , 5 , 5
149+ X = cp .Variable ((m , n ), bounds = [- 1 , 1 ])
150+ Y = cp .Variable ((n , p ), bounds = [- 2 , 2 ])
151+ Y .value = np .random .rand (n , p )
152+ X .value = np .random .rand (m , n )
153+ obj = cp .sum (cp .matmul (cp .matmul (X , X ), cp .cos (Y ) + X ))
154+ problem = cp .Problem (cp .Minimize (obj ))
155+ checker = DerivativeChecker (problem )
156+ checker .run_and_assert ()
157+ problem .solve (solver = cp .IPOPT , nlp = True , verbose = True )
158+ assert (problem .status == cp .OPTIMAL )
159+ checker = DerivativeChecker (problem )
160+ checker .run_and_assert ()
161+
162+ def test_matmul_composition_three (self ):
163+ np .random .seed (0 )
164+ m , n , p = 5 , 5 , 5
165+ X = cp .Variable ((m , n ), bounds = [- 1 , 1 ], name = 'X' )
166+ Y = cp .Variable ((n , p ), bounds = [- 2 , 2 ], name = 'Y' )
167+ Y .value = np .random .rand (n , p )
168+ X .value = np .random .rand (m , n )
169+ obj = cp .sum (cp .matmul (cp .matmul (X , X .T ), (cp .cos (Y ) + X ).T ))
170+ problem = cp .Problem (cp .Minimize (obj ))
171+ checker = DerivativeChecker (problem )
172+ checker .run_and_assert ()
173+ problem .solve (solver = cp .IPOPT , nlp = True , verbose = True )
174+ assert (problem .status == cp .OPTIMAL )
175+ checker = DerivativeChecker (problem )
176+ checker .run_and_assert ()
0 commit comments