10 #include "IpDenseVector.hpp"
11 #include "IpIpoptData.hpp"
12 #include "IpIpoptCalculatedQuantities.hpp"
16 using namespace Ipopt;
20 IpoptInteriorWarmStarter::
21 IpoptInteriorWarmStarter(Index
n,
22 const Number* x_l,
const Number* x_u,
23 Number nlp_lower_bound_inf,
24 Number nlp_upper_bound_inf,
25 bool store_several_iterates)
27 nlp_lower_bound_inf_(nlp_lower_bound_inf),
28 nlp_upper_bound_inf_(nlp_upper_bound_inf),
29 store_several_iterates_(store_several_iterates),
33 x_l_prev_ =
new double[
n];
34 x_u_prev_ =
new double[
n];
36 for (Index i=0; i<
n; i++) {
37 x_l_prev_[i] = x_l[i];
38 x_u_prev_[i] = x_u[i];
51 const IpoptData& ip_data,
52 IpoptCalculatedQuantities& ip_cq)
55 if (mode==RestorationPhaseMode) {
60 Index iter = ip_data.iter_count();
61 Number mu = ip_data.curr_mu();
62 Number nlp_error = ip_cq.curr_nlp_error();
63 Number primal_inf = ip_cq.curr_primal_infeasibility(NORM_MAX);
64 Number dual_inf = ip_cq.curr_dual_infeasibility(NORM_MAX);
65 Number complementarity = ip_cq.curr_complementarity(0., NORM_MAX);
98 const Number* x_u_new,
99 IteratesVector& warm_start_iterate)
121 const DenseVector* d_x =
dynamic_cast<const DenseVector*
> (
GetRawPtr(prev_x));
122 const DenseVector* d_s =
dynamic_cast<const DenseVector*
> (
GetRawPtr(prev_s));
123 const DenseVector* d_z_L =
dynamic_cast<const DenseVector*
> (
GetRawPtr(prev_z_L));
124 const DenseVector* d_z_U =
dynamic_cast<const DenseVector*
> (
GetRawPtr(prev_z_U));
125 const DenseVector* d_y_c =
dynamic_cast<const DenseVector*
> (
GetRawPtr(prev_y_c));
126 const DenseVector* d_y_d =
dynamic_cast<const DenseVector*
> (
GetRawPtr(prev_y_d));
127 const DenseVector* d_v_L =
dynamic_cast<const DenseVector*
> (
GetRawPtr(prev_v_L));
128 const DenseVector* d_v_U =
dynamic_cast<const DenseVector*
> (
GetRawPtr(prev_v_U));
130 const Number* x_vals_prev = d_x->Values();
131 const Number* s_vals_prev = d_s->Values();
132 const Number* z_L_vals_prev = d_z_L->Values();
133 const Number* z_U_vals_prev = d_z_U->Values();
134 const Number* y_c_vals_prev = d_y_c->Values();
135 const Number* y_d_vals_prev = d_y_d->Values();
136 const Number* v_L_vals_prev = d_v_L->Values();
137 const Number* v_U_vals_prev = d_v_U->Values();
139 DenseVector* d_x_new =
dynamic_cast<DenseVector*
> (
GetRawPtr(warm_start_iterate.x_NonConst()));
140 DenseVector* d_s_new =
dynamic_cast<DenseVector*
> (
GetRawPtr(warm_start_iterate.s_NonConst()));
141 DenseVector* d_z_L_new =
dynamic_cast<DenseVector*
> (
GetRawPtr(warm_start_iterate.z_L_NonConst()));
142 DenseVector* d_z_U_new =
dynamic_cast<DenseVector*
> (
GetRawPtr(warm_start_iterate.z_U_NonConst()));
143 DenseVector* d_y_c_new =
dynamic_cast<DenseVector*
> (
GetRawPtr(warm_start_iterate.y_c_NonConst()));
144 DenseVector* d_y_d_new =
dynamic_cast<DenseVector*
> (
GetRawPtr(warm_start_iterate.y_d_NonConst()));
145 DenseVector* d_v_L_new =
dynamic_cast<DenseVector*
> (
GetRawPtr(warm_start_iterate.v_L_NonConst()));
146 DenseVector* d_v_U_new =
dynamic_cast<DenseVector*
> (
GetRawPtr(warm_start_iterate.v_U_NonConst()));
148 Number* x_vals_new = d_x_new->Values();
149 Number* s_vals_new = d_s_new->Values();
150 Number* z_L_vals_new = d_z_L_new->Values();
151 Number* z_U_vals_new = d_z_U_new->Values();
152 Number* y_c_vals_new = d_y_c_new->Values();
153 Number* y_d_vals_new = d_y_d_new->Values();
154 Number* v_L_vals_new = d_v_L_new->Values();
155 Number* v_U_vals_new = d_v_U_new->Values();
165 for (Index i=0; i<
n_; i++) {
166 if (x_l_new[i]<x_u_new[i]) {
168 x_vals_new[ix_new] = x_vals_prev[ix_prev];
173 z_L_vals_new[izL_new] = z_L_vals_prev[izL_prev];
179 z_U_vals_new[izU_new] = z_U_vals_prev[izU_prev];
190 DBG_ASSERT(ix_prev==prev_x->Dim());
191 DBG_ASSERT(izL_prev==prev_z_L->Dim());
192 DBG_ASSERT(izU_prev==prev_z_U->Dim());
193 DBG_ASSERT(ix_new==warm_start_iterate.x()->Dim());
194 DBG_ASSERT(izL_new==warm_start_iterate.z_L()->Dim());
195 DBG_ASSERT(izU_new==warm_start_iterate.z_U()->Dim());
198 DBG_ASSERT(prev_s->Dim()==warm_start_iterate.s()->Dim());
199 DBG_ASSERT(prev_y_d->Dim()==warm_start_iterate.s()->Dim());
200 DBG_ASSERT(prev_y_d->Dim()==warm_start_iterate.y_d()->Dim());
201 for (Index i=0; i<prev_s->Dim(); i++) {
202 s_vals_new[i] = s_vals_prev[i];
203 y_d_vals_new[i] = y_d_vals_prev[i];
205 DBG_ASSERT(prev_y_c->Dim()==warm_start_iterate.y_c()->Dim());
206 for (Index i=0; i<prev_y_c->Dim(); i++) {
207 y_c_vals_new[i] = y_c_vals_prev[i];
209 DBG_ASSERT(prev_v_L->Dim()==warm_start_iterate.v_L()->Dim());
210 for (Index i=0; i<prev_v_L->Dim(); i++) {
211 v_L_vals_new[i] = v_L_vals_prev[i];
213 DBG_ASSERT(prev_v_U->Dim()==warm_start_iterate.v_U()->Dim());
214 for (Index i=0; i<prev_v_U->Dim(); i++) {
215 v_U_vals_new[i] = v_U_vals_prev[i];
std::vector< Ipopt::SmartPtr< const Ipopt::IteratesVector > > stored_iterates_
~IpoptInteriorWarmStarter()
Default destructor.
std::vector< Ipopt::Index > stored_iter_
bool UpdateStoredIterates(Ipopt::AlgorithmMode mode, const Ipopt::IpoptData &ip_data, Ipopt::IpoptCalculatedQuantities &ip_cq)
Method for possibly storing another iterate during the current optimizatin for possible use for a war...
bool WarmStartIterate(Ipopt::Index n, const Ipopt::Number *x_l_new, const Ipopt::Number *x_u_new, Ipopt::IteratesVector &warm_start_iterate)
Method for computing the initial point based on the stored information.
std::vector< Ipopt::Number > stored_compl_
bool Finalize()
Method for doing whatever needs to be done after the parent NLP has been solved.
Ipopt::Number nlp_upper_bound_inf_
Value for a upper bound that denotes infinity.
bool store_several_iterates_
Flag indicating whether more than one iterate is to be stored.
std::vector< Ipopt::Number > stored_mu_
Ipopt::Number * x_l_prev_
U * GetRawPtr(const OSSmartPtr< U > &smart_ptr)
Ipopt::Number * x_u_prev_
std::vector< Ipopt::Number > stored_dual_inf_
Ipopt::Number nlp_lower_bound_inf_
Value for a lower bound that denotes -infinity.
Ipopt::Index n_stored_iterates_
std::vector< Ipopt::Number > stored_nlp_error_
std::vector< Ipopt::Number > stored_primal_inf_