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 )
59 ,max_cond_( 0.01 / std::numeric_limits<
value_type>::epsilon() )
76 const Range1D equ_decomp = s.equ_decomp();
86 bool select_new_decomposition =
false;
90 beta = s.py().get_k(0).norm_inf() / (s.c().get_k(0).sub_view(equ_decomp)->norm_inf()+small_num);
93 out <<
"\nbeta = ||py||/||c|| = " << beta << std::endl;
97 IterQuantityAccess<index_type>
98 &num_basis_iq = s.num_basis();
99 if( num_basis_iq.updated_k(0) ) {
101 out <<
"\nnum_basis_k was updated so the basis changed so we will skip this check\n"
102 <<
" reset min ||py||/||c|| to current value + 1\n";
111 if( (beta + 1.0)/
beta_min_ > max_decomposition_cond_change_frac() ) {
113 out <<
"Select a new decomposition"
114 <<
" (k = " << algo.
state().
k() <<
")\n"
115 <<
"beta_change = ( ||py||/||c|| = " << beta
116 <<
" ) / ( min ||py||/||c|| = " <<
beta_min_ <<
" )\n"
117 <<
"beta_change = " << (beta/
beta_min_) <<
" > max_decomposition_cond_change_frac = "
118 << max_decomposition_cond_change_frac() << std::endl;
120 select_new_decomposition =
true;
123 if( !select_new_decomposition && beta > max_cond() ) {
125 out <<
"\nConditioning of decomposition matrix is > " << beta
126 <<
" > max_cond = " << max_cond() << std::endl
127 <<
"Selecting a new decomposition ... "
128 <<
" (k = " << algo.
state().
k() <<
")\n";
130 select_new_decomposition =
true;
133 if(select_new_decomposition) {
135 return new_decomp_strategy().new_decomposition(algo,step_poss,type,assoc_step_poss);
144 ,std::ostream&
out,
const std::string& L )
const
147 << L <<
"default: beta_min = inf\n"
148 << L <<
" max_decomposition_cond_change_frac = " << max_decomposition_cond_change_frac() << std::endl
149 << L <<
" max_cond = 0.01 * mach_eps\n"
150 << L <<
"beta = norm_inf(py_k) / (norm_inf(c_k(equ_decomp))+small_number)\n"
151 << L <<
"select_new_decomposition = false\n"
152 << L <<
"if num_basis_k is updated then\n"
153 << L <<
" beta_min = beta + 1\n"
155 << L <<
"if beta + 1 < beta_min then\n"
156 << L <<
" beta_min = beta + 1\n"
158 << L <<
" if (beta + 1) / beta_min > max_decomposition_cond_change_frac then\n"
159 << L <<
" select_new_decomposition = true\n"
162 << L <<
"if beta > max_cond then\n"
163 << L <<
" select_new_decomposition = true\n"
165 << L <<
"if select_new_decomposition == true then\n"
166 << L <<
" new decomposition selection : " <<
typeName(new_decomp_strategy()) << std::endl
168 new_decomp_strategy().print_new_decomposition(
169 rsqp_algo(algo),step_poss,type,assoc_step_poss,out, L +
" " );
171 << L <<
" end new decomposition selection\n"
std::string typeName(const T &t)
void reset()
Call the reset initialization of all defaults.
rSQP Algorithm control class.
bool do_step(Algorithm &algo, poss_type step_poss, IterationPack::EDoStepType type, poss_type assoc_step_poss)
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
virtual std::ostream & journal_out() const
Return a reference to a std::ostream to be used to output debug information and the like...
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()
AbstractLinAlgPack::value_type value_type
Acts as the central hub for an iterative algorithm.
NLPAlgoState & rsqp_state()
<<std aggr>="">> members for algo_cntr
CheckDecompositionFromPy_Step()
RangePack::Range1D Range1D
NLPAlgo & rsqp_algo(Algorithm &algo)
Convert from a Algorithm to a NLPAlgo.