diff --git a/pathfinder/model/oscillating/oscillating_dipole.py b/pathfinder/model/oscillating/oscillating_dipole.py index 0d78dc6..1f3fba1 100644 --- a/pathfinder/model/oscillating/oscillating_dipole.py +++ b/pathfinder/model/oscillating/oscillating_dipole.py @@ -3,7 +3,7 @@ import numpy import numpy.typing from typing import Sequence, List, Tuple from pathfinder.model.oscillating.dot import DotMeasurement -# import pathfinder.model.oscillating.util + DotInput = Tuple[numpy.typing.ArrayLike, float] diff --git a/pathfinder/model/oscillating/util.py b/pathfinder/model/oscillating/util.py index 325b38f..22e7b1d 100644 --- a/pathfinder/model/oscillating/util.py +++ b/pathfinder/model/oscillating/util.py @@ -16,4 +16,4 @@ def flip_chunk_to_positive_px(pt: numpy.ndarray) -> numpy.ndarray: def normalize_oscillating_dipole_list(pts: numpy.ndarray) -> numpy.ndarray: pt_length = 7 chunked_pts = [flip_chunk_to_positive_px(pts[i: i + pt_length]) for i in range(0, len(pts), pt_length)] - return numpy.concatenate(sorted(chunked_pts, key=operator.itemgetter(0, 1, 2, 3, 4, 5, 6)), axis=None) + return numpy.concatenate(sorted(chunked_pts, key=lambda x: tuple(round(val, 3) for val in operator.itemgetter(0, 1, 2, 3, 4, 5, 6)(x))), axis=None) diff --git a/tests/model/oscillating/test_osc_model_sol.py b/tests/model/oscillating/test_osc_model_sol.py index eba451c..8e1d6dc 100644 --- a/tests/model/oscillating/test_osc_model_sol.py +++ b/tests/model/oscillating/test_osc_model_sol.py @@ -62,3 +62,48 @@ def test_two_dipole_six_dot_two_frequencies(): print_result("two oscillating dipole six dots", res) assert res.success, "The solution for two dipole and six dots should have succeeded." numpy.testing.assert_allclose(res.pathfinder_x, expected_result, err_msg="Dipole wasn't as expected.", rtol=1e-6, atol=1e-6) + + +def test_two_dipole_six_dot_two_frequencies_morerealistic(): + # setup + dot_inputs = [ + ([0, 0, .01], 5), ([-1, 0, -.01], 5), ([-2, 0, -.01], 5), ([-3, 0, 0], 5), ([0, -1, .01], 5), ([-1, -1, 0], 5), ([-2, -1, 0], 5), ([-3, -1, 0], 5), + ([0, -2, .01], 5), ([-1, -2, -.01], 5), ([-2, -2, -.01], 5), ([-3, -2, 0], 5), ([0, -3, .01], 5), ([-1, -3, 0], 5), ([-2, -3, 0], 5), ([-3, -3, 0], 5), + ([0, 0, .01], 1), ([-1, 0, -.01], 1), ([-2, 0, -.01], 1), ([-3, 0, 0], 1), ([0, -1, .01], 1), ([-1, -1, 0], 1), ([-2, -1, 0], 1), ([-3, -1, 0], 1), + ([0, -2, .01], 1), ([-1, -2, -.01], 1), ([-2, -2, -.01], 1), ([-3, -2, 0], 1), ([0, -3, .01], 1), ([-1, -3, 0], 1), ([-2, -3, 0], 1), ([-3, -3, 0], 1), + ] + dipole = pathfinder.model.oscillating.OscillatingDipole([1, 2, 3], [0, 4, -1], 7) + dipole2 = pathfinder.model.oscillating.OscillatingDipole([-1, 2, 0], [-1, 2, 1], 4) + expected_result = numpy.array([1, -2, 0, -1, 2, 1, 4, 1, 2, 3, 0, 4, -1, 7]) + dipole_arrangement = pathfinder.model.oscillating.OscillatingDipoleArrangement([dipole, dipole2]) + dot_measurements = dipole_arrangement.get_dot_measurements(dot_inputs) + + model = pathfinder.model.oscillating.DotOscillatingDipoleModel(dot_measurements, 2) + res = model.sol() + + print_result("two oscillating dipole six dots", res) + numpy.testing.assert_allclose(res.pathfinder_x, expected_result, err_msg="Dipole wasn't as expected.", rtol=1e-6, atol=1e-6) + + +def test_two_dipole_eighteen_dot_two_frequencies_morerealistic(): + # setup + dot_inputs = [ + ([0, 0, .01], 5), ([-1, 0, -.01], 5), ([-2, 0, -.01], 5), ([0, -1, .01], 5), ([-1, -1, 0], 5), ([-2, -1, 0], 5), + ([0, -2, .01], 5), ([-1, -2, -.01], 5), ([-2, -2, -.01], 5), ([0, -3, .01], 5), ([-1, -3, 0], 5), ([-2, -3, 0], 5), + ([0, -4, .01], 5), ([-1, -4, -.01], 5), ([-2, -4, -.01], 5), ([0, -5, .01], 5), ([-1, -5, 0], 5), ([-2, -5, 0], 5), + ([0, 0, .01], 1), ([-1, 0, -.01], 1), ([-2, 0, -.01], 1), ([0, -1, .01], 1), ([-1, -1, 0], 1), ([-2, -1, 0], 1), + ([0, -2, .01], 1), ([-1, -2, -.01], 1), ([-2, -2, -.01], 1), ([0, -3, .01], 1), ([-1, -3, 0], 1), ([-2, -3, 0], 1), + ([0, -4, .01], 1), ([-1, -4, -.01], 1), ([-2, -4, -.01], 1), ([0, -5, .01], 1), ([-1, -5, 0], 1), ([-2, -5, 0], 1), + ] + dipole = pathfinder.model.oscillating.OscillatingDipole([1, 2, 3], [0, 4, -1], 7) + dipole2 = pathfinder.model.oscillating.OscillatingDipole([-1, 2, 0], [-1, 2, 1], 4) + expected_result = numpy.array([1, -2, 0, -1, 2, 1, 4, 1, 2, 3, 0, 4, -1, 7]) + dipole_arrangement = pathfinder.model.oscillating.OscillatingDipoleArrangement([dipole, dipole2]) + dot_measurements = dipole_arrangement.get_dot_measurements(dot_inputs) + + model = pathfinder.model.oscillating.DotOscillatingDipoleModel(dot_measurements, 2) + res = model.sol() + + print_result("two oscillating dipole six dots", res) + assert res.success, "The solution for two dipole and six dots should have succeeded." + numpy.testing.assert_allclose(res.pathfinder_x, expected_result, err_msg="Dipole wasn't as expected.", rtol=1e-6, atol=1e-6)