import pytest
import numpy as np
try:
import numrs2 as nr
NUMRS2_AVAILABLE = True
except ImportError:
NUMRS2_AVAILABLE = False
nr = None
pytestmark = pytest.mark.skipif(
not NUMRS2_AVAILABLE, reason="numrs2 not built with Python bindings"
)
def test_matmul():
a = nr.array([1.0, 2.0, 3.0, 4.0])
a_mat = a.reshape([2, 2])
b = nr.array([5.0, 6.0, 7.0, 8.0])
b_mat = b.reshape([2, 2])
c = nr.matmul(a_mat, b_mat)
assert c.shape == [2, 2]
result = c.tolist()
assert len(result) == 4
def test_linalg_det():
a = nr.eye(2)
det = nr.linalg.det(a)
assert abs(det - 1.0) < 1e-10
def test_linalg_trace():
a = nr.array([1.0, 2.0, 3.0, 4.0]).reshape([2, 2])
trace = nr.linalg.trace(a)
assert abs(trace - 5.0) < 1e-10
def test_linalg_inv():
a = nr.array([4.0, 7.0, 2.0, 6.0]).reshape([2, 2])
a_inv = nr.linalg.inv(a)
identity = nr.matmul(a, a_inv)
result = identity.tolist()
assert abs(result[0] - 1.0) < 1e-9
assert abs(result[3] - 1.0) < 1e-9
def test_linalg_eigvals():
a = nr.eye(2)
eigvals = nr.linalg.eigvals(a)
assert eigvals.size == 2
values = eigvals.tolist()
for val in values:
assert abs(val - 1.0) < 1e-10
def test_linalg_eig():
a = nr.eye(2)
vals, vecs = nr.linalg.eig(a)
assert vals.size == 2
assert vecs.shape == [2, 2]
def test_linalg_svd():
a = nr.array([1.0, 2.0, 3.0, 4.0, 5.0, 6.0]).reshape([2, 3])
u, s, vt = nr.linalg.svd(a)
assert u.ndim == 2
assert s.ndim == 1
assert vt.ndim == 2
def test_linalg_qr():
a = nr.array([1.0, 2.0, 3.0, 4.0, 5.0, 6.0]).reshape([2, 3])
q, r = nr.linalg.qr(a)
assert q.ndim == 2
assert r.ndim == 2
def test_linalg_norm():
a = nr.array([3.0, 4.0])
norm = nr.linalg.norm(a)
assert abs(norm - 5.0) < 1e-10
if __name__ == "__main__":
pytest.main([__file__, "-v"])