From 1fefa3f2a07a08e7cc4451c269f1208161ce28e1 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Tue, 1 Nov 2022 15:18:32 -0500 Subject: [PATCH] ENH: Add check if optimizer supports scales Not all optimizers support scale weights. The itkImageRegistrationMethodv4 was unconditionally setting the scales and causing a confusing warning message to be presented (identified in python, but also present in c++). Providing an overridable member function that returns the support for weighting scales allow suppression of the warnings. --- Modules/Numerics/Optimizers/include/itkLBFGSBOptimizer.h | 7 +++++++ .../include/itkSingleValuedNonLinearVnlOptimizer.h | 9 +++++++++ .../Numerics/Optimizersv4/include/itkLBFGSBOptimizerv4.h | 7 +++++++ .../include/itkObjectToObjectOptimizerBase.h | 9 +++++++++ .../include/itkImageRegistrationMethodv4.hxx | 3 ++- 5 files changed, 34 insertions(+), 1 deletion(-) diff --git a/Modules/Numerics/Optimizers/include/itkLBFGSBOptimizer.h b/Modules/Numerics/Optimizers/include/itkLBFGSBOptimizer.h index 33f3f55bc15..e9770380b70 100644 --- a/Modules/Numerics/Optimizers/include/itkLBFGSBOptimizer.h +++ b/Modules/Numerics/Optimizers/include/itkLBFGSBOptimizer.h @@ -194,6 +194,13 @@ class ITKOptimizers_EXPORT LBFGSBOptimizer : public SingleValuedNonLinearVnlOpti const std::string GetStopConditionDescription() const override; + /** Returns false unconditionally because LBFGSBOptimizer does not support using scales. */ + bool + CanUseScales() const override + { + return false; + } + protected: LBFGSBOptimizer(); ~LBFGSBOptimizer() override; diff --git a/Modules/Numerics/Optimizers/include/itkSingleValuedNonLinearVnlOptimizer.h b/Modules/Numerics/Optimizers/include/itkSingleValuedNonLinearVnlOptimizer.h index b77d573e6f6..7467ccd7da2 100644 --- a/Modules/Numerics/Optimizers/include/itkSingleValuedNonLinearVnlOptimizer.h +++ b/Modules/Numerics/Optimizers/include/itkSingleValuedNonLinearVnlOptimizer.h @@ -101,6 +101,15 @@ class ITKOptimizers_EXPORT SingleValuedNonLinearVnlOptimizer : public SingleValu itkGetConstReferenceMacro(CachedDerivative, DerivativeType); itkGetConstReferenceMacro(CachedCurrentPosition, ParametersType); + /** Returns true if derived optimizer supports using scales. + * For optimizers that do not support scaling, this + * default function is overriden to return false.*/ + virtual bool + CanUseScales() const + { + return true; + } + protected: SingleValuedNonLinearVnlOptimizer(); ~SingleValuedNonLinearVnlOptimizer() override; diff --git a/Modules/Numerics/Optimizersv4/include/itkLBFGSBOptimizerv4.h b/Modules/Numerics/Optimizersv4/include/itkLBFGSBOptimizerv4.h index 6f70737e349..fa4908481d2 100644 --- a/Modules/Numerics/Optimizersv4/include/itkLBFGSBOptimizerv4.h +++ b/Modules/Numerics/Optimizersv4/include/itkLBFGSBOptimizerv4.h @@ -170,6 +170,13 @@ class ITKOptimizersv4_EXPORT LBFGSBOptimizerv4 : public LBFGSOptimizerBasev4m_Optimizer->SetMetric(this->m_Metric); - if ((this->m_Optimizer->GetScales()).Size() != this->m_OutputTransform->GetNumberOfLocalParameters()) + if (this->m_Optimizer->CanUseScales() && + ((this->m_Optimizer->GetScales()).Size() != this->m_OutputTransform->GetNumberOfLocalParameters())) { using ScalesType = typename OptimizerType::ScalesType; ScalesType scales;