def test_low_rank(self, ones_ss): unitary, right = la.qr(ones_ss) self.assertArrayAllClose(unitary @ right, ones_ss) lower, upper, _ = la.lu(ones_ss) self.assertArrayAllClose(lower @ upper, ones_ss) with self.assertRaisesRegex(*utn.invalid_err): la.solve(ones_ss, ones_ss[..., :2])
def test_good_p_invarray_combos_in_lstsq(self, arrays): m_ss, m_bs, m_sb, mini = view_as(*arrays) # hy.assume(hn.tall(m_bs)) hy.assume(hn.all_well_behaved(m_ss, mini, m_bs, m_sb)) self.assertArrayAllClose(la.lstsq(mini.inv, m_sb), la.matmul(mini, m_sb)) self.assertArrayAllClose(la.rlstsq(m_bs, mini.inv), la.matmul(m_bs, mini)) cond = np.linalg.cond(m_bs).max() self.assertArrayAllClose(la.lstsq(mini.inv, m_bs.pinv), la.rlstsq(mini, m_bs), cond=cond) cond = np.linalg.cond(mini).max() self.assertArrayAllClose(la.rlstsq(mini.inv, m_sb.pinv), la.solve(mini, m_sb), cond=cond) cond = np.linalg.cond(m_ss).max() self.assertArrayAllClose(la.lstsq(mini.inv, m_ss.inv), la.rsolve(mini, m_ss), cond=cond) cond = np.linalg.cond(mini).max() self.assertArrayAllClose(la.rlstsq(mini.inv, m_ss.inv), la.solve(mini, m_ss), cond=cond) cond = np.linalg.cond(m_ss).max() self.assertArrayAllClose(la.lstsq(m_bs.pinv, m_ss.inv), la.rsolve(m_bs, m_ss), cond=cond) cond = np.linalg.cond(m_sb).max() self.assertArrayAllClose(la.rlstsq(m_sb.pinv, m_ss.inv), la.lstsq(m_sb, m_ss), cond=cond)
def test_functions_solve(self, arrays): m_ss, m_sb, m_bs = arrays[:-1] v_s = hn.core_only(arrays[-1], dims=1) smol, wide, tall = [arr.shape for arr in arrays[:-1]] hy.assume(hn.all_well_behaved(m_ss)) # with self.subTest('solve'): expect = gf.return_shape('(a,b),(b,c)->(a,c)', smol, wide) self.assertArrayShape(la.solve(m_ss, m_sb), expect) self.assertArrayShape(la.solve(m_ss, v_s), smol[:-1]) # with self.subTest('rsolve'): expect = gf.return_shape('(a,b),(b,c)->(a,c)', tall, smol) self.assertArrayShape(la.rsolve(m_bs, m_ss), expect) self.assertArrayShape(la.rsolve(v_s, m_ss), smol[:-1])
def test_return_array_types(self, arrays): m_sb_n, m_bs_n = arrays[:2] m_sb, m_bs, m_ss, m_bb = view_as(*arrays) m_bs_m, m_ss_m, m_bb_m = hn.core_only(m_bs, m_ss, m_bb) hy.assume(hn.all_well_behaved(m_ss, m_bb)) hy.assume(m_sb.ndim != m_ss.ndim - 1) # np..solve's broadcasting issue self.assertIsInstance(m_sb @ m_bs, la.lnarray) self.assertIsInstance(m_sb_n @ m_bs, la.lnarray) expect = utn.array_return_shape('(a,b),(b,c)->(a,c)', m_bs, m_sb) tw_o = np.empty(expect, m_bs.dtype) tw_r = la.matmul(m_bs, m_sb_n, tw_o) self.assertIsInstance(tw_r, np.ndarray) self.assertIsInstance(tw_o, np.ndarray) self.assertIsInstance(np.matmul(m_bs, m_sb_n), np.ndarray) self.assertIsInstance(la.solve(m_ss, m_sb_n), la.lnarray) self.assertIsInstance(nl.solve(m_ss, m_sb_n), np.ndarray) self.assertIsInstance(la.lstsq(m_bs, m_bb), la.lnarray) self.assertIsInstance( nl.lstsq(m_bs_m, m_bb_m, rcond=None)[0], np.ndarray) self.assertIsInstance(la.lu(m_ss)[0], la.lnarray) self.assertIsInstance(la.lu(m_bs_n)[0], np.ndarray) self.assertIsInstance(la.qr(m_ss)[0], la.lnarray) self.assertIsInstance(la.qr(m_bs_n)[0], np.ndarray) self.assertIsInstance(la.lq(m_ss)[0], la.lnarray) self.assertIsInstance(la.lq(m_bs_n)[0], np.ndarray) self.assertIsInstance(la.lqr(m_ss)[0], la.lnarray) self.assertIsInstance(la.lqr(m_bs_n)[0], np.ndarray) self.assertIsInstance(nl.qr(m_ss_m)[0], np.ndarray)
def test_functions_solve(self, arrays): m_ss, m_sb, m_bs = arrays hy.assume(hn.all_well_behaved(m_ss)) cond = np.linalg.cond(m_ss).max() # with self.subTest('solve'): self.assertArrayAllClose(la.solve(m_ss, m_sb), gf.solve(m_ss, m_sb), cond=cond) slv_sh = utn.array_return_shape('(a,a),(a,b)->(a,b)', m_ss, m_sb) slv_out = np.empty(slv_sh, m_ss.dtype) slv_r = la.solve(m_ss, m_sb, out=slv_out) self.assertArrayAllClose(slv_out, slv_r) # with self.subTest('rsolve'): self.assertArrayAllClose(la.rsolve(m_bs, m_ss), gf.rsolve(m_bs, m_ss), cond=cond)
def test_bad_p_invarray_combos_in_functions(self, arrays): m_ss, m_bs, m_sb, mini = view_as(*arrays) # hy.assume(hn.tall(m_bs)) with self.assertRaises(TypeError): la.solve(m_sb.pinv, mini) with self.assertRaises(TypeError): la.rsolve(mini, m_bs.pinv) with self.assertRaises(TypeError): la.solve(mini, m_bs.pinv) with self.assertRaises(TypeError): la.rsolve(m_sb.pinv, mini) with self.assertRaises(TypeError): la.solve(m_sb.pinv, m_bs.pinv) with self.assertRaises(TypeError): la.rsolve(m_sb.pinv, m_bs.pinv) with self.assertRaises(TypeError): la.matmul(m_ss.inv, m_bs.pinv) with self.assertRaises(TypeError): la.matmul(m_sb.pinv, mini.inv) with self.assertRaises(TypeError): la.solve(m_bs.pinv, mini.inv) with self.assertRaises(TypeError): la.rsolve(mini.inv, m_sb.pinv)