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)