Exemplo n.º 1
0
def difevo(fcn,
           x0,
           xmin,
           xmax,
           maxfev=None,
           ftol=EPSILON,
           xprob=0.9,
           weighting_factor=0.8,
           population_size=None,
           multicore=True,
           verbose=0):

    x0, xmin, xmax = _check_args(x0, xmin, xmax)

    npar = len(x0)
    if maxfev is None:
        maxfev = 4096 * npar * 16
    if population_size is None:
        population_size = 16 * npar

    starttime = time.time()
    nm_result = sherpa_neldermead(fcn,
                                  x0,
                                  xmin,
                                  xmax,
                                  ftol=ftol,
                                  maxfev=maxfev,
                                  initsimplex=0,
                                  finalsimplex=9,
                                  step=None,
                                  verbose=0)

    print nm_result
    print '%f secs' % (time.time() - starttime)

    if nm_result[0]:

        dif_evo = DifEvo(fcn)

        maxfev_per_iter = min(maxfev - nm_result[4].get('nfev'), 512 * npar)
        factor = 4.0
        myx = nm_result[1]
        myxmin, myxmax = _narrow_limit(4 * factor, [myx, xmin, xmax],
                                       debug=True)
        starttime = time.time()
        de_result = dif_evo(myx, myxmin, myxmax, maxfev_per_iter, ftol,
                            population_size, xprob, weighting_factor)
        print de_result
        print '%f secs' % (time.time() - starttime)

        de_result = list(de_result)
        de_result[-1] += nm_result[4].get('nfev')
        return get_result(de_result, maxfev)

    else:

        return nm_result
Exemplo n.º 2
0
def difevo(
    fcn,
    x0,
    xmin,
    xmax,
    maxfev=None,
    ftol=EPSILON,
    xprob=0.9,
    weighting_factor=0.8,
    population_size=None,
    multicore=True,
    verbose=0,
):

    x0, xmin, xmax = _check_args(x0, xmin, xmax)

    npar = len(x0)
    if maxfev is None:
        maxfev = 4096 * npar * 16
    if population_size is None:
        population_size = 16 * npar

    starttime = time.time()
    nm_result = sherpa_neldermead(
        fcn, x0, xmin, xmax, ftol=ftol, maxfev=maxfev, initsimplex=0, finalsimplex=9, step=None, verbose=0
    )

    print nm_result
    print "%f secs" % (time.time() - starttime)

    if nm_result[0]:

        dif_evo = DifEvo(fcn)

        maxfev_per_iter = min(maxfev - nm_result[4].get("nfev"), 512 * npar)
        factor = 4.0
        myx = nm_result[1]
        myxmin, myxmax = _narrow_limit(4 * factor, [myx, xmin, xmax], debug=True)
        starttime = time.time()
        de_result = dif_evo(myx, myxmin, myxmax, maxfev_per_iter, ftol, population_size, xprob, weighting_factor)
        print de_result
        print "%f secs" % (time.time() - starttime)

        de_result = list(de_result)
        de_result[-1] += nm_result[4].get("nfev")
        return get_result(de_result, maxfev)

    else:

        return nm_result
Exemplo n.º 3
0
def optneldermead(
    afcn,
    x0,
    xmin,
    xmax,
    ftol=EPSILON,
    maxfev=None,
    initsimplex=0,
    finalsimplex=None,
    step=None,
    multicore=False,
    verbose=None,
):

    x, xmin, xmax = _check_args(x0, xmin, xmax)

    nfev, fcn = func_counter(afcn)

    if step is None or (numpy.iterable(step) and len(step) != len(x)):
        step = 1.2 * numpy.ones(x.shape, numpy.float_, numpy.isfortran(x))
    elif numpy.isscalar(step):
        step = step * numpy.ones(x.shape, numpy.float_, numpy.isfortran(x))

    if maxfev is None:
        maxfev = 1024 * len(x)

    if finalsimplex is None:
        finalsimplex = [0, 2]

    if False == is_iterable(finalsimplex):
        finalsimplex = [finalsimplex]

    # For internal use only:
    debug = True

    def myloop(xxx, mymaxfev, mystep):

        nms = classicNelderMead(fcn)
        mynfev = 0
        for myfinalsimplex in finalsimplex:
            starttime = time.time()
            result = nms(
                xxx, xmin, xmax, mymaxfev - mynfev, ftol, mystep, initsimplex, myfinalsimplex, multicore, verbose
            )
            mynfev += result[3]
            if 0 != result[0]:
                return result[0], result[1], result[2], mynfev
            if debug:
                print "neldermead::myloop: result = ", result, " took ", time.time() - starttime, " secs"
        if multicore:
            return result[0], result[1], result[2], mynfev + nfev[0]
        else:
            return result[0], result[1], result[2], mynfev

    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

    # result = myneldermead( x, maxfev, step )
    result = myloop(x, maxfev, step)
    return get_result(result, maxfev)
Exemplo n.º 4
0
def optneldermead(afcn,
                  x0,
                  xmin,
                  xmax,
                  ftol=EPSILON,
                  maxfev=None,
                  initsimplex=0,
                  finalsimplex=None,
                  step=None,
                  multicore=False,
                  verbose=None):

    x, xmin, xmax = _check_args(x0, xmin, xmax)

    nfev, fcn = func_counter(afcn)

    if step is None or (numpy.iterable(step) and len(step) != len(x)):
        step = 1.2 * numpy.ones(x.shape, numpy.float_, numpy.isfortran(x))
    elif numpy.isscalar(step):
        step = step * numpy.ones(x.shape, numpy.float_, numpy.isfortran(x))

    if maxfev is None:
        maxfev = 1024 * len(x)

    if finalsimplex is None:
        finalsimplex = [0, 2]

    if False == is_iterable(finalsimplex):
        finalsimplex = [finalsimplex]

    # For internal use only:
    debug = True

    def myloop(xxx, mymaxfev, mystep):

        nms = classicNelderMead(fcn)
        mynfev = 0
        for myfinalsimplex in finalsimplex:
            starttime = time.time()
            result = nms(xxx, xmin, xmax, mymaxfev - mynfev, ftol, mystep,
                         initsimplex, myfinalsimplex, multicore, verbose)
            mynfev += result[3]
            if 0 != result[0]:
                return result[0], result[1], result[2], mynfev
            if debug:
                print 'neldermead::myloop: result = ', result, ' took ', time.time(
                ) - starttime, ' secs'
        if multicore:
            return result[0], result[1], result[2], mynfev + nfev[0]
        else:
            return result[0], result[1], result[2], mynfev

    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

    #result = myneldermead( x, maxfev, step )
    result = myloop(x, maxfev, step)
    return get_result(result, maxfev)