Beispiel #1
0
def main():
  # Create Network instance
  network = Network()

  # Add three TestNode regions to network
  network.addRegion("region1", "TestNode", "")
  network.addRegion("region2", "TestNode", "")
  network.addRegion("region3", "TestNode", "")

  # Set dimensions on first region
  region1 = network.getRegions().getByName("region1")
  region1.setDimensions(Dimensions([1, 1]))

  # Link regions
  network.link("region1", "region2", "UniformLink", "")
  network.link("region2", "region1", "UniformLink", "")
  network.link("region1", "region3", "UniformLink", "")
  network.link("region2", "region3", "UniformLink", "")

  # Initialize network
  network.initialize()

  # Initialize Network Visualizer
  viz = NetworkVisualizer(network)

  # Render w/ graphviz
  viz.render(renderer=GraphVizRenderer)

  # Render w/ networkx
  viz.render(renderer=NetworkXRenderer)
    def testLinkingDownwardDimensions(self):
        #
        # Linking can induce dimensions downward
        #
        net = Network()
        level1 = net.addRegion("level1", "TestNode", "")
        level2 = net.addRegion("level2", "TestNode", "")
        dims = Dimensions([3, 2])
        level2.setDimensions(dims)
        net.link("level1", "level2", "TestFanIn2", "")
        net.initialize()

        # Level1 should now have dimensions [6, 4]
        self.assertEqual(level1.getDimensions()[0], 6)
        self.assertEqual(level1.getDimensions()[1], 4)

        #
        # We get nice error messages when network can't be initialized
        #
        LOGGER.info("=====")
        LOGGER.info("Creating a 3 level network in which levels 1 and 2 have")
        LOGGER.info("dimensions but network initialization will fail because")
        LOGGER.info("level3 does not have dimensions")
        LOGGER.info("Error message follows:")

        net = Network()
        level1 = net.addRegion("level1", "TestNode", "")
        level2 = net.addRegion("level2", "TestNode", "")
        _level3 = net.addRegion("level3", "TestNode", "")
        dims = Dimensions([6, 4])
        level1.setDimensions(dims)
        net.link("level1", "level2", "TestFanIn2", "")
        self.assertRaises(RuntimeError, net.initialize)
        LOGGER.info("=====")

        LOGGER.info("======")
        LOGGER.info("Creating a link with incompatible dimensions. \
      Error message follows")
        net.link("level2", "level3", "TestFanIn2", "")
        self.assertRaises(RuntimeError, net.initialize)
  def _testNetLoad(self):
    """Test loading a network with this sensor in it."""
    n = Network()
    r = n.addRegion(self.nodeName, self.sensorName, '{ activeOutputCount: 11}')
    r.dimensions = Dimensions([1])
    n.save(self.filename)

    n = Network(self.filename)
    n.initialize()
    self.testsPassed += 1

    # Check that vectorCount parameter is zero
    r = n.regions[self.nodeName]

    res = r.getParameter('vectorCount')
    self.assertEqual(
        res, 0, "getting vectorCount:\n Expected '0',  got back  '%d'\n" % res)

    self.sensor = r
    def runNodesTest(self, nodeType1, nodeType2):
        # =====================================================
        # Build and run the network
        # =====================================================
        LOGGER.info('test(level1: %s, level2: %s)', nodeType1, nodeType2)
        net = Network()
        level1 = net.addRegion("level1", nodeType1, "{int32Param: 15}")
        dims = Dimensions([6, 4])
        level1.setDimensions(dims)

        level2 = net.addRegion("level2", nodeType2, "{real64Param: 128.23}")

        net.link("level1", "level2", "TestFanIn2", "")

        # Could call initialize here, but not necessary as net.run()
        # initializes implicitly.
        # net.initialize()

        net.run(1)
        LOGGER.info("Successfully created network and ran for one iteration")

        # =====================================================
        # Check everything
        # =====================================================
        dims = level1.getDimensions()
        self.assertEqual(len(dims), 2)
        self.assertEqual(dims[0], 6)
        self.assertEqual(dims[1], 4)

        dims = level2.getDimensions()
        self.assertEqual(len(dims), 2)
        self.assertEqual(dims[0], 3)
        self.assertEqual(dims[1], 2)

        # Check L1 output. "False" means don't copy, i.e.
        # get a pointer to the actual output
        # Actual output values are determined by the TestNode
        # compute() behavior.
        l1output = level1.getOutputData("bottomUpOut")
        self.assertEqual(len(l1output), 48)  # 24 nodes; 2 values per node
        for i in xrange(24):
            self.assertEqual(l1output[2 * i],
                             0)  # size of input to each node is 0
            self.assertEqual(l1output[2 * i + 1], i)  # node number

        # check L2 output.
        l2output = level2.getOutputData("bottomUpOut")
        self.assertEqual(len(l2output), 12)  # 6 nodes; 2 values per node
        # Output val = node number + sum(inputs)
        # Can compute from knowing L1 layout
        #
        #  00 01 | 02 03 | 04 05
        #  06 07 | 08 09 | 10 11
        #  ---------------------
        #  12 13 | 14 15 | 16 17
        #  18 19 | 20 21 | 22 23
        outputVals = []
        outputVals.append(0 + (0 + 1 + 6 + 7))
        outputVals.append(1 + (2 + 3 + 8 + 9))
        outputVals.append(2 + (4 + 5 + 10 + 11))
        outputVals.append(3 + (12 + 13 + 18 + 19))
        outputVals.append(4 + (14 + 15 + 20 + 21))
        outputVals.append(5 + (16 + 17 + 22 + 23))
        for i in xrange(6):
            if l2output[2 * i] != 8:
                LOGGER.info(l2output[2 * i])
                # from dbgp.client import brk; brk(port=9019)

            self.assertEqual(l2output[2 * i],
                             8)  # size of input for each node is 8
            self.assertEqual(l2output[2 * i + 1], outputVals[i])

        # =====================================================
        # Run for one more iteration
        # =====================================================
        LOGGER.info("Running for a second iteration")
        net.run(1)

        # =====================================================
        # Check everything again
        # =====================================================

        # Outputs are all the same except that the first output is
        # incremented by the iteration number
        for i in xrange(24):
            self.assertEqual(l1output[2 * i], 1)
            self.assertEqual(l1output[2 * i + 1], i)

        for i in xrange(6):
            self.assertEqual(l2output[2 * i], 9)
            self.assertEqual(l2output[2 * i + 1], outputVals[i] + 4)

        # =====================================================
        # Demonstrate a few other features
        # =====================================================

        #
        # Linking can induce dimensions downward
        #

        net = Network()
        level1 = net.addRegion("level1", nodeType1, "")
        level2 = net.addRegion("level2", nodeType2, "")
        dims = Dimensions([3, 2])
        level2.setDimensions(dims)
        net.link("level1", "level2", "TestFanIn2", "")
        net.initialize()

        # Level1 should now have dimensions [6, 4]
        self.assertEqual(level1.getDimensions()[0], 6)
        self.assertEqual(level1.getDimensions()[1], 4)
    def testSerialization(self):
        n = Network()

        imageDims = (42, 38)
        params = dict(width=imageDims[0],
                      height=imageDims[1],
                      mode="bw",
                      background=1,
                      invertOutput=1)

        sensor = n.addRegion("sensor", "py.ImageSensor", json.dumps(params))
        sensor.setDimensions(Dimensions(imageDims[0], imageDims[1]))

        params = dict(inputShape=imageDims,
                      coincidencesShape=imageDims,
                      disableTemporal=1,
                      tpSeed=43,
                      spSeed=42,
                      nCellsPerCol=1)

        l1 = n.addRegion("l1", "py.CLARegion", json.dumps(params))

        params = dict(maxCategoryCount=48,
                      SVDSampleCount=400,
                      SVDDimCount=5,
                      distanceNorm=0.6)

        _classifier = n.addRegion("classifier", "py.KNNClassifierRegion",
                                  json.dumps(params))

        # TODO: link params should not be required. Dest region dimensions are
        # already specified as [1]
        params = dict(mapping="in", rfSize=imageDims)

        n.link("sensor", "l1", "UniformLink", json.dumps(params))
        n.link("l1", "classifier", "UniformLink", "", "bottomUpOut",
               "bottomUpIn")
        n.link("sensor", "classifier", "UniformLink", "", "categoryOut",
               "categoryIn")
        n.initialize()

        n.save("fdr.nta")

        # Make sure the network bundle has all the expected files
        self.assertTrue(os.path.exists("fdr.nta/network.yaml"))
        self.assertTrue(os.path.exists("fdr.nta/R0-pkl"))
        self.assertTrue(os.path.exists("fdr.nta/R1-pkl"))
        self.assertTrue(os.path.exists("fdr.nta/R2-pkl"))

        n2 = Network("fdr.nta")
        n2.initialize()  # should not fail

        # Make sure the network is actually the same
        sensor = n2.regions['sensor']
        self.assertEqual(sensor.type, "py.ImageSensor")
        # would like to directly compare, but can't -- NPC-6
        self.assertEqual(str(sensor.dimensions), str(Dimensions(42, 38)))
        self.assertEqual(sensor.getParameter("width"), 42)
        self.assertEqual(sensor.getParameter("height"), 38)
        self.assertEqual(sensor.getParameter("mode"), "bw")
        self.assertEqual(sensor.getParameter("background"), 1)
        self.assertEqual(sensor.getParameter("invertOutput"), 1)

        l1 = n2.regions['l1']
        self.assertEqual(l1.type, "py.CLARegion")
        self.assertEqual(str(l1.dimensions), str(Dimensions(1)))
        a = l1.getParameter("inputShape")
        self.assertEqual(len(a), 2)
        self.assertEqual(a[0], 42)
        self.assertEqual(a[1], 38)

        a = l1.getParameter("coincidencesShape")
        self.assertEqual(len(a), 2)
        self.assertEqual(a[0], 42)
        self.assertEqual(a[1], 38)

        self.assertEqual(l1.getParameter("disableTemporal"), 1)
        self.assertEqual(l1.getParameter("spSeed"), 42)
        self.assertEqual(l1.getParameter("tpSeed"), 43)

        cl = n2.regions['classifier']
        self.assertEqual(cl.type, "py.KNNClassifierRegion")
        self.assertEqual(cl.getParameter("maxCategoryCount"), 48)
        self.assertEqual(cl.getParameter("SVDSampleCount"), 400)
        self.assertEqual(cl.getParameter("SVDDimCount"), 5)
        self.assertLess((cl.getParameter("distanceNorm") - 0.6), 0.0001)
        self.assertEqual(str(cl.dimensions), str(Dimensions(1)))

        n2.save("fdr2.nta")

        # now compare the two network bundles -- should be the same
        c = filecmp.dircmp("fdr.nta", "fdr2.nta")
        self.assertEqual(len(c.left_only), 0,
                         "fdr.nta has extra files: %s" % c.left_only)

        self.assertEqual(len(c.right_only), 0,
                         "fdr2.nta has extra files: %s" % c.right_only)

        if len(c.diff_files) > 0:
            _LOGGER.warn(
                "Some bundle files differ: %s\n"
                "This is expected, as pickle.load() followed by "
                "pickle.dump() doesn't produce the same file", c.diff_files)