/* ************************************************************************* */ boost::shared_ptr<GaussianFactor> LinearizedJacobianFactor::linearize(const Values& c) const { // Create the 'terms' data structure for the Jacobian constructor std::vector<std::pair<Key, Matrix> > terms; for(Key key: keys()) { terms.push_back(std::make_pair(key, this->A(key))); } // compute rhs Vector b = -error_vector(c); return boost::shared_ptr<GaussianFactor>(new JacobianFactor(terms, b, noiseModel::Unit::Create(dim()))); }
TEUCHOS_UNIT_TEST( MCSA, MCSA_test) { int problem_size = 16; Epetra_SerialComm comm; Epetra_Map map( problem_size, 0, comm ); std::vector<double> x_vector( problem_size ); Epetra_Vector x( View, map, &x_vector[0] ); std::vector<double> x_aztec_vector( problem_size ); Epetra_Vector x_aztec( View, map, &x_aztec_vector[0] ); std::vector<double> b_vector( problem_size, 0.4 ); Epetra_Vector b( View, map, &b_vector[0] ); Teuchos::RCP<Epetra_CrsMatrix> A = Teuchos::rcp( new Epetra_CrsMatrix( Copy, map, problem_size ) ); double lower_diag = -0.1; double diag = 2.4; double upper_diag = -0.1; int global_row = 0; int lower_row = 0; int upper_row = 0; for ( int i = 0; i < problem_size; ++i ) { global_row = A->GRID(i); lower_row = i-1; upper_row = i+1; if ( lower_row > -1 ) { A->InsertGlobalValues( global_row, 1, &lower_diag, &lower_row ); } A->InsertGlobalValues( global_row, 1, &diag, &global_row ); if ( upper_row < problem_size ) { A->InsertGlobalValues( global_row, 1, &upper_diag, &upper_row ); } } A->FillComplete(); double spec_rad_A = HMCSA::OperatorTools::spectralRadius( A ); std::cout << std::endl << "Operator spectral radius: " << spec_rad_A << std::endl; Teuchos::RCP<Epetra_LinearProblem> linear_problem = Teuchos::rcp( new Epetra_LinearProblem( A.getRawPtr(), &x, &b ) ); HMCSA::JacobiPreconditioner preconditioner( linear_problem ); preconditioner.precondition(); HMCSA::MCSA mcsa_solver( linear_problem ); mcsa_solver.iterate( 100, 1.0e-8, 100, 1.0e-8 ); std::cout << "MCSA ITERS: " << mcsa_solver.getNumIters() << std::endl; Epetra_LinearProblem aztec_linear_problem( A.getRawPtr(), &x_aztec, &b ); AztecOO aztec_solver( aztec_linear_problem ); aztec_solver.SetAztecOption( AZ_solver, AZ_gmres ); aztec_solver.Iterate( 100, 1.0e-8 ); std::vector<double> error_vector( problem_size ); Epetra_Vector error( View, map, &error_vector[0] ); for (int i = 0; i < problem_size; ++i) { error[i] = x[i] - x_aztec[i]; } double error_norm; error.Norm2( &error_norm ); std::cout << std::endl << "Aztec GMRES vs. MCSA absolute error L2 norm: " << error_norm << std::endl; }
/* ************************************************************************* */ double LinearizedJacobianFactor::error(const Values& c) const { Vector errorVector = error_vector(c); return 0.5 * errorVector.dot(errorVector); }