class AbstractSensorimotorTest(unittest.TestCase): VERBOSITY = 1 DEFAULT_TM_PARAMS = {} SEED = 42 def _init(self, tmOverrides=None): """ Initialize Sensorimotor Temporal Memory, and other member variables. :param tmOverrides: overrides for default Temporal Memory parameters """ params = self._computeTMParams(tmOverrides) # Uncomment the line below to disable learn on one cell mode # params["learnOnOneCell"] = False self.tm = SensorimotorTemporalMemory(**params) def _feedTM(self, sequence, learn=True): (sensorSequence, motorSequence, sensorimotorSequence, sequenceLabels) = sequence self.tm.clearHistory() for i in xrange(len(sensorSequence)): sensorPattern = sensorSequence[i] sensorimotorPattern = sensorimotorSequence[i] sequenceLabel = sequenceLabels[i] if sensorPattern is None: self.tm.reset() else: self.tm.compute(sensorPattern, activeExternalCells=sensorimotorPattern, formInternalConnections=False, learn=learn, sequenceLabel=sequenceLabel) if self.VERBOSITY >= 2: print self.tm.prettyPrintHistory(verbosity=self.VERBOSITY - 2) print if self.VERBOSITY >= 2: print self.tm.prettyPrintSequenceCellRepresentations() print if learn and self.VERBOSITY >= 3: print self.tm.prettyPrintConnections() def _testTM(self, sequence): self._feedTM(sequence, learn=False) stats = self.tm.getStatistics() self.allStats.append((self.id(), stats)) return stats # ============================== # Overrides # ============================== @classmethod def setUpClass(cls): cls.allStats = [] @classmethod def tearDownClass(cls): cols = [ "Test", "# of predicted active cells (stats)", "# of predicted inactive cells (stats)", "# of predicted active columns (stats)", "# of predicted inactive columns (stats)", "# of unpredicted active columns (stats)", "# of predicted active cells per column in each sequence (stats)", "# of sequences each predicted active cell shows up in" ] table = PrettyTable(cols) for stats in cls.allStats: row = [stats[0]] + [tuple(x) for x in list(stats[1])] table.add_row(row) print print table print "(stats) => (min, max, sum, average, standard deviation)" def setUp(self): self.tm = None self._random = numpy.random.RandomState(self.SEED) if self.VERBOSITY >= 2: print( "\n" "======================================================\n" "Test: {0} \n" "{1}\n" "======================================================\n" ).format(self.id(), self.shortDescription()) # ============================== # Helper functions # ============================== @classmethod def _generateSensorimotorSequences(cls, length, agents): """ @param length (int) Length of each sequence to generate, one for each agent @param agents (AbstractAgent) Agents acting in their worlds @return (tuple) (sensor sequence, motor sequence, sensorimotor sequence, sequence labels) """ sensorSequence = [] motorSequence = [] sensorimotorSequence = [] sequenceLabels = [] for agent in agents: s, m, sm = agent.generateSensorimotorSequence( length, verbosity=cls.VERBOSITY - 1) sensorSequence += s motorSequence += m sensorimotorSequence += sm sequenceLabels += [str(agent.world)] * length sensorSequence.append(None) motorSequence.append(None) sensorimotorSequence.append(None) sequenceLabels.append(None) return (sensorSequence, motorSequence, sensorimotorSequence, sequenceLabels) def _computeTMParams(self, overrides): params = dict(self.DEFAULT_TM_PARAMS) params.update(overrides or {}) return params
class AbstractSensorimotorTest(unittest.TestCase): VERBOSITY = 1 DEFAULT_TM_PARAMS = {} SEED = 42 def _init(self, tmOverrides=None): """ Initialize Sensorimotor Temporal Memory, and other member variables. :param tmOverrides: overrides for default Temporal Memory parameters """ params = self._computeTMParams(tmOverrides) # Uncomment the line below to disable learn on one cell mode # params["learnOnOneCell"] = False self.tm = SensorimotorTemporalMemory(**params) def _feedTM(self, sequence, learn=True): (sensorSequence, motorSequence, sensorimotorSequence, sequenceLabels) = sequence self.tm.clearHistory() for i in xrange(len(sensorSequence)): sensorPattern = sensorSequence[i] sensorimotorPattern = sensorimotorSequence[i] sequenceLabel = sequenceLabels[i] if sensorPattern is None: self.tm.reset() else: self.tm.compute(sensorPattern, activeExternalCells=sensorimotorPattern, formInternalConnections=False, learn=learn, sequenceLabel=sequenceLabel) if self.VERBOSITY >= 2: print self.tm.prettyPrintHistory(verbosity=self.VERBOSITY-2) print if self.VERBOSITY >= 2: print self.tm.prettyPrintSequenceCellRepresentations() print if learn and self.VERBOSITY >= 3: print self.tm.prettyPrintConnections() def _testTM(self, sequence): self._feedTM(sequence, learn=False) stats = self.tm.getStatistics() self.allStats.append((self.id(), stats)) return stats # ============================== # Overrides # ============================== @classmethod def setUpClass(cls): cls.allStats = [] @classmethod def tearDownClass(cls): cols = ["Test", "# of predicted active cells (stats)", "# of predicted inactive cells (stats)", "# of predicted active columns (stats)", "# of predicted inactive columns (stats)", "# of unpredicted active columns (stats)", "# of predicted active cells per column in each sequence (stats)", "# of sequences each predicted active cell shows up in"] table = PrettyTable(cols) for stats in cls.allStats: row = [stats[0]] + [tuple(x) for x in list(stats[1])] table.add_row(row) print print table print "(stats) => (min, max, sum, average, standard deviation)" def setUp(self): self.tm = None self._random = numpy.random.RandomState(self.SEED) if self.VERBOSITY >= 2: print ("\n" "======================================================\n" "Test: {0} \n" "{1}\n" "======================================================\n" ).format(self.id(), self.shortDescription()) # ============================== # Helper functions # ============================== @classmethod def _generateSensorimotorSequences(cls, length, agents): """ @param length (int) Length of each sequence to generate, one for each agent @param agents (AbstractAgent) Agents acting in their worlds @return (tuple) (sensor sequence, motor sequence, sensorimotor sequence, sequence labels) """ sensorSequence = [] motorSequence = [] sensorimotorSequence = [] sequenceLabels = [] for agent in agents: s,m,sm = agent.generateSensorimotorSequence(length, verbosity=cls.VERBOSITY-1) sensorSequence += s motorSequence += m sensorimotorSequence += sm sequenceLabels += [str(agent.world)] * length sensorSequence.append(None) motorSequence.append(None) sensorimotorSequence.append(None) sequenceLabels.append(None) return (sensorSequence, motorSequence, sensorimotorSequence, sequenceLabels) def _computeTMParams(self, overrides): params = dict(self.DEFAULT_TM_PARAMS) params.update(overrides or {}) return params