import numpy as np import pytest from scan_server.path_optimization import PathOptimizerMixin from scan_server.scans import get_fermat_spiral_pos, get_round_roi_scan_positions def test_shell_optimization(): optim = PathOptimizerMixin() positions_orig = get_fermat_spiral_pos(-5, 5, -5, 5, 0.5) step = 2 drs = np.linspace(step - step / 2, step + step / 2, 100) min_length = len(positions_orig) for dr in drs: optim_positions = optim.optimize_shell(positions_orig, 1, dr) assert optim.get_path_length(optim_positions) < optim.get_path_length(positions_orig) assert len(positions_orig) == len(optim_positions) if min_length > len(optim_positions): min_length = len(optim_positions) @pytest.mark.parametrize( "positions_orig", [ (get_fermat_spiral_pos(-5, 5, -5, 5, 0.5)), (get_round_roi_scan_positions(10, 10, 1, 3)), (get_fermat_spiral_pos(5, 15, -5, 5, 1.5)), np.asarray( [ [-0.38502947, -0.42030026], [0.8030152, 0.07047403], [-0.78349739, 0.6006928], [0.19856742, -1.12257337], [0.68409143, 1.07541569], [-1.34834023, -0.36246191], [1.33834167, -0.69508386], [-0.55304807, 1.51437705], [-0.65246146, -1.5806309], [1.63258446, 0.76398167], [-1.80382449, 0.565789], [0.99004828, -1.70839234], [0.44128369, 2.00722911], [-1.74471832, -1.22660425], [2.18929536, -0.28370026], [-1.46933912, 1.74339971], [-0.09710392, -2.34816329], [1.70582397, 1.71416585], [-2.48192038, -0.11476599], [1.95717083, -1.63324289], [-0.34831142, 2.58874084], [-1.52694212, -2.19459512], [2.66696917, 0.59997953], [-2.42283314, 1.38833698], [0.86621469, -2.71517442], [1.21902689, 2.63844148], [-2.73218753, -1.14343837], [2.83815367, -1.02082504], [-1.42804626, 2.71712787], [-0.79577191, -3.01889832], [2.66942208, 1.71641654], [-3.177819, 0.5461377], [2.00492546, -2.58881708], [0.27441684, 3.31229458], [-2.47538823, -2.28996793], [3.41995931, 0.01668371], [-2.56798139, 2.32954321], [0.32426076, -3.4987219], [2.15202209, 2.83547191], [-3.54678327, -0.6452352], [3.0890415, -1.94389368], [-0.97637529, 3.56265228], [-1.70654861, -3.32541604], [3.54515953, 1.3143226], [-3.54147324, 1.44168904], [1.65561995, -3.49346856], [1.15131537, 3.73427006], [-3.40708457, -1.99674103], [3.90106934, -0.83770999], [-2.33412125, 3.28586031], [-0.50341829, -4.03936505], [3.12999911, 2.66418947], [-4.14690612, 0.15122708], [2.98340025, -2.94005492], [-0.21585929, 4.22171822], [-2.71692933, -3.28826626], [4.26212356, 0.59464507], [-3.57539059, 2.46186558], [0.98177109, -4.2667582], [2.17643951, 3.84149855], [-4.2345869, -1.37374444], [4.0834687, -1.86254756], [-1.7669696, 4.16491518], [-1.5223919, -4.29836282], [4.0573985, 2.15778066], [-4.48345448, 1.15846274], [2.54247449, -3.9120485], [0.77351793, 4.63625603], [-3.72923608, -2.91734439], [4.75454363, -0.3705602], [-3.2787141, 3.50969142], [0.04718809, -4.83638018], [3.25450081, 3.62297177], [-4.88013593, -0.47631219], [3.9466036, -2.96510034], [-0.91323418, 4.88450646], [-2.6432664, -4.24622688], [4.84852799, 1.35424381], [-4.51862215, 2.2911032], [1.79553073, -4.77158982], [1.91102723, 4.76076411], [-4.65344365, -2.2332179], [-2.66339579, 4.49420993], [-1.07825144, -5.14333295], [4.29438088, 3.08215718], [3.48563219, -4.05482037], [0.16975146, 5.37468924], [-3.77676048, -3.8700233], [-4.23163998, 3.46179478], [0.78610866, -5.44037987], [3.11186849, 4.56693272], [-1.75834396, 5.33137192], [-2.31659152, -5.1452506], [5.21012991, 2.24045673], [2.71438699, -5.04450228], [1.41295113, 5.58062444], [-4.83505221, -3.17599908], [-3.62119968, 4.58272985], [-0.42745065, -5.85292115], [4.28886872, 4.04597394], [4.44642124, -3.95517865], [-0.60974575, 5.94703372], [-3.5837355, -4.81879029], [1.66577589, -5.85352806], [2.73763886, 5.46523865], [-2.70615335, 5.56910532], [-1.77391247, -5.95955825], [5.35601502, 3.20953316], [3.69591707, -5.09686149], [0.72056133, 6.28040535], [-4.79303825, -4.16105568], [0.39058698, -6.41168791], [4.05891248, 5.01123034], [-1.52487763, 6.34323642], [-3.17243698, -5.7290875], [2.64593869, -6.07128557], [2.15801013, 6.28724044], [-3.71687041, 5.59874757], [-1.04493367, -6.66289079], [5.29001191, 4.2221646], [-0.13346172, 6.83869783], [-4.53673446, -5.15058641], [1.34084289, -6.80348002], [3.61915416, 5.94237521], [-2.53902039, 6.55272275], [-2.56249389, -6.56835787], [3.68917794, -6.08887232], [1.39714577, 7.0040905], [-0.1577744, -7.23076809], [5.01615753, 5.24137039], [-1.11773817, 7.23596306], [-4.07593292, -6.10902372], [2.38947313, -7.01416553], [2.98486959, 6.80614087], [-3.61674404, 6.56710458], [-1.77424666, -7.30647992], [0.47989035, 7.5895919], [-5.49592513, -5.28695631], [0.85890639, -7.64160191], [4.54092097, 6.23191277], [-2.20059676, 7.45578795], [-3.42282504, -7.00289717], [3.50268751, -7.03293539], [2.17360437, 7.57174643], [-0.83007366, -7.91621612], [-0.56720675, 8.02080897], [-5.01228442, -6.31324044], [1.97517293, -7.87739753], [3.87418174, 7.16032931], [-3.34960106, 7.48561773], [-2.59281078, -7.80105969], [1.2058016, 8.21126315], [0.24516539, -8.3736667], [5.48821351, 6.35474724], [-1.71562742, 8.27856404], [-4.33686242, -7.27973381], [3.15971673, -7.92425329], [3.02961939, 7.99524273], [-1.60475719, -8.47507253], [0.10492593, 8.70003969], [4.80886862, 7.36213166], [-3.48190329, -8.15488501], [2.02477238, 8.70779518], [-0.48094298, -8.99964965], [-5.28826502, -7.40835698], [3.94762603, 8.2804196], [-2.46378877, -8.90945817], [0.8808825, 9.27212737], [5.77316847, 7.41911894], [-4.42482118, -8.37217758], [2.91982982, 9.08001067], [4.91157785, 8.43042721], [-3.39098098, -9.21935724], [-5.40603031, -8.45540279], [3.87537543, 9.32738255], [5.90635073, 8.44732626], [-4.37118372, -9.40397006], [4.87660641, 9.44901635], [-5.38986893, -9.46244223], [5.90921802, 9.44420152], [-4.19567308, -10.38305], [4.72175873, 10.42303672], [-5.25585093, -10.43235501], [5.79626528, 10.4107929], [-6.34132488, -10.35819476], ] ), ], ) def test_corridor_optimization(positions_orig): optim = PathOptimizerMixin() optim_positions = optim.optimize_corridor(positions_orig, num_iterations=20) assert optim.get_path_length(optim_positions) < optim.get_path_length(positions_orig) assert len(positions_orig) == len(optim_positions) # from matplotlib import pyplot as plt # plt.figure() # plt.plot(positions_orig[:, 0], positions_orig[:, 1], "r-x") # plt.plot(optim_positions[:, 0], optim_positions[:, 1], "g-x") # plt.show()