Ipopt  trunk
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
IpIpoptData.hpp
Go to the documentation of this file.
00001 // Copyright (C) 2004, 2009 International Business Machines and others.
00002 // All Rights Reserved.
00003 // This code is published under the Eclipse Public License.
00004 //
00005 // $Id$
00006 //
00007 // Authors:  Carl Laird, Andreas Waechter     IBM    2004-08-13
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   /* Forward declaration */
00022   class IpoptNLP;
00023 
00028   class IpoptAdditionalData : public ReferencedObject
00029   {
00030   public:
00034     IpoptAdditionalData()
00035     {}
00036 
00038     virtual ~IpoptAdditionalData()
00039     {}
00041 
00045     virtual bool Initialize(const Journalist& jnlst,
00046                             const OptionsList& options,
00047                             const std::string& prefix) = 0;
00048 
00050     virtual bool InitializeDataStructures() = 0;
00051 
00055     virtual void AcceptTrialPoint() = 0;
00056 
00057   private:
00067     IpoptAdditionalData(const IpoptAdditionalData&);
00068 
00070     void operator=(const IpoptAdditionalData&);
00072   };
00073 
00083   class IpoptData : public ReferencedObject
00084   {
00085   public:
00089     IpoptData(SmartPtr<IpoptAdditionalData> add_data = NULL,
00090               Number cpu_time_start = -1.);
00091 
00093     virtual ~IpoptData();
00095 
00097     bool InitializeDataStructures(IpoptNLP& ip_nlp,
00098                                   bool want_x,
00099                                   bool want_y_c,
00100                                   bool want_y_d,
00101                                   bool want_z_L,
00102                                   bool want_z_U);
00103 
00107     bool Initialize(const Journalist& jnlst,
00108                     const OptionsList& options,
00109                     const std::string& prefix);
00110 
00114     inline
00115     SmartPtr<const IteratesVector> curr() const;
00116 
00121     //    SmartPtr<IteratesVector> curr_container() const;
00122 
00124     inline
00125     SmartPtr<const IteratesVector> trial() const;
00126 
00131     //SmartPtr<IteratesVector> trial_container() const;
00132 
00137     inline
00138     void set_trial(SmartPtr<IteratesVector>& trial);
00139 
00143     void SetTrialPrimalVariablesFromStep(Number alpha,
00144                                          const Vector& delta_x,
00145                                          const Vector& delta_s);
00150     void SetTrialEqMultipliersFromStep(Number alpha,
00151                                        const Vector& delta_y_c,
00152                                        const Vector& delta_y_d);
00157     void SetTrialBoundMultipliersFromStep(Number alpha,
00158                                           const Vector& delta_z_L,
00159                                           const Vector& delta_z_U,
00160                                           const Vector& delta_v_L,
00161                                           const Vector& delta_v_U);
00162 
00166     // void set_trial(const SmartPtr<IteratesVector>& trial_iterates);
00167     // void set_trial(SmartPtr<const IteratesVector>& trial_iterates);
00168 
00170     inline
00171     SmartPtr<const IteratesVector> delta() const;
00172 
00177     inline
00178     void set_delta(SmartPtr<IteratesVector>& delta);
00179 
00186     inline
00187     void set_delta(SmartPtr<const IteratesVector>& delta);
00188 
00190     inline
00191     SmartPtr<const IteratesVector> delta_aff() const;
00192 
00197     inline
00198     void set_delta_aff(SmartPtr<IteratesVector>& delta_aff);
00199 
00201     SmartPtr<const SymMatrix> W()
00202     {
00203       DBG_ASSERT(IsValid(W_));
00204       return W_;
00205     }
00206 
00208     void Set_W(SmartPtr<const SymMatrix> W)
00209     {
00210       W_ = W;
00211     }
00212 
00219 
00227     bool HaveDeltas() const
00228     {
00229       return have_deltas_;
00230     }
00231 
00237     void SetHaveDeltas(bool have_deltas)
00238     {
00239       have_deltas_ = have_deltas;
00240     }
00242 
00249 
00257     bool HaveAffineDeltas() const
00258     {
00259       return have_affine_deltas_;
00260     }
00261 
00267     void SetHaveAffineDeltas(bool have_affine_deltas)
00268     {
00269       have_affine_deltas_ = have_affine_deltas;
00270     }
00272 
00276     inline
00277     void CopyTrialToCurrent();
00278 
00281     void AcceptTrialPoint();
00283 
00286     Index iter_count() const
00287     {
00288       return iter_count_;
00289     }
00290     void Set_iter_count(Index iter_count)
00291     {
00292       iter_count_ = iter_count;
00293     }
00294 
00295     Number curr_mu() const
00296     {
00297       DBG_ASSERT(mu_initialized_);
00298       return curr_mu_;
00299     }
00300     void Set_mu(Number mu)
00301     {
00302       curr_mu_ = mu;
00303       mu_initialized_ = true;
00304     }
00305     bool MuInitialized() const
00306     {
00307       return mu_initialized_;
00308     }
00309 
00310     Number curr_tau() const
00311     {
00312       DBG_ASSERT(tau_initialized_);
00313       return curr_tau_;
00314     }
00315     void Set_tau(Number tau)
00316     {
00317       curr_tau_ = tau;
00318       tau_initialized_ = true;
00319     }
00320     bool TauInitialized() const
00321     {
00322       return tau_initialized_;
00323     }
00324 
00325     void SetFreeMuMode(bool free_mu_mode)
00326     {
00327       free_mu_mode_ = free_mu_mode;
00328     }
00329     bool FreeMuMode() const
00330     {
00331       return free_mu_mode_;
00332     }
00333 
00336     void Set_tiny_step_flag(bool flag)
00337     {
00338       tiny_step_flag_ = flag;
00339     }
00340     bool tiny_step_flag()
00341     {
00342       return tiny_step_flag_;
00343     }
00345 
00352     Number tol() const
00353     {
00354       DBG_ASSERT(initialize_called_);
00355       return tol_;
00356     }
00364     void Set_tol(Number tol)
00365     {
00366       tol_ = tol;
00367     }
00369 
00373     Number cpu_time_start() const
00374     {
00375       return cpu_time_start_;
00376     }
00377 
00380     Number info_regu_x() const
00381     {
00382       return info_regu_x_;
00383     }
00384     void Set_info_regu_x(Number regu_x)
00385     {
00386       info_regu_x_ = regu_x;
00387     }
00388     Number info_alpha_primal() const
00389     {
00390       return info_alpha_primal_;
00391     }
00392     void Set_info_alpha_primal(Number alpha_primal)
00393     {
00394       info_alpha_primal_ = alpha_primal;
00395     }
00396     char info_alpha_primal_char() const
00397     {
00398       return info_alpha_primal_char_;
00399     }
00400     void Set_info_alpha_primal_char(char info_alpha_primal_char)
00401     {
00402       info_alpha_primal_char_ = info_alpha_primal_char;
00403     }
00404     Number info_alpha_dual() const
00405     {
00406       return info_alpha_dual_;
00407     }
00408     void Set_info_alpha_dual(Number alpha_dual)
00409     {
00410       info_alpha_dual_ = alpha_dual;
00411     }
00412     Index info_ls_count() const
00413     {
00414       return info_ls_count_;
00415     }
00416     void Set_info_ls_count(Index ls_count)
00417     {
00418       info_ls_count_ = ls_count;
00419     }
00420     bool info_skip_output() const
00421     {
00422       return info_skip_output_;
00423     }
00424     void Append_info_string(const std::string& add_str)
00425     {
00426       info_string_ += add_str;
00427     }
00428     const std::string& info_string() const
00429     {
00430       return info_string_;
00431     }
00434     void Set_info_skip_output(bool info_skip_output)
00435     {
00436       info_skip_output_ = info_skip_output;
00437     }
00438 
00440     Number info_last_output()
00441     {
00442        return info_last_output_;
00443     }
00445     void Set_info_last_output(Number info_last_output)
00446     {
00447        info_last_output_ = info_last_output;
00448     }
00449 
00452     int info_iters_since_header()
00453     {
00454        return info_iters_since_header_;
00455     }
00458     void Inc_info_iters_since_header()
00459     {
00460        info_iters_since_header_++;
00461     }
00464     void Set_info_iters_since_header(int info_iters_since_header)
00465     {
00466        info_iters_since_header_ = info_iters_since_header;
00467     }
00468 
00470     void ResetInfo()
00471     {
00472       info_regu_x_ = 0;
00473       info_alpha_primal_ = 0;
00474       info_alpha_dual_ = 0.;
00475       info_alpha_primal_char_ = ' ';
00476       info_skip_output_ = false;
00477       info_string_.erase();
00478     }
00480 
00482     TimingStatistics& TimingStats()
00483     {
00484       return timing_statistics_;
00485     }
00486 
00488     bool HaveAddData()
00489     {
00490       return IsValid(add_data_);
00491     }
00492 
00494     IpoptAdditionalData& AdditionalData()
00495     {
00496       return *add_data_;
00497     }
00498 
00500     void SetAddData(SmartPtr<IpoptAdditionalData> add_data)
00501     {
00502       DBG_ASSERT(!HaveAddData());
00503       add_data_ = add_data;
00504     }
00505 
00507     void setPDPert(Number pd_pert_x, Number pd_pert_s,
00508                    Number pd_pert_c, Number pd_pert_d)
00509     {
00510       pd_pert_x_ = pd_pert_x;
00511       pd_pert_s_ = pd_pert_s;
00512       pd_pert_c_ = pd_pert_c;
00513       pd_pert_d_ = pd_pert_d;
00514     }
00515 
00517     void getPDPert(Number& pd_pert_x, Number& pd_pert_s,
00518                    Number& pd_pert_c, Number& pd_pert_d)
00519     {
00520       pd_pert_x = pd_pert_x_;
00521       pd_pert_s = pd_pert_s_;
00522       pd_pert_c = pd_pert_c_;
00523       pd_pert_d = pd_pert_d_;
00524     }
00525 
00528     static void RegisterOptions(const SmartPtr<RegisteredOptions>& roptions);
00530 
00531   private:
00536     SmartPtr<const IteratesVector> curr_;
00537 
00540     SmartPtr<const IteratesVector> trial_;
00541 
00543     SmartPtr<const SymMatrix> W_;
00544 
00547     SmartPtr<const IteratesVector> delta_;
00555     bool have_deltas_;
00557 
00563     SmartPtr<const IteratesVector> delta_aff_;
00570     bool have_affine_deltas_;
00572 
00574     Index iter_count_;
00575 
00577     Number curr_mu_;
00578     bool mu_initialized_;
00579 
00581     Number curr_tau_;
00582     bool tau_initialized_;
00583 
00586     bool initialize_called_;
00587 
00590     bool have_prototypes_;
00591 
00598     Number tol_;
00600 
00604     bool free_mu_mode_;
00606     bool tiny_step_flag_;
00608 
00612     Number info_regu_x_;
00614     Number info_alpha_primal_;
00616     char info_alpha_primal_char_;
00618     Number info_alpha_dual_;
00620     Index info_ls_count_;
00623     bool info_skip_output_;
00625     std::string info_string_;
00627     Number info_last_output_;
00630     int info_iters_since_header_;
00632 
00634     SmartPtr<IteratesVectorSpace> iterates_space_;
00635 
00638     TimingStatistics timing_statistics_;
00639 
00641     Number cpu_time_start_;
00642 
00645     SmartPtr<IpoptAdditionalData> add_data_;
00646 
00650     Number pd_pert_x_;
00651     Number pd_pert_s_;
00652     Number pd_pert_c_;
00653     Number pd_pert_d_;
00655 
00665     IpoptData(const IpoptData&);
00666 
00668     void operator=(const IpoptData&);
00670 
00671 #if COIN_IPOPT_CHECKLEVEL > 0
00672 
00676     TaggedObject::Tag debug_curr_tag_;
00677     TaggedObject::Tag debug_trial_tag_;
00678     TaggedObject::Tag debug_delta_tag_;
00679     TaggedObject::Tag debug_delta_aff_tag_;
00680     TaggedObject::Tag debug_curr_tag_sum_;
00681     TaggedObject::Tag debug_trial_tag_sum_;
00682     TaggedObject::Tag debug_delta_tag_sum_;
00683     TaggedObject::Tag debug_delta_aff_tag_sum_;
00685 #endif
00686 
00687   };
00688 
00689   inline
00690   SmartPtr<const IteratesVector> IpoptData::curr() const
00691   {
00692     DBG_ASSERT(IsNull(curr_) || (curr_->GetTag() == debug_curr_tag_ && curr_->GetTagSum() == debug_curr_tag_sum_) );
00693 
00694     return curr_;
00695   }
00696 
00697   inline
00698   SmartPtr<const IteratesVector> IpoptData::trial() const
00699   {
00700     DBG_ASSERT(IsNull(trial_) || (trial_->GetTag() == debug_trial_tag_ && trial_->GetTagSum() == debug_trial_tag_sum_) );
00701 
00702     return trial_;
00703   }
00704 
00705   inline
00706   SmartPtr<const IteratesVector> IpoptData::delta() const
00707   {
00708     DBG_ASSERT(IsNull(delta_) || (delta_->GetTag() == debug_delta_tag_ && delta_->GetTagSum() == debug_delta_tag_sum_) );
00709 
00710     return delta_;
00711   }
00712 
00713   inline
00714   SmartPtr<const IteratesVector> IpoptData::delta_aff() const
00715   {
00716     DBG_ASSERT(IsNull(delta_aff_) || (delta_aff_->GetTag() == debug_delta_aff_tag_ && delta_aff_->GetTagSum() == debug_delta_aff_tag_sum_) );
00717 
00718     return delta_aff_;
00719   }
00720 
00721   inline
00722   void IpoptData::CopyTrialToCurrent()
00723   {
00724     curr_ = trial_;
00725 #if COIN_IPOPT_CHECKLEVEL > 0
00726 
00727     if (IsValid(curr_)) {
00728       debug_curr_tag_ = curr_->GetTag();
00729       debug_curr_tag_sum_ = curr_->GetTagSum();
00730     }
00731     else {
00732       debug_curr_tag_ = 0;
00733       debug_curr_tag_sum_ = 0;
00734     }
00735 #endif
00736 
00737   }
00738 
00739   inline
00740   void IpoptData::set_trial(SmartPtr<IteratesVector>& trial)
00741   {
00742     trial_ = ConstPtr(trial);
00743 
00744 #if COIN_IPOPT_CHECKLEVEL > 0
00745     // verify the correct space
00746     DBG_ASSERT(trial_->OwnerSpace() == (VectorSpace*)GetRawPtr(iterates_space_));
00747     if (IsValid(trial)) {
00748       debug_trial_tag_ = trial->GetTag();
00749       debug_trial_tag_sum_ = trial->GetTagSum();
00750     }
00751     else {
00752       debug_trial_tag_ = 0;
00753       debug_trial_tag_sum_ = 0;
00754     }
00755 #endif
00756 
00757     trial = NULL;
00758   }
00759 
00760   inline
00761   void IpoptData::set_delta(SmartPtr<IteratesVector>& delta)
00762   {
00763     delta_ = ConstPtr(delta);
00764 #if COIN_IPOPT_CHECKLEVEL > 0
00765 
00766     if (IsValid(delta)) {
00767       debug_delta_tag_ = delta->GetTag();
00768       debug_delta_tag_sum_ = delta->GetTagSum();
00769     }
00770     else {
00771       debug_delta_tag_ = 0;
00772       debug_delta_tag_sum_ = 0;
00773     }
00774 #endif
00775 
00776     delta = NULL;
00777   }
00778 
00779   inline
00780   void IpoptData::set_delta(SmartPtr<const IteratesVector>& delta)
00781   {
00782     delta_ = delta;
00783 #if COIN_IPOPT_CHECKLEVEL > 0
00784 
00785     if (IsValid(delta)) {
00786       debug_delta_tag_ = delta->GetTag();
00787       debug_delta_tag_sum_ = delta->GetTagSum();
00788     }
00789     else {
00790       debug_delta_tag_ = 0;
00791       debug_delta_tag_sum_ = 0;
00792     }
00793 #endif
00794 
00795     delta = NULL;
00796   }
00797 
00798   inline
00799   void IpoptData::set_delta_aff(SmartPtr<IteratesVector>& delta_aff)
00800   {
00801     delta_aff_ = ConstPtr(delta_aff);
00802 #if COIN_IPOPT_CHECKLEVEL > 0
00803 
00804     if (IsValid(delta_aff)) {
00805       debug_delta_aff_tag_ = delta_aff->GetTag();
00806       debug_delta_aff_tag_sum_ = delta_aff->GetTagSum();
00807     }
00808     else {
00809       debug_delta_aff_tag_ = 0;
00810       debug_delta_aff_tag_sum_ = delta_aff->GetTagSum();
00811     }
00812 #endif
00813 
00814     delta_aff = NULL;
00815   }
00816 
00817 } // namespace Ipopt
00818 
00819 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines