68 lines
2.2 KiB
Python
68 lines
2.2 KiB
Python
# import pytest
|
|
import time
|
|
import pytest
|
|
import json
|
|
import sys
|
|
import igl
|
|
import numpy as np
|
|
sys.path.append('../')
|
|
sys.path.append('../src')
|
|
from src.energies import *
|
|
from src.linesearch import *
|
|
from src.bfgs import *
|
|
eps = 1E-6
|
|
|
|
with open('test_data3.json', 'r') as infile:
|
|
homework_datas = json.load(infile)
|
|
|
|
@pytest.mark.timeout(1)
|
|
@pytest.mark.parametrize("data", homework_datas[0])
|
|
def test_armijo_rule(data):
|
|
Fx = data[0]
|
|
Fy = data[1]
|
|
p = np.array(data[2], dtype=float)
|
|
grad = np.array(data[3], dtype=float)
|
|
c = data[4]
|
|
alpha = data[5]
|
|
armijo_rule_ground_truth = data[6]
|
|
armijo_rule_student = int(evaluate_armijo_rule(Fx, Fy, p, grad, c, alpha))
|
|
assert armijo_rule_ground_truth == armijo_rule_student
|
|
|
|
def func(x):
|
|
return np.linalg.norm(x) ** 2
|
|
|
|
@pytest.mark.timeout(1)
|
|
@pytest.mark.parametrize("data", homework_datas[1])
|
|
def test_backtracking_line_search(data):
|
|
p = np.array(data[0], dtype=float)
|
|
grad = np.array(data[1], dtype=float)
|
|
x = np.array(data[2], dtype=float)
|
|
theta = data[3]
|
|
beta = data[4]
|
|
c = data[5]
|
|
backtracking_line_search_ground_truth = data[6]
|
|
backtracking_line_search_student = backtracking_line_search(p, grad, x, theta, beta, c, func)
|
|
|
|
assert np.linalg.norm(backtracking_line_search_ground_truth - backtracking_line_search_student) < eps
|
|
|
|
@pytest.mark.timeout(1)
|
|
@pytest.mark.parametrize("data", homework_datas[2])
|
|
def test_compute_approximate_hessian_matrix(data):
|
|
sk = np.array(data[0], dtype=float)
|
|
yk = np.array(data[1], dtype=float)
|
|
Bk = np.array(data[2], dtype=float)
|
|
|
|
newBk_student = compute_approximate_hessian_matrix(sk, yk, Bk)
|
|
newBk_ground_truth = np.array(data[3], dtype=float)
|
|
assert np.linalg.norm(newBk_student - newBk_ground_truth) < eps
|
|
|
|
@pytest.mark.timeout(1)
|
|
@pytest.mark.parametrize("data", homework_datas[3])
|
|
def test_compute_inverse_approximate_hessian_matrix(data):
|
|
sk = np.array(data[0], dtype=float)
|
|
yk = np.array(data[1], dtype=float)
|
|
invBk = np.array(data[2], dtype=float)
|
|
inv_newBk_student = compute_inverse_approximate_hessian_matrix(sk, yk, invBk)
|
|
inv_newBk_ground_truth = np.array(data[3], dtype=float)
|
|
assert np.linalg.norm(inv_newBk_student - inv_newBk_ground_truth) < eps
|