def myneldermead(xxx, mymaxfev, mystep, fold=numpy.float_(numpy.finfo(numpy.float_).max)): result = myloop(xxx, mymaxfev, mystep) mynfev = result[3] fnew = result[2] if fnew < fold * 0.995 and 0 == Knuth_close( fnew, fold, ftol ) and \ 0 == Knuth_close( fnew, fold, ftol ) and \ 0 == result[0] and mynfev < mymaxfev: if debug: print 'neldermead: fnew = ', fnew, '\tfold = ', fold, \ '\tx = ', result[ 1 ] result = myneldermead(result[1], mymaxfev - mynfev, step, fold=fnew) mynfev += result[3] return result[0], result[1], result[2], mynfev
def find(self, dir, iter, step_size, open_interval, maxiters, tol, bloginfo, base=2.0): assert self.fcn is not None, 'callback func has not been set' hlimit = [ ConfBracket.LowerLimit(self.myargs.get_hlimit(dir)), ConfBracket.UpperLimit(self.myargs.get_hlimit(dir)) ] slimit = [ ConfBracket.LowerLimit(self.myargs.get_slimit(dir)), ConfBracket.UpperLimit(self.myargs.get_slimit(dir)) ] xxx = self.trial_points[0] fff = self.trial_points[1] conf_step = ConfStep(xxx, fff) mymaxiters = maxiters if mymaxiters > 16: mymaxiters = 16 plateau = 0 max_plateau_iter = 5 try: for iter in range(mymaxiters): if 0 == iter: x = conf_step.covar(dir, iter, step_size, base) elif 1 == iter: x = conf_step.secant(dir, iter, step_size, base) #x = conf_step.covar( dir, iter, step_size, base ) else: x = conf_step.quad(dir, iter, step_size, base, bloginfo) if x is None or numpy.isnan(x): return ConfRootNone() # Make sure x is not beyond the **hard** limit if hlimit[dir].is_beyond_limit(x): x = hlimit[dir].limit f = self.fcn(x, self.myargs()) # print 'find(): beyond hard limit: f(%.14e)=%.14e' % (x,f) if abs(f) <= tol: return ConfRootZero(x) if f >= 0.0: return ConfRootBracket(self.fcn, self.trial_points, open_interval) else: return ConfRootNone() elif slimit[dir].is_beyond_limit(x): f = self.fcn(x, self.myargs()) # print 'find(): beyond soft limit: f(%.14e)=%.14e' % (x,f) if abs(f) <= tol: return ConfRootZero(x) if f >= 0.0: return ConfRootBracket(self.fcn, self.trial_points, open_interval) elif f < fff[-2]: # if the fit beyond the soft limit is a better fit # then the confidence for the parameter does not exist return ConfRootNone() else: f = self.fcn(x, self.myargs()) # print 'find(): f(%.14e)=%.14e' % (x,f) if abs(f) <= tol: return ConfRootZero(x) elif f >= 0.0: return ConfRootBracket(self.fcn, self.trial_points, open_interval) if Knuth_close(fff[-2], fff[-1], 1.0e-6): plateau += 1 if plateau > max_plateau_iter: # print 'find( %d ): plateau = %d', (iter,plateau) return ConfRootNone(None) # else: # if plateau > 0: # plateau -= 1 return ConfRootNone(None) except OutOfBoundErr: return ConfRootNone()
def are_func_vals_close_enough(tolerance): smallest_fct_val = self.simplex[0, -1] largest_fct_val = self.simplex[-1, -1] return Knuth_close(smallest_fct_val, largest_fct_val, tolerance)