def test_PowerMethod(self): print("test_BlockOperator") N, M = 200, 300 niter = 10 ig = ImageGeometry(N, M) Id = IdentityOperator(ig) G = GradientOperator(ig) uid = Id.domain_geometry().allocate(ImageGeometry.RANDOM, seed=1) a = LinearOperator.PowerMethod(Id, niter, uid) #b = LinearOperator.PowerMethodNonsquare(Id, niter, uid) b = LinearOperator.PowerMethod(Id, niter) print("Edo impl", a[0]) print("None impl", b[0]) #self.assertAlmostEqual(a[0], b[0]) self.assertNumpyArrayAlmostEqual(a[0], b[0], decimal=6) a = LinearOperator.PowerMethod(G, niter, uid) b = LinearOperator.PowerMethod(G, niter) #b = LinearOperator.PowerMethodNonsquare(G, niter, uid) print("Edo impl", a[0]) #print ("old impl", b[0]) self.assertNumpyArrayAlmostEqual(a[0], b[0], decimal=2)
def test_FiniteDifference(self): print("test FiniteDifference") ## N, M = 2, 3 numpy.random.seed(1) ig = ImageGeometry(N, M) Id = IdentityOperator(ig) FD = FiniteDifferenceOperator(ig, direction=0, bnd_cond='Neumann') u = FD.domain_geometry().allocate('random') res = FD.domain_geometry().allocate(ImageGeometry.RANDOM) FD.adjoint(u, out=res) w = FD.adjoint(u) self.assertNumpyArrayEqual(res.as_array(), w.as_array()) res = Id.domain_geometry().allocate(ImageGeometry.RANDOM) 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 = GradientOperator(ig) u = G.range_geometry().allocate(ImageGeometry.RANDOM) 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) res = G.range_geometry().allocate() G.direct(u, out=res) w = G.direct(u) self.assertBlockDataContainerEqual(res, w) # 2D M, N = 2, 3 ig = ImageGeometry(voxel_num_x=M, voxel_num_y=N, voxel_size_x=0.1, voxel_size_y=0.4) x = ig.allocate('random') labels = ["horizontal_y", "horizontal_x"] for i, dir in enumerate(labels): FD1 = FiniteDifferenceOperator(ig, direction=i) res1 = FD1.direct(x) res1b = FD1.adjoint(x) FD2 = FiniteDifferenceOperator(ig, direction=labels[i]) res2 = FD2.direct(x) res2b = FD2.adjoint(x) numpy.testing.assert_almost_equal(res1.as_array(), res2.as_array()) numpy.testing.assert_almost_equal(res1b.as_array(), res2b.as_array()) print("Check 2D FiniteDiff for label {}".format(labels[i])) # 2D + chan M, N, K = 2, 3, 4 ig1 = ImageGeometry(voxel_num_x=M, voxel_num_y=N, channels=K, voxel_size_x=0.1, voxel_size_y=0.4) print(ig1.dimension_labels) x = ig1.allocate('random') labels = ["channel", "horizontal_y", "horizontal_x"] for i, dir in enumerate(labels): FD1 = FiniteDifferenceOperator(ig1, direction=i) res1 = FD1.direct(x) res1b = FD1.adjoint(x) FD2 = FiniteDifferenceOperator(ig1, direction=labels[i]) res2 = FD2.direct(x) res2b = FD2.adjoint(x) numpy.testing.assert_almost_equal(res1.as_array(), res2.as_array()) numpy.testing.assert_almost_equal(res1b.as_array(), res2b.as_array()) print("Check for 2D chan for FiniteDiff label {}".format( labels[i]))