Run multiple iterations. Print final temperatures. Reduce stdout spew.

This makes the output of the program more closely resemble that of the
original Copycat described in "FCCA" page 236:

> [T]he average final temperature of an answer can be thought of as
> the program's own assessment of that answer's quality, with lower
> temperatures meaning higher quality.

For example, running `python main.py abc abd ijk 100` produced the
following output:

    ijl: 98 (avg temp 16.0)
    jjk: 1 (avg temp 56.3)
    ijk: 1 (avg temp 57.9)

And for `python main.py abc abd ijkk 100`:

    ijkkk: 2 (avg temp 19.8)
    ijkl: 51 (avg temp 28.1)
    ijll: 46 (avg temp 28.9)
    djkk: 1 (avg temp 77.4)
This commit is contained in:
Arthur O'Dwyer
2017-04-14 11:59:52 -07:00
parent ed1d95896e
commit a2260cdaf6
3 changed files with 28 additions and 17 deletions

View File

@ -31,7 +31,7 @@ def __showWhichStringObjectIsFrom(structure):
whence = 'target' whence = 'target'
if structure.string == workspace.initial: if structure.string == workspace.initial:
whence = 'initial' whence = 'initial'
print 'object chosen = %s from %s string' % (structure, whence) #print 'object chosen = %s from %s string' % (structure, whence)
def __getScoutSource(slipnode, relevanceMethod, typeName): def __getScoutSource(slipnode, relevanceMethod, typeName):

View File

@ -1,7 +1,4 @@
import logging import logging
logging.basicConfig(level=logging.INFO, format='%(message)s',
filename='./copycat.log', filemode='w')
from workspace import workspace from workspace import workspace
from workspaceFormulas import workspaceFormulas from workspaceFormulas import workspaceFormulas
@ -33,9 +30,8 @@ def mainLoop(lastUpdate):
return result return result
def runTrial(): def runTrial(answers):
"""Run a trial of the copycat algorithm""" """Run a trial of the copycat algorithm"""
answers = {}
slipnet.reset() slipnet.reset()
workspace.reset() workspace.reset()
coderack.reset() coderack.reset()
@ -46,13 +42,20 @@ def runTrial():
answer = workspace.rule.finalAnswer answer = workspace.rule.finalAnswer
else: else:
answer = None answer = None
print '%d: %s' % (coderack.codeletsRun, answer) finalTemperature = temperature.value
answers[answer] = answers.get(answer, 0) + 1 print 'Answered %s (time %d, final temperature %.1f)' % (answer, coderack.codeletsRun, finalTemperature)
logging.debug('codelets used:') answers[answer] = answers.get(answer, {'count': 0, 'tempsum': 0})
for answer, count in answers.iteritems(): answers[answer]['count'] += 1
print '%s:%d' % (answer, count) answers[answer]['tempsum'] += finalTemperature
def run(initial, modified, target): def run(initial, modified, target, iterations):
workspace.setStrings(initial, modified, target) workspace.setStrings(initial, modified, target)
runTrial() answers = {}
for i in xrange(iterations):
runTrial(answers)
for answer, d in answers.iteritems():
d['avgtemp'] = d['tempsum'] / d['count']
d.pop('tempsum')
for answer, d in sorted(answers.iteritems(), key=lambda kv: kv[1]['avgtemp']):
print '%s: %d (avg temp %.1f)' % (answer, d['count'], d['avgtemp'])

View File

@ -1,6 +1,6 @@
"""Run the copycat program""" """Run the copycat program"""
import logging
import sys import sys
import copycat import copycat
@ -8,12 +8,20 @@ import copycat
def main(program, args): def main(program, args):
"""Run the program""" """Run the program"""
logging.basicConfig(level=logging.WARN, format='%(message)s',
filename='./copycat.log', filemode='w')
try: try:
initial, modified, target = args if len(args) == 4:
copycat.run(initial, modified, target) initial, modified, target = args[:-1]
iterations = int(args[-1])
else:
initial, modified, target = args
iterations = 1
copycat.run(initial, modified, target, iterations)
return 0 return 0
except ValueError: except ValueError:
print >> sys.stderr, 'Usage: %s initial modified target' % program print >> sys.stderr, 'Usage: %s initial modified target [iterations]' % program
return 1 return 1