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:
Arthur O'Dwyer
2017-04-16 22:03:34 -07:00
parent a3b122b75c
commit ae0434d910
2 changed files with 26 additions and 30 deletions

View File

@ -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')

View File

@ -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