def __init__(self, debugSensor=False, debugMotor=False, **kwargs): """ @param debugSensor (bool) Controls whether sensor encodings are contiguous @param debugMotor (bool) Controls whether motor encodings are contiguous """ super(OneDUniverse, self).__init__(**kwargs) self.debugSensor = debugSensor self.debugMotor = debugMotor self.sensorPatternMachine = ConsecutivePatternMachine( self.nSensor, self.wSensor) self.sensorEncoder = SDRCategoryEncoder(self.nSensor, self.wSensor, forced=True) self.motorPatternMachine = ConsecutivePatternMachine( self.nMotor, self.wMotor) self.motorEncoder = SDRCategoryEncoder(self.nMotor, self.wMotor, forced=True) # This pool is a human friendly representation of sensory values self.elementCodes = ( range(0x0041, 0x005A + 1) + # A-Z range(0x0061, 0x007A + 1) + # a-z range(0x0030, 0x0039 + 1) + # 0-9 range(0x00C0, 0x036F + 1) # Many others ) self.numDecodedElements = len(self.elementCodes)
def setUp(self): self.patternMachine = ConsecutivePatternMachine(100, 5) self.sequenceMachine = SequenceMachine(self.patternMachine) self.tm = MonitoredTemporalMemory(columnDimensions=[100], cellsPerColumn=4, initialPermanence=0.6, connectedPermanence=0.5, minThreshold=1, maxNewSynapseCount=6, permanenceIncrement=0.1, permanenceDecrement=0.05, activationThreshold=1)
def getPatternMachine(self): return ConsecutivePatternMachine(6, 1)
class TutorialTemporalMemoryTest(AbstractTemporalMemoryTest): VERBOSITY = 1 DEFAULT_TM_PARAMS = { "columnDimensions": [6], "cellsPerColumn": 4, "initialPermanence": 0.3, "connectedPermanence": 0.5, "minThreshold": 1, "maxNewSynapseCount": 6, "permanenceIncrement": 0.1, "permanenceDecrement": 0.05, "activationThreshold": 1 } PATTERN_MACHINE = ConsecutivePatternMachine(6, 1) def testFirstOrder(self): """Basic first order sequences""" self.init() sequence = self.sequenceMachine.generateFromNumbers([0, 1, 2, 3, None]) self.feedTM(sequence) self.assertEqual( len(self.tm.mmGetTracePredictedActiveColumns().data[3]), 0) self.feedTM(sequence, num=2) self.feedTM(sequence) self.assertEqual( len(self.tm.mmGetTracePredictedActiveColumns().data[3]), 1) self.feedTM(sequence, num=4) self.feedTM(sequence) self.assertEqual( len(self.tm.mmGetTracePredictedActiveColumns().data[3]), 1) def testHighOrder(self): """High order sequences (in order)""" self.init() sequenceA = self.sequenceMachine.generateFromNumbers( [0, 1, 2, 3, None]) sequenceB = self.sequenceMachine.generateFromNumbers( [4, 1, 2, 5, None]) self.feedTM(sequenceA, num=5) self.feedTM(sequenceA, learn=False) self.assertEqual( len(self.tm.mmGetTracePredictedActiveColumns().data[3]), 1) self.feedTM(sequenceB) self.feedTM(sequenceB, num=2) self.feedTM(sequenceB, learn=False) self.assertEqual( len(self.tm.mmGetTracePredictedActiveColumns().data[1]), 1) self.feedTM(sequenceB, num=3) self.feedTM(sequenceB, learn=False) self.assertEqual( len(self.tm.mmGetTracePredictedActiveColumns().data[2]), 1) self.feedTM(sequenceB, num=3) self.feedTM(sequenceB, learn=False) self.assertEqual( len(self.tm.mmGetTracePredictedActiveColumns().data[3]), 1) self.feedTM(sequenceA, learn=False) self.assertEqual( len(self.tm.mmGetTracePredictedActiveColumns().data[3]), 1) self.assertEqual( len(self.tm.mmGetTracePredictedInactiveColumns().data[3]), 1) self.feedTM(sequenceA, num=10) self.feedTM(sequenceA, learn=False) self.assertEqual( len(self.tm.mmGetTracePredictedActiveColumns().data[3]), 1) # TODO: Requires some form of synaptic decay to forget the ABC=>Y # transition that's initially formed # self.assertEqual(len(self.tm.mmGetTracePredictedInactiveColumns().data[3]), 0) def testHighOrderAlternating(self): """High order sequences (alternating)""" self.init() sequence = self.sequenceMachine.generateFromNumbers([0, 1, 2, 3, None]) sequence += self.sequenceMachine.generateFromNumbers( [4, 1, 2, 5, None]) self.feedTM(sequence) self.feedTM(sequence, num=10) self.feedTM(sequence, learn=False) # TODO: Requires some form of synaptic decay to forget the # ABC=>Y and XBC=>D transitions that are initially formed self.assertEqual( len(self.tm.mmGetTracePredictedActiveColumns().data[3]), 1) # self.assertEqual(len(self.tm.mmGetTracePredictedInactiveColumns().data[3]), 0) self.assertEqual( len(self.tm.mmGetTracePredictedActiveColumns().data[7]), 1) # self.assertEqual(len(self.tm.mmGetTracePredictedInactiveColumns().data[7]), 0) def testEndlesslyRepeating(self): """Endlessly repeating sequence of 2 elements""" self.init({"columnDimensions": [2]}) sequence = self.sequenceMachine.generateFromNumbers([0, 1]) for _ in xrange(7): self.feedTM(sequence) self.feedTM(sequence, num=50) def testEndlesslyRepeatingWithNoNewSynapses(self): """Endlessly repeating sequence of 2 elements with maxNewSynapseCount=1""" self.init({ "columnDimensions": [2], "maxNewSynapseCount": 1, "cellsPerColumn": 10 }) sequence = self.sequenceMachine.generateFromNumbers([0, 1]) for _ in xrange(7): self.feedTM(sequence) self.feedTM(sequence, num=100) def testLongRepeatingWithNovelEnding(self): """Long repeating sequence with novel pattern at the end""" self.init({"columnDimensions": [3]}) sequence = self.sequenceMachine.generateFromNumbers([0, 1]) sequence *= 10 sequence += [self.patternMachine.get(2), None] for _ in xrange(4): self.feedTM(sequence) self.feedTM(sequence, num=10) def testSingleEndlesslyRepeating(self): """A single endlessly repeating pattern""" self.init({"columnDimensions": [1]}) sequence = [self.patternMachine.get(0)] for _ in xrange(4): self.feedTM(sequence) for _ in xrange(2): self.feedTM(sequence, num=10) # ============================== # Overrides # ============================== def setUp(self): super(TutorialTemporalMemoryTest, self).setUp() print( "\n" "======================================================\n" "Test: {0} \n" "{1}\n" "======================================================\n").format( self.id(), self.shortDescription()) def init(self, *args, **kwargs): super(TutorialTemporalMemoryTest, self).init(*args, **kwargs) print "Initialized new TM with parameters:" print pprint.pformat(self._computeTMParams(kwargs.get("overrides"))) print def feedTM(self, sequence, learn=True, num=1): self._showInput(sequence, learn=learn, num=num) super(TutorialTemporalMemoryTest, self).feedTM(sequence, learn=learn, num=num) print self.tm.mmPrettyPrintTraces( self.tm.mmGetDefaultTraces(verbosity=2), breakOnResets=self.tm.mmGetTraceResets()) print if learn: print self.tm.mmPrettyPrintConnections() # ============================== # Helper functions # ============================== def _showInput(self, sequence, learn=True, num=1): sequenceText = self.sequenceMachine.prettyPrintSequence( sequence, verbosity=self.VERBOSITY) learnText = "(learning {0})".format("enabled" if learn else "disabled") numText = " [{0} times]".format(num) if num > 1 else "" print "Feeding sequence {0}{1}:\n{2}".format(learnText, numText, sequenceText) print
def setUp(self): self.patternMachine = ConsecutivePatternMachine(100, 5)
def setUp(self): self.patternMachine = ConsecutivePatternMachine(100, 5) self.sequenceMachine = SequenceMachine(self.patternMachine)