Files
copycat/copycat/copycat.py
Arthur O'Dwyer d2436601ba Decouple coderack: remove global variable coderack.
Or at least, hide it upstairs in `copycat.py`.
`copycat.py` will eventually become a class, I'm guessing,
but let's pull everything into it first.
2017-04-18 01:12:22 -07:00

62 lines
1.8 KiB
Python

import logging
from workspace import workspace
from slipnet import slipnet
from temperature import temperature
from coderack import Coderack
coderack = Coderack()
def updateEverything():
workspace.updateEverything()
coderack.updateCodelets()
slipnet.update()
workspace.updateTemperature()
coderack.pressures.calculatePressures()
def mainLoop(lastUpdate):
temperature.tryUnclamp(coderack.codeletsRun)
result = lastUpdate
if not coderack.codeletsRun:
updateEverything()
result = coderack.codeletsRun
elif coderack.codeletsRun - lastUpdate >= slipnet.timeStepLength:
updateEverything()
result = coderack.codeletsRun
logging.debug('Number of codelets: %d', len(coderack.codelets))
coderack.chooseAndRunCodelet()
return result
def runTrial(answers):
"""Run a trial of the copycat algorithm"""
slipnet.reset()
workspace.reset()
coderack.reset()
lastUpdate = 0
while not workspace.foundAnswer:
lastUpdate = mainLoop(lastUpdate)
if workspace.rule:
answer = workspace.rule.finalAnswer
else:
answer = None
finalTemperature = temperature.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):
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