From e6cbb347de79451d19aa295568b27e98a485b856 Mon Sep 17 00:00:00 2001 From: Arthur O'Dwyer Date: Mon, 17 Apr 2017 10:36:08 -0700 Subject: [PATCH] testing --- copycat/context.py | 54 +++++++++++++++++++++++++++++++++++++++++ copycat/copycat.py | 57 +++++++------------------------------------- copycat/workspace.py | 2 +- 3 files changed, 64 insertions(+), 49 deletions(-) create mode 100644 copycat/context.py diff --git a/copycat/context.py b/copycat/context.py new file mode 100644 index 0000000..94262fd --- /dev/null +++ b/copycat/context.py @@ -0,0 +1,54 @@ + +class Context(object): + def __init__(self): + self.temperature = None + self.coderack = None + self.workspace = None + self.slipnet = None + + def mainLoop(self, lastUpdate): + currentTime = coderack.codeletsRun + temperature.tryUnclamp(currentTime) + # Every 15 codelets, we update the workspace. + if currentTime >= lastUpdate + 15: + self.workspace.updateEverything() + self.coderack.updateCodelets() + self.slipnet.update() + self.temperature.update(self.workspace.getUpdatedTemperature()) + lastUpdate = currentTime + logging.debug('Number of codelets: %d', len(self.coderack.codelets)) + self.coderack.chooseAndRunCodelet() + return lastUpdate + + def runTrial(self, answers): + """Run a trial of the copycat algorithm""" + self.slipnet.reset() + self.workspace.reset() + self.coderack.reset() + lastUpdate = float('-inf') + while not self.workspace.foundAnswer: + lastUpdate = self.mainLoop(lastUpdate) + if self.workspace.rule: + answer = self.workspace.rule.finalAnswer + else: + answer = None + finalTemperature = self.temperature.last_unclamped_value + finalTime = self.coderack.codeletsRun + print 'Answered %s (time %d, final temperature %.1f)' % (answer, finalTime, finalTemperature) + answers[answer] = answers.get(answer, {'count': 0, 'tempsum': 0, 'timesum': 0}) + answers[answer]['count'] += 1 + answers[answer]['tempsum'] += finalTemperature + answers[answer]['timesum'] += finalTime + + def run(self, initial, modified, target, iterations): + self.workspace.setStrings(initial, modified, target) + answers = {} + for i in xrange(iterations): + self.runTrial(answers) + for answer, d in answers.iteritems(): + d['avgtemp'] = d.pop('tempsum') / d['count'] + d['avgtime'] = d.pop('timesum') / d['count'] + return answers + + +context = Context() diff --git a/copycat/copycat.py b/copycat/copycat.py index c5ce81a..411bdc1 100644 --- a/copycat/copycat.py +++ b/copycat/copycat.py @@ -1,56 +1,17 @@ import logging -from workspace import workspace -from slipnet import slipnet -from temperature import temperature +from workspace import Workspace +from slipnet import Slipnet +from temperature import Temperature from coderack import Coderack - -coderack = Coderack(slipnet) +from context import context -def mainLoop(lastUpdate): - currentTime = coderack.codeletsRun - temperature.tryUnclamp(currentTime) - # Every 15 codelets, we update the workspace. - if currentTime >= lastUpdate + 15: - workspace.updateEverything() - coderack.updateCodelets() - slipnet.update() - temperature.update(workspace.getUpdatedTemperature()) - lastUpdate = currentTime - logging.debug('Number of codelets: %d', len(coderack.codelets)) - coderack.chooseAndRunCodelet() - return lastUpdate - - -def runTrial(answers): - """Run a trial of the copycat algorithm""" - slipnet.reset() - workspace.reset() - coderack.reset() - lastUpdate = float('-inf') - while not workspace.foundAnswer: - lastUpdate = mainLoop(lastUpdate) - if workspace.rule: - answer = workspace.rule.finalAnswer - else: - answer = None - finalTemperature = temperature.last_unclamped_value - finalTime = coderack.codeletsRun - print 'Answered %s (time %d, final temperature %.1f)' % (answer, finalTime, finalTemperature) - answers[answer] = answers.get(answer, {'count': 0, 'tempsum': 0, 'timesum': 0}) - answers[answer]['count'] += 1 - answers[answer]['tempsum'] += finalTemperature - answers[answer]['timesum'] += finalTime - +context.slipnet = Slipnet() +context.temperature = Temperature() +context.coderack = Coderack(context.slipnet) +context.workspace = Workspace() def run(initial, modified, target, iterations): - workspace.setStrings(initial, modified, target) - answers = {} - for i in xrange(iterations): - runTrial(answers) - for answer, d in answers.iteritems(): - d['avgtemp'] = d.pop('tempsum') / d['count'] - d['avgtime'] = d.pop('timesum') / d['count'] - return answers + context.run(initial, modified, target, iterations) diff --git a/copycat/workspace.py b/copycat/workspace.py index 58d4e40..8148de1 100644 --- a/copycat/workspace.py +++ b/copycat/workspace.py @@ -2,7 +2,7 @@ import logging import formulas from workspaceString import WorkspaceString - +from context import context def __adjustUnhappiness(values): result = sum(values) / 2