89 lines
3.5 KiB
Python
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() |