IpIpoptData.hpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef __IPIPOPTDATA_HPP__
00010 #define __IPIPOPTDATA_HPP__
00011
00012 #include "IpSymMatrix.hpp"
00013 #include "IpOptionsList.hpp"
00014 #include "IpIteratesVector.hpp"
00015 #include "IpRegOptions.hpp"
00016 #include "IpTimingStatistics.hpp"
00017
00018 namespace Ipopt
00019 {
00020
00021
00022 class IpoptNLP;
00023
00033 class IpoptData : public ReferencedObject
00034 {
00035 public:
00039 IpoptData();
00040
00042 ~IpoptData();
00044
00046 bool InitializeDataStructures(IpoptNLP& ip_nlp,
00047 bool want_x,
00048 bool want_y_c,
00049 bool want_y_d,
00050 bool want_z_L,
00051 bool want_z_U);
00052
00056 bool Initialize(const Journalist& jnlst,
00057 const OptionsList& options,
00058 const std::string& prefix);
00059
00063 SmartPtr<const IteratesVector> curr() const;
00064
00069
00070
00072 SmartPtr<const IteratesVector> trial() const;
00073
00078
00079
00084 void set_trial(SmartPtr<IteratesVector>& trial);
00085
00089 void SetTrialPrimalVariablesFromStep(Number alpha,
00090 const Vector& delta_x,
00091 const Vector& delta_s);
00096 void SetTrialEqMultipliersFromStep(Number alpha,
00097 const Vector& delta_y_c,
00098 const Vector& delta_y_d);
00103 void SetTrialBoundMultipliersFromStep(Number alpha,
00104 const Vector& delta_z_L,
00105 const Vector& delta_z_U,
00106 const Vector& delta_v_L,
00107 const Vector& delta_v_U);
00108
00112
00113
00114
00116 SmartPtr<const IteratesVector> delta() const;
00117
00122 void set_delta(SmartPtr<IteratesVector>& delta);
00123
00125 SmartPtr<const IteratesVector> delta_aff() const;
00126
00131 void set_delta_aff(SmartPtr<IteratesVector>& delta_aff);
00132
00133
00135 SmartPtr<const SymMatrix> W()
00136 {
00137 DBG_ASSERT(IsValid(W_));
00138 return W_;
00139 }
00140
00142 void Set_W(SmartPtr<const SymMatrix> W)
00143 {
00144 W_ = W;
00145 }
00146
00153
00161 bool HaveDeltas() const
00162 {
00163 return have_deltas_;
00164 }
00165
00171 void SetHaveDeltas(bool have_deltas)
00172 {
00173 have_deltas_ = have_deltas;
00174 }
00176
00183
00191 bool HaveAffineDeltas() const
00192 {
00193 return have_affine_deltas_;
00194 }
00195
00201 void SetHaveAffineDeltas(bool have_affine_deltas)
00202 {
00203 have_affine_deltas_ = have_affine_deltas;
00204 }
00206
00207
00211 void CopyTrialToCurrent();
00212
00215 void AcceptTrialPoint();
00217
00220 Index iter_count() const
00221 {
00222 return iter_count_;
00223 }
00224 void Set_iter_count(Index iter_count)
00225 {
00226 iter_count_ = iter_count;
00227 }
00228
00229 Number curr_mu() const
00230 {
00231 DBG_ASSERT(mu_initialized_);
00232 return curr_mu_;
00233 }
00234 void Set_mu(Number mu)
00235 {
00236 curr_mu_ = mu;
00237 mu_initialized_ = true;
00238 }
00239 bool MuInitialized() const
00240 {
00241 return mu_initialized_;
00242 }
00243
00244 Number curr_tau() const
00245 {
00246 DBG_ASSERT(tau_initialized_);
00247 return curr_tau_;
00248 }
00249 void Set_tau(Number tau)
00250 {
00251 curr_tau_ = tau;
00252 tau_initialized_ = true;
00253 }
00254 bool TauInitialized() const
00255 {
00256 return tau_initialized_;
00257 }
00258
00259 void SetFreeMuMode(bool free_mu_mode)
00260 {
00261 free_mu_mode_ = free_mu_mode;
00262 }
00263 bool FreeMuMode() const
00264 {
00265 return free_mu_mode_;
00266 }
00267
00270 void Set_tiny_step_flag(bool flag)
00271 {
00272 tiny_step_flag_ = flag;
00273 }
00274 bool tiny_step_flag()
00275 {
00276 return tiny_step_flag_;
00277 }
00279
00286 Number tol() const
00287 {
00288 DBG_ASSERT(initialize_called_);
00289 return tol_;
00290 }
00298 void Set_tol(Number tol)
00299 {
00300 tol_ = tol;
00301 }
00303
00306 Number info_regu_x() const
00307 {
00308 return info_regu_x_;
00309 }
00310 void Set_info_regu_x(Number regu_x)
00311 {
00312 info_regu_x_ = regu_x;
00313 }
00314 Number info_alpha_primal() const
00315 {
00316 return info_alpha_primal_;
00317 }
00318 void Set_info_alpha_primal(Number alpha_primal)
00319 {
00320 info_alpha_primal_ = alpha_primal;
00321 }
00322 char info_alpha_primal_char() const
00323 {
00324 return info_alpha_primal_char_;
00325 }
00326 void Set_info_alpha_primal_char(char info_alpha_primal_char)
00327 {
00328 info_alpha_primal_char_ = info_alpha_primal_char;
00329 }
00330 Number info_alpha_dual() const
00331 {
00332 return info_alpha_dual_;
00333 }
00334 void Set_info_alpha_dual(Number alpha_dual)
00335 {
00336 info_alpha_dual_ = alpha_dual;
00337 }
00338 Index info_ls_count() const
00339 {
00340 return info_ls_count_;
00341 }
00342 void Set_info_ls_count(Index ls_count)
00343 {
00344 info_ls_count_ = ls_count;
00345 }
00346 bool info_skip_output() const
00347 {
00348 return info_skip_output_;
00349 }
00350 void Append_info_string(const std::string& add_str)
00351 {
00352 info_string_ += add_str;
00353 }
00354 const std::string& info_string() const
00355 {
00356 return info_string_;
00357 }
00360 void Set_info_skip_output(bool info_skip_output)
00361 {
00362 info_skip_output_ = info_skip_output;
00363 }
00364
00366 void ResetInfo()
00367 {
00368 info_regu_x_ = 0;
00369 info_alpha_primal_ = 0;
00370 info_alpha_dual_ = 0.;
00371 info_alpha_primal_char_ = ' ';
00372 info_ls_count_ = 0;
00373 info_skip_output_ = false;
00374 info_string_.clear();
00375 }
00377
00379 TimingStatistics& TimingStats()
00380 {
00381 return timing_statistics_;
00382 }
00383
00386 static void RegisterOptions(const SmartPtr<RegisteredOptions>& roptions);
00388
00389 private:
00394 SmartPtr<const IteratesVector> curr_;
00395
00398 SmartPtr<const IteratesVector> trial_;
00399
00401 SmartPtr<const SymMatrix> W_;
00402
00405 SmartPtr<const IteratesVector> delta_;
00413 bool have_deltas_;
00415
00421 SmartPtr<const IteratesVector> delta_aff_;
00428 bool have_affine_deltas_;
00430
00432 Index iter_count_;
00433
00435 Number curr_mu_;
00436 bool mu_initialized_;
00437
00439 Number curr_tau_;
00440 bool tau_initialized_;
00441
00444 bool initialize_called_;
00445
00448 bool have_prototypes_;
00449
00456 Number tol_;
00458
00462 bool free_mu_mode_;
00464 bool tiny_step_flag_;
00466
00470 Number info_regu_x_;
00472 Number info_alpha_primal_;
00474 char info_alpha_primal_char_;
00476 Number info_alpha_dual_;
00478 Index info_ls_count_;
00481 bool info_skip_output_;
00483 std::string info_string_;
00485
00487 SmartPtr<IteratesVectorSpace> iterates_space_;
00488
00491 TimingStatistics timing_statistics_;
00492
00502 IpoptData(const IpoptData&);
00503
00505 void operator=(const IpoptData&);
00507
00508 #ifdef IP_DEBUG
00509
00513 TaggedObject::Tag debug_curr_tag_;
00514 TaggedObject::Tag debug_trial_tag_;
00515 TaggedObject::Tag debug_delta_tag_;
00516 TaggedObject::Tag debug_delta_aff_tag_;
00517 TaggedObject::Tag debug_curr_tag_sum_;
00518 TaggedObject::Tag debug_trial_tag_sum_;
00519 TaggedObject::Tag debug_delta_tag_sum_;
00520 TaggedObject::Tag debug_delta_aff_tag_sum_;
00522 #endif
00523
00524 };
00525
00526 inline
00527 SmartPtr<const IteratesVector> IpoptData::curr() const
00528 {
00529 #ifdef IP_DEBUG
00530 DBG_ASSERT(IsNull(curr_) || (curr_->GetTag() == debug_curr_tag_ && curr_->GetTagSum() == debug_curr_tag_sum_) );
00531 #endif
00532
00533 return curr_;
00534 }
00535
00536 inline
00537 SmartPtr<const IteratesVector> IpoptData::trial() const
00538 {
00539 #ifdef IP_DEBUG
00540 DBG_ASSERT(IsNull(trial_) || (trial_->GetTag() == debug_trial_tag_ && trial_->GetTagSum() == debug_trial_tag_sum_) );
00541 #endif
00542
00543 return trial_;
00544 }
00545
00546 inline
00547 SmartPtr<const IteratesVector> IpoptData::delta() const
00548 {
00549 # ifdef IP_DEBUG
00550 DBG_ASSERT(IsNull(delta_) || (delta_->GetTag() == debug_delta_tag_ && delta_->GetTagSum() == debug_delta_tag_sum_) );
00551 # endif
00552
00553 return delta_;
00554 }
00555
00556 inline
00557 SmartPtr<const IteratesVector> IpoptData::delta_aff() const
00558 {
00559 # ifdef IP_DEBUG
00560 DBG_ASSERT(IsNull(delta_aff_) || (delta_aff_->GetTag() == debug_delta_aff_tag_ && delta_aff_->GetTagSum() == debug_delta_aff_tag_sum_) );
00561 # endif
00562
00563 return delta_aff_;
00564 }
00565
00566 inline
00567 void IpoptData::CopyTrialToCurrent()
00568 {
00569 curr_ = trial_;
00570 #ifdef IP_DEBUG
00571
00572 if (IsValid(curr_)) {
00573 debug_curr_tag_ = curr_->GetTag();
00574 debug_curr_tag_sum_ = curr_->GetTagSum();
00575 }
00576 else {
00577 debug_curr_tag_ = 0;
00578 debug_curr_tag_sum_ = 0;
00579 }
00580 #endif
00581
00582 }
00583
00584 inline
00585 void IpoptData::set_trial(SmartPtr<IteratesVector>& trial)
00586 {
00587 trial_ = ConstPtr(trial);
00588
00589 #ifdef IP_DEBUG
00590
00591 DBG_ASSERT(trial_->OwnerSpace() == (VectorSpace*)GetRawPtr(iterates_space_));
00592 if (IsValid(trial)) {
00593 debug_trial_tag_ = trial->GetTag();
00594 debug_trial_tag_sum_ = trial->GetTagSum();
00595 }
00596 else {
00597 debug_trial_tag_ = 0;
00598 debug_trial_tag_sum_ = 0;
00599 }
00600 #endif
00601
00602 trial = NULL;
00603 }
00604
00605 inline
00606 void IpoptData::set_delta(SmartPtr<IteratesVector>& delta)
00607 {
00608 delta_ = ConstPtr(delta);
00609 #ifdef IP_DEBUG
00610
00611 if (IsValid(delta)) {
00612 debug_delta_tag_ = delta->GetTag();
00613 debug_delta_tag_sum_ = delta->GetTagSum();
00614 }
00615 else {
00616 debug_delta_tag_ = 0;
00617 debug_delta_tag_sum_ = 0;
00618 }
00619 #endif
00620
00621 delta = NULL;
00622 }
00623
00624 inline
00625 void IpoptData::set_delta_aff(SmartPtr<IteratesVector>& delta_aff)
00626 {
00627 delta_aff_ = ConstPtr(delta_aff);
00628 #ifdef IP_DEBUG
00629
00630 if (IsValid(delta_aff)) {
00631 debug_delta_aff_tag_ = delta_aff->GetTag();
00632 debug_delta_aff_tag_sum_ = delta_aff->GetTagSum();
00633 }
00634 else {
00635 debug_delta_aff_tag_ = 0;
00636 debug_delta_aff_tag_sum_ = delta_aff->GetTagSum();
00637 }
00638 #endif
00639
00640 delta_aff = NULL;
00641 }
00642
00643 }
00644
00645 #endif