def setUp(self): config.StringParameter('test.param0', 'a param', default='foo') config.StringParameter('test.param1', 'a param', config.oneof('foo', 'bar')) config.IntParameter('test.param2', 'a param', default=20) config.IntParameter('test.param3', 'a param', config.atmost(100)) config.IntParameter('test.param4', 'a param', config.atleast(100)) config.IntParameter('test.param5', 'a param', config.between(10,100)) config.IntParameter('test.param6', 'a param', lambda x: x == 50) config.FloatParameter('test.param7', 'a param', config.between(1.3, 2.7))
def setUp(self): config.StringParameter('test.param0', 'a param', default='foo') config.StringParameter('test.param1', 'a param', config.oneof('foo', 'bar')) config.IntParameter('test.param2', 'a param', default=20) config.IntParameter('test.param3', 'a param', config.atmost(100)) config.IntParameter('test.param4', 'a param', config.atleast(100)) config.IntParameter('test.param5', 'a param', config.between(10, 100)) config.IntParameter('test.param6', 'a param', lambda x: x == 50) config.FloatParameter('test.param7', 'a param', config.between(1.3, 2.7))
class SimulatedAnnealingLearner(Learner): # # Parameters # _params = ( config.FloatParameter( 'simanneal.start_temp', "Starting temperature for a run.", config.atleast(0.0), default=100.0 ), config.FloatParameter( 'simanneal.delta_temp', 'Change in temp between steps.', config.atleast(0.0), default=0.5 ), config.IntParameter( 'simanneal.max_iters_at_temp', 'Max iterations at any temperature.', config.atleast(0), default=100 ), config.StringParameter( 'simanneal.seed', 'Starting network for a greedy search.', default='' ) ) def __init__(self, data_=None, prior_=None, **options): """Create a Simulated Aneaaling learner. For more information about Simulated Annealing algorithms, consult: 1. http://en.wikipedia.org/wiki/Simulated_annealing 2. D. Heckerman. A Tutorial on Learning with Bayesian Networks. Microsoft Technical Report MSR-TR-95-06, 1995. p.35-36. Any config param for 'simanneal' can be passed in via options. Use just the option part of the parameter name. """ super(SimulatedAnnealingLearner,self).__init__(data_, prior_) config.setparams(self, options) if not isinstance(self.seed, network.Network): self.seed = network.Network(self.data.variables, self.seed) def run(self): """Run the learner.""" self.stats = SALearnerStatistics(self.start_temp, self.delta_temp, self.max_iters_at_temp) self.result = result.LearnerResult(self) self.evaluator = evaluator.fromconfig(self.data, self.seed, self.prior) self.evaluator.score_network(self.seed.copy()) self.result.start_run() curscore = self.evaluator.score_network() # temperature decays exponentially, so we'll never get to 0. # So, we continue until temp < 1 while self.stats.temp >= 1: try: newscore = self._alter_network_randomly_and_score() except CannotAlterNetworkException: return self.result.add_network(self.evaluator.network, newscore) if self._accept(newscore): # set current score self.stats.current_score = newscore if self.stats.current_score > self.stats.best_score: self.stats.best_score = self.stats.current_score else: # undo network alteration self.evaluator.restore_network() # temp not updated EVERY iteration. just whenever criteria met. self.stats.update() self.result.stop_run() return self.result def _accept(self, newscore): oldscore = self.stats.current_score if newscore >= oldscore: return True elif random.random() < exp((newscore - oldscore)/self.stats.temp): return True else: return False
_plearnertype = config.StringParameter( 'learner.type', """Type of learner to use. The following learners are included with pebl: * greedy.GreedyLearner * simanneal.SimulatedAnnealingLearner * exhaustive.ListLearner """, default = 'greedy.GreedyLearner' ) _ptasks = config.IntParameter( 'learner.numtasks', "Number of learner tasks to run.", config.atleast(0), default=1 ) class Learner(Task): def __init__(self, data_=None, prior_=None, **kw): self.data = data_ or data.fromconfig() self.prior = prior_ or prior.fromconfig() self.__dict__.update(kw) # parameters self.numtasks = config.get('learner.numtasks') # stats self.reverse = 0