예제 #1
0
double FDistToMinTest::getTestValue(const NativeSolver &s) const
{
  if(relative_ == false)
    return s.getFVal() - fMin_;
  else
  {
    double v = (s.getFVal() - fMin_) / fabs(fMin_);
    return v > 0.0 ? v : NAN;
  }
}
예제 #2
0
double XDistToMinTest::getTestValue(const NativeSolver &s) const
{
  vector< double > dx = s.getX() - xMin_;
  
  if(relative_ == false)
    return norm_2(dx);
  else
    return norm_2(dx) / norm_2(xMin_);
}
예제 #3
0
double MaxNumIterTest::getTestValue(const NativeSolver &s) const
{
  return s.getNumIter();
}
예제 #4
0
bool MaxNumIterTest::test(const NativeSolver &s) const
{
  return (s.getNumIter() >= n_);
}
예제 #5
0
void MinimizerThread::run()
{
  boost::numeric::ublas::vector< double > x0(2);
  x0(0) = x0_;
  x0(1) = y0_;
  
  if(!solver_->isExternalSolver())
  {
    NativeSolver *nativeSolver = dynamic_cast< NativeSolver * >(solver_);
    
    if(C_ != NULL)
      solver_->setup(*objFunc_, x0, Solver::DefaultSetup(), *C_);
    else
      solver_->setup(*objFunc_, x0, Solver::DefaultSetup(), NoConstraints());
    results_.iterates.clear();
    results_.iterates.push_back(x0);
    if(nativeSolver->getM() > 1)
    {
      results_.iteratePointSets.clear();
      results_.iteratePointSets.push_back(nativeSolver->getXArray());
    }
    
    unsigned int nIter = 0;
    NativeSolver::IterationStatus status = NativeSolver::ITERATION_CONTINUE;
    while(status == NativeSolver::ITERATION_CONTINUE && 
          (nativeSolver->hasBuiltInStoppingCriterion() || 
           !stopCrit_->test(*nativeSolver)) && 
          nIter < 10000 && !terminationFlag_)
    {
      status = nativeSolver->iterate();
      results_.iterates.push_back(nativeSolver->getX());
      if(nativeSolver->getM() > 1)
        results_.iteratePointSets.push_back(nativeSolver->getXArray());
      nIter++;
    }
    results_.xMin = nativeSolver->getX()[0];
    results_.yMin = nativeSolver->getX()[1];
    results_.fMin = nativeSolver->getFVal();
    results_.numIter = nativeSolver->getNumIter();
    results_.numFuncEval = nativeSolver->getNumFuncEval();
    results_.numGradEval = nativeSolver->getNumGradEval();
  }
  else
  {
    // TODO: stopping criterion for LMBM?
    boost::shared_ptr< Solver::Results > results = 
      solver_->solve(*objFunc_, x0, GradNormTest(1e-8));
    
    results_.xMin        = results->xMin[0];
    results_.yMin        = results->xMin[1];
    results_.fMin        = results->fMin;
    results_.numIter     = results->numIter;
    results_.numFuncEval = results->numFuncEval;
    results_.numGradEval = results->numGradEval;
    //results_.iterates    = results->iterates; // TODO: iterates?
  }
}