00001 // Copyright (C) 2007 International Business Machines and others. 00002 // All Rights Reserved. 00003 // This code is published under the Common Public License. 00004 // 00005 // $Id: IpIpoptData.hpp 988 2007-06-01 21:57:27Z andreasw $ 00006 // 00007 // Authors: Andreas Waechter IBM 2007-06-04 00008 // based on IpIpoptData.hpp 00009 00010 #ifndef __IPCGPENALTYDATA_HPP__ 00011 #define __IPCGPENALTYDATA_HPP__ 00012 00013 #include "IpIteratesVector.hpp" 00014 #include "IpOptionsList.hpp" 00015 00016 namespace Ipopt 00017 { 00018 00021 class CGPenaltyData : public ReferencedObject 00022 { 00023 public: 00027 CGPenaltyData(); 00028 00030 ~CGPenaltyData(); 00032 00036 bool Initialize(const Journalist& jnlst, 00037 const OptionsList& options, 00038 const std::string& prefix); 00039 00041 bool InitializeDataStructures(); 00042 00044 SmartPtr<const IteratesVector> delta_cgpen() const; 00045 00050 void set_delta_cgpen(SmartPtr<IteratesVector>& delta_pen); 00051 00058 void set_delta_cgpen(SmartPtr<const IteratesVector>& delta_pen); 00059 00061 SmartPtr<const IteratesVector> delta_cgfast() const; 00062 00067 void set_delta_cgfast(SmartPtr<IteratesVector>& delta_fast); 00068 00072 bool HaveCgPenDeltas() const 00073 { 00074 return have_cgpen_deltas_; 00075 } 00076 void SetHaveCgPenDeltas(bool have_cgpen_deltas) 00077 { 00078 have_cgpen_deltas_ = have_cgpen_deltas; 00079 } 00080 00081 bool HaveCgFastDeltas() const 00082 { 00083 return have_cgfast_deltas_; 00084 } 00085 void SetHaveCgFastDeltas(bool have_cgfast_deltas) 00086 { 00087 have_cgfast_deltas_ = have_cgfast_deltas; 00088 } 00090 00095 void AcceptTrialPoint(); 00097 00098 Number curr_penalty() const 00099 { 00100 DBG_ASSERT(penalty_initialized_); 00101 return curr_penalty_; 00102 } 00103 void Set_penalty(Number penalty) 00104 { 00105 curr_penalty_ = penalty; 00106 penalty_initialized_ = true; 00107 } 00108 void SetPenaltyUninitialized() 00109 { 00110 penalty_initialized_ = false; 00111 } 00112 bool PenaltyInitialized() const 00113 { 00114 return penalty_initialized_; 00115 } 00116 00117 private: 00118 00124 SmartPtr<const IteratesVector> delta_cgpen_; 00130 bool have_cgpen_deltas_; 00132 00138 SmartPtr<const IteratesVector> delta_cgfast_; 00144 bool have_cgfast_deltas_; 00146 00149 Number curr_penalty_; 00150 bool penalty_initialized_; 00152 00155 bool initialize_called_; 00156 00166 CGPenaltyData(const CGPenaltyData&); 00167 00169 void operator=(const CGPenaltyData&); 00171 00172 #if COIN_IPOPT_CHECKLEVEL > 0 00173 00177 TaggedObject::Tag debug_delta_cgpen_tag_; 00178 TaggedObject::Tag debug_delta_cgfast_tag_; 00179 TaggedObject::Tag debug_delta_cgpen_tag_sum_; 00180 TaggedObject::Tag debug_delta_cgfast_tag_sum_; 00182 #endif 00183 00184 }; 00185 00186 inline 00187 SmartPtr<const IteratesVector> CGPenaltyData::delta_cgpen() const 00188 { 00189 DBG_ASSERT(IsNull(delta_cgpen_) || (delta_cgpen_->GetTag() == debug_delta_cgpen_tag_ && delta_cgpen_->GetTagSum() == debug_delta_cgpen_tag_sum_) ); 00190 00191 return delta_cgpen_; 00192 } 00193 00194 inline 00195 SmartPtr<const IteratesVector> CGPenaltyData::delta_cgfast() const 00196 { 00197 DBG_ASSERT(IsNull(delta_cgfast_) || (delta_cgfast_->GetTag() == debug_delta_cgfast_tag_ && delta_cgfast_->GetTagSum() == debug_delta_cgfast_tag_sum_) ); 00198 00199 return delta_cgfast_; 00200 } 00201 00202 inline 00203 void CGPenaltyData::set_delta_cgpen(SmartPtr<IteratesVector>& delta_cgpen) 00204 { 00205 delta_cgpen_ = ConstPtr(delta_cgpen); 00206 #if COIN_IPOPT_CHECKLEVEL > 0 00207 00208 if (IsValid(delta_cgpen)) { 00209 debug_delta_cgpen_tag_ = delta_cgpen->GetTag(); 00210 debug_delta_cgpen_tag_sum_ = delta_cgpen->GetTagSum(); 00211 } 00212 else { 00213 debug_delta_cgpen_tag_ = 0; 00214 debug_delta_cgpen_tag_sum_ = delta_cgpen->GetTagSum(); 00215 } 00216 #endif 00217 00218 delta_cgpen = NULL; 00219 } 00220 00221 inline 00222 void CGPenaltyData::set_delta_cgpen(SmartPtr<const IteratesVector>& delta_cgpen) 00223 { 00224 delta_cgpen_ = delta_cgpen; 00225 #if COIN_IPOPT_CHECKLEVEL > 0 00226 00227 if (IsValid(delta_cgpen)) { 00228 debug_delta_cgpen_tag_ = delta_cgpen->GetTag(); 00229 debug_delta_cgpen_tag_sum_ = delta_cgpen->GetTagSum(); 00230 } 00231 else { 00232 debug_delta_cgpen_tag_ = 0; 00233 debug_delta_cgpen_tag_sum_ = delta_cgpen->GetTagSum(); 00234 } 00235 #endif 00236 00237 delta_cgpen = NULL; 00238 } 00239 00240 inline 00241 void CGPenaltyData::set_delta_cgfast(SmartPtr<IteratesVector>& delta_cgfast) 00242 { 00243 delta_cgfast_ = ConstPtr(delta_cgfast); 00244 #if COIN_IPOPT_CHECKLEVEL > 0 00245 00246 if (IsValid(delta_cgfast)) { 00247 debug_delta_cgfast_tag_ = delta_cgfast->GetTag(); 00248 debug_delta_cgfast_tag_sum_ = delta_cgfast->GetTagSum(); 00249 } 00250 else { 00251 debug_delta_cgfast_tag_ = 0; 00252 debug_delta_cgfast_tag_sum_ = delta_cgfast->GetTagSum(); 00253 } 00254 #endif 00255 00256 delta_cgfast = NULL; 00257 } 00258 00259 } // namespace Ipopt 00260 00261 #endif