Set tolerance in testing suite: match the accuracy of the algorithm and is just above rounding error

fixes-turtlebasket
Mattia 2020-05-05 16:36:31 +01:00
parent d11a86a06d
commit f1624fd7cd
1 changed files with 14 additions and 10 deletions

View File

@ -2,7 +2,10 @@ import opengjkc as opengjk
from scipy.spatial.transform import Rotation as R from scipy.spatial.transform import Rotation as R
import numpy as np import numpy as np
import pytest import pytest
from IPython import embed
def settol():
return 1e-12
def distance_point_to_line_3D(P1, P2, point): def distance_point_to_line_3D(P1, P2, point):
""" """
@ -29,7 +32,7 @@ def test_line_point_distance(delta):
actual_distance = distance_point_to_line_3D( actual_distance = distance_point_to_line_3D(
line[0], line[1], point) line[0], line[1], point)
print(distance, actual_distance) print(distance, actual_distance)
assert(np.isclose(distance, actual_distance, atol=1e-15)) assert(np.isclose(distance, actual_distance, atol=settol() ))
@pytest.mark.parametrize("delta", [0.1, 1e-12, 0]) @pytest.mark.parametrize("delta", [0.1, 1e-12, 0])
@ -43,7 +46,7 @@ def test_line_line_distance(delta):
actual_distance = distance_point_to_line_3D( actual_distance = distance_point_to_line_3D(
line[0], line[1], line_2[0]) line[0], line[1], line_2[0])
print(distance, actual_distance) print(distance, actual_distance)
assert(np.isclose(distance, actual_distance, atol=1e-15)) assert(np.isclose(distance, actual_distance, atol=settol() ))
@pytest.mark.parametrize("delta", [0.1**(3*i) for i in range(6)]) @pytest.mark.parametrize("delta", [0.1**(3*i) for i in range(6)])
@ -55,10 +58,11 @@ def test_tri_distance(delta):
P2 = tri_1[1] P2 = tri_1[1]
point = tri_2[0] point = tri_2[0]
actual_distance = distance_point_to_line_3D(P1, P2, point) actual_distance = distance_point_to_line_3D(P1, P2, point)
distance = opengjk.gjk(tri_1, tri_2) distance = opengjk.gjk(tri_1, tri_2)
print("Computed distance ", distance, "Actual distance ", actual_distance) print("Computed distance ", distance, "Actual distance ", actual_distance)
assert(np.isclose(distance, actual_distance, atol=1e-15)) #embed()
assert(np.isclose(distance, actual_distance, atol=settol() ))
@pytest.mark.parametrize("delta", [0.1*0.1**(3*i) for i in range(6)]) @pytest.mark.parametrize("delta", [0.1*0.1**(3*i) for i in range(6)])
@ -74,7 +78,7 @@ def test_quad_distance2d(delta):
distance = opengjk.gjk(quad_1, quad_2) distance = opengjk.gjk(quad_1, quad_2)
print("Computed distance ", distance, "Actual distance ", actual_distance) print("Computed distance ", distance, "Actual distance ", actual_distance)
assert(np.isclose(distance, actual_distance, atol=1e-15)) assert(np.isclose(distance, actual_distance, atol=settol() ))
@pytest.mark.parametrize("delta", [1*0.5**(3*i) for i in range(7)]) @pytest.mark.parametrize("delta", [1*0.5**(3*i) for i in range(7)])
@ -88,7 +92,7 @@ def test_tetra_distance_3d(delta):
distance = opengjk.gjk(tetra_1, tetra_2) distance = opengjk.gjk(tetra_1, tetra_2)
print("Computed distance ", distance, "Actual distance ", actual_distance) print("Computed distance ", distance, "Actual distance ", actual_distance)
assert(np.isclose(distance, actual_distance, atol=1e-15)) assert(np.isclose(distance, actual_distance, atol=settol() ))
@pytest.mark.parametrize("delta", [(-1)**i*np.sqrt(2)*0.1**(3*i) @pytest.mark.parametrize("delta", [(-1)**i*np.sqrt(2)*0.1**(3*i)
@ -103,11 +107,11 @@ def test_tetra_collision_3d(delta):
distance = opengjk.gjk(tetra_1, tetra_2) distance = opengjk.gjk(tetra_1, tetra_2)
if delta < 0: if delta < 0:
assert(np.isclose(distance, 0, atol=1e-15)) assert(np.isclose(distance, 0, atol=settol()))
else: else:
print("Computed distance ", distance, print("Computed distance ", distance,
"Actual distance ", actual_distance) "Actual distance ", actual_distance)
assert(np.isclose(distance, actual_distance, atol=1e-15)) assert(np.isclose(distance, actual_distance, atol=settol()))
@pytest.mark.parametrize("delta", [0, -0.1, -0.49, -0.51]) @pytest.mark.parametrize("delta", [0, -0.1, -0.49, -0.51])
@ -133,11 +137,11 @@ def test_hex_collision_3d(delta):
distance = opengjk.gjk(hex_1, hex_2) distance = opengjk.gjk(hex_1, hex_2)
if P0[0] < 1: if P0[0] < 1:
assert(np.isclose(distance, 0, atol=1e-15)) assert(np.isclose(distance, 0, atol=settol()))
else: else:
print("Computed distance ", distance, print("Computed distance ", distance,
"Actual distance ", actual_distance) "Actual distance ", actual_distance)
assert(np.isclose(distance, actual_distance, atol=1e-15)) assert(np.isclose(distance, actual_distance, atol=settol()))
@pytest.mark.parametrize("c0", [0, 1, 2, 3]) @pytest.mark.parametrize("c0", [0, 1, 2, 3])