def test_adjoint_scaling_factor(self): """Test if back-projector A^* is adjoint of forward projector A: <A x, y>_D = <x,A^* y>_I . Define scaling factor as A^* = s B where is the implemented back-projector. Thus, s = <A x, y>_D / <x,B y>_I , or using y = A x s = <A x, A x>_D / <x,B A x>_I . """ geom = Geometry(2) # x = ones() and y = A x vol_rn = Rn(geom.vol_size) vol_rn_ones = vol_rn.element(1) proj_rn = Rn(geom.proj_size) projector = ODLProjector(geom, vol_rn, proj_rn) proj = projector.forward(vol_rn_ones) vol = projector.backward(proj) s0 = proj.norm() ** 2 / vol_rn._inner(vol, vol_rn_ones) # x = ones(), y = ones() vol_rn = Rn(geom.vol_size) vol_rn_ones = vol_rn.element(1) proj_rn = Rn(geom.proj_size) proj_rn_ones = proj_rn.element(1) projector = ODLProjector(geom, vol_rn, proj_rn) proj = projector.forward(vol_rn_ones) vol = projector.backward(proj_rn_ones) s1 = proj.inner(proj_rn_ones) / vol_rn_ones.inner(vol) # implemented function proj_vec = Rn(geom.proj_size).element(1) cp = ODLChambollePock(geom, proj_vec) cp.adjoint_scaling_factor() s2 = cp.adj_scal_fac self.assertEqual(s1, s2) print('Scaling factors:', s0, s1, s2) projector.clear_astra_memory()
def test_adjoint_scaling_factor(self): # x vol_rn = Rn(self.geom.vol_size) vol_rn_ones = vol_rn.element(1) # y proj_rn = Rn(self.geom.proj_size) proj_rn_ones = proj_rn.element(1) # A projector = ODLProjector(self.geom, vol_rn, proj_rn) # A x proj = projector.forward(vol_rn_ones) # A^* y vol = projector.backward(proj_rn_ones) # scaling factor for x[:] = 1 and y[:] = 1 s0 = proj.inner(proj_rn_ones) / vol_rn_ones.inner(vol) # A^* A x volp = projector.backward(proj) # scaling factor for x[:] = 1 and y = A x s1 = proj.norm() ** 2 / vol_rn._inner(volp, vol_rn_ones) cp = self.cp_class(self.geom, self.proj_vec) self.assertEqual(cp.adj_scal_fac, 1) cp.adjoint_scaling_factor() s2 = cp.adj_scal_fac self.assertFalse(s2 == 1) self.assertEqual(s0, s2) print ('Test adjoint') print (' Scaling factor for backprojector', s0, s1, s2) projector.clear_astra_memory()