Skip to content

Commit a761d16

Browse files
committed
update: add norm to vectors + tests
1 parent 4af3d36 commit a761d16

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

src/py/mat3ra/code/vector.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ def __eq__(self, other):
3333
other = Vector3D(other)
3434
return np.allclose(self.root, other.root, atol=self.__atol__, rtol=0)
3535

36+
@property
37+
def norm(self):
38+
return np.linalg.norm(self.value)
39+
3640

3741
class RoundedVector3D(RoundNumericValuesMixin, Vector3D):
3842
def __init__(self, root: List[float]):
@@ -64,3 +68,7 @@ def __eq__(self, other):
6468
other = RoundedVector3D(other)
6569
atol = self.__atol__ or 10 ** (-self.__round_precision__)
6670
return np.allclose(self.value_rounded, other.value_rounded, atol=atol, rtol=0)
71+
72+
@property
73+
def norm_rounded(self):
74+
return self.round_array_or_number(self.norm)

tests/py/unit/test_vector.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
1+
import numpy as np
12
from mat3ra.code.vector import RoundedVector3D, Vector3D
23

34
VECTOR_FLOAT = [1.234567890, 2.345678901, 3.456789012]
5+
VECTOR_FLOAT_NORM = 4.3561172682906
6+
FLOAT_PRECISION = 1e-8
7+
48
VECTOR_FLOAT_DIFFERENT_WITHIN_TOL = [1.23456789999, 2.345678901, 3.456789012]
59
VECTOR_FLOAT_DIFFERENT_OUTSIDE_TOL = [1.2345699999, 2.345678901, 3.456789012]
610
VECTOR_FLOAT_ROUNDED_4 = [1.2346, 2.3457, 3.4568]
@@ -38,6 +42,28 @@ def test_vector_equality():
3842
assert vector != Vector3D(VECTOR_FLOAT_DIFFERENT_OUTSIDE_TOL)
3943

4044

45+
def test_vector_equality_with_list():
46+
vector = Vector3D(VECTOR_FLOAT)
47+
assert vector == VECTOR_FLOAT
48+
assert vector == VECTOR_FLOAT_DIFFERENT_WITHIN_TOL
49+
assert vector != VECTOR_FLOAT_DIFFERENT_OUTSIDE_TOL
50+
51+
52+
def test_vector_norm():
53+
vector = Vector3D(VECTOR_FLOAT)
54+
# Check if the norm is close to the expected value to avoid architecture-specific issues
55+
np.isclose(vector.norm, VECTOR_FLOAT_NORM, atol=FLOAT_PRECISION, rtol=0)
56+
assert vector.value == VECTOR_FLOAT
57+
assert vector.x == 1.234567890
58+
assert vector.y == 2.345678901
59+
assert vector.z == 3.456789012
60+
61+
62+
#####################################################################
63+
## RoundedVector3D tests
64+
#####################################################################
65+
66+
4167
def test_rounded_vector_init():
4268
vector = RoundedVector3D(VECTOR_FLOAT)
4369
assert vector.model_dump() == VECTOR_FLOAT
@@ -70,3 +96,19 @@ def test_rounded_vector_serialization():
7096
assert vector.x_rounded == VECTOR_FLOAT_ROUNDED_3[0]
7197
assert vector.y_rounded == VECTOR_FLOAT_ROUNDED_3[1]
7298
assert vector.z_rounded == VECTOR_FLOAT_ROUNDED_3[2]
99+
100+
101+
def test_rounded_vector_equality():
102+
class_reference = RoundedVector3D
103+
# Higher precision yields inequality
104+
class_reference.__round_precision__ = 4
105+
vector = class_reference(VECTOR_FLOAT)
106+
assert vector == VECTOR_FLOAT
107+
assert vector == VECTOR_FLOAT_ROUNDED_4
108+
assert vector != VECTOR_FLOAT_ROUNDED_3
109+
# Lower precision yields equality
110+
class_reference.__round_precision__ = 3
111+
vector = class_reference(VECTOR_FLOAT)
112+
assert vector == VECTOR_FLOAT
113+
assert vector == VECTOR_FLOAT_ROUNDED_4
114+
assert vector == VECTOR_FLOAT_ROUNDED_3

0 commit comments

Comments
 (0)