def myopt(myfcn, xxx, ftol, maxfev, seed, pop, xprob, weight, factor=4.0, debug=False): x = xxx[0] xmin = xxx[1] xmax = xxx[2] maxfev_per_iter = 512 * x.size def random_start(xmin, xmax): xx = [] for ii in range(len(xmin)): xx.append(random.uniform(xmin[ii], xmax[ii])) return numpy.asarray(xx) ############################# NelderMead ############################# mymaxfev = min(maxfev_per_iter, maxfev) if all(x == 0.0): mystep = list(map(lambda fubar: 1.2 + fubar, x)) else: mystep = list(map(lambda fubar: 1.2 * fubar, x)) if 1 == numcores: result = neldermead(myfcn, x, xmin, xmax, maxfev=mymaxfev, ftol=ftol, finalsimplex=9, step=mystep) x = numpy.asarray(result[1], numpy.float_) nfval = result[2] nfev = result[4].get('nfev') else: ncores_nm = ncoresNelderMead() nfev, nfval, x = \ ncores_nm(stat_cb0, x, xmin, xmax, ftol, mymaxfev, numcores) if verbose or debug != False: print('f_nm%s=%.14e in %d nfev' % (x, nfval, nfev)) ############################# NelderMead ############################# ############################## nmDifEvo ############################# xmin, xmax = _narrow_limits(4 * factor, [x, xmin, xmax], debug=False) mymaxfev = min(maxfev_per_iter, maxfev - nfev) if 1 == numcores: result = difevo_nm(myfcn, x, xmin, xmax, ftol, mymaxfev, verbose, seed, pop, xprob, weight) nfev += result[4].get('nfev') x = numpy.asarray(result[1], numpy.float_) nfval = result[2] else: ncores_de = ncoresDifEvo() mystep = None tmp_nfev, tmp_fmin, tmp_par = \ ncores_de(stat_cb0, x, xmin, xmax, ftol, mymaxfev, mystep, numcores, pop, seed, weight, xprob, verbose) nfev += tmp_nfev if tmp_fmin < nfval: nfval = tmp_fmin x = tmp_par if verbose or debug != False: print('f_de_nm%s=%.14e in %d nfev' % (x, nfval, nfev)) ############################## nmDifEvo ############################# ofval = FUNC_MAX while nfev < maxfev: xmin, xmax = _narrow_limits(factor, [x, xmin, xmax], debug=False) ############################ nmDifEvo ############################# y = random_start(xmin, xmax) mymaxfev = min(maxfev_per_iter, maxfev - nfev) if 1 == numcores: result = difevo_nm(myfcn, y, xmin, xmax, ftol, mymaxfev, verbose, seed, pop, xprob, weight) nfev += result[4].get('nfev') if result[2] < nfval: nfval = result[2] x = numpy.asarray(result[1], numpy.float_) if verbose or debug != False: print('f_de_nm%s=%.14e in %d nfev' % \ (x, result[2], result[4].get('nfev'))) ############################ nmDifEvo ############################# if debug != False: print('ofval=%.14e\tnfval=%.14e\n' % (ofval, nfval)) if sao_fcmp(ofval, nfval, ftol) <= 0: return x, nfval, nfev ofval = nfval factor *= 2 return x, nfval, nfev
# You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # from sherpa.utils import _ncpus from sherpa.optmethods.ncoresnm import ncoresNelderMead from sherpa.optmethods.ncoresde import ncoresDifEvo import sherpa.optmethods.opt as tstopt import pytest NUMPAR = 10 NCORES_NM = ncoresNelderMead() NCORES_DE = ncoresDifEvo() def print_result(name, f, x, nfev): print('%s(%s) = %g in %d nfev' % (name, x, f, nfev)) # Mapping from SherpaTestCase.assertEqualWithinTol to # pytest.approx # and noting that the tolerance is an absolute tolerance, # not relative in SherpaTestCase. # def tst_opt(opt, fcn, x0, xmin, xmax, fmin, tol=1e-2): def func(arg): return fcn(arg)[0] nfev, fval, par = opt(func, x0, xmin, xmax)