def fmin_smac(func: callable, x0: list, bounds: list, maxfun: int = -1, maxtime: int = -1, rng: np.random.RandomState = None): """ Minimize a function func using the SMAC algorithm. This function is a convenience wrapper for the SMAC class. Parameters ---------- func : callable f(x) Function to minimize. x0 : list Initial guess/default configuration. bounds : list ``(min, max)`` pairs for each element in ``x``, defining the bound on that parameters. maxtime : int, optional Maximum runtime in seconds. maxfun : int, optional Maximum number of function evaluations. rng : np.random.RandomState, optional Random number generator used by SMAC. Returns ------- x : list Estimated position of the minimum. f : float Value of `func` at the minimum. s : :class:`smac.facade.smac_facade.SMAC` SMAC objects which enables the user to get e.g., the trajectory and runhistory. """ # create configuration space cs = ConfigurationSpace() for idx, (lower_bound, upper_bound) in enumerate(bounds): parameter = UniformFloatHyperparameter(name="x%d" % (idx + 1), lower=lower_bound, upper=upper_bound, default_value=x0[idx]) cs.add_hyperparameter(parameter) # Create target algorithm runner ta = ExecuteTAFuncArray(ta=func) # create scenario scenario_dict = { "run_obj": "quality", "cs": cs, "deterministic": "true", "initial_incumbent": "DEFAULT" } if maxfun > 0: scenario_dict["runcount_limit"] = maxfun if maxtime > 0: scenario_dict["wallclock_limit"] = maxtime scenario = Scenario(scenario_dict) smac = SMAC(scenario=scenario, tae_runner=ta, rng=rng) smac.logger = logging.getLogger(smac.__module__ + "." + smac.__class__.__name__) incumbent = smac.optimize() config_id = smac.solver.runhistory.config_ids[incumbent] run_key = RunKey(config_id, None, 0) incumbent_performance = smac.solver.runhistory.data[run_key] incumbent = np.array( [incumbent['x%d' % (idx + 1)] for idx in range(len(bounds))], dtype=np.float) return incumbent, incumbent_performance.cost, \ smac
def test_check_random_states(self, patch): patch.return_value = None smac = SMAC() smac.logger = unittest.mock.MagicMock() # Check some properties # Check whether different seeds give different random states _, rng_1 = get_rng(1) _, rng_2 = get_rng(2) self.assertNotEqual(sum(rng_1.get_state()[1] - rng_2.get_state()[1]), 0) # Check whether no seeds gives different random states _, rng_1 = get_rng(logger=smac.logger) self.assertEqual(smac.logger.debug.call_count, 1) _, rng_2 = get_rng(logger=smac.logger) self.assertEqual(smac.logger.debug.call_count, 2) self.assertNotEqual(sum(rng_1.get_state()[1] - rng_2.get_state()[1]), 0) # Check whether the same int seeds give the same random states _, rng_1 = get_rng(1) _, rng_2 = get_rng(1) self.assertEqual(sum(rng_1.get_state()[1] - rng_2.get_state()[1]), 0) # Check all execution paths self.assertRaisesRegex( TypeError, "Argument rng accepts only arguments of type None, int or np.random.RandomState, " "you provided <class 'str'>.", get_rng, rng='ABC', ) self.assertRaisesRegex( TypeError, "Argument run_id accepts only arguments of type None, int or np.random.RandomState, " "you provided <class 'str'>.", get_rng, run_id='ABC') run_id, rng_1 = get_rng(rng=None, run_id=None, logger=smac.logger) self.assertIsInstance(run_id, int) self.assertIsInstance(rng_1, np.random.RandomState) self.assertEqual(smac.logger.debug.call_count, 3) run_id, rng_1 = get_rng(rng=None, run_id=1, logger=smac.logger) self.assertEqual(run_id, 1) self.assertIsInstance(rng_1, np.random.RandomState) run_id, rng_1 = get_rng(rng=1, run_id=None, logger=smac.logger) self.assertEqual(run_id, 1) self.assertIsInstance(rng_1, np.random.RandomState) run_id, rng_1 = get_rng(rng=1, run_id=1337, logger=smac.logger) self.assertEqual(run_id, 1337) self.assertIsInstance(rng_1, np.random.RandomState) rs = np.random.RandomState(1) run_id, rng_1 = get_rng(rng=rs, run_id=None, logger=smac.logger) self.assertIsInstance(run_id, int) self.assertIs(rng_1, rs) run_id, rng_1 = get_rng(rng=rs, run_id=2505, logger=smac.logger) self.assertEqual(run_id, 2505) self.assertIs(rng_1, rs)