45 #include "MoochoPack_CheckDecompositionFromPy_Step.hpp"
46 #include "MoochoPack_moocho_algo_conversion.hpp"
47 #include "IterationPack_print_algorithm_step.hpp"
48 #include "AbstractLinAlgPack_Vector.hpp"
49 #include "AbstractLinAlgPack_LinAlgOpPack.hpp"
51 namespace MoochoPack {
53 CheckDecompositionFromPy_Step::CheckDecompositionFromPy_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 )
59 ,max_cond_( 0.01 / std::numeric_limits<value_type>::epsilon() )
65 beta_min_ = std::numeric_limits<value_type>::max();
74 NLPAlgo &algo = rsqp_algo(_algo);
76 const Range1D equ_decomp = s.equ_decomp();
77 EJournalOutputLevel olevel = algo.algo_cntr().journal_output_level();
81 if( static_cast<int>(olevel) >= static_cast<int>(PRINT_ALGORITHM_STEPS) ) {
82 using IterationPack::print_algorithm_step;
83 print_algorithm_step( algo, step_poss, type, assoc_step_poss, out );
86 bool select_new_decomposition =
false;
89 small_num = std::numeric_limits<value_type>::min(),
90 beta = s.py().get_k(0).norm_inf() / (s.c().get_k(0).sub_view(equ_decomp)->norm_inf()+small_num);
92 if( (
int)olevel >= (int)PRINT_ALGORITHM_STEPS ) {
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) ) {
100 if( (
int)olevel >= (int)PRINT_ALGORITHM_STEPS )
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";
103 beta_min_ = beta + 1.0;
107 if( beta + 1.0 < beta_min_ ) {
108 beta_min_ = beta + 1.0;
111 if( (beta + 1.0)/ beta_min_ > max_decomposition_cond_change_frac() ) {
112 if( (
int)olevel >= (int)PRINT_BASIC_ALGORITHM_INFO ) {
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() ) {
124 if( (
int)olevel >= (int)PRINT_BASIC_ALGORITHM_INFO ) {
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);
143 ,IterationPack::EDoStepType type,
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"
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
Reduced space SQP state encapsulation interface.
AlgorithmTracker & track()
NLPAlgoState & rsqp_state()
<<std aggr>="">> members for algo_cntr
std::string typeName(const T &t)