void ObjectiveFunctionTests::compare_hessian_diagonal( ObjectiveFunction* of ) { MsqPrintError err(std::cout); PatchData pd; create_twelve_hex_patch( pd, err ); ASSERT_NO_ERROR( err ); std::vector<Vector3D> diag_grad, hess_grad; std::vector<SymMatrix3D> diag; MsqHessian hess; double diag_val, hess_val; bool valid; valid = of->evaluate_with_Hessian_diagonal( ObjectiveFunction::CALCULATE, pd, diag_val, diag_grad, diag, err ); ASSERT_NO_ERROR( err ); CPPUNIT_ASSERT(valid); CPPUNIT_ASSERT_EQUAL( pd.num_free_vertices(), diag_grad.size() ); CPPUNIT_ASSERT_EQUAL( pd.num_free_vertices(), diag.size() ); hess.initialize( pd, err ); ASSERT_NO_ERROR( err ); valid = of->evaluate_with_Hessian( ObjectiveFunction::CALCULATE, pd, hess_val, hess_grad, hess, err ); ASSERT_NO_ERROR( err ); CPPUNIT_ASSERT(valid); CPPUNIT_ASSERT_EQUAL( pd.num_free_vertices(), hess_grad.size() ); CPPUNIT_ASSERT_EQUAL( pd.num_free_vertices(), hess.size() ); CPPUNIT_ASSERT_DOUBLES_EQUAL( hess_val, diag_val, 1e-6 ); for (size_t i = 0; i < pd.num_free_vertices(); ++i) { CPPUNIT_ASSERT_VECTORS_EQUAL( hess_grad[i], diag_grad[i], 1e-6 ); CPPUNIT_ASSERT_MATRICES_EQUAL( *hess.get_block(i,i), diag[i], 1e-6 ); } }
bool ObjectiveFunction::evaluate_with_Hessian_diagonal( EvalType type, PatchData& pd, double& value_out, std::vector<Vector3D>& grad_out, std::vector<SymMatrix3D>& hess_diag_out, MsqError& err ) { MsqHessian hess; hess.initialize( pd, err ); MSQ_ERRZERO(err); bool val = evaluate_with_Hessian( type, pd, value_out, grad_out, hess, err ); MSQ_ERRZERO(err); hess_diag_out.resize( hess.size() ); for (size_t i = 0; i < hess.size(); ++i) hess_diag_out[i] = hess.get_block(i,i)->upper(); return val; }