1
2
3
4
5 """
6 A standard optimizer
7 """
8
9 import optimizer
10
12 """
13 A standard optimizer, takes a step and finds the best candidate
14 Must give in self.optimalPoint the optimal point after optimization
15 """
17 """
18 Needs to have :
19 - an object function to optimize (function), alternatively a function ('fun'), gradient ('gradient'), ...
20 - a way to get a new point, that is a step (step)
21 - a criterion to stop the optimization (criterion)
22 - a starting point (x0)
23 - a way to find the best point on a line (lineSearch)
24 Can have :
25 - a step modifier, a factor to modulate the step (stepSize = 1.)
26 """
27 optimizer.Optimizer.__init__(self, **kwargs)
28 self.stepKind = kwargs['step']
29 self.optimalPoint = kwargs['x0']
30 self.lineSearch = kwargs['line_search']
31
32 self.state['new_parameters'] = self.optimalPoint
33 self.state['new_value'] = self.function(self.optimalPoint)
34
35 self.recordHistory(**self.state)
36
37
39 """
40 Implementation of the optimization. Does one iteration.
41 (Optional) Provide known direction to overide step call in 'forceDir'.
42 """
43 self.state['old_parameters'] = self.optimalPoint
44 self.state['old_value'] = self.state['new_value']
45
46 if forceDir is None:
47 step = self.stepKind(self.function, self.optimalPoint, state = self.state)
48 else:
49 self.state['direction'] = forceDir
50 self.state['gradient'] = -forceDir
51 step = forceDir
52
53 self.optimalPoint = self.lineSearch(origin = self.optimalPoint,
54 function = self.function,
55 state = self.state)
56 try:
57 pest = self.function.pest
58 except AttributeError:
59 new_pars = self.optimalPoint
60 else:
61
62 new_pars = pest.pars_dict_to_array(pest.log[pest._lowest_res_log_ix].pars)
63 print "*** CHOSE pars with residual %.8f" % pest.log[pest._lowest_res_log_ix].residual_norm
64 self.state['new_parameters'] = new_pars
65
66 self.state['new_value'] = self.function(new_pars)
67
68 self.recordHistory(**self.state)
69