Files
dev/script/scitest/linalg_test.py
2019-12-11 15:57:15 +01:00

89 lines
3.5 KiB
Python

import unittest
import scisoftpy as np
import scisoftpy.linalg as la
def toInt(o):
return int(o)
def toAny(o):
return o
class Test(unittest.TestCase):
def checkitems(self, la, ds, convert=toAny):
if ds.ndim == 1:
for i in range(ds.shape[0]):
self.assertAlmostEquals(convert(la[i]), ds[i])
elif ds.ndim == 2:
for i in range(ds.shape[0]):
for j in range(ds.shape[1]):
self.assertAlmostEquals(convert(la[i][j]), ds[i, j])
elif ds.ndim == 3:
for i in range(ds.shape[0]):
for j in range(ds.shape[1]):
for k in range(ds.shape[2]):
self.assertAlmostEquals(convert(la[i][j][k]), ds[i, j, k])
def testDot(self):
a = np.arange(1, 9).reshape(2, 2, 2)
b = np.array([-2, -3, 5, 7]).reshape(2, 2)
self.checkitems([35, 63], np.tensordot(a, b))
self.checkitems([63, 70], np.tensordot(b, a))
a = np.arange(60.0).reshape(3, 4, 5)
b = np.arange(24.0).reshape(4, 3, 2)
self.checkitems(
[[4400.0, 4730.0], [4532.0, 4874.0], [4664.0, 5018.0], [4796.0, 5162.0], [4928.0, 5306.0]],
np.tensordot(a, b, axes=([1, 0], [0, 1])),
)
def testPower(self):
a = np.array([[0, 1], [-1, 0]]) # matrix equiv. of the imaginary unit
self.checkitems([[0, -1], [1, 0]], np.linalg.matrix_power(a, 3))
self.checkitems([[1, 0], [0, 1]], np.linalg.matrix_power(a, 0))
self.checkitems([[0, 1], [-1, 0]], np.linalg.matrix_power(a, -3))
def testNorm(self):
a = np.arange(9) - 4
b = a.reshape((3, 3))
self.assertAlmostEqual(7.745966692414834, la.norm(a))
self.assertAlmostEqual(7.745966692414834, la.norm(b))
self.assertAlmostEqual(7.745966692414834, la.norm(b, "fro"))
self.assertAlmostEqual(4, la.norm(a, np.inf))
self.assertAlmostEqual(9, la.norm(b, np.inf))
self.assertAlmostEqual(0, la.norm(a, -np.inf))
self.assertAlmostEqual(2, la.norm(b, -np.inf))
self.assertAlmostEqual(20, la.norm(a, 1))
self.assertAlmostEqual(7, la.norm(b, 1))
self.assertAlmostEqual(-4.6566128774142013e-010, la.norm(a, -1))
self.assertAlmostEqual(6, la.norm(b, -1))
self.assertAlmostEqual(7.745966692414834, la.norm(a, 2))
self.assertAlmostEqual(7.3484692283495345, la.norm(b, 2))
# self.assertTrue(np.isnan(la.norm(a, -2)))
self.assertAlmostEqual(1.8570331885190563e-016, la.norm(b, -2))
self.assertAlmostEqual(5.8480354764257312, la.norm(a, 3))
# self.assertTrue(np.isnan(la.norm(a, -3)))
def testCond(self):
a = np.array([[1, 0, -1], [0, 1, 0], [1, 0, 1]])
self.assertAlmostEqual(1.4142135623730951, np.linalg.cond(a))
self.assertAlmostEqual(3.1622776601683795, np.linalg.cond(a, "fro"))
self.assertAlmostEqual(2.0, np.linalg.cond(a, np.inf))
self.assertAlmostEqual(1.0, np.linalg.cond(a, -np.inf))
self.assertAlmostEqual(2.0, np.linalg.cond(a, 1))
self.assertAlmostEqual(1.0, np.linalg.cond(a, -1))
self.assertAlmostEqual(1.4142135623730951, np.linalg.cond(a, 2))
self.assertAlmostEqual(0.70710678118654746, np.linalg.cond(a, -2))
def testDet(self):
a = np.array([[1, 2], [3, 4]])
self.assertAlmostEqual(-2.0, np.linalg.det(a))
if __name__ == "__main__":
# import sys;sys.argv = ['', 'Test.testName']
__import__("__main__").Test = Test
unittest.main()