本文整理汇总了C++中AbstractLinAlgPack::IP_comp_err_with_mu方法的典型用法代码示例。如果您正苦于以下问题:C++ AbstractLinAlgPack::IP_comp_err_with_mu方法的具体用法?C++ AbstractLinAlgPack::IP_comp_err_with_mu怎么用?C++ AbstractLinAlgPack::IP_comp_err_with_mu使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类AbstractLinAlgPack
的用法示例。
在下文中一共展示了AbstractLinAlgPack::IP_comp_err_with_mu方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: Converged
bool CheckConvergenceIP_Strategy::Converged(
Algorithm& _algo
)
{
using Teuchos::dyn_cast;
using AbstractLinAlgPack::num_bounded;
using AbstractLinAlgPack::IP_comp_err_with_mu;
// Calculate kkt errors and check for overall convergence
//bool found_solution = CheckConvergenceStd_Strategy::Converged(_algo);
bool found_solution = false;
// Recalculate the complementarity error including mu
// Get the iteration quantities
IpState &s = dyn_cast<IpState>(*_algo.get_state());
NLPAlgo& algo = rsqp_algo(_algo);
NLP& nlp = algo.nlp();
EJournalOutputLevel olevel = algo.algo_cntr().journal_output_level();
std::ostream& out = algo.track().journal_out();
// Get necessary iteration quantities
const value_type &mu_km1 = s.barrier_parameter().get_k(-1);
const Vector& x_k = s.x().get_k(0);
const VectorMutable& Gf_k = s.Gf().get_k(0);
const Vector& rGL_k = s.rGL().get_k(0);
const Vector& c_k = s.c().get_k(0);
const Vector& vl_k = s.Vl().get_k(0).diag();
const Vector& vu_k = s.Vu().get_k(0).diag();
// Calculate the errors with Andreas' scaling
value_type& opt_err = s.opt_kkt_err().set_k(0);
value_type& feas_err = s.feas_kkt_err().set_k(0);
value_type& comp_err = s.comp_kkt_err().set_k(0);
value_type& comp_err_mu = s.comp_err_mu().set_k(0);
// scaling
value_type scale_1 = 1 + x_k.norm_1()/x_k.dim();
Teuchos::RCP<VectorMutable> temp = Gf_k.clone();
temp->axpy(-1.0, vl_k);
temp->axpy(1.0, vu_k);
value_type scale_2 = temp->norm_1();
scale_2 += vl_k.norm_1() + vu_k.norm_1();
*temp = nlp.infinite_bound();
const size_type nlb = num_bounded(nlp.xl(), *temp, nlp.infinite_bound());
*temp = -nlp.infinite_bound();
const size_type nub = num_bounded(*temp, nlp.xu(), nlp.infinite_bound());
scale_2 = 1 + scale_2/(1+nlp.m()+nlb+nub);
// Calculate the opt_err
opt_err = rGL_k.norm_inf() / scale_2;
// Calculate the feas_err
feas_err = c_k.norm_inf() / scale_1;
// Calculate the comp_err
if( (int)olevel >= (int)PRINT_VECTORS )
{
out << "\nx =\n" << s.x().get_k(0);
out << "\nxl =\n" << nlp.xl();
out << "\nvl =\n" << s.Vl().get_k(0).diag();
out << "\nxu =\n" << nlp.xu();
out << "\nvu =\n" << s.Vu().get_k(0).diag();
}
comp_err = IP_comp_err_with_mu(
0.0, nlp.infinite_bound(), s.x().get_k(0), nlp.xl(), nlp.xu()
,s.Vl().get_k(0).diag(), s.Vu().get_k(0).diag());
comp_err_mu = IP_comp_err_with_mu(
mu_km1, nlp.infinite_bound(), s.x().get_k(0), nlp.xl(), nlp.xu()
,s.Vl().get_k(0).diag(), s.Vu().get_k(0).diag());
comp_err = comp_err / scale_2;
comp_err_mu = comp_err_mu / scale_2;
// check for convergence
const value_type opt_tol = algo.algo_cntr().opt_tol();
const value_type feas_tol = algo.algo_cntr().feas_tol();
const value_type comp_tol = algo.algo_cntr().comp_tol();
if (opt_err < opt_tol && feas_err < feas_tol && comp_err < comp_tol)
{
found_solution = true;
}
if( int(olevel) >= int(PRINT_ALGORITHM_STEPS) || (int(olevel) >= int(PRINT_BASIC_ALGORITHM_INFO) && found_solution) )
{
out
<< "\nopt_kkt_err_k = " << opt_err << ( opt_err < opt_tol ? " < " : " > " )
<< "opt_tol = " << opt_tol
<< "\nfeas_kkt_err_k = " << feas_err << ( feas_err < feas_tol ? " < " : " > " )
<< "feas_tol = " << feas_tol
<< "\ncomp_kkt_err_k = " << comp_err << ( comp_err < comp_tol ? " < " : " > " )
<< "comp_tol = " << comp_tol
<< "\ncomp_err_mu = " << comp_err_mu
//.........这里部分代码省略.........