|
|
|
|
@ -2,15 +2,12 @@ import inspect
|
|
|
|
|
import logging
|
|
|
|
|
import random
|
|
|
|
|
|
|
|
|
|
from slipnet import slipnet
|
|
|
|
|
from temperature import temperature
|
|
|
|
|
import formulas
|
|
|
|
|
from workspaceFormulas import chooseDirectedNeighbor
|
|
|
|
|
from workspaceFormulas import chooseNeighbor
|
|
|
|
|
from workspaceObject import WorkspaceObject
|
|
|
|
|
from letter import Letter
|
|
|
|
|
from replacement import Replacement
|
|
|
|
|
from workspaceFormulas import workspace
|
|
|
|
|
from group import Group
|
|
|
|
|
from bond import Bond
|
|
|
|
|
from bond import possibleGroupBonds
|
|
|
|
|
@ -21,7 +18,7 @@ from workspaceFormulas import chooseBondFacet
|
|
|
|
|
def codelet(name):
|
|
|
|
|
"""Decorator for otherwise-unused functions that are in fact used as codelet behaviors"""
|
|
|
|
|
def wrap(f):
|
|
|
|
|
assert tuple(inspect.getargspec(f)) == (['coderack', 'codelet'], None, None, None)
|
|
|
|
|
assert tuple(inspect.getargspec(f)) == (['ctx', 'codelet'], None, None, None)
|
|
|
|
|
f.is_codelet_method = True
|
|
|
|
|
f.codelet_name = name
|
|
|
|
|
return f
|
|
|
|
|
@ -29,6 +26,8 @@ def codelet(name):
|
|
|
|
|
|
|
|
|
|
# some methods common to the codelets
|
|
|
|
|
def __showWhichStringObjectIsFrom(structure):
|
|
|
|
|
from context import context as ctx
|
|
|
|
|
workspace = ctx.workspace
|
|
|
|
|
if not structure:
|
|
|
|
|
return
|
|
|
|
|
whence = 'other'
|
|
|
|
|
@ -40,6 +39,8 @@ def __showWhichStringObjectIsFrom(structure):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def __getScoutSource(slipnode, relevanceMethod, typeName):
|
|
|
|
|
from context import context as ctx
|
|
|
|
|
workspace = ctx.workspace
|
|
|
|
|
initialRelevance = relevanceMethod(workspace.initial, slipnode)
|
|
|
|
|
targetRelevance = relevanceMethod(workspace.target, slipnode)
|
|
|
|
|
initialUnhappiness = workspace.initial.intraStringUnhappiness
|
|
|
|
|
@ -78,11 +79,12 @@ def __getDescriptors(bondFacet, source, destination):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def __structureVsStructure(structure1, weight1, structure2, weight2):
|
|
|
|
|
from context import context as ctx
|
|
|
|
|
structure1.updateStrength()
|
|
|
|
|
structure2.updateStrength()
|
|
|
|
|
weightedStrength1 = formulas.temperatureAdjustedValue(
|
|
|
|
|
weightedStrength1 = formulas.temperatureAdjustedValue(ctx,
|
|
|
|
|
structure1.totalStrength * weight1)
|
|
|
|
|
weightedStrength2 = formulas.temperatureAdjustedValue(
|
|
|
|
|
weightedStrength2 = formulas.temperatureAdjustedValue(ctx,
|
|
|
|
|
structure2.totalStrength * weight2)
|
|
|
|
|
rhs = (weightedStrength1 + weightedStrength2) * random.random()
|
|
|
|
|
logging.info('%d > %d', weightedStrength1, rhs)
|
|
|
|
|
@ -115,9 +117,10 @@ def __fightIncompatibles(incompatibles, structure, name,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def __slippability(conceptMappings):
|
|
|
|
|
from context import context as ctx
|
|
|
|
|
for mapping in conceptMappings:
|
|
|
|
|
slippiness = mapping.slippability() / 100.0
|
|
|
|
|
probabilityOfSlippage = formulas.temperatureAdjustedProbability(
|
|
|
|
|
probabilityOfSlippage = formulas.temperatureAdjustedProbability(ctx,
|
|
|
|
|
slippiness)
|
|
|
|
|
if formulas.coinFlip(probabilityOfSlippage):
|
|
|
|
|
return True
|
|
|
|
|
@ -125,7 +128,9 @@ def __slippability(conceptMappings):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@codelet('breaker')
|
|
|
|
|
def breaker(coderack, codelet):
|
|
|
|
|
def breaker(ctx, codelet):
|
|
|
|
|
temperature = ctx.temperature
|
|
|
|
|
workspace = ctx.workspace
|
|
|
|
|
probabilityOfFizzle = (100.0 - temperature.value()) / 100.0
|
|
|
|
|
if formulas.coinFlip(probabilityOfFizzle):
|
|
|
|
|
return
|
|
|
|
|
@ -142,7 +147,7 @@ def breaker(coderack, codelet):
|
|
|
|
|
breakObjects += [structure.source.group]
|
|
|
|
|
# Break all the objects or none of them; this matches the Java
|
|
|
|
|
for structure in breakObjects:
|
|
|
|
|
breakProbability = formulas.temperatureAdjustedProbability(
|
|
|
|
|
breakProbability = formulas.temperatureAdjustedProbability(ctx,
|
|
|
|
|
structure.totalStrength / 100.0)
|
|
|
|
|
if formulas.coinFlip(breakProbability):
|
|
|
|
|
return
|
|
|
|
|
@ -151,7 +156,9 @@ def breaker(coderack, codelet):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@codelet('bottom-up-description-scout')
|
|
|
|
|
def bottom_up_description_scout(coderack, codelet):
|
|
|
|
|
def bottom_up_description_scout(ctx, codelet):
|
|
|
|
|
coderack = ctx.coderack
|
|
|
|
|
workspace = ctx.workspace
|
|
|
|
|
chosenObject = chooseUnmodifiedObject('totalSalience', workspace.objects)
|
|
|
|
|
assert chosenObject
|
|
|
|
|
__showWhichStringObjectIsFrom(chosenObject)
|
|
|
|
|
@ -169,7 +176,9 @@ def bottom_up_description_scout(coderack, codelet):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@codelet('top-down-description-scout')
|
|
|
|
|
def top_down_description_scout(coderack, codelet):
|
|
|
|
|
def top_down_description_scout(ctx, codelet):
|
|
|
|
|
coderack = ctx.coderack
|
|
|
|
|
workspace = ctx.workspace
|
|
|
|
|
descriptionType = codelet.arguments[0]
|
|
|
|
|
chosenObject = chooseUnmodifiedObject('totalSalience', workspace.objects)
|
|
|
|
|
assert chosenObject
|
|
|
|
|
@ -184,18 +193,20 @@ def top_down_description_scout(coderack, codelet):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@codelet('description-strength-tester')
|
|
|
|
|
def description_strength_tester(coderack, codelet):
|
|
|
|
|
def description_strength_tester(ctx, codelet):
|
|
|
|
|
coderack = ctx.coderack
|
|
|
|
|
description = codelet.arguments[0]
|
|
|
|
|
description.descriptor.buffer = 100.0
|
|
|
|
|
description.updateStrength()
|
|
|
|
|
strength = description.totalStrength
|
|
|
|
|
probability = formulas.temperatureAdjustedProbability(strength / 100.0)
|
|
|
|
|
probability = formulas.temperatureAdjustedProbability(ctx, strength / 100.0)
|
|
|
|
|
assert formulas.coinFlip(probability)
|
|
|
|
|
coderack.newCodelet('description-builder', codelet, strength)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@codelet('description-builder')
|
|
|
|
|
def description_builder(coderack, codelet):
|
|
|
|
|
def description_builder(ctx, codelet):
|
|
|
|
|
workspace = ctx.workspace
|
|
|
|
|
description = codelet.arguments[0]
|
|
|
|
|
assert description.object in workspace.objects
|
|
|
|
|
if description.object.described(description.descriptor):
|
|
|
|
|
@ -206,7 +217,10 @@ def description_builder(coderack, codelet):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@codelet('bottom-up-bond-scout')
|
|
|
|
|
def bottom_up_bond_scout(coderack, codelet):
|
|
|
|
|
def bottom_up_bond_scout(ctx, codelet):
|
|
|
|
|
coderack = ctx.coderack
|
|
|
|
|
slipnet = ctx.slipnet
|
|
|
|
|
workspace = ctx.workspace
|
|
|
|
|
source = chooseUnmodifiedObject('intraStringSalience', workspace.objects)
|
|
|
|
|
__showWhichStringObjectIsFrom(source)
|
|
|
|
|
destination = chooseNeighbor(source)
|
|
|
|
|
@ -230,7 +244,10 @@ def bottom_up_bond_scout(coderack, codelet):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@codelet('rule-scout')
|
|
|
|
|
def rule_scout(coderack, codelet):
|
|
|
|
|
def rule_scout(ctx, codelet):
|
|
|
|
|
coderack = ctx.coderack
|
|
|
|
|
slipnet = ctx.slipnet
|
|
|
|
|
workspace = ctx.workspace
|
|
|
|
|
assert workspace.numberOfUnreplacedObjects() == 0
|
|
|
|
|
changedObjects = [o for o in workspace.initial.objects if o.changed]
|
|
|
|
|
#assert len(changedObjects) < 2
|
|
|
|
|
@ -270,7 +287,7 @@ def rule_scout(coderack, codelet):
|
|
|
|
|
valueList = []
|
|
|
|
|
for node in objectList:
|
|
|
|
|
depth = node.conceptualDepth
|
|
|
|
|
value = formulas.temperatureAdjustedValue(depth)
|
|
|
|
|
value = formulas.temperatureAdjustedValue(ctx, depth)
|
|
|
|
|
valueList += [value]
|
|
|
|
|
i = formulas.selectListPosition(valueList)
|
|
|
|
|
descriptor = objectList[i]
|
|
|
|
|
@ -284,7 +301,7 @@ def rule_scout(coderack, codelet):
|
|
|
|
|
valueList = []
|
|
|
|
|
for node in objectList:
|
|
|
|
|
depth = node.conceptualDepth
|
|
|
|
|
value = formulas.temperatureAdjustedValue(depth)
|
|
|
|
|
value = formulas.temperatureAdjustedValue(ctx, depth)
|
|
|
|
|
valueList += [value]
|
|
|
|
|
i = formulas.selectListPosition(valueList)
|
|
|
|
|
relation = objectList[i]
|
|
|
|
|
@ -293,17 +310,19 @@ def rule_scout(coderack, codelet):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@codelet('rule-strength-tester')
|
|
|
|
|
def rule_strength_tester(coderack, codelet):
|
|
|
|
|
def rule_strength_tester(ctx, codelet):
|
|
|
|
|
coderack = ctx.coderack
|
|
|
|
|
rule = codelet.arguments[0]
|
|
|
|
|
rule.updateStrength()
|
|
|
|
|
probability = formulas.temperatureAdjustedProbability(
|
|
|
|
|
rule.totalStrength / 100.0)
|
|
|
|
|
probability = formulas.temperatureAdjustedProbability(ctx, rule.totalStrength / 100.0)
|
|
|
|
|
if formulas.coinFlip(probability):
|
|
|
|
|
coderack.newCodelet('rule-builder', codelet, rule.totalStrength, rule)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@codelet('replacement-finder')
|
|
|
|
|
def replacement_finder(coderack, codelet):
|
|
|
|
|
def replacement_finder(ctx, codelet):
|
|
|
|
|
slipnet = ctx.slipnet
|
|
|
|
|
workspace = ctx.workspace
|
|
|
|
|
# choose random letter in initial string
|
|
|
|
|
letters = [o for o in workspace.initial.objects if isinstance(o, Letter)]
|
|
|
|
|
letterOfInitialString = random.choice(letters)
|
|
|
|
|
@ -341,7 +360,9 @@ def replacement_finder(coderack, codelet):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@codelet('top-down-bond-scout--category')
|
|
|
|
|
def top_down_bond_scout__category(coderack, codelet):
|
|
|
|
|
def top_down_bond_scout__category(ctx, codelet):
|
|
|
|
|
coderack = ctx.coderack
|
|
|
|
|
slipnet = ctx.slipnet
|
|
|
|
|
logging.info('top_down_bond_scout__category')
|
|
|
|
|
category = codelet.arguments[0]
|
|
|
|
|
source = __getScoutSource(category, formulas.localBondCategoryRelevance,
|
|
|
|
|
@ -370,7 +391,9 @@ def top_down_bond_scout__category(coderack, codelet):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@codelet('top-down-bond-scout--direction')
|
|
|
|
|
def top_down_bond_scout__direction(coderack, codelet):
|
|
|
|
|
def top_down_bond_scout__direction(ctx, codelet):
|
|
|
|
|
coderack = ctx.coderack
|
|
|
|
|
slipnet = ctx.slipnet
|
|
|
|
|
direction = codelet.arguments[0]
|
|
|
|
|
source = __getScoutSource(
|
|
|
|
|
direction, formulas.localDirectionCategoryRelevance, 'bond')
|
|
|
|
|
@ -389,12 +412,13 @@ def top_down_bond_scout__direction(coderack, codelet):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@codelet('bond-strength-tester')
|
|
|
|
|
def bond_strength_tester(coderack, codelet):
|
|
|
|
|
def bond_strength_tester(ctx, codelet):
|
|
|
|
|
coderack = ctx.coderack
|
|
|
|
|
bond = codelet.arguments[0]
|
|
|
|
|
__showWhichStringObjectIsFrom(bond)
|
|
|
|
|
bond.updateStrength()
|
|
|
|
|
strength = bond.totalStrength
|
|
|
|
|
probability = formulas.temperatureAdjustedProbability(strength / 100.0)
|
|
|
|
|
probability = formulas.temperatureAdjustedProbability(ctx, strength / 100.0)
|
|
|
|
|
logging.info('bond strength = %d for %s', strength, bond)
|
|
|
|
|
assert formulas.coinFlip(probability)
|
|
|
|
|
bond.facet.buffer = 100.0
|
|
|
|
|
@ -405,7 +429,8 @@ def bond_strength_tester(coderack, codelet):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@codelet('bond-builder')
|
|
|
|
|
def bond_builder(coderack, codelet):
|
|
|
|
|
def bond_builder(ctx, codelet):
|
|
|
|
|
workspace = ctx.workspace
|
|
|
|
|
bond = codelet.arguments[0]
|
|
|
|
|
__showWhichStringObjectIsFrom(bond)
|
|
|
|
|
bond.updateStrength()
|
|
|
|
|
@ -448,7 +473,9 @@ def bond_builder(coderack, codelet):
|
|
|
|
|
# pylint: disable=too-many-branches
|
|
|
|
|
# pylint: disable=too-many-statements
|
|
|
|
|
@codelet('top-down-group-scout--category')
|
|
|
|
|
def top_down_group_scout__category(coderack, codelet):
|
|
|
|
|
def top_down_group_scout__category(ctx, codelet):
|
|
|
|
|
coderack = ctx.coderack
|
|
|
|
|
slipnet = ctx.slipnet
|
|
|
|
|
groupCategory = codelet.arguments[0]
|
|
|
|
|
category = groupCategory.getRelatedNode(slipnet.bondCategory)
|
|
|
|
|
assert category
|
|
|
|
|
@ -530,7 +557,9 @@ def top_down_group_scout__category(coderack, codelet):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@codelet('top-down-group-scout--direction')
|
|
|
|
|
def top_down_group_scout__direction(coderack, codelet):
|
|
|
|
|
def top_down_group_scout__direction(ctx, codelet):
|
|
|
|
|
coderack = ctx.coderack
|
|
|
|
|
slipnet = ctx.slipnet
|
|
|
|
|
direction = codelet.arguments[0]
|
|
|
|
|
source = __getScoutSource(direction,
|
|
|
|
|
formulas.localDirectionCategoryRelevance,
|
|
|
|
|
@ -622,7 +651,10 @@ def top_down_group_scout__direction(coderack, codelet):
|
|
|
|
|
|
|
|
|
|
#noinspection PyStringFormat
|
|
|
|
|
@codelet('group-scout--whole-string')
|
|
|
|
|
def group_scout__whole_string(coderack, codelet):
|
|
|
|
|
def group_scout__whole_string(ctx, codelet):
|
|
|
|
|
coderack = ctx.coderack
|
|
|
|
|
slipnet = ctx.slipnet
|
|
|
|
|
workspace = ctx.workspace
|
|
|
|
|
if formulas.coinFlip():
|
|
|
|
|
string = workspace.target
|
|
|
|
|
logging.info('target string selected: %s', workspace.target)
|
|
|
|
|
@ -663,13 +695,15 @@ def group_scout__whole_string(coderack, codelet):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@codelet('group-strength-tester')
|
|
|
|
|
def group_strength_tester(coderack, codelet):
|
|
|
|
|
def group_strength_tester(ctx, codelet):
|
|
|
|
|
coderack = ctx.coderack
|
|
|
|
|
slipnet = ctx.slipnet
|
|
|
|
|
# update strength value of the group
|
|
|
|
|
group = codelet.arguments[0]
|
|
|
|
|
__showWhichStringObjectIsFrom(group)
|
|
|
|
|
group.updateStrength()
|
|
|
|
|
strength = group.totalStrength
|
|
|
|
|
probability = formulas.temperatureAdjustedProbability(strength / 100.0)
|
|
|
|
|
probability = formulas.temperatureAdjustedProbability(ctx, strength / 100.0)
|
|
|
|
|
if formulas.coinFlip(probability):
|
|
|
|
|
# it is strong enough - post builder & activate nodes
|
|
|
|
|
group.groupCategory.getRelatedNode(slipnet.bondCategory).buffer = 100.0
|
|
|
|
|
@ -679,7 +713,9 @@ def group_strength_tester(coderack, codelet):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@codelet('group-builder')
|
|
|
|
|
def group_builder(coderack, codelet):
|
|
|
|
|
def group_builder(ctx, codelet):
|
|
|
|
|
slipnet = ctx.slipnet
|
|
|
|
|
workspace = ctx.workspace
|
|
|
|
|
# update strength value of the group
|
|
|
|
|
group = codelet.arguments[0]
|
|
|
|
|
#print '%s' % group
|
|
|
|
|
@ -754,7 +790,8 @@ def group_builder(coderack, codelet):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@codelet('rule-builder')
|
|
|
|
|
def rule_builder(coderack, codelet):
|
|
|
|
|
def rule_builder(ctx, codelet):
|
|
|
|
|
workspace = ctx.workspace
|
|
|
|
|
rule = codelet.arguments[0]
|
|
|
|
|
if rule.ruleEqual(workspace.rule):
|
|
|
|
|
rule.activateRuleDescriptions()
|
|
|
|
|
@ -788,7 +825,10 @@ def __getCutOff(density):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@codelet('rule-translator')
|
|
|
|
|
def rule_translator(coderack, codelet):
|
|
|
|
|
def rule_translator(ctx, codelet):
|
|
|
|
|
coderack = ctx.coderack
|
|
|
|
|
temperature = ctx.temperature
|
|
|
|
|
workspace = ctx.workspace
|
|
|
|
|
assert workspace.rule
|
|
|
|
|
if len(workspace.initial) == 1 and len(workspace.target) == 1:
|
|
|
|
|
bondDensity = 1.0
|
|
|
|
|
@ -808,7 +848,10 @@ def rule_translator(coderack, codelet):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@codelet('bottom-up-correspondence-scout')
|
|
|
|
|
def bottom_up_correspondence_scout(coderack, codelet):
|
|
|
|
|
def bottom_up_correspondence_scout(ctx, codelet):
|
|
|
|
|
coderack = ctx.coderack
|
|
|
|
|
slipnet = ctx.slipnet
|
|
|
|
|
workspace = ctx.workspace
|
|
|
|
|
objectFromInitial = chooseUnmodifiedObject('interStringSalience',
|
|
|
|
|
workspace.initial.objects)
|
|
|
|
|
objectFromTarget = chooseUnmodifiedObject('interStringSalience',
|
|
|
|
|
@ -846,7 +889,10 @@ def bottom_up_correspondence_scout(coderack, codelet):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@codelet('important-object-correspondence-scout')
|
|
|
|
|
def important_object_correspondence_scout(coderack, codelet):
|
|
|
|
|
def important_object_correspondence_scout(ctx, codelet):
|
|
|
|
|
coderack = ctx.coderack
|
|
|
|
|
slipnet = ctx.slipnet
|
|
|
|
|
workspace = ctx.workspace
|
|
|
|
|
objectFromInitial = chooseUnmodifiedObject('relativeImportance',
|
|
|
|
|
workspace.initial.objects)
|
|
|
|
|
descriptors = objectFromInitial.relevantDistinguishingDescriptors()
|
|
|
|
|
@ -897,7 +943,9 @@ def important_object_correspondence_scout(coderack, codelet):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@codelet('correspondence-strength-tester')
|
|
|
|
|
def correspondence_strength_tester(coderack, codelet):
|
|
|
|
|
def correspondence_strength_tester(ctx, codelet):
|
|
|
|
|
coderack = ctx.coderack
|
|
|
|
|
workspace = ctx.workspace
|
|
|
|
|
correspondence = codelet.arguments[0]
|
|
|
|
|
objectFromInitial = correspondence.objectFromInitial
|
|
|
|
|
objectFromTarget = correspondence.objectFromTarget
|
|
|
|
|
@ -908,7 +956,7 @@ def correspondence_strength_tester(coderack, codelet):
|
|
|
|
|
objectFromTarget.flipped_version())))
|
|
|
|
|
correspondence.updateStrength()
|
|
|
|
|
strength = correspondence.totalStrength
|
|
|
|
|
probability = formulas.temperatureAdjustedProbability(strength / 100.0)
|
|
|
|
|
probability = formulas.temperatureAdjustedProbability(ctx, strength / 100.0)
|
|
|
|
|
if formulas.coinFlip(probability):
|
|
|
|
|
# activate some concepts
|
|
|
|
|
for mapping in correspondence.conceptMappings:
|
|
|
|
|
@ -921,7 +969,8 @@ def correspondence_strength_tester(coderack, codelet):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@codelet('correspondence-builder')
|
|
|
|
|
def correspondence_builder(coderack, codelet):
|
|
|
|
|
def correspondence_builder(ctx, codelet):
|
|
|
|
|
workspace = ctx.workspace
|
|
|
|
|
correspondence = codelet.arguments[0]
|
|
|
|
|
objectFromInitial = correspondence.objectFromInitial
|
|
|
|
|
objectFromTarget = correspondence.objectFromTarget
|
|
|
|
|
|