Pylint the code

This commit is contained in:
J Alan Brogan
2014-12-22 23:44:09 +00:00
parent a5930b486c
commit daeff3d9bf
14 changed files with 388 additions and 325 deletions

View File

@ -4,6 +4,7 @@ from workspace import workspace
class Bond(WorkspaceStructure):
# pylint: disable=too-many-arguments
def __init__(self, source, destination, bondCategory, bondFacet,
sourceDescriptor, destinationDescriptor):
WorkspaceStructure.__init__(self)
@ -23,31 +24,30 @@ class Bond(WorkspaceStructure):
self.category = bondCategory
self.destinationIsOnRight = self.destination == self.rightObject
self.bidirectional = self.sourceDescriptor == self.destinationDescriptor
self.bidirectional = (self.sourceDescriptor ==
self.destinationDescriptor)
if self.bidirectional:
self.directionCategory = None
def flippedVersion(self):
"""
"""
return Bond(
self.destination, self.get_source(), self.category.getRelatedNode(slipnet.opposite),
self.facet, self.destinationDescriptor, self.sourceDescriptor
)
self.destination, self.get_source(),
self.category.getRelatedNode(slipnet.opposite),
self.facet, self.destinationDescriptor, self.sourceDescriptor)
def __repr__(self):
return '<Bond: %s>' % self.__str__()
def __str__(self):
return '%s bond between %s and %s' % (self.category.name, self.leftObject, self.rightObject)
return '%s bond between %s and %s' % (
self.category.name, self.leftObject, self.rightObject)
def buildBond(self):
workspace.structures += [self]
self.string.bonds += [self]
self.category.buffer = 100.0
if self.directionCategory:
self.directionCategory.buffer = 100.0
self.directionCategory.buffer = 100.0
self.leftObject.rightBond = self
self.rightObject.leftBond = self
self.leftObject.bonds += [self]
@ -79,7 +79,9 @@ class Bond(WorkspaceStructure):
else:
objekt = self.leftObject.correspondence.objectFromInitial
if objekt.leftmost and objekt.rightBond:
if objekt.rightBond.directionCategory and objekt.rightBond.directionCategory != self.directionCategory:
if (objekt.rightBond.directionCategory and
objekt.rightBond.directionCategory !=
self.directionCategory):
incompatibles += [correspondence]
if self.rightObject.rightmost and self.rightObject.correspondence:
correspondence = self.rightObject.correspondence
@ -88,7 +90,9 @@ class Bond(WorkspaceStructure):
else:
objekt = self.rightObject.correspondence.objectFromInitial
if objekt.rightmost and objekt.leftBond:
if objekt.leftBond.directionCategory and objekt.leftBond.directionCategory != self.directionCategory:
if (objekt.leftBond.directionCategory and
objekt.leftBond.directionCategory !=
self.directionCategory):
incompatibles += [correspondence]
return incompatibles
@ -96,7 +100,8 @@ class Bond(WorkspaceStructure):
# bonds between objects of same type(ie. letter or group) are
# stronger than bonds between different types
sourceGap = self.get_source().leftIndex != self.get_source().rightIndex
destinationGap = self.destination.leftIndex != self.destination.rightIndex
destinationGap = (self.destination.leftIndex !=
self.destination.rightIndex)
if sourceGap == destinationGap:
memberCompatibility = 1.0
else:
@ -106,7 +111,8 @@ class Bond(WorkspaceStructure):
facetFactor = 1.0
else:
facetFactor = 0.7
strength = min(100.0, memberCompatibility * facetFactor * self.category.bondDegreeOfAssociation())
strength = min(100.0, memberCompatibility * facetFactor *
self.category.bondDegreeOfAssociation())
self.internalStrength = strength
def updateExternalStrength(self):
@ -121,14 +127,16 @@ class Bond(WorkspaceStructure):
self.externalStrength = strength
def numberOfLocalSupportingBonds(self):
return len([b for b in self.string.bonds if b.string == self.get_source().string and
self.leftObject.letterDistance(b.leftObject) != 0 and
self.rightObject.letterDistance(b.rightObject) != 0 and
self.category == b.category and
self.directionCategory == b.directionCategory])
return len([b for b in self.string.bonds if
b.string == self.get_source().string and
self.leftObject.letterDistance(b.leftObject) != 0 and
self.rightObject.letterDistance(b.rightObject) != 0 and
self.category == b.category and
self.directionCategory == b.directionCategory])
def sameCategories(self, other):
return self.category == other.category and self.directionCategory == other.directionCategory
return (self.category == other.category and
self.directionCategory == other.directionCategory)
def myEnds(self, object1, object2):
if self.get_source() == object1 and self.destination == object2:
@ -146,11 +154,14 @@ class Bond(WorkspaceStructure):
if object1.beside(object2):
slotSum += 1.0
for bond in self.string.bonds:
if bond != self and self.sameCategories(bond) and self.myEnds(object1, object2):
supportSum += 1.0
if slotSum == 0.0:
return 0.0
return 100.0 * supportSum / slotSum
if (bond != self and
self.sameCategories(bond) and
self.myEnds(object1, object2)):
supportSum += 1.0
try:
return 100.0 * supportSum / slotSum
except ZeroDivisionError:
return 0.0
def sameNeighbours(self, other):
if self.leftObject == other.leftObject:
@ -170,16 +181,20 @@ class Bond(WorkspaceStructure):
def possibleGroupBonds(bondCategory, directionCategory, bondFacet, bonds):
result = []
for bond in bonds:
if bond.category == bondCategory and bond.directionCategory == directionCategory:
if (bond.category == bondCategory and
bond.directionCategory == directionCategory):
result += [bond]
else:
# a modified bond might be made
if bondCategory == slipnet.sameness:
return None # a different bond cannot be made here
if bond.category == bondCategory or bond.directionCategory == directionCategory:
if (bond.category == bondCategory or
bond.directionCategory == directionCategory):
return None # a different bond cannot be made here
if bond.category == slipnet.sameness:
return None
bond = Bond(bond.destination, bond.get_source(), bondCategory, bondFacet, bond.destinationDescriptor, bond.sourceDescriptor)
bond = Bond(bond.destination, bond.get_source(), bondCategory,
bondFacet, bond.destinationDescriptor,
bond.sourceDescriptor)
result += [bond]
return result

View File

@ -1,14 +1,25 @@
import random
import random
import logging
import slipnet
import temperature
import formulas
from workspaceFormulas import chooseDirectedNeighbor
from workspaceFormulas import chooseNeighbour
from coderack import coderack
from workspaceObject import WorkspaceObject
from letter import Letter
from replacement import Replacement
from formulas import *
from workspaceFormulas import *
from workspaceFormulas import workspace
from group import Group
from bond import Bond, possibleGroupBonds
from bond import Bond
from bond import possibleGroupBonds
from correspondence import Correspondence
from workspaceFormulas import chooseUnmodifiedObject
from workspaceFormulas import chooseBondFacet
# some methods common to the codelets
@ -28,10 +39,10 @@ def __getScoutSource(slipnode, relevanceMethod, typeName):
targetRelevance = relevanceMethod(workspace.target, slipnode)
initialUnhappiness = workspace.initial.intraStringUnhappiness
targetUnhappiness = workspace.target.intraStringUnhappiness
logging.info('initial : relevance = %d, unhappiness=%d' % (
initialRelevance, int(initialUnhappiness)))
logging.info('target : relevance = %d, unhappiness=%d' % (
targetRelevance, int(targetUnhappiness)))
logging.info('initial : relevance = %d, unhappiness=%d',
initialRelevance, int(initialUnhappiness))
logging.info('target : relevance = %d, unhappiness=%d',
targetRelevance, int(targetUnhappiness))
string = workspace.initial
relevances = initialRelevance + targetRelevance
unhappinesses = initialUnhappiness + targetUnhappiness
@ -39,11 +50,11 @@ def __getScoutSource(slipnode, relevanceMethod, typeName):
initials = initialRelevance + initialUnhappiness
if randomized > initials:
string = workspace.target
logging.info('target string selected: %s for %s' % (
workspace.target, typeName))
logging.info('target string selected: %s for %s',
workspace.target, typeName)
else:
logging.info('initial string selected: %s for %s' % (
workspace.initial, typeName))
logging.info('initial string selected: %s for %s',
workspace.initial, typeName)
source = chooseUnmodifiedObject('intraStringSalience', string.objects)
return source
@ -68,12 +79,12 @@ def __allOppositeMappings(mappings):
def __structureVsStructure(structure1, weight1, structure2, weight2):
structure1.updateStrength()
structure2.updateStrength()
weightedStrength1 = temperatureAdjustedValue(
weightedStrength1 = formulas.temperatureAdjustedValue(
structure1.totalStrength * weight1)
weightedStrength2 = temperatureAdjustedValue(
weightedStrength2 = formulas.temperatureAdjustedValue(
structure2.totalStrength * weight2)
rhs = (weightedStrength1 + weightedStrength2) * random.random()
logging.info('%d > %d' % (weightedStrength1, rhs))
logging.info('%d > %d', weightedStrength1, rhs)
return weightedStrength1 > rhs
@ -83,9 +94,9 @@ def __fight(structure, structureWeight, incompatibles, incompatibleWeight):
for incompatible in incompatibles:
if not __structureVsStructure(structure, structureWeight,
incompatible, incompatibleWeight):
logging.info('lost fight with %s' % incompatible)
logging.info('lost fight with %s', incompatible)
return False
logging.info('won fight with %s' % incompatible)
logging.info('won fight with %s', incompatible)
return True
@ -94,18 +105,19 @@ def __fightIncompatibles(incompatibles, structure, name,
if len(incompatibles):
if __fight(structure, structureWeight,
incompatibles, incompatibleWeight):
logging.info('broke the %s' % name)
logging.info('broke the %s', name)
return True
logging.info('failed to break %s: Fizzle' % name)
logging.info('failed to break %s: Fizzle', name)
return False
logging.info('no incompatible %s' % name)
logging.info('no incompatible %s', name)
return True
def __slippability(conceptMappings):
for mapping in conceptMappings:
slippiness = mapping.slipability() / 100.0
probabilityOfSlippage = temperatureAdjustedProbability(slippiness)
probabilityOfSlippage = formulas.temperatureAdjustedProbability(
slippiness)
if formulas.coinFlip(probabilityOfSlippage):
return True
return False
@ -113,8 +125,8 @@ def __slippability(conceptMappings):
# start the actual codelets
def breaker():
probabilityOfFizzle = (100.0 - Temperature) / 100.0
assert not coinFlip(probabilityOfFizzle)
probabilityOfFizzle = (100.0 - formulas.Temperature) / 100.0
assert not formulas.coinFlip(probabilityOfFizzle)
# choose a structure at random
structures = [s for s in workspace.structures if
isinstance(s, (Group, Bond, Correspondence))]
@ -128,9 +140,9 @@ def breaker():
breakObjects += [structure.source.group]
# try to break all objects
for structure in breakObjects:
breakProbability = temperatureAdjustedProbability(
breakProbability = formulas.temperatureAdjustedProbability(
structure.totalStrength / 100.0)
if coinFlip(breakProbability):
if formulas.coinFlip(breakProbability):
return
for structure in breakObjects:
structure.break_the_structure()
@ -140,13 +152,13 @@ def bottom_up_description_scout(codelet):
chosenObject = chooseUnmodifiedObject('totalSalience', workspace.objects)
assert chosenObject
__showWhichStringObjectIsFrom(chosenObject)
description = chooseRelevantDescriptionByActivation(chosenObject)
description = formulas.chooseRelevantDescriptionByActivation(chosenObject)
assert description
sliplinks = similarPropertyLinks(description.descriptor)
sliplinks = formulas.similarPropertyLinks(description.descriptor)
assert sliplinks and len(sliplinks)
values = [sliplink.degreeOfAssociation() * sliplink.destination.activation
for sliplink in sliplinks]
i = selectListPosition(values)
i = formulas.selectListPosition(values)
chosen = sliplinks[i]
chosenProperty = chosen.destination
coderack.proposeDescription(chosenObject, chosenProperty.category(),
@ -161,7 +173,7 @@ def top_down_description_scout(codelet):
descriptions = chosenObject.getPossibleDescriptions(descriptionType)
assert descriptions and len(descriptions)
values = [n.activation for n in descriptions]
i = selectListPosition(values)
i = formulas.selectListPosition(values)
chosenProperty = descriptions[i]
coderack.proposeDescription(chosenObject, chosenProperty.category(),
chosenProperty, codelet)
@ -172,7 +184,7 @@ def description_strength_tester(codelet):
description.descriptor.buffer = 100.0
description.updateStrength()
strength = description.totalStrength
probability = temperatureAdjustedProbability(strength / 100.0)
probability = formulas.temperatureAdjustedProbability(strength / 100.0)
assert formulas.coinFlip(probability)
coderack.newCodelet('description-builder', codelet, strength)
@ -192,10 +204,10 @@ def bottom_up_bond_scout(codelet):
__showWhichStringObjectIsFrom(source)
destination = chooseNeighbour(source)
assert destination
logging.info('destination: %s' % destination)
logging.info('destination: %s', destination)
bondFacet = __getBondFacet(source, destination)
logging.info('chosen bond facet: %s' % bondFacet.get_name())
logging.info('Source: %s, destination: %s' % (source, destination))
logging.info('chosen bond facet: %s', bondFacet.get_name())
logging.info('Source: %s, destination: %s', source, destination)
bond_descriptors = __getDescriptors(bondFacet, source, destination)
sourceDescriptor, destinationDescriptor = bond_descriptors
logging.info("source descriptor: %s", sourceDescriptor.name.upper())
@ -205,7 +217,7 @@ def bottom_up_bond_scout(codelet):
assert category
if category == slipnet.identity:
category = slipnet.sameness
logging.info('proposing %s bond ' % category.name)
logging.info('proposing %s bond ', category.name)
coderack.proposeBond(source, destination, category, bondFacet,
sourceDescriptor, destinationDescriptor, codelet)
@ -243,16 +255,16 @@ def rule_scout(codelet):
if targetObject.described(node):
if targetObject.distinguishingDescriptor(node):
newList += [node]
objectList = newList # XXX surely this should be +=
objectList = newList # surely this should be +=
# "union of this and distinguishing descriptors"
assert objectList and len(objectList)
# use conceptual depth to choose a description
valueList = []
for node in objectList:
depth = node.conceptualDepth
value = temperatureAdjustedValue(depth)
value = formulas.temperatureAdjustedValue(depth)
valueList += [value]
i = selectListPosition(valueList)
i = formulas.selectListPosition(valueList)
descriptor = objectList[i]
# choose the relation (change the letmost object to "successor" or "d"
objectList = []
@ -264,9 +276,9 @@ def rule_scout(codelet):
valueList = []
for node in objectList:
depth = node.conceptualDepth
value = temperatureAdjustedValue(depth)
value = formulas.temperatureAdjustedValue(depth)
valueList += [value]
i = selectListPosition(valueList)
i = formulas.selectListPosition(valueList)
relation = objectList[i]
coderack.proposeRule(slipnet.letterCategory, descriptor,
slipnet.letter, relation, codelet)
@ -275,7 +287,8 @@ def rule_scout(codelet):
def rule_strength_tester(codelet):
rule = codelet.arguments[0]
rule.updateStrength()
probability = temperatureAdjustedProbability(rule.totalStrength / 100.0)
probability = formulas.temperatureAdjustedProbability(
rule.totalStrength / 100.0)
assert random.random() <= probability
coderack.newCodelet('rule-builder', codelet, rule.totalStrength, rule)
@ -305,7 +318,7 @@ def replacement_finder():
-1: slipnet.successor,
1: slipnet.predecessor}
relation = relations[diff]
logging.info('Relation found: %s' % relation.name)
logging.info('Relation found: %s', relation.name)
else:
relation = None
logging.info('no relation found')
@ -320,9 +333,10 @@ def replacement_finder():
def top_down_bond_scout__category(codelet):
logging.info('top_down_bond_scout__category')
category = codelet.arguments[0]
source = __getScoutSource(category, localBondCategoryRelevance, 'bond')
source = __getScoutSource(category, formulas.localBondCategoryRelevance,
'bond')
destination = chooseNeighbour(source)
logging.info('source: %s, destination: %s' % (source, destination))
logging.info('source: %s, destination: %s', source, destination)
assert destination
bondFacet = __getBondFacet(source, destination)
sourceDescriptor, destinationDescriptor = __getDescriptors(
@ -347,10 +361,10 @@ def top_down_bond_scout__category(codelet):
def top_down_bond_scout__direction(codelet):
direction = codelet.arguments[0]
source = __getScoutSource(
direction, localDirectionCategoryRelevance, 'bond')
direction, formulas.localDirectionCategoryRelevance, 'bond')
destination = chooseDirectedNeighbor(source, direction)
assert destination
logging.info('to object: %s' % destination)
logging.info('to object: %s', destination)
bondFacet = __getBondFacet(source, destination)
sourceDescriptor, destinationDescriptor = __getDescriptors(
bondFacet, source, destination)
@ -367,8 +381,8 @@ def bond_strength_tester(codelet):
__showWhichStringObjectIsFrom(bond)
bond.updateStrength()
strength = bond.totalStrength
probability = temperatureAdjustedProbability(strength / 100.0)
logging.info('bond strength = %d for %s' % (strength, bond))
probability = formulas.temperatureAdjustedProbability(strength / 100.0)
logging.info('bond strength = %d for %s', strength, bond)
assert formulas.coinFlip(probability)
bond.facet.buffer = 100.0
bond.sourceDescriptor.buffer = 100.0
@ -391,9 +405,9 @@ def bond_builder(codelet):
logging.info('already exists: activate descriptors & Fizzle')
return
incompatibleBonds = bond.getIncompatibleBonds()
logging.info('number of incompatibleBonds: %d' % len(incompatibleBonds))
logging.info('number of incompatibleBonds: %d', len(incompatibleBonds))
if len(incompatibleBonds):
logging.info('%s' % incompatibleBonds[0])
logging.info('%s', incompatibleBonds[0])
assert __fightIncompatibles(incompatibleBonds, bond, 'bonds', 1.0, 1.0)
incompatibleGroups = bond.source.getCommonGroups(bond.destination)
assert __fightIncompatibles(incompatibleGroups, bond, 'groups', 1.0, 1.0)
@ -413,15 +427,18 @@ def bond_builder(codelet):
incompatible.break_the_structure()
for incompatible in incompatibleCorrespondences:
incompatible.break_the_structure()
logging.info('building bond %s' % bond)
logging.info('building bond %s', bond)
bond.buildBond()
# pylint: disable=too-many-branches
# pylint: disable=too-many-statements
def top_down_group_scout__category(codelet):
groupCategory = codelet.arguments[0]
category = groupCategory.getRelatedNode(slipnet.bondCategory)
assert category
source = __getScoutSource(category, localBondCategoryRelevance, 'group')
source = __getScoutSource(category, formulas.localBondCategoryRelevance,
'group')
assert source and not source.spansString()
if source.leftmost:
direction = slipnet.right
@ -430,7 +447,7 @@ def top_down_group_scout__category(codelet):
else:
activations = [slipnet.left.activation]
activations += [slipnet.right.activation]
if not selectListPosition(activations):
if not formulas.selectListPosition(activations):
direction = slipnet.left
else:
direction = slipnet.right
@ -500,9 +517,10 @@ def top_down_group_scout__category(codelet):
def top_down_group_scout__direction(codelet):
direction = codelet.arguments[0]
source = __getScoutSource(direction, localDirectionCategoryRelevance,
source = __getScoutSource(direction,
formulas.localDirectionCategoryRelevance,
'direction')
logging.info('source chosen = %s' % source)
logging.info('source chosen = %s', source)
assert not source.spansString()
if source.leftmost:
mydirection = slipnet.right
@ -511,7 +529,7 @@ def top_down_group_scout__direction(codelet):
else:
activations = [slipnet.left.activation]
activations += [slipnet.right.activation]
if not selectListPosition(activations):
if not formulas.selectListPosition(activations):
mydirection = slipnet.left
else:
mydirection = slipnet.right
@ -522,7 +540,7 @@ def top_down_group_scout__direction(codelet):
if not firstBond:
logging.info('no firstBond')
else:
logging.info('firstBond: %s' % firstBond)
logging.info('firstBond: %s', firstBond)
if firstBond and not firstBond.directionCategory:
direction = None
if not firstBond or firstBond.directionCategory != direction:
@ -533,15 +551,15 @@ def top_down_group_scout__direction(codelet):
if not firstBond:
logging.info('no firstBond2')
else:
logging.info('firstBond2: %s' % firstBond)
logging.info('firstBond2: %s', firstBond)
if firstBond and not firstBond.directionCategory:
direction = None
assert firstBond and firstBond.directionCategory == direction
logging.info('possible group: %s' % firstBond)
logging.info('possible group: %s', firstBond)
category = firstBond.category
assert category
groupCategory = category.getRelatedNode(slipnet.groupCategory)
logging.info('trying from %s to %s' % (source, category.name))
logging.info('trying from %s to %s', source, category.name)
bondFacet = None
# find leftmost object in group with these bonds
search = True
@ -576,7 +594,7 @@ def top_down_group_scout__direction(codelet):
destination = destination.rightBond.rightObject
search = True
assert destination != source
logging.info('proposing group from %s to %s' % (source, destination))
logging.info('proposing group from %s to %s', source, destination)
objects = [source]
bonds = []
while source != destination:
@ -592,9 +610,9 @@ def group_scout__whole_string(codelet):
string = workspace.initial
if random.random() > 0.5:
string = workspace.target
logging.info('target string selected: %s' % workspace.target)
logging.info('target string selected: %s', workspace.target)
else:
logging.info('initial string selected: %s' % workspace.initial)
logging.info('initial string selected: %s', workspace.initial)
# find leftmost object & the highest group to which it belongs
leftmost = None
for objekt in string.objects:
@ -634,7 +652,7 @@ def group_strength_tester(codelet):
__showWhichStringObjectIsFrom(group)
group.updateStrength()
strength = group.totalStrength
probability = temperatureAdjustedProbability(strength / 100.0)
probability = formulas.temperatureAdjustedProbability(strength / 100.0)
assert random.random() <= probability
# it is strong enough - post builder & activate nodes
group.groupCategory.getRelatedNode(slipnet.bondCategory).buffer = 100.0
@ -671,16 +689,16 @@ def group_builder(codelet):
continue
incompatibleBonds += [leftBond]
previous = objekt
next = group.objectList[-1]
next_object = group.objectList[-1]
for objekt in reversed(group.objectList[:-1]):
rightBond = objekt.rightBond
if rightBond:
if rightBond.rightObject == next:
if rightBond.rightObject == next_object:
continue
if rightBond.directionCategory == group.directionCategory:
continue
incompatibleBonds += [rightBond]
next = objekt
next_object = objekt
# if incompatible bonds exist - fight
group.updateStrength()
assert __fightIncompatibles(incompatibleBonds, group, 'bonds', 1.0, 1.0)
@ -778,9 +796,10 @@ def bottom_up_correspondence_scout(codelet):
workspace.target.objects)
assert objectFromInitial.spansString() == objectFromTarget.spansString()
# get the posible concept mappings
conceptMappings = getMappings(objectFromInitial, objectFromTarget,
objectFromInitial.relevantDescriptions(),
objectFromTarget.relevantDescriptions())
conceptMappings = formulas.getMappings(
objectFromInitial, objectFromTarget,
objectFromInitial.relevantDescriptions(),
objectFromTarget.relevantDescriptions())
assert conceptMappings and __slippability(conceptMappings)
#find out if any are distinguishing
distinguishingMappings = [m for m in conceptMappings if m.distinguishing()]
@ -795,12 +814,13 @@ def bottom_up_correspondence_scout(codelet):
if (objectFromInitial.spansString() and
objectFromTarget.spansString() and
slipnet.directionCategory in initialDescriptionTypes
and __allOppositeMappings(oppositeMappings)
and __allOppositeMappings(formulas.oppositeMappings)
and slipnet.opposite.activation != 100.0):
objectFromTarget = objectFromTarget.flippedVersion()
conceptMappings = getMappings(objectFromInitial, objectFromTarget,
objectFromInitial.relevantDescriptions(),
objectFromTarget.relevantDescriptions())
conceptMappings = formulas.getMappings(
objectFromInitial, objectFromTarget,
objectFromInitial.relevantDescriptions(),
objectFromTarget.relevantDescriptions())
flipTargetObject = True
coderack.proposeCorrespondence(objectFromInitial, objectFromTarget,
conceptMappings, flipTargetObject, codelet)
@ -810,7 +830,7 @@ def important_object_correspondence_scout(codelet):
objectFromInitial = chooseUnmodifiedObject('relativeImportance',
workspace.initial.objects)
descriptors = objectFromInitial.relevantDistinguishingDescriptors()
slipnode = chooseSlipnodeByConceptualDepth(descriptors)
slipnode = formulas.chooseSlipnodeByConceptualDepth(descriptors)
assert slipnode
initialDescriptor = slipnode
for mapping in workspace.slippages():
@ -826,9 +846,10 @@ def important_object_correspondence_scout(codelet):
targetCandidates)
assert objectFromInitial.spansString() == objectFromTarget.spansString()
# get the posible concept mappings
conceptMappings = getMappings(objectFromInitial, objectFromTarget,
objectFromInitial.relevantDescriptions(),
objectFromTarget.relevantDescriptions())
conceptMappings = formulas.getMappings(
objectFromInitial, objectFromTarget,
objectFromInitial.relevantDescriptions(),
objectFromTarget.relevantDescriptions())
assert conceptMappings and __slippability(conceptMappings)
#find out if any are distinguishing
distinguishingMappings = [m for m in conceptMappings if m.distinguishing()]
@ -843,12 +864,13 @@ def important_object_correspondence_scout(codelet):
if (objectFromInitial.spansString()
and objectFromTarget.spansString()
and slipnet.directionCategory in initialDescriptionTypes
and __allOppositeMappings(oppositeMappings)
and __allOppositeMappings(formulas.oppositeMappings)
and slipnet.opposite.activation != 100.0):
objectFromTarget = objectFromTarget.flippedVersion()
conceptMappings = getMappings(objectFromInitial, objectFromTarget,
objectFromInitial.relevantDescriptions(),
objectFromTarget.relevantDescriptions())
conceptMappings = formulas.getMappings(
objectFromInitial, objectFromTarget,
objectFromInitial.relevantDescriptions(),
objectFromTarget.relevantDescriptions())
flipTargetObject = True
coderack.proposeCorrespondence(objectFromInitial, objectFromTarget,
conceptMappings, flipTargetObject, codelet)
@ -865,7 +887,7 @@ def correspondence_strength_tester(codelet):
objectFromTarget.flipped_version())))
correspondence.updateStrength()
strength = correspondence.totalStrength
probability = temperatureAdjustedProbability(strength / 100.0)
probability = formulas.temperatureAdjustedProbability(strength / 100.0)
assert random.random() <= probability
# activate some concepts
for mapping in correspondence.conceptMappings:

View File

@ -16,6 +16,13 @@ MAX_NUMBER_OF_CODELETS = 100
codeletsUsed = {}
def getUrgencyBin(urgency):
i = int(urgency) * NUMBER_OF_BINS / 100
if i >= NUMBER_OF_BINS:
return NUMBER_OF_BINS
return i + 1
class CodeRack(object):
def __init__(self):
#logging.debug('coderack.__init__()')
@ -46,13 +53,6 @@ class CodeRack(object):
self.postTopDownCodelets()
self.postBottomUpCodelets()
def getUrgencyBin(self, urgency):
bin = int(urgency) * NUMBER_OF_BINS
bin /= 100
if bin >= NUMBER_OF_BINS:
bin = NUMBER_OF_BINS - 1
return bin + 1
def post(self, codelet):
self.postings[codelet.name] = self.postings.get(codelet.name, 0) + 1
self.pressures.addCodelet(codelet)
@ -71,10 +71,10 @@ class CodeRack(object):
probability = workspaceFormulas.probabilityOfPosting(
codeletName)
howMany = workspaceFormulas.howManyToPost(codeletName)
for unused in range(0, howMany):
for _ in range(0, howMany):
if random.random() >= probability:
continue
urgency = self.getUrgencyBin(
urgency = getUrgencyBin(
node.activation * node.conceptualDepth / 100.0)
codelet = Codelet(codeletName, urgency, self.codeletsRun)
codelet.arguments += [node]
@ -108,7 +108,7 @@ class CodeRack(object):
urgency = 1
if formulas.Temperature < 25.0 and 'translator' in codeletName:
urgency = 5
for unused in range(0, howMany):
for _ in range(0, howMany):
if random.random() < probability:
codelet = Codelet(codeletName, urgency, self.codeletsRun)
self.post(codelet)
@ -128,6 +128,7 @@ class CodeRack(object):
newCodelet.pressure = oldCodelet.pressure
self.tryRun(newCodelet)
# pylint: disable=too-many-arguments
def proposeRule(self, facet, description, category, relation, oldCodelet):
"""Creates a proposed rule, and posts a rule-strength-tester codelet.
@ -162,9 +163,9 @@ class CodeRack(object):
numberOfMappings = len(mappings)
if urgency:
urgency /= numberOfMappings
bin = self.getUrgencyBin(urgency)
binn = self.getUrgencyBin(urgency)
logging.info('urgency: %s, number: %d, bin: %d',
urgency, numberOfMappings, bin)
urgency, numberOfMappings, binn)
self.newCodelet('correspondence-strength-tester',
oldCodelet, urgency, correspondence)
@ -226,7 +227,7 @@ class CodeRack(object):
def postInitialCodelets(self):
for name in self.initialCodeletNames:
for unused in range(0, workspaceFormulas.numberOfObjects()):
for _ in range(0, workspaceFormulas.numberOfObjects()):
codelet = Codelet(name, 1, self.codeletsRun)
self.post(codelet)
codelet2 = Codelet(name, 1, self.codeletsRun)
@ -296,8 +297,8 @@ class CodeRack(object):
threshold = r * urgsum
chosen = None
urgencySum = 0.0
logging.info('temperature: %f' % formulas.Temperature)
logging.info('actualTemperature: %f' % formulas.actualTemperature)
logging.info('temperature: %f', formulas.Temperature)
logging.info('actualTemperature: %f', formulas.actualTemperature)
logging.info('Slipnet:')
for node in slipnet.slipnodes:
logging.info("\tnode %s, activation: %d, buffer: %d, depth: %s",
@ -305,7 +306,7 @@ class CodeRack(object):
node.conceptualDepth)
logging.info('Coderack:')
for codelet in self.codelets:
logging.info('\t%s, %d' % (codelet.name, codelet.urgency))
logging.info('\t%s, %d', codelet.name, codelet.urgency)
from workspace import workspace
workspace.initial.log("Initial: ")
@ -344,7 +345,7 @@ class CodeRack(object):
methodName)
if not callable(method):
raise RuntimeError('Cannot call %s()' % methodName)
args, varargs, varkw, defaults = inspect.getargspec(method)
args, _varargs, _varkw, _defaults = inspect.getargspec(method)
#global codeletsUsed
#codeletsUsed[methodName] = codeletsUsed.get(methodName,0) + 1
try:

View File

@ -13,6 +13,48 @@ class CoderackPressure(object):
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 ValueError:
try:
node = codelet.arguments[0]
return i[node]
except KeyError:
return i[None]
class CoderackPressures(object):
def __init__(self):
#logging.debug('coderackPressures.__init__()')
@ -70,62 +112,16 @@ class CoderackPressures(object):
def addCodelet(self, codelet):
node = None
i = -1
if codelet.name == 'bottom-up-bond-scout':
i = 0
if codelet.name == 'top-down-bond-scout--category':
node = codelet.arguments[0]
if node == slipnet.successor:
i = 1
elif node == slipnet.predecessor:
i = 2
else:
i = 3
if codelet.name == 'top-down-bond-scout--direction':
node = codelet.arguments[0]
if node == slipnet.left:
i = 4
elif node == slipnet.right:
i = 5
else:
i = 3
if codelet.name == 'top-down-group-scout--category':
node = codelet.arguments[0]
if node == slipnet.successorGroup:
i = 6
elif node == slipnet.predecessorGroup:
i = 7
else:
i = 8
if codelet.name == 'top-down-group-scout--direction':
node = codelet.arguments[0]
if node == slipnet.left:
i = 9
elif node == slipnet.right:
i = 10
if codelet.name == 'group-scout--whole-string':
i = 11
if codelet.name == 'replacement-finder':
i = 12
if codelet.name == 'rule-scout':
i = 13
if codelet.name == 'rule-translator':
i = 14
if codelet.name == 'bottom-up-correspondence-scout':
i = 15
if codelet.name == 'important-object-correspondence-scout':
i = 16
if codelet.name == 'breaker':
i = 17
i = _codelet_index(codelet)
if i >= 0:
self.pressures[i].codelets += [codelet]
if codelet.pressure:
codelet.pressure.codelets += [codelet] # XXX why do this
codelet.pressure.codelets += [codelet]
if i >= 0:
codelet.pressure = self.pressures[i] # when this is next?
logging.info('Add %s: %d' % (codelet.name, i))
codelet.pressure = self.pressures[i]
logging.info('Add %s: %d', codelet.name, i)
if node:
logging.info('Node: %s' % node.name)
logging.info('Node: %s', node.name)
def removeCodelet(self, codelet):
self.removedCodelets += [codelet]

View File

@ -6,8 +6,9 @@ class ConceptMapping(object):
def __init__(self, initialDescriptionType, targetDescriptionType,
initialDescriptor, targetDescriptor,
initialObject, targetObject):
logging.info('make a map: %s-%s' % (initialDescriptionType.get_name(),
targetDescriptionType.get_name()))
# pylint: disable=too-many-arguments
logging.info('make a map: %s-%s', initialDescriptionType.get_name(),
targetDescriptionType.get_name())
self.initialDescriptionType = initialDescriptionType
self.targetDescriptionType = targetDescriptionType
self.initialDescriptor = initialDescriptor

View File

@ -1,3 +1,5 @@
from workspace import workspace
from workspaceStructure import WorkspaceStructure
from formulas import getMappings

View File

@ -47,7 +47,7 @@ class Description(WorkspaceStructure):
self.descriptionType.buffer = 100.0
self.descriptor.buffer = 100.0
if not self.object.described(self.descriptor):
logging.info('Add %s to descriptions' % self)
logging.info('Add %s to descriptions', self)
self.object.descriptions += [self]
def breakDescription(self):

View File

@ -49,7 +49,7 @@ def temperatureAdjustedProbability(value):
a = math.sqrt(coldness)
b = 10.0 - a
c = b / 100
d = c * (1.0 - (1.0 - value)) # aka c * value, but we're following the java
d = c * (1.0 - (1.0 - value)) # as said the java
e = (1.0 - value) + d
f = 1.0 - e
return max(f, 0.5)
@ -70,13 +70,14 @@ def chooseObjectFromList(objects, attribute):
if not objects:
return None
probabilities = []
for object in objects:
value = getattr(object, attribute)
for objekt in objects:
value = getattr(objekt, attribute)
probability = temperatureAdjustedValue(value)
logging.info('Object: %s, value: %d, probability: %d' % (object, value, probability))
logging.info('Object: %s, value: %d, probability: %d',
objekt, value, probability)
probabilities += [probability]
i = selectListPosition(probabilities)
logging.info("Selected: %d" % i)
logging.info('Selected: %d', i)
return objects[i]
@ -84,7 +85,8 @@ def chooseRelevantDescriptionByActivation(workspaceObject):
descriptions = workspaceObject.relevantDescriptions()
if not descriptions:
return None
activations = [description.descriptor.activation for description in descriptions]
activations = [description.descriptor.activation
for description in descriptions]
i = selectListPosition(activations)
return descriptions[i]
@ -119,13 +121,11 @@ def __localRelevance(string, slipnode, relevance):
numberOfObjectsNotSpanning = numberOfMatches = 0.0
#logging.info("find relevance for a string: %s" % string);
for objekt in string.objects:
#logging.info('object: %s' % objekt)
if not objekt.spansString():
#logging.info('non spanner: %s' % objekt)
numberOfObjectsNotSpanning += 1.0
if relevance(objekt, slipnode):
numberOfMatches += 1.0
#logging.info("matches: %d, not spanning: %d" % (numberOfMatches,numberOfObjectsNotSpanning))
if numberOfObjectsNotSpanning == 1:
return 100.0 * numberOfMatches
return 100.0 * numberOfMatches / (numberOfObjectsNotSpanning - 1.0)
@ -141,18 +141,20 @@ def localDirectionCategoryRelevance(string, direction):
return __localRelevance(string, direction, __relevantDirection)
def getMappings(objectFromInitial, objectFromTarget, initialDescriptions, targetDescriptions):
def getMappings(objectFromInitial, objectFromTarget,
initialDescriptions, targetDescriptions):
mappings = []
from conceptMapping import ConceptMapping
for initialDescription in initialDescriptions:
for targetDescription in targetDescriptions:
if initialDescription.descriptionType == targetDescription.descriptionType:
if initialDescription.descriptor == targetDescription.descriptor or initialDescription.descriptor.slipLinked(targetDescription.descriptor):
for initial in initialDescriptions:
for target in targetDescriptions:
if initial.descriptionType == target.descriptionType:
if (initial.descriptor == target.descriptor or
initial.descriptor.slipLinked(target.descriptor)):
mapping = ConceptMapping(
initialDescription.descriptionType,
targetDescription.descriptionType,
initialDescription.descriptor,
targetDescription.descriptor,
initial.descriptionType,
target.descriptionType,
initial.descriptor,
target.descriptor,
objectFromInitial,
objectFromTarget
)

View File

@ -8,14 +8,18 @@ import formulas
class Group(WorkspaceObject):
def __init__(self, string, groupCategory, directionCategory, facet, objectList, bondList):
# pylint: disable=too-many-instance-attributes
def __init__(self, string, groupCategory, directionCategory, facet,
objectList, bondList):
# pylint: disable=too-many-arguments
WorkspaceObject.__init__(self, string)
self.groupCategory = groupCategory
self.directionCategory = directionCategory
self.facet = facet
self.objectList = objectList
self.bondList = bondList
self.bondCategory = self.groupCategory.getRelatedNode(slipnet.bondCategory)
self.bondCategory = self.groupCategory.getRelatedNode(
slipnet.bondCategory)
leftObject = objectList[0]
rightObject = objectList[-1]
@ -41,8 +45,10 @@ class Group(WorkspaceObject):
from description import Description
if self.bondList and len(self.bondList):
firstFacet = self.bondList[0].facet
self.addBondDescription(Description(self, slipnet.bondFacet, firstFacet))
self.addBondDescription(Description(self, slipnet.bondCategory, self.bondCategory))
self.addBondDescription(
Description(self, slipnet.bondFacet, firstFacet))
self.addBondDescription(
Description(self, slipnet.bondCategory, self.bondCategory))
self.addDescription(slipnet.objectCategory, slipnet.group)
self.addDescription(slipnet.groupCategory, self.groupCategory)
@ -51,22 +57,29 @@ class Group(WorkspaceObject):
letter = self.objectList[0].getDescriptor(self.facet)
self.addDescription(self.facet, letter)
if self.directionCategory:
self.addDescription(slipnet.directionCategory, self.directionCategory)
self.addDescription(slipnet.directionCategory,
self.directionCategory)
if self.spansString():
self.addDescription(slipnet.stringPositionCategory, slipnet.whole)
elif self.leftIndex == 1:
self.addDescription(slipnet.stringPositionCategory, slipnet.leftmost)
self.addDescription(
slipnet.stringPositionCategory, slipnet.leftmost)
elif self.rightIndex == self.string.length:
self.addDescription(slipnet.stringPositionCategory, slipnet.rightmost)
self.addDescription(
slipnet.stringPositionCategory, slipnet.rightmost)
elif self.middleObject():
self.addDescription(slipnet.stringPositionCategory, slipnet.middle)
self.addDescription(
slipnet.stringPositionCategory, slipnet.middle)
self.add_length_description_category()
def add_length_description_category(self):
#check whether or not to add length description category
probability = self.lengthDescriptionProbability()
if random.random() < probability:
length = len(self.objectList)
if length < 6:
self.addDescription(slipnet.length, slipnet.numbers[length - 1])
self.addDescription(slipnet.length,
slipnet.numbers[length - 1])
def __str__(self):
s = self.string.__str__()
@ -103,8 +116,10 @@ class Group(WorkspaceObject):
def flippedVersion(self):
flippedBonds = [b.flippedversion() for b in self.bondList]
flippedGroup = self.groupCategory.getRelatedNode(slipnet.flipped)
flippedDirection = self.directionCategory.getRelatedNode(slipnet.flipped)
return Group(self.string, flippedGroup, flippedDirection, self.facet, self.objectList, flippedBonds)
flippedDirection = self.directionCategory.getRelatedNode(
slipnet.flipped)
return Group(self.string, flippedGroup, flippedDirection,
self.facet, self.objectList, flippedBonds)
def buildGroup(self):
workspace.objects += [self]
@ -117,7 +132,7 @@ class Group(WorkspaceObject):
def activateDescriptions(self):
for description in self.descriptions:
logging.info('Activate: %s' % description)
logging.info('Activate: %s', description)
description.descriptor.buffer = 100.0
def lengthDescriptionProbability(self):
@ -157,7 +172,8 @@ class Group(WorkspaceObject):
self.rightBond.breakBond()
def updateInternalStrength(self):
relatedBondAssociation = self.groupCategory.getRelatedNode(slipnet.bondCategory).degreeOfAssociation()
relatedBondAssociation = self.groupCategory.getRelatedNode(
slipnet.bondCategory).degreeOfAssociation()
bondWeight = relatedBondAssociation ** 0.98
length = len(self.objectList)
if length == 1:
@ -169,7 +185,8 @@ class Group(WorkspaceObject):
else:
lengthFactor = 90.0
lengthWeight = 100.0 - bondWeight
weightList = ((relatedBondAssociation, bondWeight), (lengthFactor, lengthWeight))
weightList = ((relatedBondAssociation, bondWeight),
(lengthFactor, lengthWeight))
self.internalStrength = formulas.weightedAverage(weightList)
def updateExternalStrength(self):
@ -190,8 +207,10 @@ class Group(WorkspaceObject):
count = 0
for objekt in self.string.objects:
if isinstance(objekt, Group):
if objekt.rightIndex < self.leftIndex or objekt.leftIndex > self.rightIndex:
if objekt.groupCategory == self.groupCategory and objekt.directionCategory == self.directionCategory:
if (objekt.rightIndex < self.leftIndex or
objekt.leftIndex > self.rightIndex):
if (objekt.groupCategory == self.groupCategory and
objekt.directionCategory == self.directionCategory):
count += 1
return count
@ -223,7 +242,7 @@ class Group(WorkspaceObject):
return result
def distinguishingDescriptor(self, descriptor):
"""Whether no other object of the same type (group) has the same descriptor"""
"""Whether no other object of the same type has the same descriptor"""
if not WorkspaceObject.distinguishingDescriptor(self, descriptor):
return False
for objekt in self.string.objects:

View File

@ -1,7 +1,10 @@
import logging
from slipnet import slipnet
from workspace import workspace
from workspaceStructure import WorkspaceStructure
from formulas import *
from formulas import weightedAverage
class Rule(WorkspaceStructure):
@ -123,7 +126,7 @@ class Rule(WorkspaceStructure):
o.described(self.descriptor) and
o.described(self.category)]
changed = changeds and changeds[0] or None
logging.debug('changed object = %s' % changed)
logging.debug('changed object = %s', changed)
if changed:
left = changed.leftIndex
startString = ''

View File

@ -5,6 +5,7 @@ from sliplink import Sliplink
class SlipNet(object):
# pylint: disable=too-many-instance-attributes
def __init__(self):
logging.debug("SlipNet.__init__()")
self.initiallyClampedSlipnodes = []
@ -21,8 +22,8 @@ class SlipNet(object):
return '<slipnet>'
def setConceptualDepths(self, depth):
logging.debug('slipnet set all depths to %f' % depth)
[node.setConceptualDepth(depth) for node in self.slipnodes]
logging.debug('slipnet set all depths to %f', depth)
_ = [node.setConceptualDepth(depth) for node in self.slipnodes]
def reset(self):
logging.debug('slipnet.reset()')
@ -36,8 +37,8 @@ class SlipNet(object):
logging.debug('slipnet.update()')
self.numberOfUpdates += 1
if self.numberOfUpdates == 50:
[node.unclamp() for node in self.initiallyClampedSlipnodes]
[node.update() for node in self.slipnodes]
_ = [node.unclamp() for node in self.initiallyClampedSlipnodes]
_ = [node.update() for node in self.slipnodes]
for node in self.slipnodes:
node.spread_activation()
for node in self.slipnodes:
@ -46,6 +47,7 @@ class SlipNet(object):
node.buffer = 0.0
def __addInitialNodes(self):
# pylint: disable=too-many-statements
self.slipnodes = []
self.letters = []
for c in 'abcdefghijklmnopqrstuvwxyz':
@ -135,47 +137,49 @@ class SlipNet(object):
self.__addCategoryLink(self.samenessGroup, self.letterCategory, 50.0)
# lengths
for number in self.numbers:
self.__addInstanceLink(self.length, number, 100.0)
self.__addNonSlipLink(self.predecessorGroup, self.length, length=95.0)
self.__addNonSlipLink(self.successorGroup, self.length, length=95.0)
self.__addNonSlipLink(self.samenessGroup, self.length, length=95.0)
# opposites
self.__addOppositeLink(self.first, self.last)
self.__addOppositeLink(self.leftmost, self.rightmost)
self.__addOppositeLink(self.left, self.right)
self.__addOppositeLink(self.successor, self.predecessor)
self.__addOppositeLink(self.successorGroup, self.predecessorGroup)
self.__addInstanceLink(self.length, number)
groups = [self.predecessorGroup, self.successorGroup,
self.samenessGroup]
for group in groups:
self.__addNonSlipLink(group, self.length, length=95.0)
opposites = [(self.first, self.last), (self.leftmost, self.rightmost),
(self.leftmost, self.rightmost), (self.left, self.right),
(self.successor, self.predecessor),
(self.successorGroup, self.predecessorGroup)]
for a, b in opposites:
self.__addOppositeLink(a, b)
# properties
self.__addPropertyLink(self.letters[0], self.first, 75.0)
self.__addPropertyLink(self.letters[-1], self.last, 75.0)
# object categories
self.__addInstanceLink(self.objectCategory, self.letter, 100.0)
self.__addInstanceLink(self.objectCategory, self.group, 100.0)
# string positions
self.__addInstanceLink(
self.stringPositionCategory, self.leftmost, 100.0)
self.__addInstanceLink(
self.stringPositionCategory, self.rightmost, 100.0)
self.__addInstanceLink(self.stringPositionCategory, self.middle, 100.0)
self.__addInstanceLink(self.stringPositionCategory, self.single, 100.0)
self.__addInstanceLink(self.stringPositionCategory, self.whole, 100.0)
# alphabetic positions
self.__addInstanceLink(
self.alphabeticPositionCategory, self.first, 100.0)
self.__addInstanceLink(
self.alphabeticPositionCategory, self.last, 100.0)
# direction categories
self.__addInstanceLink(self.directionCategory, self.left, 100.0)
self.__addInstanceLink(self.directionCategory, self.right, 100.0)
# bond categories
self.__addInstanceLink(self.bondCategory, self.predecessor, 100.0)
self.__addInstanceLink(self.bondCategory, self.successor, 100.0)
self.__addInstanceLink(self.bondCategory, self.sameness, 100.0)
# group categories
self.__addInstanceLink(
self.groupCategory, self.predecessorGroup, 100.0)
self.__addInstanceLink(self.groupCategory, self.successorGroup, 100.0)
self.__addInstanceLink(self.groupCategory, self.samenessGroup, 100.0)
links = [
# object categories
(self.objectCategory, self.letter),
(self.objectCategory, self.group),
# string positions,
(self.stringPositionCategory, self.leftmost),
(self.stringPositionCategory, self.rightmost),
(self.stringPositionCategory, self.middle),
(self.stringPositionCategory, self.single),
(self.stringPositionCategory, self.whole),
# alphabetic positions,
(self.alphabeticPositionCategory, self.first),
(self.alphabeticPositionCategory, self.last),
# direction categories,
(self.directionCategory, self.left),
(self.directionCategory, self.right),
# bond categories,
(self.bondCategory, self.predecessor),
(self.bondCategory, self.successor),
(self.bondCategory, self.sameness),
# group categories
(self.groupCategory, self.predecessorGroup),
(self.groupCategory, self.successorGroup),
(self.groupCategory, self.samenessGroup),
# bond facets
(self.bondFacet, self.letterCategory),
(self.bondFacet, self.length)]
for a, b in links:
self.__addInstanceLink(a, b)
# link bonds to their groups
self.__addNonSlipLink(
self.sameness, self.samenessGroup, label=self.groupCategory,
@ -191,9 +195,6 @@ class SlipNet(object):
label=self.bondCategory, length=90.0)
self.__addNonSlipLink(self.predecessorGroup, self.predecessor,
label=self.bondCategory, length=90.0)
# bond facets
self.__addInstanceLink(self.bondFacet, self.letterCategory, 100.0)
self.__addInstanceLink(self.bondFacet, self.length, 100.0)
# letter category to length
self.__addSlipLink(self.letterCategory, self.length, length=95.0)
self.__addSlipLink(self.length, self.letterCategory, length=95.0)
@ -235,7 +236,7 @@ class SlipNet(object):
link = self.__addLink(source, destination, None, length)
source.categoryLinks += [link]
def __addInstanceLink(self, source, destination, length):
def __addInstanceLink(self, source, destination, length=100.0):
categoryLength = source.conceptualDepth - destination.conceptualDepth
self.__addCategoryLink(destination, source, categoryLength)
#noinspection PyArgumentEqualDefault

View File

@ -11,9 +11,14 @@ def jump_threshold():
return 55.0
def points_at(links, other):
"""Whether any of the links points at the other"""
return any([l.points_at(other) for l in links])
class Slipnode(object):
# pylint: disable=too-many-instance-attributes
def __init__(self, name, depth, length=0.0):
# logging.info('depth to %s for %s' % (depth,name))
self.conceptualDepth = depth
self.usualConceptualDepth = depth
self.name = name
@ -52,7 +57,7 @@ class Slipnode(object):
return not self.clamped
def setConceptualDepth(self, depth):
logging.info('set depth to %s for %s' % (depth, self.name))
logging.info('set depth to %s for %s', depth, self.name)
self.conceptualDepth = depth
def category(self):
@ -90,15 +95,11 @@ class Slipnode(object):
def linked(self, other):
"""Whether the other is among the outgoing links"""
return self.points_at(self.outgoingLinks, other)
return points_at(self.outgoingLinks, other)
def slipLinked(self, other):
"""Whether the other is among the lateral links"""
return self.points_at(self.lateralSlipLinks, other)
def points_at(self, links, other):
"""Whether any of the links points at the other"""
return any([l.points_at(other) for l in links])
return points_at(self.lateralSlipLinks, other)
def related(self, other):
"""Same or linked"""
@ -142,14 +143,14 @@ class Slipnode(object):
result = link.label
break
if result:
logging.info('Got bond: %s' % result.name)
logging.info('Got bond: %s', result.name)
else:
logging.info('Got no bond')
return result
def spread_activation(self):
if self.fully_active():
[link.spread_activation() for link in self.outgoingLinks]
_ = [link.spread_activation() for link in self.outgoingLinks]
def addBuffer(self):
if self.unclamped():
@ -157,7 +158,7 @@ class Slipnode(object):
self.activation = min(self.activation, 100)
self.activation = max(self.activation, 0)
def can_jump():
def can_jump(self):
if self.activation <= jump_threshold():
return False
if self.clamped:

View File

@ -18,14 +18,16 @@ class WorkspaceFormulas(object):
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)
above_actual_temperature = formulas.actualTemperature + 0.001
logging.info('actualTemperature: %f', 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))
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))
logging.info('actualTemperature: %f',
formulas.actualTemperature + 0.001)
temperature.update(formulas.actualTemperature)
if not self.clampTemperature:
formulas.Temperature = formulas.actualTemperature
@ -70,46 +72,49 @@ def __chooseLeftNeighbor(source):
for o in workspace.objects:
if o.string == source.string:
if source.leftIndex == o.rightIndex + 1:
logging.info('%s is on left of %s' % (o, source))
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))
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.leftIndex == source.rightIndex + 1
]
objects = [o for o in workspace.objects
if o.string == source.string
and o.leftIndex == source.rightIndex + 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]
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]
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
string_support = __descriptionTypeSupport(descriptionType, string)
return (descriptionType.activation + string_support) / 2
def __descriptionTypeSupport(descriptionType, string):
"""The proportion of objects in the string that have a description with this descriptionType"""
numberOfObjects = totalNumberOfObjects = 0.0
"""The proportion of objects in the string with this descriptionType"""
described_count = total = 0
for objekt in workspace.objects:
if objekt.string == string:
totalNumberOfObjects += 1.0
total += 1
for description in objekt.descriptions:
if description.descriptionType == descriptionType:
numberOfObjects += 1.0
return numberOfObjects / totalNumberOfObjects
described_count += 1
return described_count / float(total)
def probabilityOfPosting(codeletName):
@ -139,9 +144,7 @@ def probabilityOfPosting(codeletName):
def howManyToPost(codeletName):
if codeletName == 'breaker':
return 1
if 'description' in codeletName:
if codeletName == 'breaker' or 'description' in codeletName:
return 1
if 'translator' in codeletName:
if not workspace.rule:
@ -156,7 +159,6 @@ def howManyToPost(codeletName):
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:

View File

@ -5,7 +5,20 @@ from slipnet import slipnet
from workspaceStructure import WorkspaceStructure
def distinguishingDescriptor(descriptor):
"""Whether no other object of the same type has the same descriptor"""
if descriptor == slipnet.letter:
return False
if descriptor == slipnet.group:
return False
for number in slipnet.numbers:
if number == descriptor:
return False
return True
class WorkspaceObject(WorkspaceStructure):
# pylint: disable=too-many-instance-attributes
def __init__(self, workspaceString):
WorkspaceStructure.__init__(self)
self.string = workspaceString
@ -45,13 +58,13 @@ class WorkspaceObject(WorkspaceStructure):
def addDescription(self, descriptionType, descriptor):
description = Description(self, descriptionType, descriptor)
logging.info("Adding description: %s to %s" % (description, self))
logging.info("Adding description: %s to %s", description, self)
self.descriptions += [description]
def addDescriptions(self, descriptions):
copy = descriptions[:] # in case we add to our own descriptions
for description in copy:
logging.info('might add: %s' % description)
logging.info('might add: %s', description)
if not self.containsDescription(description):
self.addDescription(description.descriptionType,
description.descriptor)
@ -69,7 +82,7 @@ class WorkspaceObject(WorkspaceStructure):
for bond in self.bonds:
bondStrength += bond.totalStrength
divisor = 6.0
if self.spansString(): # XXX then we have already returned
if self.spansString(): # then we have already returned
divisor = 3.0
return bondStrength / divisor
@ -98,7 +111,6 @@ class WorkspaceObject(WorkspaceStructure):
if self.correspondence:
interStringHappiness = self.correspondence.totalStrength
self.interStringUnhappiness = 100.0 - interStringHappiness
#logging.info("Unhappy: %s"%self.interStringUnhappiness)
averageHappiness = (intraStringHappiness + interStringHappiness) / 2
self.totalUnhappiness = 100.0 - averageHappiness
@ -116,9 +128,9 @@ class WorkspaceObject(WorkspaceStructure):
(self.interStringUnhappiness, 0.2)))
self.totalSalience = (self.intraStringSalience +
self.interStringSalience) / 2.0
logging.info('Set salience of %s to %f = (%f + %f)/2' % (
self.__str__(), self.totalSalience,
self.intraStringSalience, self.interStringSalience))
logging.info('Set salience of %s to %f = (%f + %f)/2',
self.__str__(), self.totalSalience,
self.intraStringSalience, self.interStringSalience)
def isWithin(self, other):
return (self.leftIndex >= other.leftIndex and
@ -128,11 +140,8 @@ class WorkspaceObject(WorkspaceStructure):
return [d for d in self.descriptions
if d.descriptionType.fully_active()]
def morePossibleDescriptions(self, node):
return []
def getPossibleDescriptions(self, descriptionType):
logging.info('getting possible descriptions for %s' % self)
logging.info('getting possible descriptions for %s', self)
descriptions = []
from group import Group
for link in descriptionType.instanceLinks:
@ -168,7 +177,7 @@ class WorkspaceObject(WorkspaceStructure):
return bool([d for d in self.descriptions if d.descriptor == slipnode])
def middleObject(self):
# XXX only works if string is 3 chars long
# only works if string is 3 chars long
# as we have access to the string, why not just " == len / 2" ?
objectOnMyRightIsRightmost = objectOnMyLeftIsLeftmost = False
for objekt in self.string.objects:
@ -178,29 +187,18 @@ class WorkspaceObject(WorkspaceStructure):
objectOnMyRightIsRightmost = True
return objectOnMyRightIsRightmost and objectOnMyLeftIsLeftmost
def distinguishingDescriptor(self, descriptor):
"""Whether no other object of the same type has the same descriptor"""
if descriptor == slipnet.letter:
return False
if descriptor == slipnet.group:
return False
for number in slipnet.numbers:
if number == descriptor:
return False
return True
def relevantDistinguishingDescriptors(self):
return [d.descriptor
for d in self.relevantDescriptions()
if self.distinguishingDescriptor(d.descriptor)]
if distinguishingDescriptor(d.descriptor)]
def getDescriptor(self, descriptionType):
"""The description attached to this object of the description type."""
descriptor = None
logging.info("\nIn %s, trying for type: %s" % (
self, descriptionType.get_name()))
logging.info("\nIn %s, trying for type: %s",
self, descriptionType.get_name())
for description in self.descriptions:
logging.info("Trying description: %s" % description)
logging.info("Trying description: %s", description)
if description.descriptionType == descriptionType:
return description.descriptor
return descriptor