void ObjectiveFunctionTests::compare_diagonal_gradient( ObjectiveFunction* of ) { MsqPrintError err(std::cout); PatchData pd; create_twelve_hex_patch( pd, err ); ASSERT_NO_ERROR( err ); std::vector<Vector3D> grad, hess_grad; std::vector<SymMatrix3D> hess; double grad_val, hess_val; bool valid; valid = of->evaluate_with_gradient( ObjectiveFunction::CALCULATE, pd, grad_val, grad, err ); ASSERT_NO_ERROR( err ); CPPUNIT_ASSERT(valid); CPPUNIT_ASSERT_EQUAL( pd.num_free_vertices(), grad.size() ); valid = of->evaluate_with_Hessian_diagonal( 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_DOUBLES_EQUAL( grad_val, hess_val, 1e-6 ); for (size_t i = 0; i < pd.num_free_vertices(); ++i) { CPPUNIT_ASSERT_VECTORS_EQUAL( grad[i], hess_grad[i], 1e-6 ); } }
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 ); } }
void ObjectiveFunctionTests::compare_numerical_gradient( ObjectiveFunction* of ) { MsqPrintError err(std::cout); PatchData pd; create_twelve_hex_patch( pd, err ); ASSERT_NO_ERROR( err ); std::vector<Vector3D> num_grad, ana_grad; double num_val, ana_val; bool valid; valid = of->evaluate_with_gradient( ObjectiveFunction::CALCULATE, pd, ana_val, ana_grad, err ); ASSERT_NO_ERROR( err ); CPPUNIT_ASSERT(valid); CPPUNIT_ASSERT_EQUAL( pd.num_free_vertices(), ana_grad.size() ); valid = of->ObjectiveFunction::evaluate_with_gradient( ObjectiveFunction::CALCULATE, pd, num_val, num_grad, err ); ASSERT_NO_ERROR( err ); CPPUNIT_ASSERT(valid); CPPUNIT_ASSERT_EQUAL( pd.num_free_vertices(), num_grad.size() ); CPPUNIT_ASSERT_DOUBLES_EQUAL( ana_val, num_val, 1e-6 ); for (size_t i = 0; i < pd.num_free_vertices(); ++i) { CPPUNIT_ASSERT_VECTORS_EQUAL( num_grad[i], ana_grad[i], 1e-3 ); } }
inline void create_twelve_hex_patch_inverted(PatchData &pd, MsqError &err) { create_twelve_hex_patch(pd,err); MSQ_CHKERR(err); move_vertex( pd, Vector3D(2,1,0), Vector3D(0,0,1.5), err ); MSQ_CHKERR(err); }