-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_BFGS.py
More file actions
112 lines (101 loc) · 5.83 KB
/
test_BFGS.py
File metadata and controls
112 lines (101 loc) · 5.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import unittest
import numpy as np
from Set import AffineSpace
from DifferentiableFunction import DifferentiableFunction
from BFGS import BFGS
class tests_BFGS(unittest.TestCase):
def test_BFGS1(self):
R = AffineSpace(1)
f = DifferentiableFunction(
name="x->x^2", domain=R, evaluate=lambda x: np.array([x[0]**2]), jacobian=lambda x: np.array([[2*x[0]]]))
bfgs = BFGS()
x = bfgs.Minimize(f, startingpoint=np.array([10.0]))
self.assertAlmostEqual(x.item(), 0, 2)
self.assertAlmostEqual(f.evaluate(x).item(), 0, 5)
def test_BFGS2(self):
R = AffineSpace(3)
f = DifferentiableFunction(
name="(x,y,z)->x^2+y^2+z^2", domain=R, evaluate=lambda x: np.array([x[0]**2+x[1]**2+x[2]**2]), jacobian=lambda x: np.array([[2*x[0], 2*x[1], 2*x[2]]]))
bfgs = BFGS()
x = bfgs.Minimize(f, startingpoint=np.array([10.0, 1, 0.1]))
self.assertAlmostEqual(np.linalg.norm(x), 0, 2)
self.assertAlmostEqual(f.evaluate(x).item(), 0, 5)
def test_BFGS3(self):
R = AffineSpace(1)
f = DifferentiableFunction(
name="x->x^4", domain=R, evaluate=lambda x: np.array([x[0]**4]), jacobian=lambda x: np.array([[4*x[0]**3]]))
bfgs = BFGS()
x = bfgs.Minimize(f, startingpoint=np.array([10.0]))
self.assertAlmostEqual(x.item(), 0, 1)
self.assertAlmostEqual(f.evaluate(x).item(), 0, 5)
def test_BFGS4(self):
R = AffineSpace(3)
f = DifferentiableFunction(
name="(x,y,z)->x^4+y^4+z^4", domain=R, evaluate=lambda x: np.array([x[0]**4+x[1]**4+x[2]**4]), jacobian=lambda x: np.array([[4*x[0]**3, 4*x[1]**3, 4*x[2]**3]]))
bfgs = BFGS()
x = bfgs.Minimize(f, startingpoint=np.array([10.0, 1, 0.1]))
self.assertAlmostEqual(np.linalg.norm(x), 0, 1)
self.assertAlmostEqual(f.evaluate(x).item(), 0, 5)
def test_BFGS5(self):
R = AffineSpace(3)
f = DifferentiableFunction(
name="(x,y,z)->1000*x^4+y^4+0.001*z^4", domain=R, evaluate=lambda x: np.array([1000*x[0]**4+x[1]**4+0.001*x[2]**4]), jacobian=lambda x: np.array([[4000*x[0]**3, 4*x[1]**3, 0.004*x[2]**3]]))
bfgs = BFGS()
x = bfgs.Minimize(f, startingpoint=np.array([10.0, 10.0, 10.0]))
self.assertAlmostEqual(np.linalg.norm(x), 0, None, "", 1.0)
self.assertAlmostEqual(f.evaluate(x).item(), 0, 2)
def test_BFGS6(self):
# Defining a function this way is ugly, as we need to do mannual computations. However, it should still work.
R = AffineSpace(2)
f = DifferentiableFunction(
name="Himmelblau", domain=R, evaluate=lambda x: np.array([(x[0]**2+x[1]-11)**2+(x[0]+x[1]**2-7)**2]), jacobian=lambda x: np.array([[4*(x[0]**2 + x[1] - 11)*x[0] + 2*x[1]**2 + 2*x[0] - 14, 2*x[0]**2 + 2*x[1] - 22 + 4*(x[1]**2 + x[0] - 7)*x[1]]]))
bfgs = BFGS()
x = bfgs.Minimize(f, startingpoint=np.array([10.0, 10.0]))
self.assertAlmostEqual(f.evaluate(x).item(), 0, 5)
x = bfgs.Minimize(f, startingpoint=np.array([1.0, 1.0]))
self.assertAlmostEqual(f.evaluate(x).item(), 0, 5)
x = bfgs.Minimize(f, startingpoint=np.array([-10.0, 10.0]))
self.assertAlmostEqual(f.evaluate(x).item(), 0, 5)
x = bfgs.Minimize(f, startingpoint=np.array([10.0, -10.0]))
self.assertAlmostEqual(f.evaluate(x).item(), 0, 5)
x = bfgs.Minimize(f, startingpoint=np.array([-10.0, -10.0]))
self.assertAlmostEqual(f.evaluate(x).item(), 0, 5)
x = bfgs.Minimize(f, startingpoint=np.array([-1.0, -1.0]))
self.assertAlmostEqual(f.evaluate(x).item(), 0, 5)
x = bfgs.Minimize(f, startingpoint=np.array([2.0, -2.0]))
self.assertAlmostEqual(f.evaluate(x).item(), 0, 5)
x = bfgs.Minimize(f, startingpoint=np.array([-2.0, 2.0]))
self.assertAlmostEqual(f.evaluate(x).item(), 0, 5)
x = bfgs.Minimize(f, startingpoint=np.array(
[-0.270845, -0.923039])) # start at local maximum
self.assertAlmostEqual(f.evaluate(x).item(), 0, 5)
def test_BFGS7(self):
# This is much nicer. Derivatives are computed automatically. Manual error in derivative computations are almost impossible.
R = AffineSpace(2)
X = DifferentiableFunction(
name="x", domain=R, evaluate=lambda x: np.array([x[0]]), jacobian=lambda x: np.array([[1, 0]]))
Y = DifferentiableFunction(
name="y", domain=R, evaluate=lambda x: np.array([x[1]]), jacobian=lambda x: np.array([[0, 1]]))
f = (X**2+Y-11)**2+(X+Y**2-7)**2
bfgs = BFGS()
x = bfgs.Minimize(f, startingpoint=np.array([10.0, 10.0]))
self.assertAlmostEqual(f.evaluate(x).item(), 0, 5)
x = bfgs.Minimize(f, startingpoint=np.array([1.0, 1.0]))
self.assertAlmostEqual(f.evaluate(x).item(), 0, 5)
x = bfgs.Minimize(f, startingpoint=np.array([-10.0, 10.0]))
self.assertAlmostEqual(f.evaluate(x).item(), 0, 5)
x = bfgs.Minimize(f, startingpoint=np.array([10.0, -10.0]))
self.assertAlmostEqual(f.evaluate(x).item(), 0, 5)
x = bfgs.Minimize(f, startingpoint=np.array([-10.0, -10.0]))
self.assertAlmostEqual(f.evaluate(x).item(), 0, 5)
x = bfgs.Minimize(f, startingpoint=np.array([-1.0, -1.0]))
self.assertAlmostEqual(f.evaluate(x).item(), 0, 5)
x = bfgs.Minimize(f, startingpoint=np.array([2.0, -2.0]))
self.assertAlmostEqual(f.evaluate(x).item(), 0, 5)
x = bfgs.Minimize(f, startingpoint=np.array([-2.0, 2.0]))
self.assertAlmostEqual(f.evaluate(x).item(), 0, 5)
x = bfgs.Minimize(f, startingpoint=np.array(
[-0.270845, -0.923039])) # start at local maximum
self.assertAlmostEqual(f.evaluate(x).item(), 0, 5)
if __name__ == '__main__':
unittest.main()