void TerminationCriterionTest::test_quality_common( bool absolute, bool successive ) { MsqPrintError err(std::cout); PatchData pd; ASSERT_NO_ERROR(err); const double LIMIT = 1e-4; TerminationCriterion tc; bool (*func_ptr)(double, double, double, double); if (absolute) { if (successive) { tc.add_absolute_successive_improvement( LIMIT ); func_ptr = &limit_absolute_sucessive; } else { tc.add_absolute_quality_improvement( LIMIT ); func_ptr = &limit_absolute_quality; } } else { if (successive) { tc.add_relative_successive_improvement( LIMIT ); func_ptr = &limit_relative_sucessive; } else { tc.add_relative_quality_improvement( LIMIT ); func_ptr = &limit_relative_quality; } } const double INIT_VALUE = 10.0; objFunc.mValue = INIT_VALUE; tc.reset_inner( pd, ofEval, err ); ASSERT_NO_ERROR(err); tc.reset_patch( pd, err ); ASSERT_NO_ERROR(err); double prev = HUGE_VAL; while (!func_ptr(INIT_VALUE,prev,objFunc.mValue,LIMIT)) { CPPUNIT_ASSERT(!tc.terminate()); prev = objFunc.mValue; objFunc.mValue *= 0.1; tc.accumulate_inner( pd, objFunc.mValue, 0, err ); ASSERT_NO_ERROR(err); tc.accumulate_patch( pd, err ); ASSERT_NO_ERROR(err); } CPPUNIT_ASSERT(tc.terminate()); }