Beispiel #1
0
    def test_FiniteDifference(self):
        print ("test FiniteDifference")
        ##
        N, M = 2, 3

        ig = ImageGeometry(N, M)
        Id = Identity(ig)

        FD = FiniteDiff(ig, direction = 0, bnd_cond = 'Neumann')
        u = FD.domain_geometry().allocate('random_int')
        
        
        res = FD.domain_geometry().allocate(ImageGeometry.RANDOM_INT)
        FD.adjoint(u, out=res)
        w = FD.adjoint(u)

        self.assertNumpyArrayEqual(res.as_array(), w.as_array())
        
        res = Id.domain_geometry().allocate(ImageGeometry.RANDOM_INT)
        Id.adjoint(u, out=res)
        w = Id.adjoint(u)

        self.assertNumpyArrayEqual(res.as_array(), w.as_array())
        self.assertNumpyArrayEqual(u.as_array(), w.as_array())

        G = Gradient(ig)

        u = G.range_geometry().allocate(ImageGeometry.RANDOM_INT)
        res = G.domain_geometry().allocate()
        G.adjoint(u, out=res)
        w = G.adjoint(u)
        self.assertNumpyArrayEqual(res.as_array(), w.as_array())
        
        u = G.domain_geometry().allocate(ImageGeometry.RANDOM_INT)
        res = G.range_geometry().allocate()
        G.direct(u, out=res)
        w = G.direct(u)
        self.assertBlockDataContainerEqual(res, w)
Beispiel #2
0
    def test_CompositionOperator_adjoint6(self):
        ig = self.ig
        data = self.data
        G = Gradient(domain_geometry=ig)
        

        Id1 = 3 * Identity(ig)
        Id = ZeroOperator(ig)
        d = G.compose(Id)
        da = d.direct(data)
        
        out1 = G.adjoint(da)
        out2 = d.adjoint(da)

        numpy.testing.assert_array_almost_equal(out2.as_array(),  0 * out1.as_array())
Beispiel #3
0
    def test_CompositionOperator_adjoint2(self):
        ig = self.ig
        data = self.data
        G = Gradient(domain_geometry=ig)
        

        Id1 = 2 * Identity(ig)
        Id2 = Identity(ig)
        
        d = CompositionOperator(G, Id1)
        da = d.direct(data)
        
        out1 = G.adjoint(da)
        out2 = d.adjoint(da)

        numpy.testing.assert_array_almost_equal(out2.as_array(),  2 * out1.as_array())
Beispiel #4
0
    def test_Gradient(self):
        N, M, K = 20, 30, 40
        channels = 10

        numpy.random.seed(1)

        # check range geometry, examples

        ig1 = ImageGeometry(voxel_num_x=M, voxel_num_y=N)
        ig2 = ImageGeometry(voxel_num_x=M, voxel_num_y=N, voxel_num_z=K)
        ig3 = ImageGeometry(voxel_num_x=M, voxel_num_y=N, channels=channels)
        ig4 = ImageGeometry(voxel_num_x=M,
                            voxel_num_y=N,
                            channels=channels,
                            voxel_num_z=K)

        G1 = Gradient(ig1, correlation='Space', backend='numpy')
        print(G1.range_geometry().shape, '2D no channels')

        G4 = Gradient(ig3, correlation='SpaceChannels', backend='numpy')
        print(G4.range_geometry().shape, '2D with channels corr')
        G5 = Gradient(ig3, correlation='Space', backend='numpy')
        print(G5.range_geometry().shape, '2D with channels no corr')

        G6 = Gradient(ig4, correlation='Space', backend='numpy')
        print(G6.range_geometry().shape, '3D with channels no corr')
        G7 = Gradient(ig4, correlation='SpaceChannels', backend='numpy')
        print(G7.range_geometry().shape, '3D with channels with corr')

        u = ig1.allocate(ImageGeometry.RANDOM)
        w = G1.range_geometry().allocate(ImageGeometry.RANDOM_INT)

        LHS = (G1.direct(u) * w).sum()
        RHS = (u * G1.adjoint(w)).sum()
        numpy.testing.assert_approx_equal(LHS, RHS, significant=1)
        numpy.testing.assert_approx_equal(G1.norm(),
                                          numpy.sqrt(2 * 4),
                                          significant=1)

        u1 = ig3.allocate('random')
        w1 = G4.range_geometry().allocate('random')
        LHS1 = (G4.direct(u1) * w1).sum()
        RHS1 = (u1 * G4.adjoint(w1)).sum()
        numpy.testing.assert_approx_equal(LHS1, RHS1, significant=1)
        numpy.testing.assert_almost_equal(G4.norm(),
                                          numpy.sqrt(3 * 4),
                                          decimal=0)

        u2 = ig4.allocate('random')
        w2 = G7.range_geometry().allocate('random')
        LHS2 = (G7.direct(u2) * w2).sum()
        RHS2 = (u2 * G7.adjoint(w2)).sum()
        numpy.testing.assert_approx_equal(LHS2, RHS2, significant=3)
        numpy.testing.assert_approx_equal(G7.norm(),
                                          numpy.sqrt(3 * 4),
                                          significant=1)

        #check direct/adjoint for space/channels correlation

        ig_channel = ImageGeometry(voxel_num_x=2, voxel_num_y=3, channels=2)
        G_no_channel = Gradient(ig_channel,
                                correlation='Space',
                                backend='numpy')
        G_channel = Gradient(ig_channel,
                             correlation='SpaceChannels',
                             backend='numpy')

        u3 = ig_channel.allocate('random_int')
        res_no_channel = G_no_channel.direct(u3)
        res_channel = G_channel.direct(u3)

        print(" Derivative for 3 directions, first is wrt Channel direction\n")
        print(res_channel[0].as_array())
        print(res_channel[1].as_array())
        print(res_channel[2].as_array())

        print(" Derivative for 2 directions, no Channel direction\n")
        print(res_no_channel[0].as_array())
        print(res_no_channel[1].as_array())

        ig2D = ImageGeometry(voxel_num_x=2, voxel_num_y=3)
        u4 = ig2D.allocate('random_int')
        G2D = Gradient(ig2D, backend='numpy')
        res = G2D.direct(u4)
        print(res[0].as_array())
        print(res[1].as_array())

        M, N = 20, 30
        ig = ImageGeometry(M, N)
        arr = ig.allocate('random_int')

        # check direct of Gradient and sparse matrix
        G = Gradient(ig, backend='numpy')
        norm1 = G.norm(iterations=300)
        print("should be sqrt(8) {} {}".format(numpy.sqrt(8), norm1))
        numpy.testing.assert_almost_equal(norm1, numpy.sqrt(8), decimal=1)
        ig4 = ImageGeometry(M, N, channels=3)
        G4 = Gradient(ig4, correlation="SpaceChannels", backend='numpy')
        norm4 = G4.norm(iterations=300)
        print("should be sqrt(12) {} {}".format(numpy.sqrt(12), norm4))
        self.assertTrue((norm4 - numpy.sqrt(12)) / norm4 < 0.2)
Beispiel #5
0
    def test_Gradient_4D_allocate(self):

        nc, nz, ny, nx = 3, 4, 5, 6
        size = nc * nz * ny * nx
        dim = [nc, nz, ny, nx]

        ig = ImageGeometry(voxel_num_x=nx,
                           voxel_num_y=ny,
                           voxel_num_z=nz,
                           channels=nc)

        arr = numpy.arange(size).reshape(dim).astype(numpy.float32)**2

        data = ig.allocate()
        data.fill(arr)

        #numpy
        grad1 = Gradient(ig,
                         bnd_cond='Neumann',
                         correlation='SpaceChannels',
                         backend='numpy')
        gold_direct = grad1.direct(data)
        gold_adjoint = grad1.adjoint(gold_direct)

        grad2 = Gradient(ig,
                         bnd_cond='Neumann',
                         correlation='SpaceChannels',
                         backend='numpy')
        out_direct = grad2.range_geometry().allocate()
        out_adjoint = grad2.domain_geometry().allocate()
        grad2.direct(data, out=out_direct)
        grad2.adjoint(out_direct, out=out_adjoint)

        #print("GradientOperator, 4D, bnd_cond='Neumann', direct")
        numpy.testing.assert_array_equal(
            out_direct.get_item(0).as_array(),
            gold_direct.get_item(0).as_array())
        numpy.testing.assert_array_equal(
            out_direct.get_item(1).as_array(),
            gold_direct.get_item(1).as_array())
        numpy.testing.assert_array_equal(
            out_direct.get_item(2).as_array(),
            gold_direct.get_item(2).as_array())
        numpy.testing.assert_array_equal(
            out_direct.get_item(3).as_array(),
            gold_direct.get_item(3).as_array())

        #print("GradientOperator, 4D, bnd_cond='Neumann', adjoint")
        numpy.testing.assert_array_equal(out_adjoint.as_array(),
                                         gold_adjoint.as_array())

        #c
        grad1 = Gradient(ig,
                         bnd_cond='Neumann',
                         correlation='SpaceChannels',
                         backend='c')
        gold_direct = grad1.direct(data)
        gold_adjoint = grad1.adjoint(gold_direct)

        grad2 = Gradient(ig,
                         bnd_cond='Neumann',
                         correlation='SpaceChannels',
                         backend='c')
        out_direct = grad2.range_geometry().allocate()
        out_adjoint = grad2.domain_geometry().allocate()
        grad2.direct(data, out=out_direct)
        grad2.adjoint(out_direct, out=out_adjoint)

        #print("GradientOperator, 4D, bnd_cond='Neumann', direct")
        numpy.testing.assert_array_equal(
            out_direct.get_item(0).as_array(),
            gold_direct.get_item(0).as_array())
        numpy.testing.assert_array_equal(
            out_direct.get_item(1).as_array(),
            gold_direct.get_item(1).as_array())
        numpy.testing.assert_array_equal(
            out_direct.get_item(2).as_array(),
            gold_direct.get_item(2).as_array())
        numpy.testing.assert_array_equal(
            out_direct.get_item(3).as_array(),
            gold_direct.get_item(3).as_array())

        #print("GradientOperator, 4D, bnd_cond='Neumann', adjoint")
        numpy.testing.assert_array_equal(out_adjoint.as_array(),
                                         gold_adjoint.as_array())