Files
copycat/copycat/workspaceString.py
2017-04-29 14:29:43 -07:00

80 lines
2.6 KiB
Python

import logging
from group import Group
from letter import Letter
class WorkspaceString(object):
def __init__(self, ctx, s):
slipnet = ctx.slipnet
workspace = ctx.workspace
self.ctx = ctx
self.string = s
self.bonds = []
self.objects = []
self.letters = []
self.length = len(s)
self.intraStringUnhappiness = 0.0
for position, c in enumerate(self.string.upper(), 1):
value = ord(c) - ord('A')
letter = Letter(self, position, self.length)
letter.workspaceString = self
letter.addDescription(slipnet.objectCategory, slipnet.letter)
letter.addDescription(slipnet.letterCategory, slipnet.letters[value])
letter.describe(position, self.length)
workspace.buildDescriptions(letter)
self.letters += [letter]
def __repr__(self):
return '<WorkspaceString: %s>' % self.string
def __str__(self):
return '%s with %d letters, %d objects, %d bonds' % (
self.string, len(self.letters), len(self.objects), len(self.bonds))
def log(self, heading):
s = '%s: %s - ' % (heading, self)
for l in self.letters:
s += ' %s' % l
s += '; '
for o in self.objects:
s += ' %s' % o
s += '; '
for b in self.bonds:
s += ' %s' % b
s += '.'
logging.info(s)
def __len__(self):
return len(self.string)
def __getitem__(self, i):
return self.string[i]
def updateRelativeImportance(self):
"""Update the normalised importance of all objects in the string"""
total = sum(o.rawImportance for o in self.objects)
if not total:
for o in self.objects:
o.relativeImportance = 0.0
else:
for o in self.objects:
logging.info('object: %s, relative: %d = raw: %d / total: %d',
o, o.relativeImportance * 1000, o.rawImportance,
total)
o.relativeImportance = o.rawImportance / total
def updateIntraStringUnhappiness(self):
if not len(self.objects):
self.intraStringUnhappiness = 0.0
return
total = sum(o.intraStringUnhappiness for o in self.objects)
self.intraStringUnhappiness = total / len(self.objects)
def equivalentGroup(self, sought):
for objekt in self.objects:
if isinstance(objekt, Group):
if objekt.sameGroup(sought):
return objekt
return None