Replace the coderack->workspaceFormulas coupling with coderack->workspace.

This feels slightly less tangled. Still needs work.
This commit is contained in:
Arthur O'Dwyer
2017-04-16 23:52:49 -07:00
parent 63b3fd4999
commit fa2142efaa
2 changed files with 59 additions and 64 deletions

View File

@ -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)

View File

@ -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