Files
copycat/copycat/coderackPressure.py

116 lines
3.6 KiB
Python

import logging
from formulas import Temperature
from slipnet import slipnet
class CoderackPressure(object):
def __init__(self, name):
self.name = name
def reset(self):
self.values = []
self.codelets = []
def _codelet_index(codelet):
name_indices = {
'bottom-up-bond-scout': 0,
'top-down-bond-scout--category': {
slipnet.successor: 1,
slipnet.predecessor: 2,
None: 3
},
'top-down-bond-scout--direction': {
slipnet.left: 4,
slipnet.right: 5,
None: 3,
},
'top-down-group-scout--category': {
slipnet.successorGroup: 6,
slipnet.predecessorGroup: 7,
None: 8,
},
'top-down-group-scout--direction': {
slipnet.left: 9,
slipnet.right: 10,
None: -1,
},
'group-scout--whole-string': 11,
'replacement-finder': 12,
'rule-scout': 13,
'rule-translator': 14,
'bottom-up-correspondence-scout': 15,
'important-object-correspondence-scout': 16,
'breaker': 17,
}
i = name_indices.get(codelet.name, -1)
try:
return int(i)
except (TypeError, ValueError):
try:
node = codelet.arguments[0]
return i[node]
except KeyError:
return i[None]
class CoderackPressures(object):
def __init__(self):
self.pressures = [
CoderackPressure('Bottom Up Bonds'),
CoderackPressure('Top Down Successor Bonds'),
CoderackPressure('Top Down Predecessor Bonds'),
CoderackPressure('Top Down Sameness Bonds'),
CoderackPressure('Top Down Left Bonds'),
CoderackPressure('Top Down Right Bonds'),
CoderackPressure('Top Down Successor Group'),
CoderackPressure('Top Down Predecessor Group'),
CoderackPressure('Top Down Sameness Group'),
CoderackPressure('Top Down Left Group'),
CoderackPressure('Top Down Right Group'),
CoderackPressure('Bottom Up Whole Group'),
CoderackPressure('Replacement Finder'),
CoderackPressure('Rule Codelets'),
CoderackPressure('Rule Translator'),
CoderackPressure('Bottom Up Correspondences'),
CoderackPressure('Important Object Correspondences'),
CoderackPressure('Breakers'),
]
self.reset()
def calculatePressures(self):
scale = (100.0 - Temperature + 10.0) / 15.0
values = map(
lambda pressure: sum(c.urgency ** scale for c in pressure.codelets),
self.pressures
)
totalValue = sum(values) or 1.0
values = [value / totalValue for value in values]
self.maxValue = max(values)
for pressure, value in zip(self.pressures, values):
pressure.values += [value * 100.0]
for codelet in self.removedCodelets:
if codelet.pressure:
codelet.pressure.codelets.remove(codelet)
self.removedCodelets = []
def reset(self):
self.maxValue = 0.001
self.removedCodelets = []
for pressure in self.pressures:
pressure.reset()
def addCodelet(self, codelet):
i = _codelet_index(codelet)
if i >= 0:
codelet.pressure = self.pressures[i]
if codelet.pressure:
codelet.pressure.codelets += [codelet]
logging.info('Add %s: %d', codelet.name, i)
def removeCodelet(self, codelet):
self.removedCodelets += [codelet]
def numberOfPressures(self):
return len(self.pressures)