Esempio n. 1
0
    def test_lstsq_returns_expected_values(self, arrays):
        m_ss, m_sb, m_bb, m_bs = arrays
        hy.assume(hn.wide(m_sb))
        cond_bs = np.linalg.cond(m_bs).max()
        cond_sb = np.linalg.cond(m_sb).max()

        # overconstrained
        x_sb = gfl.lstsq(m_bs, m_bb)
        m_bst = la.dagger(m_bs)
        # with self.subTest(msg='lstsq(over)'):
        self.assertArrayAllClose(m_bst @ m_bs @ x_sb,
                                 m_bst @ m_bb,
                                 cond=cond_bs)
        x_bs = gfl.rlstsq(m_bb, m_sb)
        m_sbt = la.dagger(m_sb)
        # with self.subTest(msg='rlstsq(over)'):
        self.assertArrayAllClose(x_bs @ m_sb @ m_sbt,
                                 m_bb @ m_sbt,
                                 cond=cond_sb)
        # underconstrained
        x_bs = gfl.lstsq(m_sb, m_ss)
        # with self.subTest(msg='lstsq(under)'):
        self.assertArrayAllClose(m_sb @ x_bs, m_ss, cond=cond_sb)
        x_sb = gfl.rlstsq(m_ss, m_bs)
        # with self.subTest(msg='rlstsq(under)'):
        self.assertArrayAllClose(x_sb @ m_bs, m_ss, cond=cond_bs)
Esempio n. 2
0
    def test_lq_complete_returns_expected_values(self, m_sb):
        hy.assume(hn.wide(m_sb))
        hy.assume(hn.all_well_behaved(m_sb))
        cond = np.linalg.cond(m_sb).max()

        left, unitary = gfl.lq_n(m_sb)
        wide = left @ unitary
        eye = unitary @ la.dagger(unitary)
        eyet = la.dagger(unitary) @ unitary
        id_b = np.identity(m_sb.shape[-1], m_sb.dtype)
        # with self.subTest(msg='lq'):
        self.assertArrayAllClose(wide, m_sb, cond=cond)
        # with self.subTest(msg='Q Q^T'):
        self.assertArrayAllClose(id_b, eye, cond=cond)
        # with self.subTest(msg='Q^T Q'):
        self.assertArrayAllClose(id_b, eyet, cond=cond)
Esempio n. 3
0
    def test_lq_returns_expected_values_with_tall(self, m_bs):
        hy.assume(hn.tall(m_bs))
        hy.assume(hn.all_well_behaved(m_bs))
        cond = np.linalg.cond(m_bs).max()

        left, unitary = gfl.lq_n(m_bs)
        tall = left @ unitary
        eye = unitary @ la.dagger(unitary)
        eyet = la.dagger(unitary) @ unitary
        id_s = np.identity(m_bs.shape[-1], m_bs.dtype)
        # with self.subTest(msg='lq'):
        self.assertArrayAllClose(tall, m_bs, cond=cond)
        # with self.subTest(msg='Q Q^T'):
        self.assertArrayAllClose(id_s, eye, cond=cond)
        # with self.subTest(msg='Q^T Q'):
        self.assertArrayAllClose(id_s, eyet, cond=cond)
Esempio n. 4
0
    def test_qr_complete_returns_expected_values(self, m_bs):
        hy.assume(hn.tall(m_bs))
        hy.assume(hn.all_well_behaved(m_bs))
        cond = np.linalg.cond(m_bs).max()

        unitary, right = gfl.qr_m(m_bs)
        tall = unitary @ right
        eye = la.dagger(unitary) @ unitary
        eyet = unitary @ la.dagger(unitary)
        id_b = np.identity(m_bs.shape[-2], m_bs.dtype)
        # with self.subTest(msg='qr'):
        self.assertArrayAllClose(tall, m_bs, cond=cond)
        # with self.subTest(msg='Q^T Q'):
        self.assertArrayAllClose(id_b, eye, cond=cond)
        # with self.subTest(msg='Q Q^T'):
        self.assertArrayAllClose(id_b, eyet, cond=cond)
Esempio n. 5
0
    def test_qr_returns_expected_values_with_wide(self, m_sb):
        hy.assume(hn.wide(m_sb))
        hy.assume(hn.all_well_behaved(m_sb))
        cond = np.linalg.cond(m_sb).max()

        unitary, right = gfl.qr_m(m_sb)
        wide = unitary @ right
        eye = la.dagger(unitary) @ unitary
        eyet = unitary @ la.dagger(unitary)
        id_s = np.identity(m_sb.shape[-2], m_sb.dtype)
        # with self.subTest(msg='qr'):
        self.assertArrayAllClose(wide, m_sb, cond=cond)
        # with self.subTest(msg='Q^T Q'):
        self.assertArrayAllClose(id_s, eye, cond=cond)
        # with self.subTest(msg='Q Q^T'):
        self.assertArrayAllClose(id_s, eyet, cond=cond)
Esempio n. 6
0
    def test_rlstsq_qr_returns_expected_values_with_tall(self, arrays, fun):
        m_ss, m_sb, m_bb, m_bs = arrays
        hy.assume(hn.wide(m_sb))
        hy.assume(hn.all_well_behaved(m_bs))
        cond = np.linalg.cond(m_bs).max()

        # underconstrained
        x0_sb = gfl.rlstsq(m_ss, m_bs)
        # underconstrained
        x_sb, x_f, tau = fun(m_ss, m_bs)
        # with self.subTest('rlstsq_qr(over,' + suffix):
        self.assertArrayAllClose(x_sb, x0_sb, cond=cond)
        # underconstrained
        xx_sb = gfl.rqr_lstsq(m_ss, x_f, tau)
        # with self.subTest('rqr_rlstsq(over,' + suffix):
        self.assertArrayAllClose(xx_sb, x0_sb, cond=cond)
        # overconstrained
        y_sb = gfl.qr_lstsq(x_f, tau, m_bb)
        m_bst = la.dagger(m_bs)
        # with self.subTest('qr_rlstsq(under,' + suffix):
        self.assertArrayAllClose(m_bst @ m_bs @ y_sb, m_bst @ m_bb, cond=cond)
Esempio n. 7
0
    def test_qr_rawn_returns_expected_values(self, m_bs):
        hy.assume(hn.tall(m_bs))
        hy.assume(hn.all_well_behaved(m_bs))
        cond = np.linalg.cond(m_bs).max()

        rrr = gfl.qr_n(m_bs)[1]
        num = rrr.shape[-1]
        ht_bs, tau = gfl.qr_rawn(m_bs)
        h_bs = la.transpose(ht_bs)
        vecs = np.tril(h_bs, -1)
        vecs[(..., ) + np.diag_indices(num)] = 1
        vnorm = gfb.norm(la.row(tau) * vecs, axis=-2)**2
        right = np.triu(h_bs)
        # with self.subTest(msg='raw_n'):
        self.assertArrayAllClose(right[..., :num, :], rrr, cond=cond)
        self.assertArrayAllClose(vnorm, 2 * tau.real, cond=cond)
        for k in range(num):
            vvv = vecs[..., num - k - 1:num - k]
            ttt = la.scalar(tau[..., -k - 1])
            right -= ttt * vvv * (la.dagger(vvv) @ right)
        # with self.subTest(msg='h_n'):
        self.assertArrayAllClose(right, m_bs, cond=cond)
Esempio n. 8
0
    def test_lq_rawn_returns_expected_values(self, m_bs):
        hy.assume(hn.tall(m_bs))
        hy.assume(hn.all_well_behaved(m_bs))
        cond = np.linalg.cond(m_bs).max()

        llo = gfl.lq_n(m_bs)[0]
        num = llo.shape[-1]
        ht_bs, tau = gfl.lq_rawn(m_bs)
        h_bs = la.transpose(ht_bs)
        vecs = np.triu(h_bs, 1)
        vecs[(..., ) + np.diag_indices(num)] = 1
        vnorm = gfb.norm(la.col(tau) * vecs[..., :num, :], axis=-1)**2
        left = np.tril(h_bs)
        # with self.subTest(msg='raw_n'):
        self.assertArrayAllClose(left, llo, cond=cond)
        # with self.subTest(msg='tau_n'):
        self.assertArrayAllClose(vnorm, 2 * tau.real, cond=cond)
        for k in range(num):
            vvv = vecs[..., num - k - 1:num - k, :]
            ttt = la.scalar(tau[..., -k - 1])
            left -= ttt.conj() * (left @ la.dagger(vvv)) * vvv
        # with self.subTest(msg='h_n'):
        self.assertArrayAllClose(left, m_bs, cond=cond)