codeletMethods.py: Replace some random.random()s with coinFlip().
There is a bugfix in here as well: one of the probabilities was being taken the wrong way around. The result should have been to make single-letter groups very often, I guess? Fixing this bug doesn't show any change in Copycat's macro behavior, except that it seems like average temperatures have gotten hotter.
This commit is contained in:
@ -131,7 +131,8 @@ def __slippability(conceptMappings):
|
|||||||
@codelet('breaker')
|
@codelet('breaker')
|
||||||
def breaker(coderack, codelet):
|
def breaker(coderack, codelet):
|
||||||
probabilityOfFizzle = (100.0 - formulas.Temperature) / 100.0
|
probabilityOfFizzle = (100.0 - formulas.Temperature) / 100.0
|
||||||
assert not formulas.coinFlip(probabilityOfFizzle)
|
if formulas.coinFlip(probabilityOfFizzle):
|
||||||
|
return
|
||||||
# choose a structure at random
|
# choose a structure at random
|
||||||
structures = [s for s in workspace.structures if
|
structures = [s for s in workspace.structures if
|
||||||
isinstance(s, (Group, Bond, Correspondence))]
|
isinstance(s, (Group, Bond, Correspondence))]
|
||||||
@ -143,7 +144,7 @@ def breaker(coderack, codelet):
|
|||||||
if structure.source.group:
|
if structure.source.group:
|
||||||
if structure.source.group == structure.destination.group:
|
if structure.source.group == structure.destination.group:
|
||||||
breakObjects += [structure.source.group]
|
breakObjects += [structure.source.group]
|
||||||
# try to break all objects
|
# Break all the objects or none of them; this matches the Java
|
||||||
for structure in breakObjects:
|
for structure in breakObjects:
|
||||||
breakProbability = formulas.temperatureAdjustedProbability(
|
breakProbability = formulas.temperatureAdjustedProbability(
|
||||||
structure.totalStrength / 100.0)
|
structure.totalStrength / 100.0)
|
||||||
@ -301,8 +302,8 @@ def rule_strength_tester(coderack, codelet):
|
|||||||
rule.updateStrength()
|
rule.updateStrength()
|
||||||
probability = formulas.temperatureAdjustedProbability(
|
probability = formulas.temperatureAdjustedProbability(
|
||||||
rule.totalStrength / 100.0)
|
rule.totalStrength / 100.0)
|
||||||
assert random.random() <= probability
|
if formulas.coinFlip(probability):
|
||||||
coderack.newCodelet('rule-builder', codelet, rule.totalStrength, rule)
|
coderack.newCodelet('rule-builder', codelet, rule.totalStrength, rule)
|
||||||
|
|
||||||
|
|
||||||
@codelet('replacement-finder')
|
@codelet('replacement-finder')
|
||||||
@ -463,8 +464,7 @@ def top_down_group_scout__category(coderack, codelet):
|
|||||||
elif source.rightmost:
|
elif source.rightmost:
|
||||||
direction = slipnet.left
|
direction = slipnet.left
|
||||||
else:
|
else:
|
||||||
activations = [slipnet.left.activation]
|
activations = [slipnet.left.activation, slipnet.right.activation]
|
||||||
activations += [slipnet.right.activation]
|
|
||||||
if not formulas.selectListPosition(activations):
|
if not formulas.selectListPosition(activations):
|
||||||
direction = slipnet.left
|
direction = slipnet.left
|
||||||
else:
|
else:
|
||||||
@ -484,8 +484,8 @@ def top_down_group_scout__category(coderack, codelet):
|
|||||||
group = Group(source.string, slipnet.samenessGroup,
|
group = Group(source.string, slipnet.samenessGroup,
|
||||||
None, slipnet.letterCategory, [source], [])
|
None, slipnet.letterCategory, [source], [])
|
||||||
probability = group.singleLetterGroupProbability()
|
probability = group.singleLetterGroupProbability()
|
||||||
assert random.random() >= probability
|
if formulas.coinFlip(probability):
|
||||||
coderack.proposeSingleLetterGroup(source, codelet)
|
coderack.proposeSingleLetterGroup(source, codelet)
|
||||||
return
|
return
|
||||||
direction = firstBond.directionCategory
|
direction = firstBond.directionCategory
|
||||||
search = True
|
search = True
|
||||||
@ -627,11 +627,11 @@ def top_down_group_scout__direction(coderack, codelet):
|
|||||||
#noinspection PyStringFormat
|
#noinspection PyStringFormat
|
||||||
@codelet('group-scout--whole-string')
|
@codelet('group-scout--whole-string')
|
||||||
def group_scout__whole_string(coderack, codelet):
|
def group_scout__whole_string(coderack, codelet):
|
||||||
string = workspace.initial
|
if formulas.coinFlip():
|
||||||
if random.random() > 0.5:
|
|
||||||
string = workspace.target
|
string = workspace.target
|
||||||
logging.info('target string selected: %s', workspace.target)
|
logging.info('target string selected: %s', workspace.target)
|
||||||
else:
|
else:
|
||||||
|
string = workspace.initial
|
||||||
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
|
# find leftmost object & the highest group to which it belongs
|
||||||
leftmost = None
|
leftmost = None
|
||||||
@ -674,12 +674,12 @@ def group_strength_tester(coderack, codelet):
|
|||||||
group.updateStrength()
|
group.updateStrength()
|
||||||
strength = group.totalStrength
|
strength = group.totalStrength
|
||||||
probability = formulas.temperatureAdjustedProbability(strength / 100.0)
|
probability = formulas.temperatureAdjustedProbability(strength / 100.0)
|
||||||
assert random.random() <= probability
|
if formulas.coinFlip(probability):
|
||||||
# it is strong enough - post builder & activate nodes
|
# it is strong enough - post builder & activate nodes
|
||||||
group.groupCategory.getRelatedNode(slipnet.bondCategory).buffer = 100.0
|
group.groupCategory.getRelatedNode(slipnet.bondCategory).buffer = 100.0
|
||||||
if group.directionCategory:
|
if group.directionCategory:
|
||||||
group.directionCategory.buffer = 100.0
|
group.directionCategory.buffer = 100.0
|
||||||
coderack.newCodelet('group-builder', codelet, strength)
|
coderack.newCodelet('group-builder', codelet, strength)
|
||||||
|
|
||||||
|
|
||||||
@codelet('group-builder')
|
@codelet('group-builder')
|
||||||
@ -915,15 +915,15 @@ def correspondence_strength_tester(coderack, codelet):
|
|||||||
correspondence.updateStrength()
|
correspondence.updateStrength()
|
||||||
strength = correspondence.totalStrength
|
strength = correspondence.totalStrength
|
||||||
probability = formulas.temperatureAdjustedProbability(strength / 100.0)
|
probability = formulas.temperatureAdjustedProbability(strength / 100.0)
|
||||||
assert random.random() <= probability
|
if formulas.coinFlip(probability):
|
||||||
# activate some concepts
|
# activate some concepts
|
||||||
for mapping in correspondence.conceptMappings:
|
for mapping in correspondence.conceptMappings:
|
||||||
mapping.initialDescriptionType.buffer = 100.0
|
mapping.initialDescriptionType.buffer = 100.0
|
||||||
mapping.initialDescriptor.buffer = 100.0
|
mapping.initialDescriptor.buffer = 100.0
|
||||||
mapping.targetDescriptionType.buffer = 100.0
|
mapping.targetDescriptionType.buffer = 100.0
|
||||||
mapping.targetDescriptor.buffer = 100.0
|
mapping.targetDescriptor.buffer = 100.0
|
||||||
coderack.newCodelet('correspondence-builder', codelet,
|
coderack.newCodelet('correspondence-builder', codelet,
|
||||||
strength, correspondence)
|
strength, correspondence)
|
||||||
|
|
||||||
|
|
||||||
@codelet('correspondence-builder')
|
@codelet('correspondence-builder')
|
||||||
|
|||||||
@ -105,11 +105,7 @@ def probabilityOfPosting(codeletName):
|
|||||||
return 1.0
|
return 1.0
|
||||||
return workspace.rule.totalWeakness() / 100.0
|
return workspace.rule.totalWeakness() / 100.0
|
||||||
if 'translator' in codeletName:
|
if 'translator' in codeletName:
|
||||||
if not workspace.rule:
|
assert False
|
||||||
assert 0
|
|
||||||
return 0.0
|
|
||||||
assert 0
|
|
||||||
return 1.0
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user