Add report_workspace() to Reporter, and remove dead rules from the workspace.

I think the change to `workspace.breakRule()` is harmless. In theory, it
should make Copycat less hesitant to come up with rules that conflict with
the already-broken rule.
This commit is contained in:
Arthur O'Dwyer
2017-05-01 15:28:38 -07:00
parent 25d73785de
commit ecc2c2e407
3 changed files with 8 additions and 3 deletions

View File

@ -837,7 +837,7 @@ def rule_builder(ctx, codelet):
rule.updateStrength()
assert rule.totalStrength
# fight against other rules
if workspace.rule:
if workspace.rule is not None:
assert __structureVsStructure(rule, 1.0, workspace.rule, 1.0)
workspace.buildRule(rule)

View File

@ -19,6 +19,8 @@ class Reporter(object):
def report_temperature(self, temperature):
pass
def report_workspace(self, workspace):
pass
class Copycat(object):
def __init__(self, rng_seed=None, reporter=None):
@ -43,6 +45,7 @@ class Copycat(object):
self.coderack.chooseAndRunCodelet()
self.reporter.report_coderack(self.coderack)
self.reporter.report_temperature(self.temperature)
self.reporter.report_workspace(self.workspace)
return lastUpdate
def runTrial(self):

View File

@ -138,7 +138,7 @@ class Workspace(object):
def slippages(self):
result = []
if self.changedObject and self.changedObject.correspondence:
result = self.changedObject.correspondence.conceptMappings[:]
result += self.changedObject.correspondence.conceptMappings
for o in self.initial.objects:
if o.correspondence:
for mapping in o.correspondence.slippages():
@ -147,13 +147,15 @@ class Workspace(object):
return result
def buildRule(self, rule):
if self.rule:
if self.rule is not None:
self.structures.remove(self.rule)
self.rule = rule
self.structures += [rule]
rule.activateRuleDescriptions()
def breakRule(self):
if self.rule is not None:
self.structures.remove(self.rule)
self.rule = None
def buildDescriptions(self, objekt):