Initial addition of Python scripts
This commit is contained in:
160
workspaceFormulas.py
Normal file
160
workspaceFormulas.py
Normal file
@ -0,0 +1,160 @@
|
||||
import logging
|
||||
|
||||
from workspace import workspace
|
||||
from temperature import temperature
|
||||
from slipnet import slipnet
|
||||
import formulas
|
||||
|
||||
class WorkspaceFormulas(object):
|
||||
def __init__(self):
|
||||
self.clampTemperature = False
|
||||
|
||||
def updateTemperature(self):
|
||||
logging.debug('updateTemperature')
|
||||
workspace.assessTemperature()
|
||||
ruleWeakness = 100.0
|
||||
if workspace.rule:
|
||||
workspace.rule.updateStrength()
|
||||
ruleWeakness = 100.0 - workspace.rule.totalStrength
|
||||
values = ( (workspace.totalUnhappiness, 0.8), (ruleWeakness, 0.2), )
|
||||
slightly_above_actual_temperature = formulas.actualTemperature + 0.001
|
||||
logging.info('actualTemperature: %f' % slightly_above_actual_temperature)
|
||||
formulas.actualTemperature = formulas.weightedAverage(values)
|
||||
logging.info('unhappiness: %f, weakness: %f, actualTemperature: %f' % (
|
||||
workspace.totalUnhappiness + 0.001, ruleWeakness + 0.001, formulas.actualTemperature + 0.001))
|
||||
if temperature.clamped:
|
||||
formulas.actualTemperature = 100.0
|
||||
logging.info('actualTemperature: %f' % (formulas.actualTemperature + 0.001))
|
||||
temperature.update(formulas.actualTemperature)
|
||||
if not self.clampTemperature:
|
||||
formulas.Temperature = formulas.actualTemperature
|
||||
temperature.update(formulas.Temperature)
|
||||
|
||||
workspaceFormulas = WorkspaceFormulas()
|
||||
|
||||
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):
|
||||
print 'no objects available in initial or target strings'
|
||||
return formulas.chooseObjectFromList(objects,attribute)
|
||||
|
||||
def chooseNeighbour(source):
|
||||
objects = []
|
||||
for objekt in workspace.objects:
|
||||
if objekt.string != source.string:
|
||||
continue
|
||||
if objekt.leftStringPosition == source.rightStringPosition + 1:
|
||||
objects += [ objekt ]
|
||||
elif source.leftStringPosition == objekt.rightStringPosition + 1:
|
||||
objects += [ objekt ]
|
||||
return formulas.chooseObjectFromList(objects,"intraStringSalience")
|
||||
|
||||
def chooseDirectedNeighbor(source,direction):
|
||||
if direction == slipnet.left:
|
||||
logging.info('Left')
|
||||
return __chooseLeftNeighbor(source)
|
||||
logging.info('Right')
|
||||
return __chooseRightNeighbor(source)
|
||||
|
||||
def __chooseLeftNeighbor(source):
|
||||
objects = []
|
||||
for o in workspace.objects:
|
||||
if o.string == source.string :
|
||||
if source.leftStringPosition == o.rightStringPosition + 1:
|
||||
logging.info('%s is on left of %s' % (o,source))
|
||||
objects += [ o ]
|
||||
else:
|
||||
logging.info('%s is not on left of %s' % (o,source))
|
||||
logging.info('Number of left objects: %s' % len(objects))
|
||||
return formulas.chooseObjectFromList(objects,'intraStringSalience')
|
||||
|
||||
def __chooseRightNeighbor(source):
|
||||
objects = [ o for o in workspace.objects if
|
||||
o.string == source.string and
|
||||
o.leftStringPosition == source.rightStringPosition + 1
|
||||
]
|
||||
return formulas.chooseObjectFromList(objects,'intraStringSalience')
|
||||
|
||||
def chooseBondFacet(source, destination):
|
||||
sourceFacets = [ d.descriptionType for d in source.descriptions if d.descriptionType in slipnet.bondFacets ]
|
||||
bondFacets = [ d.descriptionType for d in destination.descriptions if d.descriptionType in sourceFacets ]
|
||||
if not bondFacets:
|
||||
return None
|
||||
supports = [ __supportForDescriptionType(f,source.string) for f in bondFacets ]
|
||||
i = formulas.selectListPosition(supports)
|
||||
return bondFacets[ i ]
|
||||
|
||||
def __supportForDescriptionType(descriptionType,string):
|
||||
return ( descriptionType.activation + __descriptionTypeSupport(descriptionType,string) ) / 2
|
||||
|
||||
def __descriptionTypeSupport(descriptionType,string):
|
||||
"""The proportion of objects in the string that have a description with this descriptionType"""
|
||||
numberOfObjects = totalNumberOfObjects = 0.0
|
||||
for objekt in workspace.objects:
|
||||
if objekt.string == string:
|
||||
totalNumberOfObjects += 1.0
|
||||
for description in objekt.descriptions:
|
||||
if description.descriptionType == descriptionType:
|
||||
numberOfObjects += 1.0
|
||||
return numberOfObjects / totalNumberOfObjects
|
||||
|
||||
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:
|
||||
if not workspace.rule:
|
||||
assert 0
|
||||
return 0.0
|
||||
assert 0
|
||||
return 1.0
|
||||
return result
|
||||
|
||||
def howManyToPost(codeletName):
|
||||
if codeletName == 'breaker':
|
||||
return 1
|
||||
if '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()
|
||||
# print 'post number of unrelated: %d, objects: %d' % (number,len(workspace.objects))
|
||||
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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user