コード例 #1
0
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
コード例 #2
0
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