44 #include "MoochoPack_CheckDecompositionFromRPy_Step.hpp"
45 #include "MoochoPack_moocho_algo_conversion.hpp"
46 #include "IterationPack_print_algorithm_step.hpp"
47 #include "AbstractLinAlgPack_MatrixOpNonsing.hpp"
48 #include "AbstractLinAlgPack_Vector.hpp"
49 #include "AbstractLinAlgPack_LinAlgOpPack.hpp"
51 namespace MoochoPack {
53 CheckDecompositionFromRPy_Step::CheckDecompositionFromRPy_Step(
54 const new_decomp_strategy_ptr_t &new_decomp_strategy
55 ,value_type max_decomposition_cond_change_frac
57 :new_decomp_strategy_(new_decomp_strategy)
58 ,max_decomposition_cond_change_frac_(max_decomposition_cond_change_frac)
64 beta_min_ = std::numeric_limits<value_type>::max();
70 , IterationPack::EDoStepType type,
poss_type assoc_step_poss )
72 NLPAlgo &algo = rsqp_algo(_algo);
74 const Range1D equ_decomp = s.equ_decomp();
75 EJournalOutputLevel olevel = algo.algo_cntr().journal_output_level();
79 if( static_cast<int>(olevel) >= static_cast<int>(PRINT_ALGORITHM_STEPS) ) {
80 using IterationPack::print_algorithm_step;
81 print_algorithm_step( algo, step_poss, type, assoc_step_poss, out );
84 bool select_new_decomposition =
false;
87 const Vector &py_k = s.py().get_k(0);
88 const Vector &c_k = s.c().get_k(0);
89 Vector::vec_ptr_t c_decomp_k = c_k.sub_view(equ_decomp);
90 VectorMutable::vec_mut_ptr_t resid = c_decomp_k->space().create_member();
97 small_num = std::numeric_limits<value_type>::min(),
98 epsilon = std::numeric_limits<value_type>::epsilon(),
99 nrm_resid = resid->norm_inf(),
100 nrm_c_decomp = c_decomp_k->norm_inf(),
101 beta = nrm_resid / (nrm_c_decomp+small_num);
103 if( (
int)olevel >= (int)PRINT_ALGORITHM_STEPS ) {
104 out <<
"\nbeta = ||R*py_k + c_k(decomp)||inf / (||c_k(decomp)||inf + small_number)"
105 <<
"\n = "<<nrm_resid<<
" / ("<<nrm_c_decomp<<
" + "<<small_num<<
")"
106 <<
"\n = " << beta << std::endl;
110 IterQuantityAccess<index_type>
111 &num_basis_iq = s.num_basis();
112 if( num_basis_iq.updated_k(0) ) {
113 if( (
int)olevel >= (int)PRINT_ALGORITHM_STEPS )
114 out <<
"\nnum_basis_k was updated so the basis changed so we will skip this check\n"
115 <<
" reset min ||R*py+c||/||c|| to current value + epsilon(" << epsilon <<
")\n";
116 beta_min_ = beta + epsilon;
121 if( beta < beta_min_ ) {
125 if( beta / beta_min_ > max_decomposition_cond_change_frac() ) {
126 if( (
int)olevel >= (int)PRINT_BASIC_ALGORITHM_INFO ) {
128 <<
"\nbeta_change = ( ||R*py+c||/||c|| = " << beta
129 <<
" ) / ( min ||R*py+c||/||c|| = " << beta_min_ <<
" )\n"
130 <<
" = " << (beta/beta_min_) <<
" > max_decomposition_cond_change_frac = "
131 << max_decomposition_cond_change_frac()
132 <<
"\n\nSelecting a new decomposition"
133 <<
" (k = " << algo.
state().
k() <<
") ...\n";
135 select_new_decomposition =
true;
138 if(select_new_decomposition) {
140 return new_decomp_strategy().new_decomposition(algo,step_poss,type,assoc_step_poss);
147 , IterationPack::EDoStepType type,
poss_type assoc_step_poss
148 , std::ostream& out,
const std::string& L )
const
151 << L <<
"*** Try to detect when the decomposition is becomming illconditioned\n"
152 << L <<
"default: beta_min = inf\n"
153 << L <<
" max_decomposition_cond_change_frac = " << max_decomposition_cond_change_frac() << std::endl
154 << L <<
"beta = norm_inf(R*py_k + c_k(decomp)) / (norm_inf(c_k(decomp))+small_number)\n"
155 << L <<
"select_new_decomposition = false\n"
156 << L <<
"if num_basis_k is updated then\n"
157 << L <<
" beta_min = beta\n"
159 << L <<
"if beta < beta_min then\n"
160 << L <<
" beta_min = beta\n"
162 << L <<
" if beta/ beta_min > max_decomposition_cond_change_frac then\n"
163 << L <<
" select_new_decomposition = true\n"
166 << L <<
"if select_new_decomposition == true then\n"
167 << L <<
" new decomposition selection : " <<
typeName(new_decomp_strategy()) << std::endl
169 new_decomp_strategy().print_new_decomposition(
170 rsqp_algo(algo),step_poss,type,assoc_step_poss,out, L +
" " );
172 << L <<
" end new decomposition selection\n"
rSQP Algorithm control class.
virtual std::ostream & journal_out() const
void reset()
Call the reset initialization of all defaults.
Reduced space SQP state encapsulation interface.
AlgorithmTracker & track()
bool do_step(Algorithm &algo, poss_type step_poss, IterationPack::EDoStepType type, poss_type assoc_step_poss)
NLPAlgoState & rsqp_state()
<<std aggr>="">> members for algo_cntr
void print_step(const Algorithm &algo, poss_type step_poss, IterationPack::EDoStepType type, poss_type assoc_step_poss, std::ostream &out, const std::string &leading_str) const
std::string typeName(const T &t)
void Vp_V(VectorMutable *v_lhs, const V &V_rhs)