@@ -69,6 +69,7 @@ def __init__(self):
69
69
[0. , 0. ]])
70
70
v = np .arange (1 , self .expected_H_lag .shape [0 ] + 1 , dtype = np .float )
71
71
self .expected_Hv = np .dot (self .expected_H_lag , v )
72
+ self .expected_gHiv = np .array ([- 60 ]) # g = -v
72
73
self .expected_J = np .array ([[40. , 4. ]])
73
74
self .expected_Jv = np .dot (self .expected_J , v )
74
75
w = 2 * np .ones (self .expected_J .shape [0 ])
@@ -96,6 +97,7 @@ def __init__(self):
96
97
[- 0.00968672 , - 0.00978653 ]])
97
98
v = np .arange (1 , self .expected_H_lag .shape [0 ] + 1 , dtype = np .float )
98
99
self .expected_Hv = np .dot (self .expected_H_lag , v )
100
+ self .expected_gHiv = np .array ([0. ]) # g = -v
99
101
self .expected_J = np .array ([[4. , - 3. ]])
100
102
self .expected_A = np .array ([[4. , - 3. ]])
101
103
self .expected_Jv = np .dot (self .expected_J , v )
@@ -119,6 +121,7 @@ def __init__(self):
119
121
[- 2. , 2. ]])
120
122
v = np .arange (1 , self .expected_H_lag .shape [0 ] + 1 , dtype = np .float )
121
123
self .expected_Hv = np .dot (self .expected_H_lag , v )
124
+ self .expected_gHiv = np .array ([5. ]) # g = -v
122
125
self .expected_J = np .array ([[2. , - 2. ]])
123
126
self .expected_Jv = np .dot (self .expected_J , v )
124
127
w = 2 * np .ones (self .expected_J .shape [0 ])
@@ -138,6 +141,7 @@ def __init__(self):
138
141
[0. , 0. , 0. ]])
139
142
v = np .arange (1 , self .expected_H_lag .shape [0 ] + 1 , dtype = np .float )
140
143
self .expected_Hv = np .dot (self .expected_H_lag , v )
144
+ self .expected_gHiv = np .array ([6. ]) # g = -v
141
145
self .expected_J = np .array ([[2. , - 2. , - 1 ]])
142
146
self .expected_Jv = np .dot (self .expected_J , v )
143
147
w = 2 * np .ones (self .expected_J .shape [0 ])
@@ -155,6 +159,7 @@ def __init__(self):
155
159
self .expected_H_lag = np .zeros ([2 , 2 ])
156
160
v = np .arange (1 , self .expected_H_lag .shape [0 ] + 1 , dtype = np .float )
157
161
self .expected_Hv = np .dot (self .expected_H_lag , v )
162
+ self .expected_gHiv = np .array ([0. ]) # g = -v
158
163
self .expected_J = np .array ([[1. / 200 , 1. / 140 ]])
159
164
self .expected_Jv = np .dot (self .expected_J , v )
160
165
w = 2 * np .ones (self .expected_J .shape [0 ])
@@ -183,11 +188,15 @@ def test_model(self):
183
188
184
189
if self .model .m > 0 :
185
190
if self .model .nlin > 0 :
186
- (g , H_lag , H , Hv , J , Jv , JTw , A ) = self .get_derivatives (self .model )
191
+ (g , H_lag , H , Hv , gHiv , J , Jv , JTw , A ) = \
192
+ self .get_derivatives (self .model )
187
193
assert (np .allclose (A , data .expected_A ))
188
194
else :
189
- (g , H_lag , H , Hv , J , Jv , JTw ) = self .get_derivatives (self .model )
195
+ (g , H_lag , H , Hv , gHiv , J , Jv , JTw ) = \
196
+ self .get_derivatives (self .model )
190
197
198
+ if gHiv is not None :
199
+ assert (np .allclose (gHiv , data .expected_gHiv ))
191
200
assert (np .allclose (J , data .expected_J ))
192
201
assert (np .allclose (Jv , data .expected_Jv ))
193
202
assert (np .allclose (JTw , data .expected_JTw ))
@@ -196,8 +205,6 @@ def test_model(self):
196
205
197
206
assert (np .allclose (g , data .expected_g ))
198
207
assert (np .allclose (H_lag , data .expected_H_lag ))
199
- print H
200
- print data .expected_H
201
208
assert (np .allclose (H , data .expected_H ))
202
209
assert (np .allclose (Hv , data .expected_Hv ))
203
210
@@ -243,15 +250,19 @@ def get_derivatives_plain(model):
243
250
v = np .arange (1 , model .nvar + 1 , dtype = np .float )
244
251
Hv = model .hprod (model .x0 , model .pi0 , v )
245
252
if model .m > 0 :
253
+ try :
254
+ gHiv = model .ghivprod (model .x0 , - v , v )
255
+ except NotImplementedError :
256
+ gHiv = None
246
257
J = model .jac (model .x0 )
247
258
Jop = model .jop (model .x0 )
248
259
Jv = Jop * v
249
260
w = 2 * np .ones (model .ncon )
250
261
JTw = Jop .T * w
251
262
if model .nlin > 0 :
252
263
A = model .A ()
253
- return (g , H_lag , H , Hv , J , Jv , JTw , A )
254
- return (g , H_lag , H , Hv , J , Jv , JTw )
264
+ return (g , H_lag , H , Hv , gHiv , J , Jv , JTw , A )
265
+ return (g , H_lag , H , Hv , gHiv , J , Jv , JTw )
255
266
else :
256
267
return (g , H_lag , H , Hv )
257
268
@@ -260,23 +271,30 @@ def get_derivatives_coord(model):
260
271
g = model .grad (model .x0 )
261
272
262
273
H_lag = ndarray_from_coord (model .nvar , model .nvar ,
263
- * model .hess (model .x0 , model .pi0 ), symmetric = True )
274
+ * model .hess (model .x0 , model .pi0 ),
275
+ symmetric = True )
264
276
H = ndarray_from_coord (model .nvar , model .nvar ,
265
- * model .hess (model .x0 ), symmetric = True )
277
+ * model .hess (model .x0 ),
278
+ symmetric = True )
266
279
v = np .arange (1 , model .nvar + 1 , dtype = np .float )
267
280
Hv = model .hprod (model .x0 , model .pi0 , v )
268
281
if model .m > 0 :
282
+ try :
283
+ gHiv = model .ghivprod (model .x0 , - v , v )
284
+ except NotImplementedError :
285
+ gHiv = None
269
286
J = ndarray_from_coord (model .ncon , model .nvar ,
270
- * model .jac (model .x0 ), symmetric = False )
287
+ * model .jac (model .x0 ),
288
+ symmetric = False )
271
289
Jop = model .jop (model .x0 )
272
290
Jv = Jop * v
273
291
w = 2 * np .ones (model .ncon )
274
292
JTw = Jop .T * w
275
293
if model .nlin > 0 :
276
294
A = ndarray_from_coord (model .nlin , model .nvar ,
277
295
* model .A (), symmetric = False )
278
- return (g , H_lag , H , Hv , J , Jv , JTw , A )
279
- return (g , H_lag , H , Hv , J , Jv , JTw )
296
+ return (g , H_lag , H , Hv , gHiv , J , Jv , JTw , A )
297
+ return (g , H_lag , H , Hv , gHiv , J , Jv , JTw )
280
298
else :
281
299
return (g , H_lag , H , Hv )
282
300
@@ -288,15 +306,19 @@ def get_derivatives_llmat(model):
288
306
v = np .arange (1 , model .nvar + 1 , dtype = np .float )
289
307
Hv = model .hprod (model .x0 , model .pi0 , v )
290
308
if model .m > 0 :
309
+ try :
310
+ gHiv = model .ghivprod (model .x0 , - v , v )
311
+ except NotImplementedError :
312
+ gHiv = None
291
313
J = ndarray_from_ll_mat (model .jac (model .x0 ))
292
314
Jop = model .jop (model .x0 )
293
315
Jv = Jop * v
294
316
w = 2 * np .ones (model .ncon )
295
317
JTw = Jop .T * w
296
318
if model .nlin > 0 :
297
319
A = ndarray_from_ll_mat (model .A ())
298
- return (g , H_lag , H , Hv , J , Jv , JTw , A )
299
- return (g , H_lag , H , Hv , J , Jv , JTw )
320
+ return (g , H_lag , H , Hv , gHiv , J , Jv , JTw , A )
321
+ return (g , H_lag , H , Hv , gHiv , J , Jv , JTw )
300
322
else :
301
323
return (g , H_lag , H , Hv )
302
324
@@ -308,15 +330,19 @@ def get_derivatives_scipy(model):
308
330
v = np .arange (1 , model .nvar + 1 , dtype = np .float )
309
331
Hv = model .hprod (model .x0 , model .pi0 , v )
310
332
if model .m > 0 :
333
+ try :
334
+ gHiv = model .ghivprod (model .x0 , - v , v )
335
+ except NotImplementedError :
336
+ gHiv = None
311
337
J = model .jac (model .x0 ).todense ()
312
338
Jop = model .jop (model .x0 )
313
339
Jv = Jop * v
314
340
w = 2 * np .ones (model .ncon )
315
341
JTw = Jop .T * w
316
342
if model .nlin > 0 :
317
343
A = model .A ().todense ()
318
- return (g , H_lag , H , Hv , J , Jv , JTw , A )
319
- return (g , H_lag , H , Hv , J , Jv , JTw )
344
+ return (g , H_lag , H , Hv , gHiv , J , Jv , JTw , A )
345
+ return (g , H_lag , H , Hv , gHiv , J , Jv , JTw )
320
346
else :
321
347
return (g , H_lag , H , Hv )
322
348
0 commit comments