51 namespace MoochoPack {
54 const new_decomp_strategy_ptr_t &new_decomp_strategy
57 :new_decomp_strategy_(new_decomp_strategy)
58 ,max_decomposition_cond_change_frac_(max_decomposition_cond_change_frac)
74 const Range1D equ_decomp = s.equ_decomp();
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();
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);
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) ) {
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";
125 if( beta /
beta_min_ > max_decomposition_cond_change_frac() ) {
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);
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"
std::string typeName(const T &t)
rSQP Algorithm control class.
virtual std::ostream & journal_out() const
Return a reference to a std::ostream to be used to output debug information and the like...
void reset()
Call the reset initialization of all defaults.
EJournalOutputLevel
enum for journal output.
Reduced space SQP state encapsulation interface.
void print_algorithm_step(const Algorithm &algo, Algorithm::poss_type step_poss, EDoStepType type, Algorithm::poss_type assoc_step_poss, std::ostream &out)
Prints to 'out' the algorithm step.
AlgorithmTracker & track()
CheckDecompositionFromRPy_Step()
bool do_step(Algorithm &algo, poss_type step_poss, IterationPack::EDoStepType type, poss_type assoc_step_poss)
void V_MtV(VectorMutable *v_lhs, const MatrixOp &M_rhs1, BLAS_Cpp::Transp trans_rhs1, const V &V_rhs2)
v_lhs = op(M_rhs1) * V_rhs2.
AbstractLinAlgPack::value_type value_type
Acts as the central hub for an iterative algorithm.
NLPAlgoState & rsqp_state()
<<std aggr>="">> members for algo_cntr
RangePack::Range1D Range1D
NLPAlgo & rsqp_algo(Algorithm &algo)
Convert from a Algorithm to a NLPAlgo.
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
void Vp_V(VectorMutable *v_lhs, const V &V_rhs)
v_lhs += V_rhs.