2018-10-19 12:48:28 +00:00
|
|
|
"""
|
|
|
|
Created on Mon Feb 26 15:40:07 2018
|
|
|
|
|
|
|
|
@author: Christian Bender
|
|
|
|
@license: MIT-license
|
|
|
|
|
|
|
|
This file contains the test-suite for the linear algebra library.
|
|
|
|
"""
|
2024-03-13 06:52:41 +00:00
|
|
|
|
2018-10-19 12:48:28 +00:00
|
|
|
import unittest
|
2020-07-06 07:44:19 +00:00
|
|
|
|
2023-10-11 18:30:02 +00:00
|
|
|
import pytest
|
|
|
|
|
2021-10-27 03:48:43 +00:00
|
|
|
from .lib import (
|
|
|
|
Matrix,
|
|
|
|
Vector,
|
|
|
|
axpy,
|
|
|
|
square_zero_matrix,
|
|
|
|
unit_basis_vector,
|
|
|
|
zero_vector,
|
|
|
|
)
|
2018-10-19 12:48:28 +00:00
|
|
|
|
2019-10-05 05:14:13 +00:00
|
|
|
|
2018-10-19 12:48:28 +00:00
|
|
|
class Test(unittest.TestCase):
|
2021-04-05 13:37:38 +00:00
|
|
|
def test_component(self) -> None:
|
2018-10-19 12:48:28 +00:00
|
|
|
"""
|
2021-10-27 03:48:43 +00:00
|
|
|
test for method component()
|
2018-10-19 12:48:28 +00:00
|
|
|
"""
|
2019-10-05 05:14:13 +00:00
|
|
|
x = Vector([1, 2, 3])
|
2023-10-11 18:30:02 +00:00
|
|
|
assert x.component(0) == 1
|
|
|
|
assert x.component(2) == 3
|
2020-05-22 06:10:11 +00:00
|
|
|
_ = Vector()
|
2019-10-05 05:14:13 +00:00
|
|
|
|
2021-04-05 13:37:38 +00:00
|
|
|
def test_str(self) -> None:
|
2018-10-19 12:48:28 +00:00
|
|
|
"""
|
2021-10-27 03:48:43 +00:00
|
|
|
test for method toString()
|
2018-10-19 12:48:28 +00:00
|
|
|
"""
|
2019-10-05 05:14:13 +00:00
|
|
|
x = Vector([0, 0, 0, 0, 0, 1])
|
2023-10-11 18:30:02 +00:00
|
|
|
assert str(x) == "(0,0,0,0,0,1)"
|
2019-10-05 05:14:13 +00:00
|
|
|
|
2021-04-05 13:37:38 +00:00
|
|
|
def test_size(self) -> None:
|
2018-10-19 12:48:28 +00:00
|
|
|
"""
|
2021-10-27 03:48:43 +00:00
|
|
|
test for method size()
|
2018-10-19 12:48:28 +00:00
|
|
|
"""
|
2019-10-05 05:14:13 +00:00
|
|
|
x = Vector([1, 2, 3, 4])
|
2023-10-11 18:30:02 +00:00
|
|
|
assert len(x) == 4
|
2019-10-05 05:14:13 +00:00
|
|
|
|
2021-10-31 14:16:02 +00:00
|
|
|
def test_euclidean_length(self) -> None:
|
2018-10-19 12:48:28 +00:00
|
|
|
"""
|
2021-10-27 03:48:43 +00:00
|
|
|
test for method euclidean_length()
|
2018-10-19 12:48:28 +00:00
|
|
|
"""
|
2019-10-05 05:14:13 +00:00
|
|
|
x = Vector([1, 2])
|
2021-10-31 14:16:02 +00:00
|
|
|
y = Vector([1, 2, 3, 4, 5])
|
|
|
|
z = Vector([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
|
|
|
|
w = Vector([1, -1, 1, -1, 2, -3, 4, -5])
|
2023-10-11 18:30:02 +00:00
|
|
|
assert x.euclidean_length() == pytest.approx(2.236, abs=1e-3)
|
|
|
|
assert y.euclidean_length() == pytest.approx(7.416, abs=1e-3)
|
|
|
|
assert z.euclidean_length() == 0
|
|
|
|
assert w.euclidean_length() == pytest.approx(7.616, abs=1e-3)
|
2019-10-05 05:14:13 +00:00
|
|
|
|
2021-04-05 13:37:38 +00:00
|
|
|
def test_add(self) -> None:
|
2018-10-19 12:48:28 +00:00
|
|
|
"""
|
2020-09-10 08:31:26 +00:00
|
|
|
test for + operator
|
2018-10-19 12:48:28 +00:00
|
|
|
"""
|
2019-10-05 05:14:13 +00:00
|
|
|
x = Vector([1, 2, 3])
|
|
|
|
y = Vector([1, 1, 1])
|
2023-10-11 18:30:02 +00:00
|
|
|
assert (x + y).component(0) == 2
|
|
|
|
assert (x + y).component(1) == 3
|
|
|
|
assert (x + y).component(2) == 4
|
2019-10-05 05:14:13 +00:00
|
|
|
|
2021-04-05 13:37:38 +00:00
|
|
|
def test_sub(self) -> None:
|
2018-10-19 12:48:28 +00:00
|
|
|
"""
|
2020-09-10 08:31:26 +00:00
|
|
|
test for - operator
|
2018-10-19 12:48:28 +00:00
|
|
|
"""
|
2019-10-05 05:14:13 +00:00
|
|
|
x = Vector([1, 2, 3])
|
|
|
|
y = Vector([1, 1, 1])
|
2023-10-11 18:30:02 +00:00
|
|
|
assert (x - y).component(0) == 0
|
|
|
|
assert (x - y).component(1) == 1
|
|
|
|
assert (x - y).component(2) == 2
|
2019-10-05 05:14:13 +00:00
|
|
|
|
2021-04-05 13:37:38 +00:00
|
|
|
def test_mul(self) -> None:
|
2018-10-19 12:48:28 +00:00
|
|
|
"""
|
2020-09-10 08:31:26 +00:00
|
|
|
test for * operator
|
2018-10-19 12:48:28 +00:00
|
|
|
"""
|
2019-10-05 05:14:13 +00:00
|
|
|
x = Vector([1, 2, 3])
|
2021-10-27 03:48:43 +00:00
|
|
|
a = Vector([2, -1, 4]) # for test of dot product
|
2019-10-05 05:14:13 +00:00
|
|
|
b = Vector([1, -2, -1])
|
2023-10-11 18:30:02 +00:00
|
|
|
assert str(x * 3.0) == "(3.0,6.0,9.0)"
|
|
|
|
assert a * b == 0
|
2019-10-05 05:14:13 +00:00
|
|
|
|
2022-10-12 22:54:20 +00:00
|
|
|
def test_zero_vector(self) -> None:
|
2018-10-19 12:48:28 +00:00
|
|
|
"""
|
2021-10-27 03:48:43 +00:00
|
|
|
test for global function zero_vector()
|
2018-10-19 12:48:28 +00:00
|
|
|
"""
|
2023-10-11 18:30:02 +00:00
|
|
|
assert str(zero_vector(10)).count("0") == 10
|
2019-10-05 05:14:13 +00:00
|
|
|
|
2022-10-12 22:54:20 +00:00
|
|
|
def test_unit_basis_vector(self) -> None:
|
2018-10-19 12:48:28 +00:00
|
|
|
"""
|
2021-10-27 03:48:43 +00:00
|
|
|
test for global function unit_basis_vector()
|
2018-10-19 12:48:28 +00:00
|
|
|
"""
|
2023-10-11 18:30:02 +00:00
|
|
|
assert str(unit_basis_vector(3, 1)) == "(0,1,0)"
|
2019-10-05 05:14:13 +00:00
|
|
|
|
2021-04-05 13:37:38 +00:00
|
|
|
def test_axpy(self) -> None:
|
2018-10-19 12:48:28 +00:00
|
|
|
"""
|
2021-10-27 03:48:43 +00:00
|
|
|
test for global function axpy() (operation)
|
2018-10-19 12:48:28 +00:00
|
|
|
"""
|
2019-10-05 05:14:13 +00:00
|
|
|
x = Vector([1, 2, 3])
|
|
|
|
y = Vector([1, 0, 1])
|
2023-10-11 18:30:02 +00:00
|
|
|
assert str(axpy(2, x, y)) == "(3,4,7)"
|
2019-10-05 05:14:13 +00:00
|
|
|
|
2021-04-05 13:37:38 +00:00
|
|
|
def test_copy(self) -> None:
|
2018-10-19 12:48:28 +00:00
|
|
|
"""
|
2021-10-27 03:48:43 +00:00
|
|
|
test for method copy()
|
2018-10-19 12:48:28 +00:00
|
|
|
"""
|
2019-10-05 05:14:13 +00:00
|
|
|
x = Vector([1, 0, 0, 0, 0, 0])
|
2018-10-19 12:48:28 +00:00
|
|
|
y = x.copy()
|
2023-10-11 18:30:02 +00:00
|
|
|
assert str(x) == str(y)
|
2019-10-05 05:14:13 +00:00
|
|
|
|
2022-10-12 22:54:20 +00:00
|
|
|
def test_change_component(self) -> None:
|
2018-10-19 12:48:28 +00:00
|
|
|
"""
|
2021-10-27 03:48:43 +00:00
|
|
|
test for method change_component()
|
2018-10-19 12:48:28 +00:00
|
|
|
"""
|
2019-10-05 05:14:13 +00:00
|
|
|
x = Vector([1, 0, 0])
|
2021-10-27 03:48:43 +00:00
|
|
|
x.change_component(0, 0)
|
|
|
|
x.change_component(1, 1)
|
2023-10-11 18:30:02 +00:00
|
|
|
assert str(x) == "(0,1,0)"
|
2019-10-05 05:14:13 +00:00
|
|
|
|
2021-04-05 13:37:38 +00:00
|
|
|
def test_str_matrix(self) -> None:
|
2021-10-27 03:48:43 +00:00
|
|
|
"""
|
|
|
|
test for Matrix method str()
|
|
|
|
"""
|
2022-10-12 22:54:20 +00:00
|
|
|
a = Matrix([[1, 2, 3], [2, 4, 5], [6, 7, 8]], 3, 3)
|
2023-10-11 18:30:02 +00:00
|
|
|
assert str(a) == "|1,2,3|\n|2,4,5|\n|6,7,8|\n"
|
2019-10-05 05:14:13 +00:00
|
|
|
|
2021-10-27 03:48:43 +00:00
|
|
|
def test_minor(self) -> None:
|
|
|
|
"""
|
|
|
|
test for Matrix method minor()
|
|
|
|
"""
|
2022-10-12 22:54:20 +00:00
|
|
|
a = Matrix([[1, 2, 3], [2, 4, 5], [6, 7, 8]], 3, 3)
|
2021-10-27 03:48:43 +00:00
|
|
|
minors = [[-3, -14, -10], [-5, -10, -5], [-2, -1, 0]]
|
2022-10-12 22:54:20 +00:00
|
|
|
for x in range(a.height()):
|
|
|
|
for y in range(a.width()):
|
2023-10-11 18:30:02 +00:00
|
|
|
assert minors[x][y] == a.minor(x, y)
|
2021-10-27 03:48:43 +00:00
|
|
|
|
|
|
|
def test_cofactor(self) -> None:
|
2019-10-24 09:08:45 +00:00
|
|
|
"""
|
2021-10-27 03:48:43 +00:00
|
|
|
test for Matrix method cofactor()
|
2019-10-24 09:08:45 +00:00
|
|
|
"""
|
2022-10-12 22:54:20 +00:00
|
|
|
a = Matrix([[1, 2, 3], [2, 4, 5], [6, 7, 8]], 3, 3)
|
2021-10-27 03:48:43 +00:00
|
|
|
cofactors = [[-3, 14, -10], [5, -10, 5], [-2, 1, 0]]
|
2022-10-12 22:54:20 +00:00
|
|
|
for x in range(a.height()):
|
|
|
|
for y in range(a.width()):
|
2023-10-11 18:30:02 +00:00
|
|
|
assert cofactors[x][y] == a.cofactor(x, y)
|
2021-10-27 03:48:43 +00:00
|
|
|
|
|
|
|
def test_determinant(self) -> None:
|
|
|
|
"""
|
|
|
|
test for Matrix method determinant()
|
|
|
|
"""
|
2022-10-12 22:54:20 +00:00
|
|
|
a = Matrix([[1, 2, 3], [2, 4, 5], [6, 7, 8]], 3, 3)
|
2023-10-11 18:30:02 +00:00
|
|
|
assert a.determinant() == -5
|
2019-10-24 09:08:45 +00:00
|
|
|
|
2021-04-05 13:37:38 +00:00
|
|
|
def test__mul__matrix(self) -> None:
|
2021-10-27 03:48:43 +00:00
|
|
|
"""
|
|
|
|
test for Matrix * operator
|
|
|
|
"""
|
2022-10-12 22:54:20 +00:00
|
|
|
a = Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]], 3, 3)
|
2019-10-05 05:14:13 +00:00
|
|
|
x = Vector([1, 2, 3])
|
2023-10-11 18:30:02 +00:00
|
|
|
assert str(a * x) == "(14,32,50)"
|
|
|
|
assert str(a * 2) == "|2,4,6|\n|8,10,12|\n|14,16,18|\n"
|
2019-10-05 05:14:13 +00:00
|
|
|
|
2021-10-27 03:48:43 +00:00
|
|
|
def test_change_component_matrix(self) -> None:
|
|
|
|
"""
|
|
|
|
test for Matrix method change_component()
|
|
|
|
"""
|
2022-10-12 22:54:20 +00:00
|
|
|
a = Matrix([[1, 2, 3], [2, 4, 5], [6, 7, 8]], 3, 3)
|
|
|
|
a.change_component(0, 2, 5)
|
2023-10-11 18:30:02 +00:00
|
|
|
assert str(a) == "|1,2,5|\n|2,4,5|\n|6,7,8|\n"
|
2019-10-05 05:14:13 +00:00
|
|
|
|
2021-04-05 13:37:38 +00:00
|
|
|
def test_component_matrix(self) -> None:
|
2021-10-27 03:48:43 +00:00
|
|
|
"""
|
|
|
|
test for Matrix method component()
|
|
|
|
"""
|
2022-10-12 22:54:20 +00:00
|
|
|
a = Matrix([[1, 2, 3], [2, 4, 5], [6, 7, 8]], 3, 3)
|
2023-10-11 18:30:02 +00:00
|
|
|
assert a.component(2, 1) == 7, 0.01
|
2019-10-05 05:14:13 +00:00
|
|
|
|
2021-04-05 13:37:38 +00:00
|
|
|
def test__add__matrix(self) -> None:
|
2021-10-27 03:48:43 +00:00
|
|
|
"""
|
|
|
|
test for Matrix + operator
|
|
|
|
"""
|
2022-10-12 22:54:20 +00:00
|
|
|
a = Matrix([[1, 2, 3], [2, 4, 5], [6, 7, 8]], 3, 3)
|
|
|
|
b = Matrix([[1, 2, 7], [2, 4, 5], [6, 7, 10]], 3, 3)
|
2023-10-11 18:30:02 +00:00
|
|
|
assert str(a + b) == "|2,4,10|\n|4,8,10|\n|12,14,18|\n"
|
2019-10-05 05:14:13 +00:00
|
|
|
|
2021-04-05 13:37:38 +00:00
|
|
|
def test__sub__matrix(self) -> None:
|
2021-10-27 03:48:43 +00:00
|
|
|
"""
|
|
|
|
test for Matrix - operator
|
|
|
|
"""
|
2022-10-12 22:54:20 +00:00
|
|
|
a = Matrix([[1, 2, 3], [2, 4, 5], [6, 7, 8]], 3, 3)
|
|
|
|
b = Matrix([[1, 2, 7], [2, 4, 5], [6, 7, 10]], 3, 3)
|
2023-10-11 18:30:02 +00:00
|
|
|
assert str(a - b) == "|0,0,-4|\n|0,0,0|\n|0,0,-2|\n"
|
2019-10-05 05:14:13 +00:00
|
|
|
|
2022-10-12 22:54:20 +00:00
|
|
|
def test_square_zero_matrix(self) -> None:
|
2021-10-27 03:48:43 +00:00
|
|
|
"""
|
|
|
|
test for global function square_zero_matrix()
|
|
|
|
"""
|
2023-10-11 18:30:02 +00:00
|
|
|
assert str(square_zero_matrix(5)) == (
|
|
|
|
"|0,0,0,0,0|\n|0,0,0,0,0|\n|0,0,0,0,0|\n|0,0,0,0,0|\n|0,0,0,0,0|\n"
|
2019-10-05 05:14:13 +00:00
|
|
|
)
|
|
|
|
|
2019-10-24 10:39:51 +00:00
|
|
|
|
2018-10-19 12:48:28 +00:00
|
|
|
if __name__ == "__main__":
|
2018-11-12 18:04:31 +00:00
|
|
|
unittest.main()
|