Skip to content

Commit

Permalink
Re #10008. Pass iteration number to minimizers.
Browse files Browse the repository at this point in the history
  • Loading branch information
mantid-roman committed Jul 28, 2014
1 parent a3958b2 commit dfea396
Show file tree
Hide file tree
Showing 14 changed files with 36 additions and 32 deletions.
9 changes: 6 additions & 3 deletions Code/Mantid/Framework/API/inc/MantidAPI/IFuncMinimizer.h
Expand Up @@ -46,15 +46,18 @@ class MANTID_API_DLL IFuncMinimizer: public Kernel::PropertyManager
/// Virtual destructor
virtual ~IFuncMinimizer() {}

/// Initialize minimizer, i.e. pass costFunction
virtual void initialize(API::ICostFunction_sptr function) = 0;
/// Initialize minimizer.
/// @param function :: Function to minimize
/// @param maxIterations :: Maximum number of iterations
virtual void initialize(API::ICostFunction_sptr function, size_t maxIterations = 1000) = 0;

/// Get name of minimizer
virtual std::string name() const = 0;

/// Do one iteration
/// @oaram iteration :: Current iteration number.
/// @return :: true if iterations should be continued or false to stop
virtual bool iterate() = 0;
virtual bool iterate(size_t iteration) = 0;

/// Perform iteration with minimizer and return true if successful.
virtual bool minimize(size_t maxIterations = 1000);
Expand Down
4 changes: 2 additions & 2 deletions Code/Mantid/Framework/API/src/IFuncMinimizer.cpp
Expand Up @@ -22,13 +22,13 @@ bool IFuncMinimizer::minimize(size_t maxIterations)
bool success = false;
do
{
iter++;
if ( !iterate() )
if ( !iterate(iter) )
{
success = m_errorString.empty() || m_errorString == "success";
m_errorString = "success";
break;
}
iter++;
}
while (iter < maxIterations);

Expand Down
4 changes: 2 additions & 2 deletions Code/Mantid/Framework/API/test/FuncMinimizerFactoryTest.h
Expand Up @@ -26,10 +26,10 @@ class FuncMinimizerFactoryTest_A: public IFuncMinimizer

/// Overloading base class methods
std::string name()const {return "Boevs";}
bool iterate() {return true;}
bool iterate(size_t) {return true;}
int hasConverged() {return 101;}
double costFunctionVal() {return 5.0;}
void initialize(API::ICostFunction_sptr)
void initialize(API::ICostFunction_sptr,size_t)
{
}
};
Expand Down
Expand Up @@ -49,9 +49,9 @@ class DLLExport DampingMinimizer : public API::IFuncMinimizer
std::string name() const {return "DampingMinimizer";}

/// Initialize minimizer, i.e. pass a function to minimize.
virtual void initialize(API::ICostFunction_sptr function);
virtual void initialize(API::ICostFunction_sptr function,size_t maxIterations = 0);
/// Do one iteration.
virtual bool iterate();
virtual bool iterate(size_t);
/// Return current value of the cost function
virtual double costFunctionVal();

Expand Down
Expand Up @@ -49,13 +49,13 @@ class DLLExport DerivMinimizer : public API::IFuncMinimizer
~DerivMinimizer();

/// Do one iteration.
bool iterate();
bool iterate(size_t);
/// Return current value of the cost function
double costFunctionVal();
/// Calculate the covariance matrix.
void calCovarianceMatrix(gsl_matrix * covar, double epsrel = 0.0001);
/// Initialize minimizer, i.e. pass a function to minimize.
virtual void initialize(API::ICostFunction_sptr function);
virtual void initialize(API::ICostFunction_sptr function,size_t maxIterations = 0);
/// Set maximum value of the gradient at which iterations can stop
void setStopGradient(const double value);

Expand Down
Expand Up @@ -50,9 +50,9 @@ class DLLExport LevenbergMarquardtMDMinimizer : public API::IFuncMinimizer
std::string name() const {return "Levenberg-MarquardtMD";}

/// Initialize minimizer, i.e. pass a function to minimize.
virtual void initialize(API::ICostFunction_sptr function);
virtual void initialize(API::ICostFunction_sptr function, size_t maxIterations = 0);
/// Do one iteration.
virtual bool iterate();
virtual bool iterate(size_t iteration);
/// Return current value of the cost function
virtual double costFunctionVal();

Expand Down
Expand Up @@ -51,9 +51,9 @@ class DLLExport LevenbergMarquardtMinimizer : public API::IFuncMinimizer
std::string name() const {return "Levenberg-Marquardt";}

/// Initialize minimizer, i.e. pass a function to minimize.
virtual void initialize(API::ICostFunction_sptr function);
virtual void initialize(API::ICostFunction_sptr function,size_t maxIterations = 0);
/// Do one iteration.
virtual bool iterate();
virtual bool iterate(size_t);
/// Return current value of the cost function
virtual double costFunctionVal();

Expand Down
Expand Up @@ -49,11 +49,11 @@ class DLLExport SimplexMinimizer : public API::IFuncMinimizer
/// Overloading base class methods
std::string name()const{return "Simplex";}
/// Do one iteration
bool iterate();
bool iterate(size_t);
/// Return current value of the cost function
double costFunctionVal();
/// Initialize minimizer, i.e. pass a function to minimize.
virtual void initialize(API::ICostFunction_sptr function);
virtual void initialize(API::ICostFunction_sptr function, size_t maxIterations = 0);

protected:

Expand Down
4 changes: 2 additions & 2 deletions Code/Mantid/Framework/CurveFitting/src/DampingMinimizer.cpp
Expand Up @@ -37,7 +37,7 @@ m_relTol(1e-6)
}

/// Initialize minimizer, i.e. pass a function to minimize.
void DampingMinimizer::initialize(API::ICostFunction_sptr function)
void DampingMinimizer::initialize(API::ICostFunction_sptr function,size_t)
{
m_leastSquares = boost::dynamic_pointer_cast<CostFuncLeastSquares>(function);
if ( !m_leastSquares )
Expand All @@ -47,7 +47,7 @@ void DampingMinimizer::initialize(API::ICostFunction_sptr function)
}

/// Do one iteration.
bool DampingMinimizer::iterate()
bool DampingMinimizer::iterate(size_t)
{
const bool debug = false;

Expand Down
4 changes: 2 additions & 2 deletions Code/Mantid/Framework/CurveFitting/src/DerivMinimizer.cpp
Expand Up @@ -120,7 +120,7 @@ DerivMinimizer::~DerivMinimizer()
* Initialize the minimizer.
* @param function :: A cost function to minimize.
*/
void DerivMinimizer::initialize(API::ICostFunction_sptr function)
void DerivMinimizer::initialize(API::ICostFunction_sptr function, size_t)
{
m_costFunction = function;
m_gslMultiminContainer.n = m_costFunction->nParams();
Expand All @@ -147,7 +147,7 @@ void DerivMinimizer::initialize(API::ICostFunction_sptr function)
* Perform one iteration.
* @return :: true to continue, false to stop.
*/
bool DerivMinimizer::iterate()
bool DerivMinimizer::iterate(size_t)
{
if (m_gslSolver == NULL)
{
Expand Down
11 changes: 6 additions & 5 deletions Code/Mantid/Framework/CurveFitting/src/Fit.cpp
Expand Up @@ -393,15 +393,16 @@ namespace CurveFitting
API::IFuncMinimizer_sptr minimizer = API::FuncMinimizerFactory::Instance().createMinimizer(minimizerName);

// Try to retrieve optional properties
const int maxIterations = getProperty("MaxIterations");
int intMaxIterations = getProperty("MaxIterations");
const size_t maxIterations = static_cast<size_t>( intMaxIterations );

// get the cost function which must be a CostFuncFitting
boost::shared_ptr<CostFuncFitting> costFunc = boost::dynamic_pointer_cast<CostFuncFitting>(
API::CostFunctionFactory::Instance().create(getPropertyValue("CostFunction"))
);

costFunc->setFittingFunction(m_function,domain,values);
minimizer->initialize(costFunc);
minimizer->initialize(costFunc,maxIterations);

const int64_t nsteps = maxIterations*m_function->estimateNoProgressCalls();
API::Progress prog(this,0.0,1.0,nsteps);
Expand All @@ -412,12 +413,11 @@ namespace CurveFitting
bool success = false;
std::string errorString;
g_log.debug("Starting minimizer iteration\n");
while (static_cast<int>(iter) < maxIterations)
while ( iter < maxIterations )
{
iter++;
g_log.debug() << "Starting iteration " << iter << "\n";
m_function->iterationStarting();
if ( !minimizer->iterate() )
if ( !minimizer->iterate(iter) )
{
errorString = minimizer->getError();
g_log.debug() << "Iteration stopped. Minimizer status string=" << errorString << "\n";
Expand All @@ -435,6 +435,7 @@ namespace CurveFitting
{
g_log.debug() << "Iteration " << iter << ", cost function = " << minimizer->costFunctionVal() << "\n";
}
++iter;
}
g_log.debug() << "Number of minimizer iterations=" << iter << "\n";

Expand Down
Expand Up @@ -43,7 +43,7 @@ m_rho(1.0)
}

/// Initialize minimizer, i.e. pass a function to minimize.
void LevenbergMarquardtMDMinimizer::initialize(API::ICostFunction_sptr function)
void LevenbergMarquardtMDMinimizer::initialize(API::ICostFunction_sptr function, size_t)
{
m_leastSquares = boost::dynamic_pointer_cast<CostFuncLeastSquares>(function);
if ( !m_leastSquares )
Expand All @@ -56,7 +56,7 @@ void LevenbergMarquardtMDMinimizer::initialize(API::ICostFunction_sptr function)
}

/// Do one iteration.
bool LevenbergMarquardtMDMinimizer::iterate()
bool LevenbergMarquardtMDMinimizer::iterate(size_t)
{
const bool debug = getProperty("Debug");
const double muMax = getProperty("MuMax");
Expand Down
Expand Up @@ -35,7 +35,7 @@ LevenbergMarquardtMinimizer::LevenbergMarquardtMinimizer()
declareProperty("RelError", m_relError, "Relative error allowed for parameters - a stopping parameter in success.");
}

void LevenbergMarquardtMinimizer::initialize(API::ICostFunction_sptr costFunction)
void LevenbergMarquardtMinimizer::initialize(API::ICostFunction_sptr costFunction, size_t)
{
// set-up GSL container to be used with GSL simplex algorithm
auto leastSquares = boost::dynamic_pointer_cast<CostFuncLeastSquares>(costFunction);
Expand Down Expand Up @@ -86,7 +86,7 @@ LevenbergMarquardtMinimizer::~LevenbergMarquardtMinimizer()
}
}

bool LevenbergMarquardtMinimizer::iterate()
bool LevenbergMarquardtMinimizer::iterate(size_t)
{
m_absError = getProperty("AbsError");
m_relError = getProperty("RelError");
Expand Down
4 changes: 2 additions & 2 deletions Code/Mantid/Framework/CurveFitting/src/SimplexMinimizer.cpp
Expand Up @@ -57,7 +57,7 @@ m_gslSolver(NULL)
{
}

void SimplexMinimizer::initialize(API::ICostFunction_sptr function)
void SimplexMinimizer::initialize(API::ICostFunction_sptr function, size_t)
{
m_costFunction = function;

Expand Down Expand Up @@ -90,7 +90,7 @@ void SimplexMinimizer::initialize(API::ICostFunction_sptr function)
* Do one iteration.
* @return :: true if iterations to be continued, false if they can stop
*/
bool SimplexMinimizer::iterate()
bool SimplexMinimizer::iterate(size_t)
{
int status = gsl_multimin_fminimizer_iterate(m_gslSolver);
if (status)
Expand Down

0 comments on commit dfea396

Please sign in to comment.