Package minimise :: Module cauchy_point
[hide private]
[frames] | no frames]

Source Code for Module minimise.cauchy_point

 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   
8 -class cauchy_point(generic_trust_region, generic_minimise):
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 # Initialise the function, gradient, and hessian evaluation counters. 43 self.f_count = 0 44 self.g_count = 0 45 self.h_count = 0 46 47 # Initialise the warning string. 48 self.warning = None 49 50 # Initial values before the first iteration. 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 # Minimisation. 56 self.minimise = self.generic_minimise
57 58
59 - def backup_current_data(self):
60 "Function to backup the current data into fk_last." 61 62 self.fk_last = self.fk
63 64
65 - def calc_pk(self):
66 "Find the Cauchy point." 67 68 # tau_k. 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 # Cauchy point. 81 self.pk = - self.tau_k * self.delta * self.dfk / sqrt(dot(self.dfk, self.dfk))
82 83
84 - def update_data(self):
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