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 testD(self): """Endlessly repeating sequence of 2 elements""" self.initTM({"columnDimensions": [2]}) self.finishSetUp(ConsecutivePatternMachine( self.tm.connections.numberOfColumns(), 1)) sequence = self.sequenceMachine.generateFromNumbers([0, 1]) for _ in xrange(7): self.feedTM(sequence) self.feedTM(sequence, num=50)
def setUp(self): self.patternMachine = ConsecutivePatternMachine(100, 5) self.sequenceMachine = SequenceMachine(self.patternMachine) self.tm = InspectTemporalMemory(columnDimensions=[100], cellsPerColumn=4, initialPermanence=0.6, connectedPermanence=0.5, minThreshold=1, maxNewSynapseCount=6, permanenceIncrement=0.1, permanenceDecrement=0.05, activationThreshold=1)
def testG(self): """A single endlessly repeating pattern""" self.initTM({"columnDimensions": [1]}) self.finishSetUp(ConsecutivePatternMachine( self.tm.connections.numberOfColumns(), 1)) sequence = [self.patternMachine.get(0)] for _ in xrange(4): self.feedTM(sequence) for _ in xrange(2): self.feedTM(sequence, num=10)
def testF(self): """Long repeating sequence with novel pattern at the end""" self.initTM({"columnDimensions": [3]}) self.finishSetUp(ConsecutivePatternMachine( self.tm.connections.numberOfColumns(), 1)) 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 testE(self): """Endlessly repeating sequence of 2 elements with maxNewSynapseCount=1""" self.initTM({"columnDimensions": [2], "maxNewSynapseCount": 1, "cellsPerColumn": 10}) self.finishSetUp(ConsecutivePatternMachine( self.tm.connections.numberOfColumns(), 1)) sequence = self.sequenceMachine.generateFromNumbers([0, 1]) for _ in xrange(7): self.feedTM(sequence) self.feedTM(sequence, num=100)
def testB(self): """High order sequences (in order)""" self.initTM() self.finishSetUp(ConsecutivePatternMachine( self.tm.connections.numberOfColumns(), 1)) sequenceA = self.sequenceMachine.generateFromNumbers([0, 1, 2, 3, None]) sequenceB = self.sequenceMachine.generateFromNumbers([4, 1, 2, 5, None]) self.feedTM(sequenceA, num=5) (_, _, predictedActiveColumnsList, _, _) = self.feedTM(sequenceA, learn=False) self.assertEqual(len(predictedActiveColumnsList[3]), 1) self.feedTM(sequenceB) self.feedTM(sequenceB, num=2) (_, _, predictedActiveColumnsList, _, _) = self.feedTM(sequenceB, learn=False) self.assertEqual(len(predictedActiveColumnsList[1]), 1) self.feedTM(sequenceB, num=3) (_, _, predictedActiveColumnsList, _, _) = self.feedTM(sequenceB, learn=False) self.assertEqual(len(predictedActiveColumnsList[2]), 1) self.feedTM(sequenceB, num=3) (_, _, predictedActiveColumnsList, _, _) = self.feedTM(sequenceB, learn=False) self.assertEqual(len(predictedActiveColumnsList[3]), 1) (_, _, predictedActiveColumnsList, predictedInactiveColumnsList, _) = self.feedTM(sequenceA, learn=False) self.assertEqual(len(predictedActiveColumnsList[3]), 1) self.assertEqual(len(predictedInactiveColumnsList[3]), 1) self.feedTM(sequenceA, num=10) (_, _, predictedActiveColumnsList, predictedInactiveColumnsList, _) = self.feedTM(sequenceA, learn=False) self.assertEqual(len(predictedActiveColumnsList[3]), 1)
def testA(self): """Basic first order sequences""" self.initTM() self.finishSetUp(ConsecutivePatternMachine( self.tm.connections.numberOfColumns(), 1)) sequence = self.sequenceMachine.generateFromNumbers([0, 1, 2, 3, None]) (_, _, predictedActiveColumnsList, _, _) = self.feedTM(sequence) self.assertEqual(len(predictedActiveColumnsList[3]), 0) self.feedTM(sequence, num=2) (_, _, predictedActiveColumnsList, _, _) = self.feedTM(sequence) self.assertEqual(len(predictedActiveColumnsList[3]), 1) self.feedTM(sequence, num=4) (_, _, predictedActiveColumnsList, _, _) = self.feedTM(sequence) self.assertEqual(len(predictedActiveColumnsList[3]), 1)
def testC(self): """High order sequences (alternating)""" self.initTM() self.finishSetUp(ConsecutivePatternMachine( self.tm.connections.numberOfColumns(), 1)) 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) (_, _, predictedActiveColumnsList, predictedInactiveColumnsList, _) = 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(predictedActiveColumnsList[3]), 1) # self.assertEqual(len(predictedInactiveColumnsList[3]), 0) self.assertEqual(len(predictedActiveColumnsList[8]), 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) self.sequenceMachine = SequenceMachine(self.patternMachine)
def setUp(self): self.patternMachine = ConsecutivePatternMachine(100, 5)