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
|
import logging
|
||||||
|
|
||||||
from workspace import workspace
|
from workspace import Workspace
|
||||||
from slipnet import slipnet
|
from slipnet import Slipnet
|
||||||
from temperature import temperature
|
from temperature import Temperature
|
||||||
from coderack import Coderack
|
from coderack import Coderack
|
||||||
|
|
||||||
|
from context import context
|
||||||
coderack = Coderack(slipnet)
|
|
||||||
|
|
||||||
|
|
||||||
def mainLoop(lastUpdate):
|
context.slipnet = Slipnet()
|
||||||
currentTime = coderack.codeletsRun
|
context.temperature = Temperature()
|
||||||
temperature.tryUnclamp(currentTime)
|
context.coderack = Coderack(context.slipnet)
|
||||||
# Every 15 codelets, we update the workspace.
|
context.workspace = 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
|
|
||||||
|
|
||||||
|
|
||||||
def run(initial, modified, target, iterations):
|
def run(initial, modified, target, iterations):
|
||||||
workspace.setStrings(initial, modified, target)
|
context.run(initial, modified, target, iterations)
|
||||||
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
|
|
||||||
|
|||||||
@ -2,7 +2,7 @@ import logging
|
|||||||
|
|
||||||
import formulas
|
import formulas
|
||||||
from workspaceString import WorkspaceString
|
from workspaceString import WorkspaceString
|
||||||
|
from context import context
|
||||||
|
|
||||||
def __adjustUnhappiness(values):
|
def __adjustUnhappiness(values):
|
||||||
result = sum(values) / 2
|
result = sum(values) / 2
|
||||||
|
|||||||
Reference in New Issue
Block a user