8000 add tests for AMPL hess, hprod and ghivprod. · lambe/NLP.py@6e9669a · GitHub
[go: up one dir, main page]

Skip to content

Commit 6e9669a

Browse files
committed
add tests for AMPL hess, hprod and ghivprod.
1 parent 41be492 commit 6e9669a

File tree

2 files changed

+78
-21
lines changed

2 files changed

+78
-21
lines changed

tests/model/helper.py

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ def __init__(self):
6969
[0., 0.]])
7070
v = np.arange(1, self.expected_H_lag.shape[0] + 1, dtype=np.float)
7171
self.expected_Hv = np.dot(self.expected_H_lag, v)
72+
self.expected_gHiv = np.array([-60]) # g = -v
7273
self.expected_J = np.array([[40., 4.]])
7374
self.expected_Jv = np.dot(self.expected_J, v)
7475
w = 2 * np.ones(self.expected_J.shape[0])
@@ -96,6 +97,7 @@ def __init__(self):
9697
[-0.00968672, -0.00978653]])
9798
v = np.arange(1, self.expected_H_lag.shape[0] + 1, dtype=np.float)
9899
self.expected_Hv = np.dot(self.expected_H_lag, v)
100+
self.expected_gHiv = np.array([0.]) # g = -v
99101
self.expected_J = np.array([[4., -3.]])
100102
self.expected_A = np.array([[4., -3.]])
101103
self.expected_Jv = np.dot(self.expected_J, v)
@@ -119,6 +121,7 @@ def __init__(self):
119121
[-2., 2.]])
120122
v = np.arange(1, self.expected_H_lag.shape[0] + 1, dtype=np.float)
121123
self.expected_Hv = np.dot(self.expected_H_lag, v)
124+
self.expected_gHiv = np.array([5.]) # g = -v
122125
self.expected_J = np.array([[2., -2.]])
123126
self.expected_Jv = np.dot(self.expected_J, v)
124127
w = 2 * np.ones(self.expected_J.shape[0])
@@ -138,6 +141,7 @@ def __init__(self):
138141
[0., 0., 0.]])
139142
v = np.arange(1, self.expected_H_lag.shape[0] + 1, dtype=np.float)
140143
self.expected_Hv = np.dot(self.expected_H_lag, v)
144+
self.expected_gHiv = np.array([6.]) # g = -v
141145
self.expected_J = np.array([[2., -2., -1]])
142146
self.expected_Jv = np.dot(self.expected_J, v)
143147
w = 2 * np.ones(self.expected_J.shape[0])
@@ -155,6 +159,7 @@ def __init__(self):
155159
self.expected_H_lag = np.zeros([2, 2])
156160
v = np.arange(1, self.expected_H_lag.shape[0] + 1, dtype=np.float)
157161
self.expected_Hv = np.dot(self.expected_H_lag, v)
162+
self.expected_gHiv = np.array([0.]) # g = -v
158163
self.expected_J = np.array([[1. / 200, 1. / 140]])
159164
self.expected_Jv = np.dot(self.expected_J, v)
160165
w = 2 * np.ones(self.expected_J.shape[0])
@@ -183,11 +188,15 @@ def test_model(self):
183188

184189
if self.model.m > 0:
185190
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)
187193
assert(np.allclose(A, data.expected_A))
188194
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)
190197

198+
if gHiv is not None:
199+
assert(np.allclose(gHiv, data.expected_gHiv))
191200
assert(np.allclose(J, data.expected_J))
192201
assert(np.allclose(Jv, data.expected_Jv))
193202
assert(np.allclose(JTw, data.expected_JTw))
@@ -196,8 +205,6 @@ def test_model(self):
196205

197206
assert(np.allclose(g, data.expected_g))
198207
assert(np.allclose(H_lag, data.expected_H_lag))
199-
print H
200-
print data.expected_H
201208
assert(np.allclose(H, data.expected_H))
202209
assert(np.allclose(Hv, data.expected_Hv))
203210

@@ -243,15 +250,19 @@ def get_derivatives_plain(model):
243250
v = np.arange(1, model.nvar + 1, dtype=np.float)
244251
Hv = model.hprod(model.x0, model.pi0, v)
245252
if model.m > 0:
253+
try:
254+
gHiv = model.ghivprod(model.x0, -v, v)
255+
except NotImplementedError:
256+
gHiv = None
246257
J = model.jac(model.x0)
247258
Jop = model.jop(model.x0)
248259
Jv = Jop * v
249260
w = 2 * np.ones(model.ncon)
250261
JTw = Jop.T * w
251262
if model.nlin > 0:
252263
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)
255266
else:
256267
return (g, H_lag, H, Hv)
257268

@@ -260,23 +271,30 @@ def get_derivatives_coord(model):
260271
g = model.grad(model.x0)
261272

262273
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)
264276
H = ndarray_from_coord(model.nvar, model.nvar,
265-
*model.hess(model.x0), symmetric=True)
277+
*model.hess(model.x0),
278+
symmetric=True)
266279
v = np.arange(1, model.nvar + 1, dtype=np.float)
267280
Hv = model.hprod(model.x0, model.pi0, v)
268281
if model.m > 0:
282+
try:
283+
gHiv = model.ghivprod(model.x0, -v, v)
284+
except NotImplementedError:
285+
gHiv = None
269286
J = ndarray_from_coord(model.ncon, model.nvar,
270-
*model.jac(model.x0), symmetric=False)
287+
*model.jac(model.x0),
288+
symmetric=False)
271289
Jop = model.jop(model.x0)
272290
Jv = Jop * v
273291
w = 2 * np.ones(model.ncon)
274292
JTw = Jop.T * w
275293
if model.nlin > 0:
276294
A = ndarray_from_coord(model.nlin, model.nvar,
277295
*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)
280298
else:
281299
return (g, H_lag, H, Hv)
282300

@@ -288,15 +306,19 @@ def get_derivatives_llmat(model):
288306
v = np.arange(1, model.nvar + 1, dtype=np.float)
289307
Hv = model.hprod(model.x0, model.pi0, v)
290308
if model.m > 0:
309+
try:
310+
gHiv = model.ghivprod(model.x0, -v, v)
311+
except NotImplementedError:
312+
gHiv = None
291313
J = ndarray_from_ll_mat(model.jac(model.x0))
292314
Jop = model.jop(model.x0)
293315
Jv = Jop * v
294316
w = 2 * np.ones(model.ncon)
295317
JTw = Jop.T * w
296318
if model.nlin > 0:
297319
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)
300322
else:
301323
return (g, H_lag, H, Hv)
302324

@@ -308,15 +330,19 @@ def get_derivatives_scipy(model):
308330
v = np.arange(1, model.nvar + 1, dtype=np.float)
309331
Hv = model.hprod(model.x0, model.pi0, v)
310332
if model.m > 0:
333+
try:
334+
gHiv = model.ghivprod(model.x0, -v, v)
335+
except NotImplementedError:
336+
gHiv = None
311337
J = model.jac(model.x0).todense()
312338
Jop = model.jop(model.x0)
313339
Jv = Jop * v
314340
w = 2 * np.ones(model.ncon)
315341
JTw = Jop.T * w
316342
if model.nlin > 0:
317343
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)
320346
else:
321347
return (g, H_lag, H, Hv)
322348

tests/model/test_amplmodel.py

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
"""Tests relative to problems modeled with AMPL."""
22

33
from unittest import TestCase
4-
from helper import *
54
import numpy as np
5+
from helper import *
66
import os
77
import pytest
88
from nlp.tools.dercheck import DerivativeChecker
@@ -12,7 +12,7 @@
1212
this_path = os.path.dirname(os.path.realpath(__file__))
1313

1414

15-
class Test_AmplRosenbrock(TestCase, Rosenbrock): # Test def'd in Rosenbrock
15+
class Test_AmplRosenbrock(TestCase, Rosenbrock): # Test also def'd in Rosenbrock
1616

1717
def get_derivatives(self, model):
1818
return get_derivatives_coord(model)
@@ -22,8 +22,25 @@ def setUp(self):
2222
model = os.path.join(this_path, 'rosenbrock.nl')
2323
self.model = AmplModel(model) # x0 = (-1, ..., -1)
2424

25+
def test_ampl_hessian_issue(self):
26+
data = self.get_expected()
27+
model = self.model
28+
29+
# Trying to trick AMPL.
30+
f = model.obj(np.zeros(self.model.n))
31+
H_lag = ndarray_from_coord(model.nvar, model.nvar,
32+
*model.hess(model.x0, model.pi0),
33+
symmetric=True)
34+
assert np.allclose(H_lag, data.expected_H_lag)
35+
36+
# Trying to trick AMPL.
37+
f = model.obj(np.zeros(self.model.n))
38+
v = np.arange(1, model.nvar + 1, dtype=np.float)
39+
Hv = model.hprod(model.x0, model.pi0, v)
40+
assert np.allclose(Hv, data.expected_Hv)
41+
2542

26-
class Test_AmplHS7(TestCase, Hs7): # Test defined in Hs7
43+
class Test_AmplHS7(TestCase, Hs7): # Test also defined in Hs7
2744

2845
def get_derivatives(self, model):
2946
return get_derivatives_coord(model)
@@ -35,7 +52,7 @@ def setUp(self):
3552
self.model.pi0 = np.ones(1)
3653

3754

38-
class Test_AmplMaxProfit(TestCase, MaxProfit): # Test defined in MaxProfit
55+
class Test_AmplMaxProfit(TestCase, MaxProfit): # Test also defined in MaxProfit
3956

4057
def get_derivatives(self, model):
4158
return get_derivatives_coord(model)
@@ -357,7 +374,6 @@ def setUp(self):
357374
def test_lp(self):
358375
model = self.model
359376
assert model.islp() is True
360-
361377
assert np.allclose(model.cost().to_array(), np.array([1., 0.]))
362378
print model.display_basic_info()
363379

@@ -400,6 +416,18 @@ def test_obj_scaling(self):
400416
for j in xrange(model.ncon):
401417
assert (len(dcheck.chess_errs[j]) == 0)
402418

419+
def test_icons(self):
420+
model = self.model
421+
cons = np.array([0.])
422+
for j in range(model.ncon):
423+
assert np.allclose(model.icons(j, model.x0), cons[j])
424+
425+
def test_irow(self):
426+
model = self.model
427+
A = np.array([[1., 2.]])
428+
for j in range(model.ncon):
429+
assert np.allclose(model.irow(j).to_array(), A[j, :])
430+
403431
def test_cons_scaling(self):
404432
model = self.model
405433
log = config_logger("nlp.der",
@@ -414,7 +442,10 @@ def test_cons_scaling(self):
414442

415443
model.compute_scaling_cons(g_max=2.)
416444
assert np.allclose(model.scale_con, np.array([1.]))
417-
assert np.allclose(model.cons(model.x0), np.array([0.]))
445+
cons = np.array([0.])
446+
for j in range(model.ncon):
447+
assert np.allclose(model.icons(j, model.x0), cons[j])
448+
assert np.allclose(model.cons(model.x0), cons)
418449
assert np.allclose(model.jop(model.x0).to_array(),
419450
np.array([[1., 2.]]))
420451
assert np.allclose(ndarray_from_coord(model.ncon, model.nvar,

0 commit comments

Comments
 (0)
0