This commit is contained in:
Arthur O'Dwyer
2017-04-17 10:36:08 -07:00
parent 965bd13298
commit e6cbb347de
3 changed files with 64 additions and 49 deletions

54
copycat/context.py Normal file
View File

@ -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()

View File

@ -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)

View File

@ -2,7 +2,7 @@ import logging
import formulas
from workspaceString import WorkspaceString
from context import context
def __adjustUnhappiness(values):
result = sum(values) / 2