From f3caf79806dc7e9fcb4f84b4f5cff1ef70f7605e Mon Sep 17 00:00:00 2001 From: dominiquef Date: Fri, 16 May 2025 14:26:20 -0700 Subject: [PATCH 1/3] Prevent lower IRLS start chi than target chi --- .../factories/directives_factory.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/simpeg_drivers/components/factories/directives_factory.py b/simpeg_drivers/components/factories/directives_factory.py index 9cf71b80..bfef3f4e 100644 --- a/simpeg_drivers/components/factories/directives_factory.py +++ b/simpeg_drivers/components/factories/directives_factory.py @@ -15,6 +15,7 @@ from __future__ import annotations from abc import ABC +from logging import getLogger from typing import TYPE_CHECKING import numpy as np @@ -29,6 +30,8 @@ if TYPE_CHECKING: from simpeg_drivers.driver import InversionDriver +logger = getLogger(__name__) + class DirectivesFactory: def __init__(self, driver: InversionDriver): @@ -263,7 +266,15 @@ def scale_misfits(self): def update_irls_directive(self): """Directive to update IRLS.""" if self._update_irls_directive is None: - has_chi_start = self.params.starting_chi_factor is not None + start_chi_fact = self.params.starting_chi_factor + + if start_chi_fact is not None and self.params.chi_factor > start_chi_fact: + logger.warning( + "Starting chi factor is greater than target chi factor.\n" + "Setting the target chi factor to the starting chi factor." + ) + start_chi_fact = self.params.chi_factor + self._update_irls_directive = directives.UpdateIRLS( f_min_change=self.params.f_min_change, max_irls_iterations=self.params.max_irls_iterations, @@ -272,11 +283,7 @@ def update_irls_directive(self): cooling_rate=self.params.cooling_rate, cooling_factor=self.params.cooling_factor, irls_cooling_factor=self.params.epsilon_cooling_factor, - chifact_start=( - self.params.starting_chi_factor - if has_chi_start - else self.params.chi_factor - ), + chifact_start=start_chi_fact or self.params.chi_factor, chifact_target=self.params.chi_factor, ) return self._update_irls_directive From d35d541f2cb3cc80e7798a0c41db46f22a82efd0 Mon Sep 17 00:00:00 2001 From: dominiquef Date: Fri, 16 May 2025 14:29:56 -0700 Subject: [PATCH 2/3] Add unitest --- tests/driver_test.py | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/tests/driver_test.py b/tests/driver_test.py index aa99564e..eb2d6ebb 100644 --- a/tests/driver_test.py +++ b/tests/driver_test.py @@ -57,3 +57,40 @@ def test_smallness_terms(tmp_path: Path): params.alpha_s = None driver = GravityInversionDriver(params) assert driver.regularization.objfcts[0].alpha_s == 0.0 + + +def test_target_chi(tmp_path: Path, caplog): + n_grid_points = 2 + refinement = (2,) + + geoh5, _, model, survey, topography = setup_inversion_workspace( + tmp_path, + background=0.0, + anomaly=0.75, + n_electrodes=n_grid_points, + n_lines=n_grid_points, + refinement=refinement, + flatten=False, + ) + + with geoh5.open(): + gz = survey.add_data({"gz": {"values": np.ones(survey.n_vertices)}}) + mesh = model.parent + active_cells = ActiveCellsOptions(topography_object=topography) + params = GravityInversionOptions( + geoh5=geoh5, + mesh=mesh, + active_cells=active_cells, + data_object=gz.parent, + gz_channel=gz, + gz_uncertainty=2e-3, + starting_model=1e-4, + starting_chi_factor=1.0, + chi_factor=2.0, + ) + driver = GravityInversionDriver(params) + + with caplog.at_level("WARNING"): + assert driver.directives.update_irls_directive.chifact_start == 2.0 + + assert "Starting chi factor is greater" in caplog.text From dff5b3fc68164de645ea05652aa19ad36ea0f137 Mon Sep 17 00:00:00 2001 From: dominiquef Date: Fri, 16 May 2025 14:38:24 -0700 Subject: [PATCH 3/3] Change cooling rate type --- simpeg_drivers/joint/options.py | 2 +- simpeg_drivers/options.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/simpeg_drivers/joint/options.py b/simpeg_drivers/joint/options.py index abf871c3..7e033bae 100644 --- a/simpeg_drivers/joint/options.py +++ b/simpeg_drivers/joint/options.py @@ -84,7 +84,7 @@ class BaseJointOptions(BaseData): initial_beta: float | None = None cooling_factor: float = 2.0 - cooling_rate: float = 1.0 + cooling_rate: int = 1 max_global_iterations: int = 50 max_line_search_iterations: int = 20 max_cg_iterations: int = 30 diff --git a/simpeg_drivers/options.py b/simpeg_drivers/options.py index 403ffaeb..5b8f0c53 100644 --- a/simpeg_drivers/options.py +++ b/simpeg_drivers/options.py @@ -362,7 +362,7 @@ class BaseInversionOptions(CoreOptions): initial_beta: float | None = None cooling_factor: float = 2.0 - cooling_rate: float = 1.0 + cooling_rate: int = 1 max_global_iterations: int = 50 max_line_search_iterations: int = 20 max_cg_iterations: int = 30