示例#1
0
    def setUp(self):
        # Create a simple deep network (2 input vertices, 3 network vertices,, 2 output vertices)
        self.ni, self.nc, self.no, self.depth, self.weight, self.p, self.r, self.batch_size = 2, 3, 2, 2, 10, 3, 2, 4
        self.ax_p, self.ax_r = np.ones(self.no) * self.p, np.ones(self.no) * self.r

        l_edges = [('input_0', 'core_0'), ('core_0', 'output_0')] +  \
                  [('input_0', 'core_1'), ('core_1', 'output_0')] + \
                  [('input_1', 'core_1')] + \
                  [('input_1', 'core_2'), ('core_2', 'output_1')]

        self.levels = np.array([1, 2, 1], dtype=int)
        self.sax_I, self.sax_C, self.sax_O = mat_from_tuples(self.ni, self.no, self.nc, l_edges, self.weight)
        self.mask_vertice_drain_a = {'I': np.ones(self.ni), 'C': np.ones(self.nc)}
        self.mask_vertice_drain_b = {'I': np.ones(self.ni), 'C': np.zeros(self.nc)}
        self.mask_vertice_drain_c = {'I': np.zeros(self.ni), 'C': np.ones(self.nc)}

        # Create firing graphs
        self.fga = FiringGraph.from_matrices(
            self.sax_I, self.sax_C, self.sax_O, self.levels,  mask_vertices=self.mask_vertice_drain_a
        )

        self.fgb = FiringGraph.from_matrices(
            self.sax_I, self.sax_C, self.sax_O, self.levels,  mask_vertices=self.mask_vertice_drain_b
        )

        self.fgc = FiringGraph.from_matrices(
            self.sax_I, self.sax_C, self.sax_O, self.levels,  mask_vertices=self.mask_vertice_drain_c
        )

        # Create test signals
        self.input = csc_matrix([[0, 0], [1, 0], [0, 1], [1, 1]])
        self.output = csc_matrix([[0, 0], [0, 0], [0, 1], [1, 1]])
    def setUp(self):

        # enable, disable visual inspection of graph
        self.visual = False

        # Create And pattern of depth 2 /!\ Do not change those parameter for the test /!\
        self.n, self.ni, self.no, self.w0, self.t_mask = 100, 10, 2, 10, 5
        self.ap2 = ap2(self.ni, self.no, w=self.w0, seed=1234)
        self.ap2_fg = self.ap2.build_graph_pattern_init()

        # Create And pattern of depth 3
        self.ni, self.no, self.n_selected = 15, 2, 3
        self.ap3 = ap3(self.ni,
                       self.no,
                       n_selected=self.n_selected,
                       w=self.w0,
                       seed=1234)
        self.ap3_fg = self.ap3.build_graph_pattern_init()

        # Create simple pattern to test multi output
        self.sax_forward = vstack([csc_matrix(np.eye(4)) for _ in range(10)])
        self.sax_backward = lil_matrix(self.sax_forward.shape)
        self.sax_backward[:, :2] = 1
        self.p, self.r = np.array([1, 1, 2, 1]), np.array([1, 2, 1, 1])
        self.weight = 100

        # Create patterns to test functionality of forward and  backward patterns in server
        d_matrices = create_empty_matrices(self.sax_forward.shape[1],
                                           self.sax_backward.shape[1], 4)
        for i in range(4):
            d_matrices['Iw'][i, i], d_matrices['Ow'][
                i, i], d_matrices['Im'][:, :] = self.weight, 1, True

        self.fg = FiringGraph('test_server', np.ones(4), d_matrices, depth=2)
示例#3
0
    def build_graph_pattern_init(self):

        # Build edges
        l_edges = []
        for i in range(self.no):
            l_edges += [(self.input_vertices[i][j], self.core_vertices[i])
                        for j in range(self.ni)]
        l_edges += zip(self.core_vertices, self.output_vertices)

        # Build Firing graph
        sax_I, sax_C, sax_O = mat_from_tuples(self.ni * self.no,
                                              self.no,
                                              self.no,
                                              l_edges,
                                              weights=self.w)
        self.firing_graph = FiringGraph.from_matrices(
            sax_I,
            sax_C,
            sax_O,
            np.ones(self.no),
            mask_vertices=self.mask_vertice_drain,
            depth=self.depth,
            project='AndPat2')

        return self.firing_graph
示例#4
0
    def setUp(self):

        # Create input and output signal
        self.sax_forward = csc_matrix([
            [1, 0, 0, 0, 0, 1],
            [1, 0, 1, 1, 1, 1],
            [0, 1, 0, 1, 1, 0],
            [0, 1, 0, 0, 1, 1],
            [1, 1, 1, 0, 0, 1],
            [1, 1, 0, 0, 1, 0],
            [1, 1, 0, 1, 0, 1],
            [1, 1, 0, 1, 1, 1],
        ])

        self.sax_backward = csc_matrix([[0], [0], [0], [0], [1], [1], [1],
                                        [1]])
        self.sax_test = csc_matrix([[1], [0], [1], [0], [1], [1], [1], [0]])

        # Create patterns to test functionality of forward and  backward patterns in server
        d_matrices = create_empty_matrices(self.sax_forward.shape[1],
                                           self.sax_backward.shape[1], 1)
        d_matrices['Iw'][3, 0], d_matrices['Ow'][0, 0] = 1, 1
        self.pattern = FiringGraph('test_server',
                                   np.ones(1),
                                   d_matrices,
                                   depth=2)

        # Create server
        self.server = ArrayServer(self.sax_forward,
                                  self.sax_backward,
                                  dtype_forward=int,
                                  dtype_backward=int,
                                  pattern_mask=self.pattern.copy())

        self.sax_expected = np.array([-1, 0, -1, 0, 1, 1, 1, 0])
        self.sax_expected_mask = np.array([-1, 0, 0, 0, 1, 1, 0, 0])
示例#5
0
    def test_propagate(self):
        """
        Test basic graph building
        python -m unittest tests.unit.firing_graph.test_builder.TestBuilder.test_propagate

        """

        sax_I, sax_C, sax_O = mat_from_tuples(self.ni, self.no - 1, self.nc -1, self.l_edges_2, self.weight)

        firing_graph = FiringGraph.from_matrices(
            sax_I, sax_C, sax_O, self.ax_levels_2,  mask_vertices=self.mask_vertice_drain_2, depth=3
        )

        sax_o = firing_graph.propagate(self.sax_i)

        # Assert result is as expected
        self.assertTrue((sax_o.toarray() == self.sax_o.toarray()).all())
示例#6
0
    def build_graph_pattern_init(self):

        # Build edges
        l_edges, ax_levels = [], np.ones(self.nc * self.no)

        for i in range(self.no):
            l_edges += [(self.input_vertices[i][j], self.core_vertices[i][0])
                        for j in range(self.ni)
                        if self.ni * i + j in self.target_selected[i]]
            ax_levels[i * self.nc] = len(self.target_selected[i])

        for i in range(self.no):
            l_edges += [(self.input_vertices[i][j], self.core_vertices[i][1])
                        for j in range(self.ni)
                        if self.ni * i + j not in self.target_selected[i]]

        for i in range(self.no):
            l_edges += [
                (self.core_vertices[i][0], self.core_vertices[i][self.nc - 1]),
                (self.core_vertices[i][1], self.core_vertices[i][self.nc - 1]),
                (self.core_vertices[i][self.nc - 1], self.output_vertices[i])
            ]
            ax_levels[i * self.nc + self.nc - 1] = self.nc - 1

        # Build Firing graph
        sax_I, sax_C, sax_O = mat_from_tuples(self.ni * self.no,
                                              self.no,
                                              self.no * self.nc,
                                              l_edges,
                                              weights=self.w)
        self.firing_graph = FiringGraph.from_matrices(
            sax_I,
            sax_C,
            sax_O,
            ax_levels,
            mask_vertices=self.mask_vertice_drain,
            depth=self.depth,
            project='AndPatInit3')

        return self.firing_graph
示例#7
0
    def test_building_graph(self):
        """
        Test basic graph building
        python -m unittest tests.unit.firing_graph.test_builder.TestBuilder.test_building_graph

        """

        # Update mask vertice drainer
        self.mask_vertice_drain['I'][0] = 1
        self.mask_vertice_drain['C'][3] = 1
        self.mask_vertice_drain['C'][2] = 1

        firing_graph = FiringGraph.from_matrices(
            self.sax_I, self.sax_C, self.sax_O, self.ax_levels,  mask_vertices=self.mask_vertice_drain, depth=3
        )

        # Assert matrices dtypes and format are correct
        self.assertTrue(isinstance(firing_graph.Iw, csc_matrix) and firing_graph.Iw.dtype.type == np.int32)
        self.assertTrue(isinstance(firing_graph.Cw, csc_matrix) and firing_graph.Cw.dtype.type == np.int32)
        self.assertTrue(isinstance(firing_graph.Ow, csc_matrix) and firing_graph.Ow.dtype.type == np.int32)
        self.assertTrue(isinstance(firing_graph.Im, csc_matrix) and firing_graph.Im.dtype.type == np.bool_)
        self.assertTrue(isinstance(firing_graph.Cm, csc_matrix) and firing_graph.Cm.dtype.type == np.bool_)
        self.assertTrue(isinstance(firing_graph.Om, csc_matrix) and firing_graph.Om.dtype.type == np.bool_)

        # Assert tracking dtypes and format are correct
        self.assertTrue(isinstance(firing_graph.backward_firing['i'], csc_matrix))
        self.assertTrue(isinstance(firing_graph.backward_firing['c'], csc_matrix))
        self.assertTrue(isinstance(firing_graph.backward_firing['o'], csc_matrix))
        self.assertTrue(all([sax_bf.dtype.type == np.uint32 for sax_bf in firing_graph.backward_firing.values()]))

        # Assert adjacency matrices are correct
        self.assertTrue(firing_graph.I[0, 3] and firing_graph.Iw[0, 3] == self.weight)
        self.assertTrue(firing_graph.C[3, 2] and firing_graph.Cw[3, 2] == self.weight)
        self.assertTrue(firing_graph.O[4, 2] and firing_graph.Ow[4, 2] == self.weight)

        # Assert mask for drainer are correct
        self.assertTrue(firing_graph.Im[1, :].nnz == 0 and firing_graph.Im[0, :].nnz == firing_graph.I[0, :].nnz)
        self.assertTrue(firing_graph.Cm[[0, 1, 2, 4], :].nnz == 0 and firing_graph.Cm[3, :].nnz == firing_graph.C[3, :].nnz)
        self.assertTrue(firing_graph.Om[[0, 1, 3, 4], :].nnz == 0 and firing_graph.Om[2, :].nnz == firing_graph.O[2, :].nnz)
示例#8
0
class TestServer(unittest.TestCase):
    def setUp(self):

        # Create input and output signal
        self.sax_forward = csc_matrix([
            [1, 0, 0, 0, 0, 1],
            [1, 0, 1, 1, 1, 1],
            [0, 1, 0, 1, 1, 0],
            [0, 1, 0, 0, 1, 1],
            [1, 1, 1, 0, 0, 1],
            [1, 1, 0, 0, 1, 0],
            [1, 1, 0, 1, 0, 1],
            [1, 1, 0, 1, 1, 1],
        ])

        self.sax_backward = csc_matrix([[0], [0], [0], [0], [1], [1], [1],
                                        [1]])
        self.sax_test = csc_matrix([[1], [0], [1], [0], [1], [1], [1], [0]])

        # Create patterns to test functionality of forward and  backward patterns in server
        d_matrices = create_empty_matrices(self.sax_forward.shape[1],
                                           self.sax_backward.shape[1], 1)
        d_matrices['Iw'][3, 0], d_matrices['Ow'][0, 0] = 1, 1
        self.pattern = FiringGraph('test_server',
                                   np.ones(1),
                                   d_matrices,
                                   depth=2)

        # Create server
        self.server = ArrayServer(self.sax_forward,
                                  self.sax_backward,
                                  dtype_forward=int,
                                  dtype_backward=int,
                                  pattern_mask=self.pattern.copy())

        self.sax_expected = np.array([-1, 0, -1, 0, 1, 1, 1, 0])
        self.sax_expected_mask = np.array([-1, 0, 0, 0, 1, 1, 0, 0])

    def test_server_no_mask(self):
        """
        python -m unittest tests.unit.firing_graph.test_server.TestServer.test_server_no_mask

        """
        # stream once
        self.server.pattern_mask = None
        sax_i = self.server.next_forward(5).sax_data_forward

        # Assert correct behaviour
        self.assertEqual(sax_i.shape, (5, self.sax_forward.shape[1]))
        self.assertTrue(
            (sax_i.toarray() == self.sax_forward.toarray()[:5, :]).all())
        self.assertEqual(self.server.step_forward, 5)

        # Stream another time
        sax_i = self.server.next_forward(5).sax_data_forward

        # Assert correct behaviour
        self.assertEqual(sax_i.shape, (5, self.sax_forward.shape[1]))
        self.assertTrue(
            (sax_i.toarray()[0, :] == self.sax_forward.toarray()[5, :]).all())
        self.assertTrue((sax_i.toarray()[-1, :] == self.sax_forward.toarray()[
            9 % self.sax_forward.shape[0], :]).all())
        self.assertEqual(self.server.step_forward, 2)

        # Stream feedback signal
        self.server.stream_features()

        # Assert correct behaviour
        sax_ob = fpo(self.sax_test, self.server, self.sax_forward.shape[0],
                     np.ones(1), np.ones(1))
        self.assertTrue((sax_ob.toarray()[0] == self.sax_expected).all())

    def test_server_mask_pattern(self):
        """
        python -m unittest tests.unit.firing_graph.test_server.TestServer.test_server_mask_pattern

        """

        # Stream feedback signal with soft orthogonality settings
        self.server.stream_features()

        # Assert correct behaviour
        sax_ob = fpo(self.sax_test, self.server, self.sax_forward.shape[0],
                     np.ones(1), np.ones(1))
        self.assertTrue((sax_ob.toarray() == self.sax_expected_mask).all())