From 9b0373477eacd7ca84286dee38d7dea2eac99de4 Mon Sep 17 00:00:00 2001 From: Brady Planden Date: Wed, 13 Mar 2024 13:00:40 +0000 Subject: [PATCH] Updt. cost2d/optim2d x0 shape/colour, revert conftest win platform unicode, add infeasible unit test --- conftest.py | 5 ---- pybop/plotting/plot_convergence.py | 30 ++++++++++----------- tests/integration/test_parameterisations.py | 4 +-- tests/unit/test_optimisation.py | 11 ++++++++ 4 files changed, 28 insertions(+), 22 deletions(-) diff --git a/conftest.py b/conftest.py index d8e79fcd..3641cbd1 100644 --- a/conftest.py +++ b/conftest.py @@ -1,7 +1,6 @@ import pytest import matplotlib import plotly -import sys plotly.io.renderers.default = None matplotlib.use("Template") @@ -43,10 +42,6 @@ def pytest_configure(config): config.addinivalue_line("markers", "plots: mark test as a plot test") config.addinivalue_line("markers", "notebook: mark test as a notebook test") - if sys.platform.startswith("win"): - # Set the output encoding to UTF-8 on Windows - sys.stdout = open(sys.stdout.fileno(), mode="w", encoding="utf8", buffering=1) - def pytest_collection_modifyitems(config, items): options = { diff --git a/pybop/plotting/plot_convergence.py b/pybop/plotting/plot_convergence.py index b5963179..53324b57 100644 --- a/pybop/plotting/plot_convergence.py +++ b/pybop/plotting/plot_convergence.py @@ -98,35 +98,35 @@ def plot_optim2d(optim, bounds=None, steps=10, show=True, **layout_kwargs): # Import plotly only when needed go = pybop.PlotlyManager().go - # Plot the initial guess + # Plot the optimisation trace + optim_trace = np.array([item for sublist in optim.log for item in sublist]) + optim_trace = optim_trace.reshape(-1, 2) fig.add_trace( go.Scatter( - x=[optim.x0[0]], - y=[optim.x0[1]], + x=optim_trace[:, 0], + y=optim_trace[:, 1], mode="markers", - marker_symbol="x", marker=dict( - color="red", - line_color="midnightblue", - line_width=1, - size=12, + color=[i / len(optim_trace) for i in range(len(optim_trace))], + colorscale="YlOrBr", showscale=False, ), showlegend=False, ) ) - # Plot the optimisation trace - optim_trace = np.array([item for sublist in optim.log for item in sublist]) - optim_trace = optim_trace.reshape(-1, 2) + # Plot the initial guess fig.add_trace( go.Scatter( - x=optim_trace[:, 0], - y=optim_trace[:, 1], + x=[optim.x0[0]], + y=[optim.x0[1]], mode="markers", + marker_symbol="circle", marker=dict( - color=[i / len(optim_trace) for i in range(len(optim_trace))], - colorscale="YlOrBr", + color="mediumspringgreen", + line_color="mediumspringgreen", + line_width=1, + size=14, showscale=False, ), showlegend=False, diff --git a/tests/integration/test_parameterisations.py b/tests/integration/test_parameterisations.py index 33ad4f36..0aecf615 100644 --- a/tests/integration/test_parameterisations.py +++ b/tests/integration/test_parameterisations.py @@ -91,7 +91,7 @@ def test_spm_optimisers(self, optimiser, spm_costs): if optimiser in [pybop.CMAES]: parameterisation.set_f_guessed_tracking(True) - parameterisation.cost.problem._model.allow_infeasible_solutions = False + parameterisation.cost.problem.model.allow_infeasible_solutions = False assert parameterisation._use_f_guessed is True parameterisation.set_max_iterations(1) x, final_cost = parameterisation.run() @@ -115,7 +115,7 @@ def test_spm_optimisers(self, optimiser, spm_costs): x, final_cost = parameterisation.run() elif optimiser in [pybop.SciPyMinimize]: - parameterisation.cost.problem._model.allow_infeasible_solutions = False + parameterisation.cost.problem.model.allow_infeasible_solutions = False x, final_cost = parameterisation.run() else: diff --git a/tests/unit/test_optimisation.py b/tests/unit/test_optimisation.py index 6569d1ad..7e1a4b10 100644 --- a/tests/unit/test_optimisation.py +++ b/tests/unit/test_optimisation.py @@ -122,6 +122,17 @@ def test_halting(self, cost): with pytest.raises(ValueError): optim.set_max_unchanged_iterations(1, threshold=-1) + @pytest.mark.unit + def test_infeasible_solutions(self, cost): + # Test infeasible solutions + for optimiser in [pybop.SciPyMinimize, pybop.GradientDescent]: + optim = pybop.Optimisation( + cost=cost, optimiser=optimiser, allow_infeasible_solutions=False + ) + optim.set_max_iterations(1) + optim.run() + assert optim._iterations == 1 + @pytest.mark.unit def test_unphysical_result(self, cost): # Trigger parameters not physically viable warning