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
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
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)
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)