def runTest(self): n = 2 npt = (n + 1) * (n + 2) // 2 x0 = np.array([1.0, 1.0]) xl = -1e2 * np.ones((n, )) xu = 1e2 * np.ones((n, )) model = Model(npt, x0, objfun(x0), xl, xu, 1) x1 = x0 + np.array([1.0, 0.0]) model.change_point(1, x1 - model.xbase, objfun(x1)) x2 = x0 + np.array([0.1, 0.9]) model.change_point(2, x2 - model.xbase, objfun(x2)) x3 = x0 + np.array([-0.1, 0.0]) model.change_point(3, x3 - model.xbase, objfun(x3)) x4 = x0 + np.array([-0.1, 2.0]) model.change_point(4, x4 - model.xbase, objfun(x4)) x5 = x0 + np.array([-1.1, 1.0]) model.change_point(5, x5 - model.xbase, objfun(x5)) xopt = model.xopt() for i in range(npt): c, g, hess = model.lagrange_polynomial(i) # based at xopt for j in range(npt): dx = model.xpt(j) - xopt lag_value = c + model_value(g, hess, dx) expected_value = 1.0 if i == j else 0.0 self.assertAlmostEqual( lag_value, expected_value, msg="Lagrange for x%g has bad value at x%g" % (i, j))
def runTest(self): n = 3 g = np.array([1.0, 0.0, 1.0]) H = np.array([[1.0, 0.0, 0.0], [0.0, 2.0, 0.0], [0.0, 0.0, 2.0]]) Delta = 5.0 / 12.0 xopt = np.zeros((n, )) sl = -1e20 * np.ones((n, )) su = 1e20 * np.ones((n, )) d, gnew, crvmin = trsbox(xopt, g, H, sl, su, Delta) true_d = np.array([-1.0 / 3.0, 0.0, -0.25]) est_min = model_value(g, H, d) true_min = model_value(g, H, true_d) # Hope to get actual correct answer # self.assertTrue(np.all(d == true_d), 'Wrong answer') # self.assertAlmostEqual(est_min, true_min, 'Wrong min value') s_cauchy, red_cauchy, crvmin_cauchy = cauchy_pt(g, H, Delta) self.assertTrue(est_min <= red_cauchy, 'Cauchy reduction not achieved') self.assertTrue(np.all(gnew == g + H.dot(d)), 'Wrong gnew') self.assertAlmostEqual(crvmin, 0.0, 'Wrong crvmin')
def runTest(self): n = 3 g = np.array([0.0, 0.0, 1.0]) H = np.array([[-2.0, 0.0, 0.0], [0.0, -1.0, 0.0], [0.0, 0.0, -1.0]]) Delta = sqrt(2.0) hess = Hessian(n, vals=H) xopt = np.zeros((n,)) sl = -1e20 * np.ones((n,)) su = 1e20 * np.ones((n,)) d, gnew, crvmin = trsbox(xopt, g, hess, sl, su, Delta) true_d = np.array([1.0, 0.0, -1.0]) # non-unique solution est_min = model_value(g, hess, d) true_min = model_value(g, hess, true_d) # Hope to get actual correct answer # self.assertTrue(np.all(d == true_d), 'Wrong answer') # self.assertAlmostEqual(est_min, true_min, 'Wrong min value') s_cauchy, red_cauchy, crvmin_cauchy = cauchy_pt(g, hess, Delta) self.assertTrue(est_min <= red_cauchy, 'Cauchy reduction not achieved') self.assertTrue(np.all(gnew == g + hess.vec_mul(d)), 'Wrong gnew') self.assertAlmostEqual(crvmin, 0.0, 'Wrong crvmin')
def runTest(self): n = 3 g = np.array([1.0, 0.0, 1.0]) H = np.array([[1.0, 0.0, 0.0], [0.0, 2.0, 0.0], [0.0, 0.0, 2.0]]) Delta = 2.0 hess = Hessian(n, vals=H) xopt = np.ones((n, )) # trying nonzero (since bounds inactive) sl = -1e20 * np.ones((n, )) su = 1e20 * np.ones((n, )) d, gnew, crvmin = trsbox(xopt, g, hess, sl, su, Delta) true_d = np.array([-1.0, 0.0, -0.5]) est_min = model_value(g, hess, d) true_min = model_value(g, hess, true_d) # Hope to get actual correct answer for internal minimum? # self.assertTrue(np.all(d == true_d), 'Wrong answer') # self.assertAlmostEqual(est_min, true_min, 'Wrong min value') s_cauchy, red_cauchy, crvmin_cauchy = cauchy_pt(g, hess, Delta) self.assertTrue(est_min <= red_cauchy, 'Cauchy reduction not achieved') self.assertTrue(np.all(gnew == g + hess.vec_mul(d)), 'Wrong gnew') self.assertAlmostEqual(crvmin, -1.0, 'Wrong crvmin')
def runTest(self): n = 3 g = np.array([1.0, 0.0, 1.0]) H = np.array([[1.0, 0.0, 0.0], [0.0, 2.0, 0.0], [0.0, 0.0, 2.0]]) Delta = 5.0 / 12.0 hess = Hessian(n, vals=H) xopt = np.zeros((n,)) sl = xopt + np.array([-0.3, -0.01, -0.1]) su = xopt + np.array([10.0, 1.0, 10.0]) d, gnew, crvmin = trsbox(xopt, g, hess, sl, su, Delta) true_d = np.array([-1.0 / 3.0, 0.0, -0.25]) est_min = model_value(g, hess, d) true_min = model_value(g, hess, true_d) # Hope to get actual correct answer # self.assertTrue(np.all(d == true_d), 'Wrong answer') # self.assertAlmostEqual(est_min, true_min, 'Wrong min value') s_cauchy, red_cauchy, crvmin_cauchy = cauchy_pt_box(g, hess, Delta, sl - xopt, su - xopt) self.assertTrue(est_min <= red_cauchy, 'Cauchy reduction not achieved') self.assertTrue(np.max(np.abs(gnew - g - hess.vec_mul(d))) < 1e-10, 'Wrong gnew') print(crvmin) self.assertAlmostEqual(crvmin, -1.0, 'Wrong crvmin')
def cauchy_pt(g, hess, delta): # General expression for the Cauchy point crv = np.dot(g, hess.vec_mul(g)) gnorm = np.linalg.norm(g) if crv <= 0.0: alpha = delta / gnorm else: alpha = min(delta / gnorm, gnorm**2 / crv) s = -alpha * g red = model_value(g, hess, s) crvmin = np.dot(s, hess.vec_mul(s)) / np.dot(s, s) if crvmin < 0.0: crvmin = -1.0 return s, red, crvmin
def runTest(self): n = 3 g = np.array([1.0, 0.0, 1.0]) H = np.array([[1.0, 0.0, 0.0], [0.0, 2.0, 0.0], [0.0, 0.0, 2.0]]) Delta = 2.0 xopt = np.ones((n, )) # trying nonzero (since bounds inactive) sl = xopt + np.array([-0.5, -10.0, -10.0]) su = xopt + np.array([10.0, 10.0, 10.0]) d, gnew, crvmin = trsbox(xopt, g, H, sl, su, Delta) true_d = np.array([-1.0, 0.0, -0.5]) est_min = model_value(g, H, d) true_min = model_value(g, H, true_d) # Hope to get actual correct answer for internal minimum? # self.assertTrue(np.all(d == true_d), 'Wrong answer') # self.assertAlmostEqual(est_min, true_min, 'Wrong min value') s_cauchy, red_cauchy, crvmin_cauchy = cauchy_pt_box( g, H, Delta, sl - xopt, su - xopt) # print(s_cauchy) # print(d) self.assertTrue(est_min <= red_cauchy, 'Cauchy reduction not achieved') self.assertTrue(np.all(gnew == g + H.dot(d)), 'Wrong gnew') # print(crvmin) self.assertAlmostEqual(crvmin, -1.0, 'Wrong crvmin')
def cauchy_pt_box(g, hess, delta, lower, upper): # General expression for the Cauchy point, lower <= s <= upper crv = np.dot(g, hess.vec_mul(g)) gnorm = np.linalg.norm(g) if crv <= 0.0: alpha = delta / gnorm else: alpha = min(delta / gnorm, gnorm**2 / crv) # print("alpha = %g" % alpha) # Then cap with bounds: for i in range(len(g)): if g[i] > 0: # s[i] negative, will hit lower alpha = min(alpha, -lower[i] / g[i]) elif g[i] < 0: # s[i] positive, will hit upper alpha = min(alpha, -upper[i] / g[i]) # print("alpha = %g after i=%g" % (alpha, i)) s = -alpha * g red = model_value(g, hess, s) crvmin = np.dot(s, hess.vec_mul(s)) / np.dot(s, s) if crvmin < 0.0: crvmin = -1.0 return s, red, crvmin
def runTest(self): n = 2 npt = n + 1 x0 = np.array([-1.2, 1.0]) xl = -1e2 * np.ones((n, )) xu = 1e2 * np.ones((n, )) model = Model(npt, x0, rosenbrock(x0), xl, xu, 1) x1 = np.array([1.0, 0.9]) model.change_point(1, x1 - model.xbase, rosenbrock(x1)) x2 = np.array([2.0, 0.9]) model.change_point(2, x2 - model.xbase, rosenbrock(x2)) xopt = model.xopt() for i in range(npt): c, g, hess = model.lagrange_polynomial(i) # based at xopt for j in range(npt): dx = model.xpt(j) - xopt lag_value = c + model_value(g, hess, dx) expected_value = 1.0 if i == j else 0.0 self.assertAlmostEqual( lag_value, expected_value, msg="Lagrange for x%g has bad value at x%g" % (i, j))