156 lines
5.5 KiB
Python
Raw Normal View History

2022-04-07 18:46:57 +02:00
import time
import pytest
import json
import sys
import igl
import numpy as np
sys.path.append('../')
sys.path.append('../src')
import utils, laplacian_utils, mean_curvature_flow, remesher_helper
from utils import parse_input_mesh, normalize_area, get_diverging_colors, remesh
from mean_curvature_flow import MCF
import copy
import numpy.linalg as la
import fitting
epsilon1 = 5e-2
epsilon2 = 1e-3
eps = 1E-6
with open('test_data.json', 'r') as infile:
homework_data = json.load(infile)
v = np.array(homework_data[0], dtype=float)
f = np.array(homework_data[1], dtype=int)
num_bdry_vx, num_intr_vx = int(homework_data[2]), int(homework_data[3])
curr_mcf = MCF(num_bdry_vx, num_intr_vx)
curr_mcf.bbox_diagonal = igl.bounding_box_diagonal(v)
@pytest.mark.timeout(0.5)
def test_mass_matrix():
student_mass_matrix = laplacian_utils.compute_mass_matrix(v, f).toarray()
assert np.linalg.norm(student_mass_matrix - np.array(homework_data[4], dtype=float)) < eps
@pytest.mark.timeout(0.5)
def test_cotan():
cotan, a, b, c, A = homework_data[5]
student_cotan = laplacian_utils.compute_cotangent(a, b, c, A)
assert np.linalg.norm(student_cotan - cotan) < eps
@pytest.mark.timeout(0.5)
def test_laplacian_matrix():
student_laplacian_matrix = laplacian_utils.compute_laplacian_matrix(v, f).toarray()
assert np.linalg.norm(student_laplacian_matrix - np.array(homework_data[6], dtype=float)) < eps
@pytest.mark.timeout(0.5)
def test_average_mean_curvature():
data = homework_data[7]
laplace_v = copy.deepcopy(v)
curr_mcf.update_system(laplace_v, f)
assert np.linalg.norm(curr_mcf.average_mean_curvature - data) < eps
@pytest.mark.timeout(0.5)
def test_laplace_solution():
data = homework_data[8]
laplace_v = copy.deepcopy(v)
curr_mcf.solve_laplace_equation(laplace_v, f)
assert np.linalg.norm(laplace_v - np.array(data, dtype=float)) < eps
@pytest.mark.timeout(0.5)
def test_meet_sc():
data = homework_data[9]
student_sc = [curr_mcf.meet_stopping_criteria([0.001, 0.001], epsilon1, epsilon2), curr_mcf.meet_stopping_criteria([1, 0.5], epsilon1, epsilon2)]
assert student_sc == data
@pytest.mark.timeout(0.5)
def test_mean_curvature_flow():
data = np.array(homework_data[10], dtype=float)
_, student_mean_curvature_flow = curr_mcf.run_mean_curvature_flow(v, f, 100, epsilon1, epsilon2)
assert np.linalg.norm(student_mean_curvature_flow - data) < eps
@pytest.mark.timeout(0.5)
def test_average_mean_curvature():
data = homework_data[7]
laplace_v = copy.deepcopy(v)
curr_mcf.update_system(laplace_v, f)
assert np.linalg.norm(curr_mcf.average_mean_curvature - data) < eps
@pytest.mark.timeout(0.5)
def test_laplace_solution():
data = homework_data[8]
laplace_v = copy.deepcopy(v)
curr_mcf.solve_laplace_equation(laplace_v, f)
assert np.linalg.norm(laplace_v - np.array(data, dtype=float)) < eps
@pytest.mark.timeout(0.5)
def test_meet_sc():
data = homework_data[9]
student_sc = [curr_mcf.meet_stopping_criteria([0.001, 0.001], epsilon1, epsilon2), curr_mcf.meet_stopping_criteria([1, 0.5], epsilon1, epsilon2)]
assert student_sc == data
@pytest.mark.timeout(0.5)
def test_mean_curvature_flow():
data = np.array(homework_data[10], dtype=float)
_, student_mean_curvature_flow = curr_mcf.run_mean_curvature_flow(v, f, 100, epsilon1, epsilon2)
assert np.linalg.norm(student_mean_curvature_flow - data) < eps
fitting_v = np.array(homework_data[11], dtype=float)
fitting_f = np.array(homework_data[12], dtype=int)
@pytest.mark.timeout(0.5)
def test_osculating_paraboloids():
[paraboloids_parameters, e1, e2, e3] = homework_data[13]
paraboloids_parameters = np.array(paraboloids_parameters)
e1 = np.array(e1)
e2 = np.array(e2)
e3 = np.array(e3)
student_paraboloids_parameters = fitting.compute_osculating_paraboloids(fitting_v, fitting_f, e1, e2, e3)
assert np.linalg.norm(student_paraboloids_parameters - paraboloids_parameters) < eps
@pytest.mark.timeout(0.5)
def test_osculating_paraboloid_first_derivatives():
[op_fd_x, op_fd_y, paraboloids_parameters] = homework_data[14]
op_fd_x = np.array(op_fd_x)
op_fd_y = np.array(op_fd_y)
paraboloids_parameters = np.array(paraboloids_parameters)
student_fd_x, student_fd_y = fitting.compute_osculating_paraboloid_first_derivatives(paraboloids_parameters)
assert np.linalg.norm(student_fd_x - op_fd_x) < eps
assert np.linalg.norm(student_fd_y - op_fd_y) < eps
@pytest.mark.timeout(0.5)
def test_osculating_paraboloid_second_derivatives():
[op_sd_xx, op_sd_xy, op_sd_yy, paraboloids_parameters] = homework_data[15]
op_sd_xx = np.array(op_sd_xx)
op_sd_xy = np.array(op_sd_xy)
op_sd_yy = np.array(op_sd_yy)
paraboloids_parameters = np.array(paraboloids_parameters)
student_sd_xx, student_sd_xy, student_sd_yy = fitting.compute_osculating_paraboloid_second_derivatives(paraboloids_parameters)
assert np.linalg.norm(student_sd_xx - op_sd_xx) < eps
assert np.linalg.norm(student_sd_xy - op_sd_xy) < eps
assert np.linalg.norm(student_sd_yy - op_sd_yy) < eps
@pytest.mark.timeout(0.5)
def test_mesh_principal_curvatures():
k1, k2, d1, d2 = homework_data[16]
k1 = np.array(k1)
k2 = np.array(k2)
d1 = np.array(d1)
d2 = np.array(d2)
student_k1, student_k2, student_d1, student_d2 = fitting.compute_mesh_principal_curvatures(fitting_v, fitting_f)
assert np.linalg.norm(k1 - student_k1) < eps
assert np.linalg.norm(k2 - student_k2) < eps
assert np.linalg.norm(d1 - student_d1) < eps
assert np.linalg.norm(d2 - student_d2) < eps