Пример #1
0
    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))
Пример #2
0
 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')
Пример #3
0
 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')
Пример #4
0
 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')
Пример #5
0
 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')
Пример #6
0
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
Пример #7
0
 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')
Пример #8
0
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
Пример #9
0
    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))