diff --git a/copycat/coderack.py b/copycat/coderack.py index efde82c..c66a2f6 100644 --- a/copycat/coderack.py +++ b/copycat/coderack.py @@ -4,11 +4,11 @@ import random import codeletMethods import formulas -import workspaceFormulas from slipnet import slipnet from codelet import Codelet from coderackPressure import CoderackPressures from temperature import temperature +from workspace import workspace NUMBER_OF_BINS = 7 @@ -21,6 +21,57 @@ def getUrgencyBin(urgency): return i + 1 +def probabilityOfPosting(workspace, codeletName): + if codeletName == 'breaker': + return 1.0 + if 'description' in codeletName: + result = (formulas.Temperature / 100.0) ** 2 + else: + result = workspace.intraStringUnhappiness / 100.0 + if 'correspondence' in codeletName: + result = workspace.interStringUnhappiness / 100.0 + if 'replacement' in codeletName: + if workspace.numberOfUnreplacedObjects() > 0: + return 1.0 + return 0.0 + if 'rule' in codeletName: + if not workspace.rule: + return 1.0 + return workspace.rule.totalWeakness() / 100.0 + if 'translator' in codeletName: + assert False + return result + + +def howManyToPost(workspace, codeletName): + if codeletName == 'breaker' or 'description' in codeletName: + return 1 + if 'translator' in codeletName: + if not workspace.rule: + return 0 + return 1 + if 'rule' in codeletName: + return 2 + if 'group' in codeletName and not workspace.numberOfBonds(): + return 0 + if 'replacement' in codeletName and workspace.rule: + return 0 + number = 0 + if 'bond' in codeletName: + number = workspace.numberOfUnrelatedObjects() + if 'group' in codeletName: + number = workspace.numberOfUngroupedObjects() + if 'replacement' in codeletName: + number = workspace.numberOfUnreplacedObjects() + if 'correspondence' in codeletName: + number = workspace.numberOfUncorrespondingObjects() + if number < formulas.blur(2.0): + return 1 + if number < formulas.blur(4.0): + return 2 + return 3 + + class Coderack(object): def __init__(self): self.pressures = CoderackPressures() @@ -61,11 +112,10 @@ class Coderack(object): continue #logging.info('using slipnode: %s' % node.get_name()) for codeletName in node.codelets: - probability = workspaceFormulas.probabilityOfPosting( - codeletName) - howMany = workspaceFormulas.howManyToPost(codeletName) + probability = probabilityOfPosting(workspace, codeletName) + howMany = howManyToPost(workspace, codeletName) for _ in xrange(howMany): - if random.random() >= probability: + if not formulas.coinFlip(probability): continue urgency = getUrgencyBin( node.activation * node.conceptualDepth / 100.0) @@ -88,15 +138,15 @@ class Coderack(object): self.__postBottomUpCodelets('breaker') def __postBottomUpCodelets(self, codeletName): - probability = workspaceFormulas.probabilityOfPosting(codeletName) - howMany = workspaceFormulas.howManyToPost(codeletName) + probability = probabilityOfPosting(workspace, codeletName) + howMany = howManyToPost(workspace, codeletName) urgency = 3 if codeletName == 'breaker': urgency = 1 if formulas.Temperature < 25.0 and 'translator' in codeletName: urgency = 5 for _ in xrange(howMany): - if random.random() < probability: + if formulas.coinFlip(probability): codelet = Codelet(codeletName, urgency, self.codeletsRun) self.post(codelet) @@ -214,7 +264,7 @@ class Coderack(object): def postInitialCodelets(self): for name in self.initialCodeletNames: - for _ in xrange(2 * workspaceFormulas.numberOfObjects()): + for _ in xrange(2 * len(workspace.objects)): codelet = Codelet(name, 1, self.codeletsRun) self.post(codelet) diff --git a/copycat/workspaceFormulas.py b/copycat/workspaceFormulas.py index ed1328a..64067f0 100644 --- a/copycat/workspaceFormulas.py +++ b/copycat/workspaceFormulas.py @@ -6,10 +6,6 @@ from slipnet import slipnet import formulas -def numberOfObjects(): - return len(workspace.objects) - - def chooseUnmodifiedObject(attribute, inObjects): objects = [o for o in inObjects if o.string != workspace.modified] if not len(objects): @@ -85,54 +81,3 @@ def __descriptionTypeSupport(descriptionType, string): if description.descriptionType == descriptionType: described_count += 1 return described_count / float(total) - - -def probabilityOfPosting(codeletName): - if codeletName == 'breaker': - return 1.0 - if 'description' in codeletName: - result = (formulas.Temperature / 100.0) ** 2 - else: - result = workspace.intraStringUnhappiness / 100.0 - if 'correspondence' in codeletName: - result = workspace.interStringUnhappiness / 100.0 - if 'replacement' in codeletName: - if workspace.numberOfUnreplacedObjects() > 0: - return 1.0 - return 0.0 - if 'rule' in codeletName: - if not workspace.rule: - return 1.0 - return workspace.rule.totalWeakness() / 100.0 - if 'translator' in codeletName: - assert False - return result - - -def howManyToPost(codeletName): - if codeletName == 'breaker' or 'description' in codeletName: - return 1 - if 'translator' in codeletName: - if not workspace.rule: - return 0 - return 1 - if 'rule' in codeletName: - return 2 - if 'group' in codeletName and not workspace.numberOfBonds(): - return 0 - if 'replacement' in codeletName and workspace.rule: - return 0 - number = 0 - if 'bond' in codeletName: - number = workspace.numberOfUnrelatedObjects() - if 'group' in codeletName: - number = workspace.numberOfUngroupedObjects() - if 'replacement' in codeletName: - number = workspace.numberOfUnreplacedObjects() - if 'correspondence' in codeletName: - number = workspace.numberOfUncorrespondingObjects() - if number < formulas.blur(2.0): - return 1 - if number < formulas.blur(4.0): - return 2 - return 3