testing
This commit is contained in:
54
copycat/context.py
Normal file
54
copycat/context.py
Normal 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()
|
||||
@ -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)
|
||||
|
||||
@ -2,7 +2,7 @@ import logging
|
||||
|
||||
import formulas
|
||||
from workspaceString import WorkspaceString
|
||||
|
||||
from context import context
|
||||
|
||||
def __adjustUnhappiness(values):
|
||||
result = sum(values) / 2
|
||||
|
||||
Reference in New Issue
Block a user