Пример #1
0
    def test_dot(self):

        mat1 = self.square_mpi_mat
        mat2 = self.square_mpi_mat2

        serial_mat1 = self.square_serial_mat
        serial_mat2 = self.square_serial_mat2

        rank = comm.Get_rank()

        bv1 = MPIBlockVector(2, [0, 1], comm)

        if rank == 0:
            bv1.set_block(0, np.arange(4, dtype=np.float64))
        if rank == 1:
            bv1.set_block(1, np.arange(4, dtype=np.float64) + 4)
        bv1.broadcast_block_sizes()

        serial_bv1 = BlockVector(2)
        serial_bv1.set_block(0, np.arange(4, dtype=np.float64))
        serial_bv1.set_block(1, np.arange(4, dtype=np.float64) + 4)

        res = mat1.dot(bv1)
        serial_res = serial_mat1.dot(serial_bv1)
        self.assertIsInstance(res, BlockVector)
        self.assertEqual(res.nblocks, serial_res.nblocks)
        for bid in range(serial_res.nblocks):
            self.assertTrue(
                np.allclose(res.get_block(bid), serial_res.get_block(bid)))
Пример #2
0
 def test_flatten(self):
     v = BlockVector(2)
     a = np.arange(5)
     b = np.arange(9)
     c = np.concatenate([a, b])
     v.set_block(0, a)
     v.set_block(1, b)
     self.assertListEqual(v.flatten().tolist(), c.tolist())
Пример #3
0
 def test_fill(self):
     v = BlockVector(2)
     a = np.arange(5)
     b = np.arange(9)
     v.set_block(0, a)
     v.set_block(1, b)
     v.fill(1.0)
     c = np.ones(v.size)
     self.assertListEqual(v.tolist(), c.tolist())
Пример #4
0
 def test_min(self):
     self.assertEqual(self.ones.min(), 1)
     v = BlockVector(2)
     a = np.arange(5)
     b = np.arange(9)
     c = np.concatenate([a, b])
     v.set_block(0, a)
     v.set_block(1, b)
     self.assertEqual(v.min(), c.min())
Пример #5
0
 def test_cumsum(self):
     v = BlockVector(3)
     v.set_block(0, np.arange(1, 5))
     v.set_block(1, np.arange(5, 10))
     v.set_block(2, np.arange(10, 15))
     c = np.arange(1, 15)
     res = v.cumsum()
     self.assertIsInstance(res, BlockVector)
     self.assertEqual(v.nblocks, res.nblocks)
     self.assertTrue(np.allclose(c.cumsum(), res.flatten()))
Пример #6
0
    def test_std(self):

        v = BlockVector(2)
        a = np.arange(5)
        b = np.arange(9)
        v.set_block(0, a)
        v.set_block(1, b)

        vv = np.concatenate([a, b])
        self.assertEqual(vv.std(), v.std())
Пример #7
0
    def test_ptp(self):

        v = BlockVector(2)
        a = np.arange(5)
        b = np.arange(9)
        v.set_block(0, a)
        v.set_block(1, b)

        vv = np.arange(9)
        self.assertEqual(vv.ptp(), v.ptp())
Пример #8
0
    def test_nonzero(self):

        v = BlockVector(2)
        a = np.ones(5)
        b = np.zeros(9)
        v.set_block(0, a)
        v.set_block(1, b)

        n = v.nonzero()

        v2 = BlockVector(2)
        v2.set_block(0, np.arange(5))
        v2.set_block(1, np.zeros(0))
        self.assertEqual(n[0].nblocks, v.nblocks)
        for bid, blk in enumerate(n[0]):
            self.assertTrue(np.allclose(blk, v2.get_block(bid)))
Пример #9
0
    def test_itruediv(self):
        v = self.ones
        v /= 3
        self.assertTrue(np.allclose(v.flatten(), np.ones(v.size) / 3))
        v.fill(1.0)
        v /= v
        self.assertTrue(np.allclose(v.flatten(), np.ones(v.size)))
        v.fill(1.0)
        v /= np.ones(v.size) * 2
        self.assertTrue(np.allclose(v.flatten(), np.ones(v.size) / 2))

        v = BlockVector(2)
        a = np.ones(5)
        b = np.arange(9, dtype=np.float64)
        a_copy = a.copy()
        b_copy = b.copy()
        v.set_block(0, a)
        v.set_block(1, b)
        v /= 2.0

        self.assertTrue(np.allclose(v.get_block(0), a_copy / 2.0))
        self.assertTrue(np.allclose(v.get_block(1), b_copy / 2.0))

        v = BlockVector(2)
        a = np.ones(5)
        b = np.zeros(9)
        a_copy = a.copy()
        b_copy = b.copy()
        v.set_block(0, a)
        v.set_block(1, b)

        v2 = BlockVector(2)
        v2.set_block(0, np.ones(5) * 2)
        v2.set_block(1, np.ones(9) * 2)

        v /= v2
        self.assertTrue(np.allclose(v.get_block(0), a_copy / 2))
        self.assertTrue(np.allclose(v.get_block(1), b_copy / 2))

        self.assertTrue(np.allclose(v2.get_block(0), np.ones(5) * 2))
        self.assertTrue(np.allclose(v2.get_block(1), np.ones(9) * 2))

        with self.assertRaises(Exception) as context:
            v *= 'hola'
Пример #10
0
    def test_imul(self):
        v = self.ones
        v *= 3
        self.assertListEqual(v.tolist(), [3] * v.size)
        v.fill(1.0)
        v *= v
        self.assertListEqual(v.tolist(), [1] * v.size)
        v.fill(1.0)
        v *= np.ones(v.size) * 2
        self.assertTrue(np.allclose(v.flatten(), np.ones(v.size) * 2))

        v = BlockVector(2)
        a = np.ones(5)
        b = np.arange(9, dtype=np.float64)
        a_copy = a.copy()
        b_copy = b.copy()
        v.set_block(0, a)
        v.set_block(1, b)
        v *= 2.0

        self.assertTrue(np.allclose(v.get_block(0), a_copy * 2.0))
        self.assertTrue(np.allclose(v.get_block(1), b_copy * 2.0))

        v = BlockVector(2)
        a = np.ones(5)
        b = np.zeros(9)
        a_copy = a.copy()
        b_copy = b.copy()
        v.set_block(0, a)
        v.set_block(1, b)

        v2 = BlockVector(2)
        v2.set_block(0, np.ones(5) * 2)
        v2.set_block(1, np.ones(9) * 2)

        v *= v2
        self.assertTrue(np.allclose(v.get_block(0), a_copy * 2))
        self.assertTrue(np.allclose(v.get_block(1), b_copy * 2))

        self.assertTrue(np.allclose(v2.get_block(0), np.ones(5) * 2))
        self.assertTrue(np.allclose(v2.get_block(1), np.ones(9) * 2))

        with self.assertRaises(Exception) as context:
            v *= 'hola'
Пример #11
0
    def test_dot(self):
        A_dense = self.basic_m.toarray()
        A_block = self.basic_m
        x = np.ones(A_dense.shape[1])
        block_x = BlockVector(2)
        block_x.set_block(0, np.ones(self.block_m.shape[1]))
        block_x.set_block(1, np.ones(self.block_m.shape[1]))
        flat_res = A_block.dot(x).flatten()
        block_res = A_block.dot(block_x)
        self.assertTrue(np.allclose(A_dense.dot(x), flat_res))
        self.assertTrue(np.allclose(A_dense.dot(x), block_res.flatten()))
        self.assertEqual(block_res.bshape[0], 2)

        m = BlockMatrix(2, 2)
        sub_m = np.array([[1, 0], [0, 1]])
        sub_m = coo_matrix(sub_m)
        m.set_block(0, 1, sub_m.copy())
        m.set_block(1, 0, sub_m.copy())
        x = np.arange(4)
        res = m * x
        self.assertTrue(np.allclose(res.flatten(), np.array([2, 3, 0, 1])))
Пример #12
0
    def test_mul(self):

        mat1 = self.square_mpi_mat
        mat2 = self.square_mpi_mat2

        serial_mat1 = self.square_serial_mat
        serial_mat2 = self.square_serial_mat2

        rank = comm.Get_rank()

        bv1 = MPIBlockVector(2, [0, 1], comm)

        if rank == 0:
            bv1.set_block(0, np.arange(4, dtype=np.float64))
        if rank == 1:
            bv1.set_block(1, np.arange(4, dtype=np.float64) + 4)
        bv1.broadcast_block_sizes()

        serial_bv1 = BlockVector(2)
        serial_bv1.set_block(0, np.arange(4, dtype=np.float64))
        serial_bv1.set_block(1, np.arange(4, dtype=np.float64) + 4)

        res = mat1 * bv1
        serial_res = serial_mat1 * serial_bv1
        self.assertIsInstance(res, BlockVector)
        self.assertEqual(res.nblocks, serial_res.nblocks)
        for bid in range(serial_res.nblocks):
            self.assertTrue(
                np.allclose(res.get_block(bid), serial_res.get_block(bid)))

        res = mat2 * bv1
        serial_res = serial_mat2 * serial_bv1
        self.assertIsInstance(res, BlockVector)
        self.assertEqual(res.nblocks, serial_res.nblocks)
        for bid in range(serial_res.nblocks):
            self.assertTrue(
                np.allclose(res.get_block(bid), serial_res.get_block(bid)))

        bv1 = MPIBlockVector(2, [0, -1], comm)

        if rank == 0:
            bv1.set_block(0, np.arange(4, dtype=np.float64))
        bv1.set_block(1, np.arange(4, dtype=np.float64) + 4)
        bv1.broadcast_block_sizes()

        res = mat1 * bv1
        serial_res = serial_mat1 * serial_bv1
        self.assertIsInstance(res, BlockVector)
        self.assertEqual(res.nblocks, serial_res.nblocks)
        for bid in range(serial_res.nblocks):
            self.assertTrue(
                np.allclose(res.get_block(bid), serial_res.get_block(bid)))

        res = mat2 * bv1
        serial_res = serial_mat2 * serial_bv1
        self.assertIsInstance(res, BlockVector)
        self.assertEqual(res.nblocks, serial_res.nblocks)
        for bid in range(serial_res.nblocks):
            self.assertTrue(
                np.allclose(res.get_block(bid), serial_res.get_block(bid)))

        # rectangular matrix
        mat1 = self.rectangular_mpi_mat
        serial_mat1 = self.rectangular_serial_mat

        bv1 = MPIBlockVector(3, [0, 1, 2], comm)

        if rank == 0:
            bv1.set_block(0, np.arange(4, dtype=np.float64))
        if rank == 1:
            bv1.set_block(1, np.arange(4, dtype=np.float64) + 4)
        if rank == 2:
            bv1.set_block(2, np.arange(2, dtype=np.float64) + 8)

        bv1.broadcast_block_sizes()

        serial_bv1 = BlockVector(3)
        serial_bv1.set_block(0, np.arange(4, dtype=np.float64))
        serial_bv1.set_block(1, np.arange(4, dtype=np.float64) + 4)
        serial_bv1.set_block(2, np.arange(2, dtype=np.float64) + 8)

        # with warnings.catch_warnings():
        #     warnings.simplefilter("ignore")
        res = mat1 * bv1
        serial_res = serial_mat1 * serial_bv1

        self.assertIsInstance(res, BlockVector)
        self.assertEqual(serial_res.nblocks, 2)
        self.assertEqual(res.nblocks, 2)
        for bid in range(serial_res.nblocks):
            self.assertTrue(
                np.allclose(res.get_block(bid), serial_res.get_block(bid)))

        bv1 = MPIBlockVector(3, [0, 1, 0], comm)

        if rank == 0:
            bv1.set_block(0, np.arange(4, dtype=np.float64))
            bv1.set_block(2, np.arange(2, dtype=np.float64) + 8)
        if rank == 1:
            bv1.set_block(1, np.arange(4, dtype=np.float64) + 4)
        bv1.broadcast_block_sizes()

        res = mat1 * bv1
        serial_res = serial_mat1 * serial_bv1
        self.assertIsInstance(res, BlockVector)
        self.assertEqual(res.nblocks, serial_res.nblocks)
        for bid in range(serial_res.nblocks):
            self.assertTrue(
                np.allclose(res.get_block(bid), serial_res.get_block(bid)))

        res = mat1 * 3.0
        serial_res = serial_mat1 * 3.0
        self.assertIsInstance(res, MPIBlockMatrix)
        rows, columns = np.nonzero(res.ownership_mask)
        for i, j in zip(rows, columns):
            if res.get_block(i, j) is not None:
                self.assertTrue(
                    np.allclose(
                        res.get_block(i, j).toarray(),
                        serial_res.get_block(i, j).toarray()))
            else:
                self.assertIsNone(serial_res.get_block(i, j))

        res = 3.0 * mat1
        serial_res = serial_mat1 * 3.0

        self.assertIsInstance(res, MPIBlockMatrix)
        rows, columns = np.nonzero(res.ownership_mask)
        for i, j in zip(rows, columns):
            if res.get_block(i, j) is not None:
                self.assertTrue(
                    np.allclose(
                        res.get_block(i, j).toarray(),
                        serial_res.get_block(i, j).toarray()))
            else:
                self.assertIsNone(serial_res.get_block(i, j))
Пример #13
0
 def test_sum(self):
     self.assertEqual(self.ones.sum(), self.ones.size)
     v = BlockVector(2)
     v.set_block(0, np.arange(5))
     v.set_block(1, np.arange(9))
     self.assertEqual(v.sum(), 46)