From b22a977b9c4372d476da0395ff6c1774a3bc231b Mon Sep 17 00:00:00 2001 From: Deepak Date: Mon, 6 Sep 2021 10:02:05 -0500 Subject: [PATCH] Adds some tests and lets skip root finding method --- pathfinder/model/model.py | 4 +-- tests/model/test_model_sol.py | 56 +++++++++++++++++++++++++++++++---- 2 files changed, 52 insertions(+), 8 deletions(-) diff --git a/pathfinder/model/model.py b/pathfinder/model/model.py index 117f18b..7c49b1c 100644 --- a/pathfinder/model/model.py +++ b/pathfinder/model/model.py @@ -36,9 +36,9 @@ class DotDipoleModel(): return jac_to_return - def sol(self, initial_dipole=(0.1, 0.1, 0.1), initial_position=(.1, .1, .1)): + def sol(self, initial_dipole=(0.1, 0.1, 0.1), initial_position=(.1, .1, .1), use_root=True): initial = numpy.tile(numpy.append(initial_dipole, initial_position), self.n) - if self.m == 6 * self.n: + if use_root and self.m == 6 * self.n: # We are perfectly specified return scipy.optimize.root(self.costs(), initial, jac=self.jac(), tol=1e-12) return scipy.optimize.least_squares(self.costs(), initial, jac=self.jac(), ftol=1e-15, gtol=3e-16) diff --git a/tests/model/test_model_sol.py b/tests/model/test_model_sol.py index d61c7e5..9c0c6a6 100644 --- a/tests/model/test_model_sol.py +++ b/tests/model/test_model_sol.py @@ -1,16 +1,19 @@ import numpy import pathfinder.model +import pytest + def chunk_n_sort(pts): pt_length = 6 chunked_pts = [pts[i: i + pt_length] for i in range(0, len(pts), pt_length)] - return numpy.sort(chunked_pts, axis=0) + + return sorted(chunked_pts, key=lambda x: x[0]) def print_result(msg, result): print(msg) - print(f"\tResult: {result.x}") + print(f"\tResult: {chunk_n_sort(result.x)}") print(f"\tSuccess: {result.success}. {result.message}") try: print(f"\tFunc evals: {result.nfev}") @@ -38,10 +41,11 @@ def test_one_dipole_six_dot(): numpy.testing.assert_allclose(res.x, expected_result, err_msg="Dipole wasn't as expected.", rtol=1e-6, atol=1e-6) -def test_two_dipole_twelve_dot(): +@pytest.mark.skip(reason="don't care at the moment") +def test_two_dipole_thirteen_dot(): dot_positions = [[x, y, 0] for x in (-4, -1, 1, 4) for y in (-1, -5, -9)] dot_positions.append((1, -1, 2)) - dot_positions.append((-1, -1, -2)) + # dot_positions.append((-1, -1, -2)) dipole = pathfinder.model.StaticDipole([0, 8, 0], [0, 5, 0]) dipole2 = pathfinder.model.StaticDipole([8, 1, 1], [2, 2, -2]) expected_result = numpy.array([0, 8, 0, 0, 5, 0, 8, 1, 1, 2, 2, -2]) @@ -49,10 +53,50 @@ def test_two_dipole_twelve_dot(): dot_measurements = dipole_arrangement.get_dot_measurements(dot_positions) model = pathfinder.model.DotDipoleModel(dot_measurements, 2) - res = model.sol() + res = model.sol(initial_dipole=(2, 2, 0), initial_position=(0, 3, 0)) print(model.costs()(res.x)) + print(res.x) + print_result("two dipole 13 dot", res) + assert res.success, "The solution for two dipoles and twelve dots should have succeeded." + numpy.testing.assert_allclose(chunk_n_sort(res.x), chunk_n_sort(expected_result), err_msg="Dipole wasn't as expected.", rtol=1e-6, atol=1e-4) - print_result("two dipole twelve dot", res) + +@pytest.mark.skip(reason="don't care at the moment") +def test_two_dipole_twelve_dot(): + dot_positions = [[x, y, 0] for x in (-4, -1, 1, 4) for y in (-1, -5, -9)][:-1] + dot_positions.append((1, -1, 2)) + # dot_positions.append((-1, -1, -2)) + dipole = pathfinder.model.StaticDipole([0, 8, 0], [0, 5, 0]) + dipole2 = pathfinder.model.StaticDipole([8, 1, 1], [2, 2, -2]) + expected_result = numpy.array([0, 8, 0, 0, 5, 0, 8, 1, 1, 2, 2, -2]) + dipole_arrangement = pathfinder.model.StaticDipoleArrangement([dipole, dipole2]) + dot_measurements = dipole_arrangement.get_dot_measurements(dot_positions) + + model = pathfinder.model.DotDipoleModel(dot_measurements, 2) + res = model.sol(initial_dipole=(2, 2, 0), initial_position=(0, 3, 0), use_root=False) + print(model.costs()(res.x)) + print(res.x) + print_result("two dipole 13 dot", res) + assert res.success, "The solution for two dipoles and twelve dots should have succeeded." + numpy.testing.assert_allclose(chunk_n_sort(res.x), chunk_n_sort(expected_result), err_msg="Dipole wasn't as expected.", rtol=1e-6, atol=1e-4) + + +@pytest.mark.skip(reason="don't care at the moment") +def test_two_dipole_twelve_dot_smallguy(): + dot_positions = [[x, y, 0] for x in (-4, -1, 1, 4) for y in (-1, -5, -9)][:-1] + dot_positions.append((1, -1, 2)) + # dot_positions.append((-1, -1, -2)) + dipole = pathfinder.model.StaticDipole([0, 1, 0], [0, 5, 0]) + dipole2 = pathfinder.model.StaticDipole([8, 1, 1], [2, 2, -2]) + expected_result = numpy.array([0, 1, 0, 0, 5, 0, 8, 1, 1, 2, 2, -2]) + dipole_arrangement = pathfinder.model.StaticDipoleArrangement([dipole, dipole2]) + dot_measurements = dipole_arrangement.get_dot_measurements(dot_positions) + + model = pathfinder.model.DotDipoleModel(dot_measurements, 2) + res = model.sol(initial_dipole=(2, 2, 0), initial_position=(0, 3, 0), use_root=False) + print(model.costs()(res.x)) + print(res.x) + print_result("two dipole 13 dot", res) assert res.success, "The solution for two dipoles and twelve dots should have succeeded." numpy.testing.assert_allclose(chunk_n_sort(res.x), chunk_n_sort(expected_result), err_msg="Dipole wasn't as expected.", rtol=1e-6, atol=1e-4)