1 from Numeric import copy, dot, sqrt
2 from trust_region import trust_region
3
4 from generic_trust_region import generic_trust_region
5 from generic_minimise import generic_minimise
6
7
9 - def __init__(self, func, dfunc=None, d2func=None, args=(), x0=None, func_tol=1e-5, maxiter=1000, full_output=0, print_flag=0, delta_max=1e5, delta0=1.0, eta=0.2):
10 """Cauchy Point trust-region algorithm.
11
12 Page 70 from 'Numerical Optimization' by Jorge Nocedal and Stephen J. Wright, 1999
13 The Cauchy point is defined by:
14
15 delta
16 pCk = - tau_k ------- dfk
17 ||dfk||
18
19 where:
20 delta_k is the trust region radius,
21 dfk is the gradient vector,
22
23 / 1 if dfk . Bk . dfk <= 0
24 tau_k = <
25 \ min(||dfk||**2/(delta . dfk . Bk . dfk), 1) otherwise.
26 """
27
28 self.func = func
29 self.dfunc = dfunc
30 self.d2func = d2func
31 self.args = args
32 self.xk = x0
33 self.func_tol = func_tol
34 self.maxiter = maxiter
35 self.full_output = full_output
36 self.print_flag = print_flag
37
38 self.delta_max = delta_max
39 self.delta = delta0
40 self.eta = eta
41
42
43 self.f_count = 0
44 self.g_count = 0
45 self.h_count = 0
46
47
48 self.warning = None
49
50
51 self.fk, self.f_count = apply(self.func, (self.xk,)+self.args), self.f_count + 1
52 self.dfk, self.g_count = apply(self.dfunc, (self.xk,)+self.args), self.g_count + 1
53 self.d2fk, self.h_count = apply(self.d2func, (self.xk,)+self.args), self.h_count + 1
54
55
56 self.minimise = self.generic_minimise
57
58
60 "Function to backup the current data into fk_last."
61
62 self.fk_last = self.fk
63
64
66 "Find the Cauchy point."
67
68
69 temp = dot(self.dfk, dot(self.d2fk, self.dfk))
70
71 if temp <= 0.0:
72 self.tau_k = 1.0
73 else:
74 self.tau_k = min(dot(self.dfk, self.dfk) / (self.delta * temp), 1.0)
75
76 if self.print_flag == 2:
77 print "dfk . Bk . dfk: " + `temp`
78 print "tau_k: " + `self.tau_k`
79
80
81 self.pk = - self.tau_k * self.delta * self.dfk / sqrt(dot(self.dfk, self.dfk))
82
83
85 "Function to update the function value, gradient vector, and hessian matrix"
86
87 self.delta = self.delta_new
88 self.xk = copy.deepcopy(self.xk_new)
89 self.fk, self.f_count = apply(self.func, (self.xk,)+self.args), self.f_count + 1
90 self.dfk, self.g_count = apply(self.dfunc, (self.xk,)+self.args), self.g_count + 1
91 self.d2fk, self.h_count = apply(self.d2func, (self.xk,)+self.args), self.h_count + 1
92