from nevergrad.common.errors import InefficientSettingsWarning import logging import nevergrad as ng import nevergrad.optimization.experimentalvariants as ev import nevergrad.optimization.optimizerlib as ol import warnings logging.getLogger("nevergrad").setLevel(logging.WARNING) warnings.filterwarnings("ignore", category=InefficientSettingsWarning) optimizers = [ ol.ASCMADEthird, ol.AdaptiveDiscreteOnePlusOne, ol.AlmostRotationInvariantDE, ol.AnisotropicAdaptiveDiscreteOnePlusOne, ol.AvgMetaRecenteringNoHull, # ol.BO, # slow # ol.BOSplit, # slow # ol.BayesOptimBO, # ModuleNotFoundError: No module named 'bayes_optim' ol.CMA, ol.CMAbounded, ol.CMApara, ol.CMAsmall, ol.CMAstd, ol.CMAtuning, ol.CauchyLHSSearch, ol.CauchyOnePlusOne, ol.CauchyScrHammersleySearch, ol.ChainCMAPowell, ol.ChainDiagonalCMAPowell, ol.ChainMetaModelPowell, ol.ChainMetaModelSQP, ol.ChainNaiveTBPSACMAPowell, ol.ChainNaiveTBPSAPowell, ol.CmaFmin2, ol.Cobyla, ol.DE, ol.DiagonalCMA, ol.DiscreteBSOOnePlusOne, ol.DiscreteDE, ol.DiscreteDoerrOnePlusOne, ol.DiscreteLenglerOnePlusOne, ol.DiscreteLenglerOnePlusOneT, ol.DiscreteOnePlusOne, ol.DiscreteOnePlusOneT, ol.DoubleFastGADiscreteOnePlusOne, ol.ES, ol.FCMA, ol.GeneticDE, ol.HaltonSearch, ol.HaltonSearchPlusMiddlePoint, ol.HammersleySearch, ol.HammersleySearchPlusMiddlePoint, ol.HullAvgMetaRecentering, ol.HullAvgMetaTuneRecentering, # ol.HyperOpt, # fairly slow with larger problems (NOTE: newly removed) ol.LHSSearch, ol.LargeHaltonSearch, ol.LhsDE, ol.MetaModel, ol.MetaModelOnePlusOne, ol.MetaRecentering, ol.MetaTuneRecentering, ol.MixES, ol.MultiCMA, ol.MultiScaleCMA, ol.MutDE, # ol.NEWUOA, # RuntimeError: Recast optimizer raised an error: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (2,) + inhomogeneous part. # ol.NLOPT, # RuntimeError: Recast optimizer raised an error: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (2,) + inhomogeneous part. ol.NaiveIsoEMNA, ol.NaiveTBPSA, ol.NelderMead, ol.NoisyDE, ol.NoisyDiscreteOnePlusOne, ol.NoisyOnePlusOne, ol.NonNSGAIIES, ol.ORandomSearch, ol.OScrHammersleySearch, ol.OldCMA, ol.OnePlusOne, ol.OptimisticDiscreteOnePlusOne, ol.OptimisticNoisyOnePlusOne, # ol.PCABO, # ModuleNotFoundError: No module named 'bayes_optim' ol.PSO, ol.ParaPortfolio, ol.PolyCMA, ol.PortfolioDiscreteOnePlusOne, ol.PortfolioDiscreteOnePlusOneT, ol.Powell, # ol.PymooBatchNSGA2, # NotImplementedError: This optimizer isn't supported by the way minimize works by default. # ol.PymooNSGA2, # RuntimeError: Recast optimizer raised an error: The method `get_algorithm` has been deprecated since 0.6.0 Please use the object-oriented interface. ol.QORandomSearch, ol.QOScrHammersleySearch, ol.QrDE, ol.RCobyla, ol.RLSOnePlusOne, ol.RPowell, # ol.RSLSQP, ol.RSQP, ol.RandomSearch, ol.RandomSearchPlusMiddlePoint, ol.RealSpacePSO, ol.RecES, ol.RecMixES, ol.RecMutDE, ol.RecombiningPortfolioDiscreteOnePlusOne, ol.RecombiningPortfolioOptimisticNoisyDiscreteOnePlusOne, ol.RescaledCMA, ol.RotatedTwoPointsDE, ol.RotationInvariantDE, ol.SADiscreteLenglerOnePlusOneExp09, ol.SADiscreteLenglerOnePlusOneExp099, ol.SADiscreteLenglerOnePlusOneExp09Auto, ol.SADiscreteLenglerOnePlusOneLin1, ol.SADiscreteLenglerOnePlusOneLin100, ol.SADiscreteLenglerOnePlusOneLinAuto, ol.SADiscreteOnePlusOneExp09, ol.SADiscreteOnePlusOneExp099, ol.SADiscreteOnePlusOneLin100, # ol.SLSQP, ol.SQP, ol.ScrHaltonSearch, ol.ScrHaltonSearchPlusMiddlePoint, ol.ScrHammersleySearch, ol.ScrHammersleySearchPlusMiddlePoint, ol.SparseDoubleFastGADiscreteOnePlusOne, ol.TBPSA, ol.TripleCMA, ol.TwoPointsDE, ol.discretememetic, ] more_optimizers = [ ev.AlmostRotationInvariantDEAndBigPop, ev.AnisoEMNA, ev.AnisoEMNATBPSA, ev.AvgHammersleySearch, ev.AvgHammersleySearchPlusMiddlePoint, ev.AvgRandomSearch, # ev.BO, # slow ev.BPRotationInvariantDE, ev.CMA, ev.CauchyRandomSearch, # ev.ChainBOwithLHS, # slow # ev.ChainBOwithLHS30, # slow # ev.ChainBOwithLHSdim, # slow # ev.ChainBOwithLHSsqrt, # slow # ev.ChainBOwithMetaRecentering, # slow # ev.ChainBOwithMetaRecentering30, # slow # ev.ChainBOwithMetaRecenteringdim, # slow # ev.ChainBOwithMetaRecenteringsqrt, # slow # ev.ChainBOwithMetaTuneRecentering, # slow # ev.ChainBOwithMetaTuneRecentering30, # slow # ev.ChainBOwithMetaTuneRecenteringdim, # slow # ev.ChainBOwithMetaTuneRecenteringsqrt, # slow # ev.ChainBOwithR, # slow # ev.ChainBOwithR30, # slow # ev.ChainBOwithRdim, # slow # ev.ChainBOwithRsqrt, # slow ev.ChainCMASQP, ev.ChainCMAwithLHS, ev.ChainCMAwithLHS30, ev.ChainCMAwithLHSdim, ev.ChainCMAwithLHSsqrt, ev.ChainCMAwithMetaRecentering, ev.ChainCMAwithMetaRecentering30, ev.ChainCMAwithMetaRecenteringdim, ev.ChainCMAwithMetaRecenteringsqrt, ev.ChainCMAwithR, ev.ChainCMAwithR30, ev.ChainCMAwithRdim, ev.ChainCMAwithRsqrt, ev.ChainDEwithLHS, ev.ChainDEwithLHS30, ev.ChainDEwithLHSdim, ev.ChainDEwithLHSsqrt, ev.ChainDEwithMetaRecentering, ev.ChainDEwithMetaRecentering30, ev.ChainDEwithMetaRecenteringdim, ev.ChainDEwithMetaRecenteringsqrt, ev.ChainDEwithMetaTuneRecentering, ev.ChainDEwithMetaTuneRecentering30, ev.ChainDEwithMetaTuneRecenteringdim, ev.ChainDEwithMetaTuneRecenteringsqrt, ev.ChainDEwithR, ev.ChainDEwithR30, ev.ChainDEwithRdim, ev.ChainDEwithRsqrt, ev.ChainPSOwithLHS, ev.ChainPSOwithLHS30, ev.ChainPSOwithLHSdim, ev.ChainPSOwithLHSsqrt, ev.ChainPSOwithMetaRecentering, ev.ChainPSOwithMetaRecentering30, ev.ChainPSOwithMetaRecenteringdim, ev.ChainPSOwithMetaRecenteringsqrt, ev.ChainPSOwithR, ev.ChainPSOwithR30, ev.ChainPSOwithRdim, ev.ChainPSOwithRsqrt, ev.CmaFmin2, ev.DE, ev.DiagonalCMA, ev.DiscreteNoisy13Splits, ev.DiscreteNoisyInfSplits, ev.DoubleFastGAOptimisticNoisyDiscreteOnePlusOne, ev.ECMA, ev.FCMAp13, ev.FCMAs03, ev.FastGADiscreteOnePlusOne, ev.FastGANoisyDiscreteOnePlusOne, ev.FastGAOptimisticNoisyDiscreteOnePlusOne, ev.GeneticDE, ev.HSCMA, ev.HSDE, ev.HSMetaModel, ev.HullCenterHullAvgCauchyLHSSearch, ev.HullCenterHullAvgCauchyScrHammersleySearch, ev.HullCenterHullAvgLHSSearch, ev.HullCenterHullAvgLargeHammersleySearch, ev.HullCenterHullAvgRandomSearch, ev.HullCenterHullAvgScrHaltonSearch, ev.HullCenterHullAvgScrHaltonSearchPlusMiddlePoint, ev.HullCenterHullAvgScrHammersleySearch, ev.HullCenterHullAvgScrHammersleySearchPlusMiddlePoint, ev.IsoEMNA, ev.IsoEMNATBPSA, # ev.LBO, # slow ev.LHSSearch, ev.LhsHSDE, ev.MetaCauchyRecentering, ev.MetaModelDiagonalCMA, ev.MetaModelFmin2, # ev.MetaNGOpt10, # hangs: Optimizing the schwefel function with the ngx_metangopt10 optimizer ev.MetaRecentering, ev.MetaTuneRecentering, ev.MicroCMA, # ev.MidQRBO, # slow ev.MilliCMA, ev.MiniDE, ev.MiniLhsDE, ev.MiniQrDE, ev.MixDeterministicRL, # InefficientSettingsWarning: DE algorithms are inefficient with budget < 60 # ev.NGOptSingle16, # slow # ev.NGOptSingle25, # slow # ev.NGOptSingle9, # slow ev.NaiveAnisoEMNA, ev.NaiveAnisoEMNATBPSA, ev.NaiveIsoEMNATBPSA, ev.Noisy13Splits, ev.NoisyInfSplits, ev.NoisyOnePlusOne, ev.NoisyRL1, # note: inefficiency warnings ev.NoisyRL2, # note: inefficiency warnings ev.NoisyRL3, # note: inefficiency warnings ev.OnePointDE, ev.OptimisticNoisyOnePlusOne, # ev.PCABO80, # ModuleNotFoundError: No module named 'bayes_optim' # ev.PCABO95DoE20, # ModuleNotFoundError: No module named 'bayes_optim' ev.PSO, ev.ParametrizationDE, ev.PortfolioNoisyDiscreteOnePlusOne, ev.PortfolioOptimisticNoisyDiscreteOnePlusOne, # ev.QRBO, # slow # ev.RBO, # slow ev.RandomScaleRandomSearch, ev.RandomScaleRandomSearchPlusMiddlePoint, ev.RandomSearch, ev.RecombiningGA, ev.RecombiningOptimisticNoisyDiscreteOnePlusOne, ev.RecombiningPortfolioOptimisticNoisyDiscreteOnePlusOne, ev.RescaleScrHammersleySearch, ev.RotatedRecombiningGA, ev.SQP, ev.SmoothAdaptiveDiscreteOnePlusOne, ev.SmoothDiscreteLenglerOnePlusOne, ev.SmoothDiscreteOnePlusOne, ev.SmoothPortfolioDiscreteOnePlusOne, ev.SparseDiscreteOnePlusOne, ev.SpecialRL, # note: inefficiency warnings ev.StupidRandom, ev.TBPSA, ev.TEAvgCauchyLHSSearch, ev.TEAvgCauchyScrHammersleySearch, ev.TEAvgLHSSearch, ev.TEAvgRandomSearch, ev.TEAvgScrHammersleySearch, ev.TEAvgScrHammersleySearchPlusMiddlePoint, ev.Zero, ] bayes_optimizers = [ ol.BO, ev.RBO, ev.QRBO, ev.MidQRBO, ev.LBO, ol.ParametrizedBO(utility_kind="ei").set_name("BOEI"), ol.ParametrizedBO(utility_kind="poi").set_name("BOPOI"), ] assert ol.RSLSQP is ol.RSQP, "weirdness is gone, please adjust accordingly" assert ol.SLSQP is ol.SQP, "weirdness is gone, please adjust accordingly" def nevergrad_cube_factory(optimizer, objective, n_trials, n_dim, with_count): instrument = ng.p.Array(lower=0, upper=1, shape=(n_dim,)) # better sigma # ev.RBO, ev.QRBO, ev.MidQRBO, and ev.LBO still complain, though: # /home/py/.local/lib/python3.10/site-packages/nevergrad/parametrization/_datalayers.py:107: NevergradRuntimeWarning: Bounds are 1.0 sigma away from each other at the closest, you should aim for at least 3 for better quality. if optimizer in (ev.RBO, ev.QRBO, ev.MidQRBO, ev.LBO): instrument.set_mutation(sigma=0.3) opt = optimizer assert opt is not None, optimizer optimizer = opt(parametrization=instrument, budget=n_trials, num_workers=1) feval_count = 0 def cube_objective(us): nonlocal feval_count feval_count += 1 return objective(us) recommendation = optimizer.minimize(cube_objective) best_x = recommendation.value best_val = cube_objective(best_x) # don't trust recommendation.loss return (best_val, best_x, feval_count) if with_count else (best_val, best_x) def named_optimizer(optimizer, experimental=False): def f(*args, **kwargs): return nevergrad_cube_factory(optimizer, *args, **kwargs) name = optimizer.name if hasattr(optimizer, "name") else optimizer.__name__ # TODO: make these names less awful. new_name = ("ngx_" if experimental else "ng_") + name + "_cube" new_name = new_name.replace("OnePlusOne", "_1p1") new_name = new_name.replace("PlusMiddlePoint", "_pmp") new_name = new_name.replace("Search", "") while "__" in new_name: new_name = new_name.replace("__", "_") f.__name__ = new_name.lower() return f # some selections: ng_1p1_cube = named_optimizer(ol.OnePlusOne) ng_bo_cube = named_optimizer(ol.BO) ng_cauchy_1p1_cube = named_optimizer(ol.CauchyOnePlusOne) ng_chaincmapowell_cube = named_optimizer(ol.ChainCMAPowell) ng_chaindiagonalcmapowell_cube = named_optimizer(ol.ChainDiagonalCMAPowell) ng_chainmetamodelpowell_cube = named_optimizer(ol.ChainMetaModelPowell) ng_chainmetamodelsqp_cube = named_optimizer(ol.ChainMetaModelSQP) ng_chainnaivetbpsapowell_cube = named_optimizer(ol.ChainNaiveTBPSAPowell) ng_cma_cube = named_optimizer(ol.CMA) ng_cobyla_cube = named_optimizer(ol.Cobyla) ng_diagonalcma_cube = named_optimizer(ol.DiagonalCMA) ng_ecma_cube = named_optimizer(ev.ECMA) ng_fcma_cube = named_optimizer(ol.FCMA) ng_fcmap13_cube = named_optimizer(ev.FCMAp13) ng_fcmas03_cube = named_optimizer(ev.FCMAs03) ng_metamodel_1p1_cube = named_optimizer(ol.MetaModelOnePlusOne) ng_metamodel_cube = named_optimizer(ol.MetaModel) ng_neldermead_cube = named_optimizer(ol.NelderMead) ng_parametrizationde_cube = named_optimizer(ev.ParametrizationDE) ng_powell_cube = named_optimizer(ol.Powell) ng_rescaledcma_cube = named_optimizer(ol.RescaledCMA) ng_rpowell_cube = named_optimizer(ol.RPowell) ng_rsqp_cube = named_optimizer(ol.RSQP) ng_sqp_cube = named_optimizer(ol.SQP) ngx_chaincmasqp_cube = named_optimizer(ev.ChainCMASQP) ngx_chaincmawithmetarecenteringdim_cube = named_optimizer(ev.ChainCMAwithMetaRecenteringdim) NEVERGRAD2_OPTIMIZERS = list(map(named_optimizer, optimizers)) + list( map(lambda o: named_optimizer(o, experimental=True), more_optimizers) ) BAYES_OPTIMIZERS = list(map(lambda o: named_optimizer(o, experimental=o != ol.BO), bayes_optimizers))