def test_matmul(self) -> None: self.assertEqual(rows((range(3), range(3, 6))) @ rows((range(6, 9), range(9, 12))), 145) self.assertEqual(row(range(5, -1, -1)) @ row(range(6)), 20) self.assertEqual(column(range(5, -1, -1)) @ column(range(6)), 20) self.assertEqual(vector(range(5, -1, -1)) @ vector(range(6)), 20) self.assertRaises(DimensionError, matmul, row(range(5)), column(range(5))) self.assertRaises(DimensionError, matmul, row(range(5)), row(range(6)))
def test_getitem(self) -> None: self.assertEqual(rows((range(3), range(3, 6)))[4], 4) self.assertEqual(row(range(6))[4], 4) self.assertEqual(column(range(6))[4], 4) self.assertEqual(vector(range(6))[4], 4) self.assertIterableEqual(rows((range(3), range(3, 6)))[2:5], range(2, 5)) self.assertIterableEqual(row(range(6))[2:5], range(2, 5)) self.assertIterableEqual(column(range(6))[2:5], range(2, 5)) self.assertIterableEqual(vector(range(6))[2:5], range(2, 5))
def test_add(self) -> None: self.assertEqual( rows((range(3), range(3, 6))) + rows((range(6, 9), range(9, 12))), rows(((6, 8, 10), (12, 14, 16)))) self.assertEqual(row(range(5, -1, -1)) + row(range(6)), row((5,) * 6)) self.assertEqual(column(range(5, -1, -1)) + column(range(6)), column((5,) * 6)) self.assertEqual(vector(range(5, -1, -1)) + vector(range(6)), vector((5,) * 6)) self.assertRaises(TypeError, add, row(range(5)), 5) self.assertRaises(DimensionError, add, row(range(5)), column(range(5))) self.assertRaises(DimensionError, add, row(range(5)), row(range(6))) self.assertRaises(DimensionError, add, row(range(5)), vector(range(5)))
def test_mul(self) -> None: self.assertEqual( rows((range(3), range(3, 6))) * rows((range(2), range(2, 4), range(4, 6))), rows(((10, 13), (28, 40)))) self.assertEqual(row(range(5, -1, -1)) * column(range(6)), singleton_matrix(20)) self.assertEqual(column(range(6)) * row(range(6)), rows(( (0,) * 6, range(6), range(0, 12, 2), range(0, 18, 3), range(0, 24, 4), range(0, 30, 5), ))) self.assertEqual(row(range(5, -1, -1)) * vector(range(6)), singleton_vector(20)) self.assertRaises(DimensionError, mul, row(range(5)), row(range(5))) self.assertRaises(DimensionError, mul, row(range(5)), column(range(6)))
def test_getitem(self) -> None: self.assertIterableEqual(rows((range(3), range(3, 6)))[::-1], reversed(range(6))) self.assertIterableEqual(row(range(6))[::-1], reversed(range(6))) self.assertIterableEqual(column(range(6))[::-1], reversed(range(6))) self.assertEqual(rows((range(3), range(3, 6)))[1, 1], 4) self.assertEqual(row(range(6))[0, 4], 4) self.assertEqual(column(range(6))[4, 0], 4) self.assertEqual(rows((range(3), range(3, 6)))[:, :], rows((range(3), range(3, 6)))) self.assertEqual(row(range(6))[:, :], row(range(6))) self.assertEqual(column(range(6))[:, :], column(range(6))) self.assertEqual(rows((range(3), range(3, 6)))[:, :2], rows((range(2), range(3, 5)))) self.assertEqual(row(range(6))[0, :], row(range(6))) self.assertEqual(column(range(6))[:, 0], column(range(6)))
def test_rows(self) -> None: self.assert2DIterableEqual(row(range(5)).rows, (range(5),)) self.assert2DIterableEqual(column(range(5)).rows, ((0,), (1,), (2,), (3,), (4,))) self.assert2DIterableEqual(Matrix(range(6), (2, 3)).rows, (range(3), range(3, 6)))
def test_abs(self) -> None: self.assertAlmostEqual(abs(rows((range(3), range(3, 6)))), 7.416198487095663) self.assertAlmostEqual(abs(row(range(6))), 7.416198487095663) self.assertAlmostEqual(abs(column(range(6))), 7.416198487095663)
def test_div(self) -> None: self.assertEqual(rows((range(0, 15, 5), range(15, 30, 5))) / 5, rows((range(3), range(3, 6)))) self.assertEqual(row(range(25, -1, -5)) / 5, row(range(5, -1, -1))) self.assertEqual(column(range(25, -1, -5)) / 5, column(range(5, -1, -1))) self.assertEqual(vector(range(25, -1, -5)) / 5, vector(range(5, -1, -1)))
def test_rmul(self) -> None: self.assertEqual(5 * rows((range(3), range(3, 6))), rows((range(0, 15, 5), range(15, 30, 5)))) self.assertEqual(5 * row(range(5, -1, -1)), row(range(25, -1, -5))) self.assertEqual(5 * column(range(5, -1, -1)), column(range(25, -1, -5))) self.assertEqual(5 * vector(range(5, -1, -1)), vector(range(25, -1, -5)))
def test_sub(self) -> None: self.assertEqual( rows((range(3), range(3, 6))) - rows((range(6, 9), range(9, 12))), rows(((-6, -6, -6), (-6, -6, -6)))) self.assertEqual(row(range(5, -1, -1)) - row(range(6)), row(range(5, -6, -2))) self.assertEqual(column(range(5, -1, -1)) - column(range(6)), column(range(5, -6, -2))) self.assertEqual(vector(range(5, -1, -1)) - vector(range(6)), vector(range(5, -6, -2)))
def test_norm(self) -> None: self.assertAlmostEqual(norm(row((1 / sqrt(2), 1 / sqrt(2)))), 1) self.assertAlmostEqual(norm(column((1, 0, 0))), 1) self.assertAlmostEqual(norm(vector(range(5))), abs(vector(range(5)))) self.assertAlmostEqual(norm(identity_matrix(2)), sqrt(2))
def test_one_matrix(self) -> None: self.assertEqual(one_matrix(0), empty_matrix()) self.assertEqual(one_matrix(5), rows(((1,) * 5, (1,) * 5, (1,) * 5, (1,) * 5, (1,) * 5))) self.assertEqual(one_matrix(5, 5), rows(((1,) * 5, (1,) * 5, (1,) * 5, (1,) * 5, (1,) * 5))) self.assertEqual(one_matrix(1, 5), row((1,) * 5)) self.assertEqual(one_matrix(5, 1), column((1,) * 5))
def test_columns(self) -> None: self.assert2DIterableEqual(row(range(5)).columns, ((0,), (1,), (2,), (3,), (4,))) self.assert2DIterableEqual(column(range(5)).columns, (range(5),)) self.assert2DIterableEqual(Matrix(range(6), (2, 3)).columns, ((0, 3), (1, 4), (2, 5)))
def test_row(self) -> None: self.assertEqual(row(()).dimensions, (1, 0)) self.assertEqual(row(range(10)), rows((range(10),))) self.assertEqual(row(tuple(map(partial(pow, 2), range(5)))), rows(((1, 2, 4, 8, 16),)))
def test_neg(self) -> None: self.assertEqual(-rows((range(3), range(3, 6))), rows((range(0, -3, -1), range(-3, -6, -1)))) self.assertEqual(-row(range(6)), rows((range(0, -6, -1),))) self.assertEqual(-column(range(6)), rows(tuple((-x,) for x in range(6)))) self.assertEqual(-vector(range(6)), vector(range(0, -6, -1)))
def test_pos(self) -> None: self.assertEqual(+rows((range(3), range(3, 6))), rows((range(3), range(3, 6)))) self.assertEqual(+row(range(6)), row(range(6))) self.assertEqual(+column(range(6)), column(range(6))) self.assertEqual(+vector(range(6)), vector(range(6)))
def test_pow(self) -> None: self.assertEqual(rows((range(3), range(3, 6))) ** 'T', rows(((0, 3), (1, 4), (2, 5)))) self.assertEqual(row(range(6)) ** 'T', column(range(6))) self.assertEqual(column(range(6)) ** 'T', row(range(6)))