1
2
3
4
5 """
6 A standard optimizer with a special object that modifies the resulting set of parameters
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 After each iteration the resulting optimization point is modified by a call to a function
16 """
18 """
19 Needs to have :
20 - an object function to optimize (function), alternatively a function ('fun'), gradient ('gradient'), ...
21 - a way to get a new point, that is a step (step)
22 - a criterion to stop the optimization (criterion)
23 - a starting point (x0)
24 - a way to find the best point on a line (line_search)
25 Can have :
26 - a step modifier, a factor to modulate the step (step_size = 1.)
27 - a pre-modifier, that acts on the set of parameters before an iteration (pre_modifier)
28 - a post-modifier, that acts on the set of parameters after an iteration (post_modifier)
29 """
30 optimizer.Optimizer.__init__(self, **kwargs)
31 self.stepKind = kwargs['step']
32 self.optimalPoint = kwargs['x0']
33 self.lineSearch = kwargs['line_search']
34 self.pre_modifier = kwargs.get('pre_modifier')
35 self.post_modifier = kwargs.get('post_modifier')
36
37 self.state['new_parameters'] = self.optimalPoint
38 self.state['new_value'] = self.function(self.optimalPoint)
39
40 self.recordHistory(**self.state)
41
43 """
44 Implementation of the optimization. Does one iteration
45 """
46 self.state['unmodified_old_parameters'] = self.optimalPoint
47 self.state['unmodified_old_value'] = self.state['new_value']
48
49 if self.pre_modifier:
50 self.optimalPoint = self.pre_modifier(self.optimalPoint)
51 self.state['old_parameters'] = self.optimalPoint
52 self.state['old_value'] = self.function(self.optimalPoint)
53
54 direction = self.stepKind(self.function, self.optimalPoint, state = self.state)
55
56 self.optimalPoint = self.lineSearch(origin = self.optimalPoint, function = self.function, state = self.state)
57
58 self.state['unmodified_new_parameters'] = self.optimalPoint
59 self.state['unmodified_new_value'] = self.function(self.optimalPoint)
60
61 if self.post_modifier:
62 self.optimalPoint = self.post_modifier(self.optimalPoint)
63 self.state['new_parameters'] = self.optimalPoint
64 self.state['new_value'] = self.function(self.optimalPoint)
65
66 self.recordHistory(**self.state)
67