diff options
Diffstat (limited to 'build/Bonmin/include/coin/IpIpoptData.hpp')
-rw-r--r-- | build/Bonmin/include/coin/IpIpoptData.hpp | 819 |
1 files changed, 0 insertions, 819 deletions
diff --git a/build/Bonmin/include/coin/IpIpoptData.hpp b/build/Bonmin/include/coin/IpIpoptData.hpp deleted file mode 100644 index 6973bab..0000000 --- a/build/Bonmin/include/coin/IpIpoptData.hpp +++ /dev/null @@ -1,819 +0,0 @@ -// Copyright (C) 2004, 2009 International Business Machines and others. -// All Rights Reserved. -// This code is published under the Eclipse Public License. -// -// $Id: IpIpoptData.hpp 2472 2014-04-05 17:47:20Z stefan $ -// -// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 - -#ifndef __IPIPOPTDATA_HPP__ -#define __IPIPOPTDATA_HPP__ - -#include "IpSymMatrix.hpp" -#include "IpOptionsList.hpp" -#include "IpIteratesVector.hpp" -#include "IpRegOptions.hpp" -#include "IpTimingStatistics.hpp" - -namespace Ipopt -{ - - /* Forward declaration */ - class IpoptNLP; - - /** Base class for additional data that is special to a particular - * type of algorithm, such as the CG penalty function, or using - * iterative linear solvers. The regular IpoptData object should - * be given a derivation of this base class when it is created. */ - class IpoptAdditionalData : public ReferencedObject - { - public: - /**@name Constructors/Destructors */ - //@{ - /** Default Constructor */ - IpoptAdditionalData() - {} - - /** Default destructor */ - virtual ~IpoptAdditionalData() - {} - //@} - - /** This method is called to initialize the global algorithmic - * parameters. The parameters are taken from the OptionsList - * object. */ - virtual bool Initialize(const Journalist& jnlst, - const OptionsList& options, - const std::string& prefix) = 0; - - /** Initialize Data Structures at the beginning. */ - virtual bool InitializeDataStructures() = 0; - - /** Do whatever is necessary to accept a trial point as current - * iterate. This is also used to finish an iteration, i.e., to - * release memory, and to reset any flags for a new iteration. */ - virtual void AcceptTrialPoint() = 0; - - private: - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Copy Constructor */ - IpoptAdditionalData(const IpoptAdditionalData&); - - /** Overloaded Equals Operator */ - void operator=(const IpoptAdditionalData&); - //@} - }; - - /** Class to organize all the data required by the algorithm. - * Internally, once this Data object has been initialized, all - * internal curr_ vectors must always be set (so that prototyes are - * available). The current values can only be set from the trial - * values. The trial values can be set by copying from a vector or - * by adding some fraction of a step to the current values. This - * object also stores steps, which allows to easily communicate the - * step from the step computation object to the line search object. - */ - class IpoptData : public ReferencedObject - { - public: - /**@name Constructors/Destructors */ - //@{ - /** Constructor */ - IpoptData(SmartPtr<IpoptAdditionalData> add_data = NULL, - Number cpu_time_start = -1.); - - /** Default destructor */ - virtual ~IpoptData(); - //@} - - /** Initialize Data Structures */ - bool InitializeDataStructures(IpoptNLP& ip_nlp, - bool want_x, - bool want_y_c, - bool want_y_d, - bool want_z_L, - bool want_z_U); - - /** This method must be called to initialize the global - * algorithmic parameters. The parameters are taken from the - * OptionsList object. */ - bool Initialize(const Journalist& jnlst, - const OptionsList& options, - const std::string& prefix); - - /** @name Get Methods for Iterates */ - //@{ - /** Current point */ - inline - SmartPtr<const IteratesVector> curr() const; - - /** Get the current point in a copied container that is non-const. - The entries in the container cannot be modified, but - the container can be modified to point to new entries. - */ - // SmartPtr<IteratesVector> curr_container() const; - - /** Get Trial point */ - inline - SmartPtr<const IteratesVector> trial() const; - - /** Get Trial point in a copied container that is non-const. - * The entries in the container can not be modified, but - * the container can be modified to point to new entries. - */ - //SmartPtr<IteratesVector> trial_container() const; - - /** Set the trial point - this method copies the pointer for - * efficiency (no copy and to keep cache tags the same) so - * after you call set you cannot modify the data again - */ - inline - void set_trial(SmartPtr<IteratesVector>& trial); - - /** Set the values of the primal trial variables (x and s) from - * provided Step with step length alpha. - */ - void SetTrialPrimalVariablesFromStep(Number alpha, - const Vector& delta_x, - const Vector& delta_s); - /** Set the values of the trial values for the equality constraint - * multipliers (y_c and y_d) from provided step with step length - * alpha. - */ - void SetTrialEqMultipliersFromStep(Number alpha, - const Vector& delta_y_c, - const Vector& delta_y_d); - /** Set the value of the trial values for the bound multipliers - * (z_L, z_U, v_L, v_U) from provided step with step length - * alpha. - */ - void SetTrialBoundMultipliersFromStep(Number alpha, - const Vector& delta_z_L, - const Vector& delta_z_U, - const Vector& delta_v_L, - const Vector& delta_v_U); - - /** ToDo: I may need to add versions of set_trial like the - * following, but I am not sure - */ - // void set_trial(const SmartPtr<IteratesVector>& trial_iterates); - // void set_trial(SmartPtr<const IteratesVector>& trial_iterates); - - /** get the current delta */ - inline - SmartPtr<const IteratesVector> delta() const; - - /** Set the current delta - like the trial point, this method copies - * the pointer for efficiency (no copy and to keep cache tags the - * same) so after you call set, you cannot modify the data - */ - inline - void set_delta(SmartPtr<IteratesVector>& delta); - - /** Set the current delta - like the trial point, this method - * copies the pointer for efficiency (no copy and to keep cache - * tags the same) so after you call set, you cannot modify the - * data. This is the version that is happy with a pointer to - * const IteratesVector. - */ - inline - void set_delta(SmartPtr<const IteratesVector>& delta); - - /** Affine Delta */ - inline - SmartPtr<const IteratesVector> delta_aff() const; - - /** Set the affine delta - like the trial point, this method copies - * the pointer for efficiency (no copy and to keep cache tags the - * same) so after you call set, you cannot modify the data - */ - inline - void set_delta_aff(SmartPtr<IteratesVector>& delta_aff); - - /** Hessian or Hessian approximation (do not hold on to it, it might be changed) */ - SmartPtr<const SymMatrix> W() - { - DBG_ASSERT(IsValid(W_)); - return W_; - } - - /** Set Hessian approximation */ - void Set_W(SmartPtr<const SymMatrix> W) - { - W_ = W; - } - - /** @name ("Main") Primal-dual search direction. Those fields are - * used to store the search directions computed from solving the - * primal-dual system, and can be used in the line search. They - * are overwritten in every iteration, so do not hold on to the - * pointers (make copies instead) */ - //@{ - - /** Returns true, if the primal-dual step have been already - * computed for the current iteration. This flag is reset after - * every call of AcceptTrialPoint(). If the search direction is - * computed during the computation of the barrier parameter, the - * method computing the barrier parameter should call - * SetHaveDeltas(true) to tell the IpoptAlgorithm object that it - * doesn't need to recompute the primal-dual step. */ - bool HaveDeltas() const - { - return have_deltas_; - } - - /** Method for setting the HaveDeltas flag. This method should be - * called if some method computes the primal-dual step (and - * stores it in the delta_ fields of IpoptData) at an early part - * of the iteration. If that flag is set to true, the - * IpoptAlgorithm object will not recompute the step. */ - void SetHaveDeltas(bool have_deltas) - { - have_deltas_ = have_deltas; - } - //@} - - /** @name Affine-scaling step. Those fields can be used to store - * the affine scaling step. For example, if the method for - * computing the current barrier parameter computes the affine - * scaling steps, then the corrector step in the line search does - * not have to recompute those solutions of the linear system. */ - //@{ - - /** Returns true, if the affine-scaling step have been already - * computed for the current iteration. This flag is reset after - * every call of AcceptTrialPoint(). If the search direction is - * computed during the computation of the barrier parameter, the - * method computing the barrier parameter should call - * SetHaveDeltas(true) to tell the line search does not have to - * recompute them in case it wants to do a corrector step. */ - bool HaveAffineDeltas() const - { - return have_affine_deltas_; - } - - /** Method for setting the HaveDeltas flag. This method should be - * called if some method computes the primal-dual step (and - * stores it in the delta_ fields of IpoptData) at an early part - * of the iteration. If that flag is set to true, the - * IpoptAlgorithm object will not recompute the step. */ - void SetHaveAffineDeltas(bool have_affine_deltas) - { - have_affine_deltas_ = have_affine_deltas; - } - //@} - - /** @name Public Methods for updating iterates */ - //@{ - /** Copy the trial values to the current values */ - inline - void CopyTrialToCurrent(); - - /** Set the current iterate values from the - * trial values. */ - void AcceptTrialPoint(); - //@} - - /** @name General algorithmic data */ - //@{ - Index iter_count() const - { - return iter_count_; - } - void Set_iter_count(Index iter_count) - { - iter_count_ = iter_count; - } - - Number curr_mu() const - { - DBG_ASSERT(mu_initialized_); - return curr_mu_; - } - void Set_mu(Number mu) - { - curr_mu_ = mu; - mu_initialized_ = true; - } - bool MuInitialized() const - { - return mu_initialized_; - } - - Number curr_tau() const - { - DBG_ASSERT(tau_initialized_); - return curr_tau_; - } - void Set_tau(Number tau) - { - curr_tau_ = tau; - tau_initialized_ = true; - } - bool TauInitialized() const - { - return tau_initialized_; - } - - void SetFreeMuMode(bool free_mu_mode) - { - free_mu_mode_ = free_mu_mode; - } - bool FreeMuMode() const - { - return free_mu_mode_; - } - - /** Setting the flag that indicates if a tiny step (below machine - * precision) has been detected */ - void Set_tiny_step_flag(bool flag) - { - tiny_step_flag_ = flag; - } - bool tiny_step_flag() - { - return tiny_step_flag_; - } - //@} - - /** Overall convergence tolerance. It is used in the convergence - * test, but also in some other parts of the algorithm that - * depend on the specified tolerance, such as the minimum value - * for the barrier parameter. */ - //@{ - /** Obtain the tolerance. */ - Number tol() const - { - DBG_ASSERT(initialize_called_); - return tol_; - } - /** Set a new value for the tolerance. One should be very careful - * when using this, since changing the predefined tolerance might - * have unexpected consequences. This method is for example used - * in the restoration convergence checker to tighten the - * restoration phase convergence tolerance, if the restoration - * phase converged to a point that has not a large value for the - * constraint violation. */ - void Set_tol(Number tol) - { - tol_ = tol; - } - //@} - - /** Cpu time counter at the beginning of the optimization. This - * is useful to see how much CPU time has been spent in this - * optimization run. */ - Number cpu_time_start() const - { - return cpu_time_start_; - } - - /** @name Information gathered for iteration output */ - //@{ - Number info_regu_x() const - { - return info_regu_x_; - } - void Set_info_regu_x(Number regu_x) - { - info_regu_x_ = regu_x; - } - Number info_alpha_primal() const - { - return info_alpha_primal_; - } - void Set_info_alpha_primal(Number alpha_primal) - { - info_alpha_primal_ = alpha_primal; - } - char info_alpha_primal_char() const - { - return info_alpha_primal_char_; - } - void Set_info_alpha_primal_char(char info_alpha_primal_char) - { - info_alpha_primal_char_ = info_alpha_primal_char; - } - Number info_alpha_dual() const - { - return info_alpha_dual_; - } - void Set_info_alpha_dual(Number alpha_dual) - { - info_alpha_dual_ = alpha_dual; - } - Index info_ls_count() const - { - return info_ls_count_; - } - void Set_info_ls_count(Index ls_count) - { - info_ls_count_ = ls_count; - } - bool info_skip_output() const - { - return info_skip_output_; - } - void Append_info_string(const std::string& add_str) - { - info_string_ += add_str; - } - const std::string& info_string() const - { - return info_string_; - } - /** Set this to true, if the next time when output is written, the - * summary line should not be printed. */ - void Set_info_skip_output(bool info_skip_output) - { - info_skip_output_ = info_skip_output; - } - - /** gives time when the last summary output line was printed */ - Number info_last_output() - { - return info_last_output_; - } - /** sets time when the last summary output line was printed */ - void Set_info_last_output(Number info_last_output) - { - info_last_output_ = info_last_output; - } - - /** gives number of iteration summaries actually printed - * since last summary header was printed */ - int info_iters_since_header() - { - return info_iters_since_header_; - } - /** increases number of iteration summaries actually printed - * since last summary header was printed */ - void Inc_info_iters_since_header() - { - info_iters_since_header_++; - } - /** sets number of iteration summaries actually printed - * since last summary header was printed */ - void Set_info_iters_since_header(int info_iters_since_header) - { - info_iters_since_header_ = info_iters_since_header; - } - - /** Reset all info fields */ - void ResetInfo() - { - info_regu_x_ = 0; - info_alpha_primal_ = 0; - info_alpha_dual_ = 0.; - info_alpha_primal_char_ = ' '; - info_skip_output_ = false; - info_string_.erase(); - } - //@} - - /** Return Timing Statistics Object */ - TimingStatistics& TimingStats() - { - return timing_statistics_; - } - - /** Check if additional data has been set */ - bool HaveAddData() - { - return IsValid(add_data_); - } - - /** Get access to additional data object */ - IpoptAdditionalData& AdditionalData() - { - return *add_data_; - } - - /** Set a new pointer for additional Ipopt data */ - void SetAddData(SmartPtr<IpoptAdditionalData> add_data) - { - DBG_ASSERT(!HaveAddData()); - add_data_ = add_data; - } - - /** Set the perturbation of the primal-dual system */ - void setPDPert(Number pd_pert_x, Number pd_pert_s, - Number pd_pert_c, Number pd_pert_d) - { - pd_pert_x_ = pd_pert_x; - pd_pert_s_ = pd_pert_s; - pd_pert_c_ = pd_pert_c; - pd_pert_d_ = pd_pert_d; - } - - /** Get the current perturbation of the primal-dual system */ - void getPDPert(Number& pd_pert_x, Number& pd_pert_s, - Number& pd_pert_c, Number& pd_pert_d) - { - pd_pert_x = pd_pert_x_; - pd_pert_s = pd_pert_s_; - pd_pert_c = pd_pert_c_; - pd_pert_d = pd_pert_d_; - } - - /** Methods for IpoptType */ - //@{ - static void RegisterOptions(const SmartPtr<RegisteredOptions>& roptions); - //@} - - private: - /** @name Iterates */ - //@{ - /** Main iteration variables - * (current iteration) */ - SmartPtr<const IteratesVector> curr_; - - /** Main iteration variables - * (trial calculations) */ - SmartPtr<const IteratesVector> trial_; - - /** Hessian (approximation) - might be changed elsewhere! */ - SmartPtr<const SymMatrix> W_; - - /** @name Primal-dual Step */ - //@{ - SmartPtr<const IteratesVector> delta_; - /** The following flag is set to true, if some other part of the - * algorithm (like the method for computing the barrier - * parameter) has already computed the primal-dual search - * direction. This flag is reset when the AcceptTrialPoint - * method is called. - * ToDo: we could cue off of a null delta_; - */ - bool have_deltas_; - //@} - - /** @name Affine-scaling step. This used to transfer the - * information about the affine-scaling step from the computation - * of the barrier parameter to the corrector (in the line - * search). */ - //@{ - SmartPtr<const IteratesVector> delta_aff_; - /** The following flag is set to true, if some other part of the - * algorithm (like the method for computing the barrier - * parameter) has already computed the affine-scaling step. This - * flag is reset when the AcceptTrialPoint method is called. - * ToDo: we could cue off of a null delta_aff_; - */ - bool have_affine_deltas_; - //@} - - /** iteration count */ - Index iter_count_; - - /** current barrier parameter */ - Number curr_mu_; - bool mu_initialized_; - - /** current fraction to the boundary parameter */ - Number curr_tau_; - bool tau_initialized_; - - /** flag indicating if Initialize method has been called (for - * debugging) */ - bool initialize_called_; - - /** flag for debugging whether we have already curr_ values - * available (from which new Vectors can be generated */ - bool have_prototypes_; - - /** @name Global algorithm parameters. Those are options that can - * be modified by the user and appear at different places in the - * algorithm. They are set using an OptionsList object in the - * Initialize method. */ - //@{ - /** Overall convergence tolerance */ - Number tol_; - //@} - - /** @name Status data **/ - //@{ - /** flag indicating whether the algorithm is in the free mu mode */ - bool free_mu_mode_; - /** flag indicating if a tiny step has been detected */ - bool tiny_step_flag_; - //@} - - /** @name Gathered information for iteration output */ - //@{ - /** Size of regularization for the Hessian */ - Number info_regu_x_; - /** Primal step size */ - Number info_alpha_primal_; - /** Info character for primal step size */ - char info_alpha_primal_char_; - /** Dual step size */ - Number info_alpha_dual_; - /** Number of backtracking trial steps */ - Index info_ls_count_; - /** true, if next summary output line should not be printed (eg - * after restoration phase. */ - bool info_skip_output_; - /** any string of characters for the end of the output line */ - std::string info_string_; - /** time when the last summary output line was printed */ - Number info_last_output_; - /** number of iteration summaries actually printed since last - * summary header was printed */ - int info_iters_since_header_; - //@} - - /** VectorSpace for all the iterates */ - SmartPtr<IteratesVectorSpace> iterates_space_; - - /** TimingStatistics object collecting all Ipopt timing - * statistics */ - TimingStatistics timing_statistics_; - - /** CPU time counter at initialization. */ - Number cpu_time_start_; - - /** Object for the data specific for the Chen-Goldfarb penalty - * method algorithm */ - SmartPtr<IpoptAdditionalData> add_data_; - - /** @name Information about the perturbation of the primal-dual - * system */ - //@{ - Number pd_pert_x_; - Number pd_pert_s_; - Number pd_pert_c_; - Number pd_pert_d_; - //@} - - /**@name Default Compiler Generated Methods - * (Hidden to avoid implicit creation/calling). - * These methods are not implemented and - * we do not want the compiler to implement - * them for us, so we declare them private - * and do not define them. This ensures that - * they will not be implicitly created/called. */ - //@{ - /** Copy Constructor */ - IpoptData(const IpoptData&); - - /** Overloaded Equals Operator */ - void operator=(const IpoptData&); - //@} - -#if COIN_IPOPT_CHECKLEVEL > 0 - /** Some debug flags to make sure vectors are not changed - * behind the IpoptData's back - */ - //@{ - TaggedObject::Tag debug_curr_tag_; - TaggedObject::Tag debug_trial_tag_; - TaggedObject::Tag debug_delta_tag_; - TaggedObject::Tag debug_delta_aff_tag_; - TaggedObject::Tag debug_curr_tag_sum_; - TaggedObject::Tag debug_trial_tag_sum_; - TaggedObject::Tag debug_delta_tag_sum_; - TaggedObject::Tag debug_delta_aff_tag_sum_; - //@} -#endif - - }; - - inline - SmartPtr<const IteratesVector> IpoptData::curr() const - { - DBG_ASSERT(IsNull(curr_) || (curr_->GetTag() == debug_curr_tag_ && curr_->GetTagSum() == debug_curr_tag_sum_) ); - - return curr_; - } - - inline - SmartPtr<const IteratesVector> IpoptData::trial() const - { - DBG_ASSERT(IsNull(trial_) || (trial_->GetTag() == debug_trial_tag_ && trial_->GetTagSum() == debug_trial_tag_sum_) ); - - return trial_; - } - - inline - SmartPtr<const IteratesVector> IpoptData::delta() const - { - DBG_ASSERT(IsNull(delta_) || (delta_->GetTag() == debug_delta_tag_ && delta_->GetTagSum() == debug_delta_tag_sum_) ); - - return delta_; - } - - inline - SmartPtr<const IteratesVector> IpoptData::delta_aff() const - { - DBG_ASSERT(IsNull(delta_aff_) || (delta_aff_->GetTag() == debug_delta_aff_tag_ && delta_aff_->GetTagSum() == debug_delta_aff_tag_sum_) ); - - return delta_aff_; - } - - inline - void IpoptData::CopyTrialToCurrent() - { - curr_ = trial_; -#if COIN_IPOPT_CHECKLEVEL > 0 - - if (IsValid(curr_)) { - debug_curr_tag_ = curr_->GetTag(); - debug_curr_tag_sum_ = curr_->GetTagSum(); - } - else { - debug_curr_tag_ = 0; - debug_curr_tag_sum_ = 0; - } -#endif - - } - - inline - void IpoptData::set_trial(SmartPtr<IteratesVector>& trial) - { - trial_ = ConstPtr(trial); - -#if COIN_IPOPT_CHECKLEVEL > 0 - // verify the correct space - DBG_ASSERT(trial_->OwnerSpace() == (VectorSpace*)GetRawPtr(iterates_space_)); - if (IsValid(trial)) { - debug_trial_tag_ = trial->GetTag(); - debug_trial_tag_sum_ = trial->GetTagSum(); - } - else { - debug_trial_tag_ = 0; - debug_trial_tag_sum_ = 0; - } -#endif - - trial = NULL; - } - - inline - void IpoptData::set_delta(SmartPtr<IteratesVector>& delta) - { - delta_ = ConstPtr(delta); -#if COIN_IPOPT_CHECKLEVEL > 0 - - if (IsValid(delta)) { - debug_delta_tag_ = delta->GetTag(); - debug_delta_tag_sum_ = delta->GetTagSum(); - } - else { - debug_delta_tag_ = 0; - debug_delta_tag_sum_ = 0; - } -#endif - - delta = NULL; - } - - inline - void IpoptData::set_delta(SmartPtr<const IteratesVector>& delta) - { - delta_ = delta; -#if COIN_IPOPT_CHECKLEVEL > 0 - - if (IsValid(delta)) { - debug_delta_tag_ = delta->GetTag(); - debug_delta_tag_sum_ = delta->GetTagSum(); - } - else { - debug_delta_tag_ = 0; - debug_delta_tag_sum_ = 0; - } -#endif - - delta = NULL; - } - - inline - void IpoptData::set_delta_aff(SmartPtr<IteratesVector>& delta_aff) - { - delta_aff_ = ConstPtr(delta_aff); -#if COIN_IPOPT_CHECKLEVEL > 0 - - if (IsValid(delta_aff)) { - debug_delta_aff_tag_ = delta_aff->GetTag(); - debug_delta_aff_tag_sum_ = delta_aff->GetTagSum(); - } - else { - debug_delta_aff_tag_ = 0; - debug_delta_aff_tag_sum_ = delta_aff->GetTagSum(); - } -#endif - - delta_aff = NULL; - } - -} // namespace Ipopt - -#endif |