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:
@ -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):
|
||||||
|
|||||||
@ -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'])
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user