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()