Exemplo n.º 1
0
 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
Exemplo n.º 2
0
    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()
Exemplo n.º 3
0
 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)