class Optimizer(object): def __init__(self, criterion, x0=None, step=default_step, line_search=default_line_search, stop_criterion=default_stop_criterion): self.criterion = criterion self.n_variables = criterion.n_variables self.step = step self.line_search = line_search self.stop_criterion = stop_criterion self.first_guess() self.optimizer = StandardOptimizer(function=self.criterion, step=self.step, line_search=self.line_search, criterion=self.stop_criterion, x0=self.current_solution) self.optimizer.recordHistory = self.callback def callback(self, **kwargs): state = self.optimizer.state iter_ = state['iteration'] crit = state['new_value'] step = state['alpha_step'] if state['iteration'] == 0: print("Iteration \t Step \t \Criterion") print("\t%i \t %e \t %e" % (iter_, step, crit)) def first_guess(self, x0=None): """ Sets current_solution attribute to initial value. """ if x0 is None: self.current_solution = np.zeros(self.n_variables) else: self.current_solution = copy(x0) def iterate(self): self.optimizer.iterate() def __call__(self): self.optimizer.optimize()