diff --git a/docs/build/html/_modules/mathematics.html b/docs/build/html/_modules/mathematics.html index 1f45993..8c007d8 100644 --- a/docs/build/html/_modules/mathematics.html +++ b/docs/build/html/_modules/mathematics.html @@ -45,6 +45,7 @@ .. moduleauthor:: Daniel Weschke <daniel.weschke@directbox.de> """ +import math from math import gcd
[docs]def lcm(a, b): diff --git a/docs/build/html/_modules/pylib/mathematics.html b/docs/build/html/_modules/pylib/mathematics.html index 4a419ac..aa57d66 100644 --- a/docs/build/html/_modules/pylib/mathematics.html +++ b/docs/build/html/_modules/pylib/mathematics.html @@ -45,6 +45,7 @@ .. moduleauthor:: Daniel Weschke <daniel.weschke@directbox.de> """ +import math from math import gcd
[docs]def lcm(a, b): diff --git a/tests/test_mathematics.py b/tests/test_mathematics.py new file mode 100644 index 0000000..3769a3c --- /dev/null +++ b/tests/test_mathematics.py @@ -0,0 +1,397 @@ +"""Test of mathematics module. + +:Date: 2019-12-20 + +.. module:: test_mathematics + :platform: *nix, Windows + :synopsis: Test of mathematics module. + +.. moduleauthor:: Daniel Weschke +""" +import unittest + +import os +import sys +sys.path.insert(0, os.path.abspath('../pylib')) + +import math +from mathematics import vector, matrix + +class TestGeometry(unittest.TestCase): + + # + # vector + # NOTE: vector: scalar != 1 element vector + # + + def test_vector(self): + self.assertEqual( + vector(), + []) + self.assertEqual( + vector([1, 0, 0, 1]), + [1, 0, 0, 1]) + + def test_vector_mul_vs(self): + self.assertEqual( + vector([1, 2, 3]) * 4, + [4, 8, 12]) + self.assertEqual( + vector([-1, -2, -3]) * 4, + [-4, -8, -12]) + self.assertEqual( + vector([1, 2, 3]) * -4, + [-4, -8, -12]) + self.assertEqual( + vector([-1, -2, -3]) * -4, + [4, 8, 12]) + + def test_vector_mul_vv(self): + self.assertEqual( + vector([1, 2, 3]) * vector([1, 2, 3]), + 14) + self.assertEqual( + vector([-1, -2, -3]) * vector([1, 2, 3]), + -14) + self.assertEqual( + vector([1, 2, 3]) * vector([-1, -2, -3]), + -14) + self.assertEqual( + vector([-1, -2, -3]) * vector([-1, -2, -3]), + 14) + + def test_vector_mul_vm(self): + r""" + .. math:: + & + \begin{bmatrix} + 1 & 2 & 3 + \end{bmatrix} + \cdot + \begin{bmatrix} + 1 & 2 & 3 \\ + 4 & 5 & 6 \\ + 7 & 8 & 9 + \end{bmatrix} + \\ + =& + \begin{bmatrix} + 1+8+21 & 2+10+24 & 3+12+27 + \end{bmatrix} + \\ + =& + \begin{bmatrix} + 30 & 36 & 42 + \end{bmatrix} + """ + self.assertEqual( + vector([1, 2, 3]) * matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), + [30, 36, 42]) + self.assertEqual( + vector([-1, -2, -3]) * matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), + [-30, -36, -42]) + self.assertEqual( + vector([1, 2, 3]) * matrix([[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]]), + [-30, -36, -42]) + self.assertEqual( + vector([-1, -2, -3]) * matrix([[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]]), + [30, 36, 42]) + + def test_vector_rmul_sv(self): + self.assertEqual( + 4 * vector([1, 2, 3]), + [4, 8, 12]) + self.assertEqual( + -4 * vector([1, 2, 3]), + [-4, -8, -12]) + self.assertEqual( + 4 * vector([-1, -2, -3]), + [-4, -8, -12]) + self.assertEqual( + -4 * vector([-1, -2, -3]), + [4, 8, 12]) + + def test_vector_rmul_mv(self): + # 2d list * vector, matrix * vector see matrix.__mul__ + self.assertEqual( + [[1, 2, 3], [4, 5, 6], [7, 8, 9]] * vector([1, 2, 3]), + [14, 32, 50]) + self.assertEqual( + [[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]] * vector([1, 2, 3]), + [-14, -32, -50]) + self.assertEqual( + [[1, 2, 3], [4, 5, 6], [7, 8, 9]] * vector([-1, -2, -3]), + [-14, -32, -50]) + self.assertEqual( + [[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]] * vector([-1, -2, -3]), + [14, 32, 50]) + + def test_vector_abs(self): + self.assertEqual( + abs(vector([0.6, 0.8])), + 1) + self.assertEqual( + abs(vector([3, 4])), + 5) + + def test_vector_full(self): + self.assertEqual( + vector.full(3, 7), + [7, 7, 7]) + + def test_vector_zeros(self): + self.assertEqual( + vector.zeros(3), + [0, 0, 0]) + self.assertEqual( + vector.zeros((3)), + [0, 0, 0]) + self.assertEqual( + vector.zeros(-1), + []) + + def test_vector_ones(self): + self.assertEqual( + vector.ones(3), + [1, 1, 1]) + self.assertEqual( + vector.ones((3)), + [1, 1, 1]) + self.assertEqual( + vector.ones(-1), + []) + + def test_vector_random(self): + obj = vector.random(3) + self.assertEqual( + len(obj), + 3) + + def test_vector_normalize(self): + v = vector.normalize(vector([3, 4])) + self.assertEqual( + v, + [0.6, 0.8]) + self.assertEqual( + abs(v), + 1) + + def test_vector_rotate_x(self): + # rotation of vector coordinate system about x axis + + # vector points to x -> vector points to x still + self.assertEqual( vector([1, 0, 0, 1]).rotate_x(math.pi/2), [1, 0, 0, 1]) + # vector points to y -> vector points to -z + [self.assertAlmostEqual(i, j) for i, j in zip(vector([0, 1, 0, 1]).rotate_x(math.pi/2), [0, 0, 1, 1])] + # vector points to z -> vector points to y + [self.assertAlmostEqual(i, j) for i, j in zip(vector([0, 0, 1, 1]).rotate_x(math.pi/2), [0, -1, 0, 1])] + + def test_vector_rotate_y(self): + # rotation of vector coordinate system about y axis + + # vector points to x ->, vector points to z + [self.assertAlmostEqual(i, j) for i, j in zip(vector([1, 0, 0, 1]).rotate_y(math.pi/2), [0, 0, -1, 1])] + # vector points to y -> vector points to y still + self.assertEqual( vector([0, 1, 0, 1]).rotate_y(math.pi/2), [0, 1, 0, 1]) + # vector points to z -> vector points to -x + [self.assertAlmostEqual(i, j) for i, j in zip(vector([0, 0, 1, 1]).rotate_y(math.pi/2), [1, 0, 0, 1])] + + def test_vector_rotate_z(self): + # rotation of vector coordinate system about z axis + + # vector points to x ->, vector points to z + [self.assertAlmostEqual(i, j) for i, j in zip(vector([1, 0, 0, 1]).rotate_z(math.pi/2), [0, 1, 0, 1])] + # vector points to y -> vector points to + [self.assertAlmostEqual(i, j) for i, j in zip(vector([0, 1, 0, 1]).rotate_z(math.pi/2), [-1, 0, 0, 1])] + # vector points to z -> vector points to z still + self.assertEqual( vector([0, 0, 1, 1]).rotate_z(math.pi/2), [0, 0, 1, 1]) + + # + # matrix + # NOTE: matrix: scalar != 1x1 matrix + # + + def test_matrix_mul_ms(self): + self.assertEqual( + matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) * 4, + [[4, 8, 12], [16, 20, 24], [28, 32, 36]]) + self.assertEqual( + matrix([[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]]) * 4, + [[-4, -8, -12], [-16, -20, -24], [-28, -32, -36]]) + self.assertEqual( + matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) * -4, + [[-4, -8, -12], [-16, -20, -24], [-28, -32, -36]]) + self.assertEqual( + matrix([[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]]) * -4, + [[4, 8, 12], [16, 20, 24], [28, 32, 36]]) + + def test_matrix_mul_mv(self): + r""" + .. math:: + \begin{bmatrix} + 1 & 2 & 3 \\ + 4 & 5 & 6 \\ + 7 & 8 & 9 + \end{bmatrix} + \cdot + \begin{bmatrix} + 1 \\ + 2 \\ + 3 + \end{bmatrix} + = + \begin{bmatrix} + 1+4+9 \\ + 4+10+18 \\ + 7+16+27 + \end{bmatrix} + = + \begin{bmatrix} + 14 \\ + 32 \\ + 50 + \end{bmatrix} + """ + self.assertEqual( + matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) * vector([1, 2, 3]), + [14, 32, 50]) + self.assertEqual( + matrix([[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]]) * vector([1, 2, 3]), + [-14, -32, -50]) + self.assertEqual( + matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) * vector([-1, -2, -3]), + [-14, -32, -50]) + self.assertEqual( + matrix([[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]]) * vector([-1, -2, -3]), + [14, 32, 50]) + + self.assertEqual( + matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) * matrix([[1], [2], [3]]), + [[14], [32], [50]]) + self.assertEqual( + matrix([[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]]) * matrix([[1], [2], [3]]), + [[-14], [-32], [-50]]) + self.assertEqual( + matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) * matrix([[-1], [-2], [-3]]), + [[-14], [-32], [-50]]) + self.assertEqual( + matrix([[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]]) * matrix([[-1], [-2], [-3]]), + [[14], [32], [50]]) + + def test_matrix_mul_vm(self): + # matrix-vector * matrix, vector * matrix see vector.__mul__ + self.assertEqual( + matrix([[1, 2, 3]]) * matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), + [[30, 36, 42]]) + self.assertEqual( + matrix([[-1, -2, -3]]) * matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), + [[-30, -36, -42]]) + self.assertEqual( + matrix([[1, 2, 3]]) * matrix([[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]]), + [[-30, -36, -42]]) + self.assertEqual( + matrix([[-1, -2, -3]]) * matrix([[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]]), + [[30, 36, 42]]) + + def test_matrix_mul_mm(self): + r""" + .. math:: + & + \begin{bmatrix} + 1 & 2 & 3 \\ + 4 & 5 & 6 \\ + 7 & 8 & 9 + \end{bmatrix} + \cdot + \begin{bmatrix} + 11 & 12 & 13 \\ + 14 & 15 & 16 \\ + 17 & 18 & 19 + \end{bmatrix} + \\ + =& + \begin{bmatrix} + 11+28+51 & 12+30+54 & 13+32+57 \\ + 44+70+102 & 48+75+108 & 52+80+114 \\ + 77+112+153 & 84+120+162 & 91+128+171 + \end{bmatrix} + \\ + =& + \begin{bmatrix} + 90 & 96 & 102 \\ + 216 & 231 & 246 \\ + 342 & 366 & 390 + \end{bmatrix} + + interesting + + .. math:: + 90 \xrightarrow{+6} 96 \xrightarrow{+6} 102 \quad &\Big| \sum\{1, 2, 3\} = 6 \\ + 216 \xrightarrow{+15} 231 \xrightarrow{+15} 246 \quad &\Big| \sum\{4, 5, 6\} = 15 \\ + 342 \xrightarrow{+24} 366 \xrightarrow{+24} 390 \quad &\Big| \sum\{7, 8, 9\} = 24 + + .. math:: + 90 \xrightarrow{+126} 216 \xrightarrow{+126} 342 \quad &\Big| \sum\{11, 14, 17\} = 42 = 126/3 \\ + 96 \xrightarrow{+135} 231 \xrightarrow{+135} 366 \quad &\Big| \sum\{12, 15, 18\} = 45 = 135/3 \\ + 102 \xrightarrow{+144} 246 \xrightarrow{+144} 390 \quad &\Big| \sum\{13, 16, 19\} = 48 = 144/3 + """ + self.assertEqual( + matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) * matrix([[11, 12, 13], [14, 15, 16], [17, 18, 19]]), + [[90, 96, 102], [216, 231, 246], [342, 366, 390]]) + self.assertEqual( + matrix([[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]]) * matrix([[11, 12, 13], [14, 15, 16], [17, 18, 19]]), + [[-90, -96, -102], [-216, -231, -246], [-342, -366, -390]]) + self.assertEqual( + matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) * matrix([[-11, -12, -13], [-14, -15, -16], [-17, -18, -19]]), + [[-90, -96, -102], [-216, -231, -246], [-342, -366, -390]]) + self.assertEqual( + matrix([[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]]) * matrix([[-11, -12, -13], [-14, -15, -16], [-17, -18, -19]]), + [[90, 96, 102], [216, 231, 246], [342, 366, 390]]) + + def test_matrix_rmul_sm(self): + self.assertEqual( + 4 * matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), + [[4, 8, 12], [16, 20, 24], [28, 32, 36]]) + self.assertEqual( + -4 * matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), + [[-4, -8, -12], [-16, -20, -24], [-28, -32, -36]]) + self.assertEqual( + 4 * matrix([[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]]), + [[-4, -8, -12], [-16, -20, -24], [-28, -32, -36]]) + self.assertEqual( + -4 * matrix([[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]]), + [[4, 8, 12], [16, 20, 24], [28, 32, 36]]) + + def test_matrix_rmul_vm(self): + # 1d list * matrix, vector * matrix see vector.__mul__ + self.assertEqual( + [1, 2, 3] * matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), + [30, 36, 42]) + self.assertEqual( + [-1, -2, -3] * matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), + [-30, -36, -42]) + self.assertEqual( + [1, 2, 3] * matrix([[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]]), + [-30, -36, -42]) + self.assertEqual( + [-1, -2, -3] * matrix([[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]]), + [30, 36, 42]) + + def test_matrix_rmul_mm(self): + # 2d list * matrix, matrix * matrix see matrix.__mul__ + self.assertEqual( + [[1, 2, 3], [4, 5, 6], [7, 8, 9]] * matrix([[11, 12, 13], [14, 15, 16], [17, 18, 19]]), + [[90, 96, 102], [216, 231, 246], [342, 366, 390]]) + self.assertEqual( + [[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]] * matrix([[11, 12, 13], [14, 15, 16], [17, 18, 19]]), + [[-90, -96, -102], [-216, -231, -246], [-342, -366, -390]]) + self.assertEqual( + [[1, 2, 3], [4, 5, 6], [7, 8, 9]] * matrix([[-11, -12, -13], [-14, -15, -16], [-17, -18, -19]]), + [[-90, -96, -102], [-216, -231, -246], [-342, -366, -390]]) + self.assertEqual( + [[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]] * matrix([[-11, -12, -13], [-14, -15, -16], [-17, -18, -19]]), + [[90, 96, 102], [216, 231, 246], [342, 366, 390]]) + + +if __name__ == '__main__': + unittest.main(verbosity=2)