open source driving agent
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

751 lines
31 KiB

// Copyright (C) 2004, 2011 International Business Machines and others.
// All Rights Reserved.
// This code is published under the Eclipse Public License.
//
// $Id: IpIpoptCalculatedQuantities.hpp 2020 2011-06-16 20:46:16Z andreasw $
//
// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13
#ifndef __IPIPOPTCALCULATEDQUANTITIES_HPP__
#define __IPIPOPTCALCULATEDQUANTITIES_HPP__
#include "IpSmartPtr.hpp"
#include "IpCachedResults.hpp"
#include <string>
namespace Ipopt
{
class IpoptNLP;
class IpoptData;
class Vector;
class Matrix;
class SymMatrix;
class Journalist;
class OptionsList;
class RegisteredOptions;
/** Norm types */
enum ENormType {
NORM_1=0,
NORM_2,
NORM_MAX
};
/** Base class for additional calculated quantities that is special
* to a particular type of algorithm, such as the CG penalty
* function, or using iterative linear solvers. The regular
* IpoptCalculatedQuantities object should be given a derivation of
* this base class when it is created. */
class IpoptAdditionalCq : public ReferencedObject
{
public:
/**@name Constructors/Destructors */
//@{
/** Default Constructor */
IpoptAdditionalCq()
{}
/** Default destructor */
virtual ~IpoptAdditionalCq()
{}
//@}
/** 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;
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 */
IpoptAdditionalCq(const IpoptAdditionalCq&);
/** Overloaded Equals Operator */
void operator=(const IpoptAdditionalCq&);
//@}
};
/** Class for all IPOPT specific calculated quantities.
*
*/
class IpoptCalculatedQuantities : public ReferencedObject
{
public:
/**@name Constructors/Destructors */
//@{
/** Constructor */
IpoptCalculatedQuantities(const SmartPtr<IpoptNLP>& ip_nlp,
const SmartPtr<IpoptData>& ip_data);
/** Default destructor */
virtual ~IpoptCalculatedQuantities();
//@}
/** Method for setting pointer for additional calculated
* quantities. This needs to be called before Initialized. */
void SetAddCq(SmartPtr<IpoptAdditionalCq> add_cq)
{
DBG_ASSERT(!HaveAddCq());
add_cq_ = add_cq;
}
/** Method detecting if additional object for calculated
* quantities has already been set */
bool HaveAddCq()
{
return IsValid(add_cq_);
}
/** 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 Slacks */
//@{
/** Slacks for x_L (at current iterate) */
SmartPtr<const Vector> curr_slack_x_L();
/** Slacks for x_U (at current iterate) */
SmartPtr<const Vector> curr_slack_x_U();
/** Slacks for s_L (at current iterate) */
SmartPtr<const Vector> curr_slack_s_L();
/** Slacks for s_U (at current iterate) */
SmartPtr<const Vector> curr_slack_s_U();
/** Slacks for x_L (at trial point) */
SmartPtr<const Vector> trial_slack_x_L();
/** Slacks for x_U (at trial point) */
SmartPtr<const Vector> trial_slack_x_U();
/** Slacks for s_L (at trial point) */
SmartPtr<const Vector> trial_slack_s_L();
/** Slacks for s_U (at trial point) */
SmartPtr<const Vector> trial_slack_s_U();
/** Indicating whether or not we "fudged" the slacks */
Index AdjustedTrialSlacks();
/** Reset the flags for "fudged" slacks */
void ResetAdjustedTrialSlacks();
//@}
/** @name Objective function */
//@{
/** Value of objective function (at current point) */
virtual Number curr_f();
/** Unscaled value of the objective function (at the current point) */
virtual Number unscaled_curr_f();
/** Value of objective function (at trial point) */
virtual Number trial_f();
/** Unscaled value of the objective function (at the trial point) */
virtual Number unscaled_trial_f();
/** Gradient of objective function (at current point) */
SmartPtr<const Vector> curr_grad_f();
/** Gradient of objective function (at trial point) */
SmartPtr<const Vector> trial_grad_f();
//@}
/** @name Barrier Objective Function */
//@{
/** Barrier Objective Function Value
* (at current iterate with current mu)
*/
virtual Number curr_barrier_obj();
/** Barrier Objective Function Value
* (at trial point with current mu)
*/
virtual Number trial_barrier_obj();
/** Gradient of barrier objective function with respect to x
* (at current point with current mu) */
SmartPtr<const Vector> curr_grad_barrier_obj_x();
/** Gradient of barrier objective function with respect to s
* (at current point with current mu) */
SmartPtr<const Vector> curr_grad_barrier_obj_s();
/** Gradient of the damping term with respect to x (times
* kappa_d) */
SmartPtr<const Vector> grad_kappa_times_damping_x();
/** Gradient of the damping term with respect to s (times
* kappa_d) */
SmartPtr<const Vector> grad_kappa_times_damping_s();
//@}
/** @name Constraints */
//@{
/** c(x) (at current point) */
SmartPtr<const Vector> curr_c();
/** unscaled c(x) (at current point) */
SmartPtr<const Vector> unscaled_curr_c();
/** c(x) (at trial point) */
SmartPtr<const Vector> trial_c();
/** unscaled c(x) (at trial point) */
SmartPtr<const Vector> unscaled_trial_c();
/** d(x) (at current point) */
SmartPtr<const Vector> curr_d();
/** unscaled d(x) (at current point) */
SmartPtr<const Vector> unscaled_curr_d();
/** d(x) (at trial point) */
SmartPtr<const Vector> trial_d();
/** d(x) - s (at current point) */
SmartPtr<const Vector> curr_d_minus_s();
/** d(x) - s (at trial point) */
SmartPtr<const Vector> trial_d_minus_s();
/** Jacobian of c (at current point) */
SmartPtr<const Matrix> curr_jac_c();
/** Jacobian of c (at trial point) */
SmartPtr<const Matrix> trial_jac_c();
/** Jacobian of d (at current point) */
SmartPtr<const Matrix> curr_jac_d();
/** Jacobian of d (at trial point) */
SmartPtr<const Matrix> trial_jac_d();
/** Product of Jacobian (evaluated at current point) of C
* transpose with general vector */
SmartPtr<const Vector> curr_jac_cT_times_vec(const Vector& vec);
/** Product of Jacobian (evaluated at trial point) of C
* transpose with general vector */
SmartPtr<const Vector> trial_jac_cT_times_vec(const Vector& vec);
/** Product of Jacobian (evaluated at current point) of D
* transpose with general vector */
SmartPtr<const Vector> curr_jac_dT_times_vec(const Vector& vec);
/** Product of Jacobian (evaluated at trial point) of D
* transpose with general vector */
SmartPtr<const Vector> trial_jac_dT_times_vec(const Vector& vec);
/** Product of Jacobian (evaluated at current point) of C
* transpose with current y_c */
SmartPtr<const Vector> curr_jac_cT_times_curr_y_c();
/** Product of Jacobian (evaluated at trial point) of C
* transpose with trial y_c */
SmartPtr<const Vector> trial_jac_cT_times_trial_y_c();
/** Product of Jacobian (evaluated at current point) of D
* transpose with current y_d */
SmartPtr<const Vector> curr_jac_dT_times_curr_y_d();
/** Product of Jacobian (evaluated at trial point) of D
* transpose with trial y_d */
SmartPtr<const Vector> trial_jac_dT_times_trial_y_d();
/** Product of Jacobian (evaluated at current point) of C
* with general vector */
SmartPtr<const Vector> curr_jac_c_times_vec(const Vector& vec);
/** Product of Jacobian (evaluated at current point) of D
* with general vector */
SmartPtr<const Vector> curr_jac_d_times_vec(const Vector& vec);
/** Constraint Violation (at current iterate). This value should
* be used in the line search, and not curr_primal_infeasibility().
* What type of norm is used depends on constr_viol_normtype */
virtual Number curr_constraint_violation();
/** Constraint Violation (at trial point). This value should
* be used in the line search, and not curr_primal_infeasibility().
* What type of norm is used depends on constr_viol_normtype */
virtual Number trial_constraint_violation();
/** Real constraint violation in a given norm (at current
* iterate). This considers the inequality constraints without
* slacks. */
virtual Number curr_nlp_constraint_violation(ENormType NormType);
/** Unscaled real constraint violation in a given norm (at current
* iterate). This considers the inequality constraints without
* slacks. */
virtual Number unscaled_curr_nlp_constraint_violation(ENormType NormType);
/** Unscaled real constraint violation in a given norm (at trial
* iterate). This considers the inequality constraints without
* slacks. */
virtual Number unscaled_trial_nlp_constraint_violation(ENormType NormType);
//@}
/** @name Hessian matrices */
//@{
/** exact Hessian at current iterate (uncached) */
SmartPtr<const SymMatrix> curr_exact_hessian();
//@}
/** @name primal-dual error and its components */
//@{
/** x-part of gradient of Lagrangian function (at current point) */
SmartPtr<const Vector> curr_grad_lag_x();
/** x-part of gradient of Lagrangian function (at trial point) */
SmartPtr<const Vector> trial_grad_lag_x();
/** s-part of gradient of Lagrangian function (at current point) */
SmartPtr<const Vector> curr_grad_lag_s();
/** s-part of gradient of Lagrangian function (at trial point) */
SmartPtr<const Vector> trial_grad_lag_s();
/** x-part of gradient of Lagrangian function (at current point)
including linear damping term */
SmartPtr<const Vector> curr_grad_lag_with_damping_x();
/** s-part of gradient of Lagrangian function (at current point)
including linear damping term */
SmartPtr<const Vector> curr_grad_lag_with_damping_s();
/** Complementarity for x_L (for current iterate) */
SmartPtr<const Vector> curr_compl_x_L();
/** Complementarity for x_U (for current iterate) */
SmartPtr<const Vector> curr_compl_x_U();
/** Complementarity for s_L (for current iterate) */
SmartPtr<const Vector> curr_compl_s_L();
/** Complementarity for s_U (for current iterate) */
SmartPtr<const Vector> curr_compl_s_U();
/** Complementarity for x_L (for trial iterate) */
SmartPtr<const Vector> trial_compl_x_L();
/** Complementarity for x_U (for trial iterate) */
SmartPtr<const Vector> trial_compl_x_U();
/** Complementarity for s_L (for trial iterate) */
SmartPtr<const Vector> trial_compl_s_L();
/** Complementarity for s_U (for trial iterate) */
SmartPtr<const Vector> trial_compl_s_U();
/** Relaxed complementarity for x_L (for current iterate and current mu) */
SmartPtr<const Vector> curr_relaxed_compl_x_L();
/** Relaxed complementarity for x_U (for current iterate and current mu) */
SmartPtr<const Vector> curr_relaxed_compl_x_U();
/** Relaxed complementarity for s_L (for current iterate and current mu) */
SmartPtr<const Vector> curr_relaxed_compl_s_L();
/** Relaxed complementarity for s_U (for current iterate and current mu) */
SmartPtr<const Vector> curr_relaxed_compl_s_U();
/** Primal infeasibility in a given norm (at current iterate). */
virtual Number curr_primal_infeasibility(ENormType NormType);
/** Primal infeasibility in a given norm (at trial point) */
virtual Number trial_primal_infeasibility(ENormType NormType);
/** Dual infeasibility in a given norm (at current iterate) */
virtual Number curr_dual_infeasibility(ENormType NormType);
/** Dual infeasibility in a given norm (at trial iterate) */
virtual Number trial_dual_infeasibility(ENormType NormType);
/** Unscaled dual infeasibility in a given norm (at current iterate) */
virtual Number unscaled_curr_dual_infeasibility(ENormType NormType);
/** Complementarity (for all complementarity conditions together)
* in a given norm (at current iterate) */
virtual Number curr_complementarity(Number mu, ENormType NormType);
/** Complementarity (for all complementarity conditions together)
* in a given norm (at trial iterate) */
virtual Number trial_complementarity(Number mu, ENormType NormType);
/** Complementarity (for all complementarity conditions together)
* in a given norm (at current iterate) without NLP scaling. */
virtual Number unscaled_curr_complementarity(Number mu, ENormType NormType);
/** Centrality measure (in spirit of the -infinity-neighborhood. */
Number CalcCentralityMeasure(const Vector& compl_x_L,
const Vector& compl_x_U,
const Vector& compl_s_L,
const Vector& compl_s_U);
/** Centrality measure at current point */
virtual Number curr_centrality_measure();
/** Total optimality error for the original NLP at the current
* iterate, using scaling factors based on multipliers. Note
* that here the constraint violation is measured without slacks
* (nlp_constraint_violation) */
virtual Number curr_nlp_error();
/** Total optimality error for the original NLP at the current
* iterate, but using no scaling based on multipliers, and no
* scaling for the NLP. Note that here the constraint violation
* is measured without slacks (nlp_constraint_violation) */
virtual Number unscaled_curr_nlp_error();
/** Total optimality error for the barrier problem at the
* current iterate, using scaling factors based on multipliers. */
virtual Number curr_barrier_error();
/** Norm of the primal-dual system for a given mu (at current
* iterate). The norm is defined as the sum of the 1-norms of
* dual infeasibiliy, primal infeasibility, and complementarity,
* all divided by the number of elements of the vectors of which
* the norm is taken.
*/
virtual Number curr_primal_dual_system_error(Number mu);
/** Norm of the primal-dual system for a given mu (at trial
* iterate). The norm is defined as the sum of the 1-norms of
* dual infeasibiliy, primal infeasibility, and complementarity,
* all divided by the number of elements of the vectors of which
* the norm is taken.
*/
virtual Number trial_primal_dual_system_error(Number mu);
//@}
/** @name Computing fraction-to-the-boundary step sizes */
//@{
/** Fraction to the boundary from (current) primal variables x and s
* for a given step */
Number primal_frac_to_the_bound(Number tau,
const Vector& delta_x,
const Vector& delta_s);
/** Fraction to the boundary from (current) primal variables x and s
* for internal (current) step */
Number curr_primal_frac_to_the_bound(Number tau);
/** Fraction to the boundary from (current) dual variables z and v
* for a given step */
Number dual_frac_to_the_bound(Number tau,
const Vector& delta_z_L,
const Vector& delta_z_U,
const Vector& delta_v_L,
const Vector& delta_v_U);
/** Fraction to the boundary from (current) dual variables z and v
* for a given step, without caching */
Number uncached_dual_frac_to_the_bound(Number tau,
const Vector& delta_z_L,
const Vector& delta_z_U,
const Vector& delta_v_L,
const Vector& delta_v_U);
/** Fraction to the boundary from (current) dual variables z and v
* for internal (current) step */
Number curr_dual_frac_to_the_bound(Number tau);
/** Fraction to the boundary from (current) slacks for a given
* step in the slacks. Usually, one will use the
* primal_frac_to_the_bound method to compute the primal fraction
* to the boundary step size, but if it is cheaper to provide the
* steps in the slacks directly (e.g. when the primal step sizes
* are only temporary), the this method is more efficient. This
* method does not cache computations. */
Number uncached_slack_frac_to_the_bound(Number tau,
const Vector& delta_x_L,
const Vector& delta_x_U,
const Vector& delta_s_L,
const Vector& delta_s_U);
//@}
/** @name Sigma matrices */
//@{
SmartPtr<const Vector> curr_sigma_x();
SmartPtr<const Vector> curr_sigma_s();
//@}
/** average of current values of the complementarities */
Number curr_avrg_compl();
/** average of trial values of the complementarities */
Number trial_avrg_compl();
/** inner_product of current barrier obj. fn. gradient with
* current search direction */
Number curr_gradBarrTDelta();
/** Compute the norm of a specific type of a set of vectors (uncached) */
Number
CalcNormOfType(ENormType NormType,
std::vector<SmartPtr<const Vector> > vecs);
/** Compute the norm of a specific type of two vectors (uncached) */
Number
CalcNormOfType(ENormType NormType,
const Vector& vec1, const Vector& vec2);
/** Norm type used for calculating constraint violation */
ENormType constr_viol_normtype() const
{
return constr_viol_normtype_;
}
/** Method returning true if this is a square problem */
bool IsSquareProblem() const;
/** Method returning the IpoptNLP object. This should only be
* used with care! */
SmartPtr<IpoptNLP>& GetIpoptNLP()
{
return ip_nlp_;
}
IpoptAdditionalCq& AdditionalCq()
{
DBG_ASSERT(IsValid(add_cq_));
return *add_cq_;
}
/** Methods for IpoptType */
//@{
/** Called by IpoptType to register the options */
static void RegisterOptions(SmartPtr<RegisteredOptions> roptions);
//@}
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. */
//@{
/** Default Constructor */
IpoptCalculatedQuantities();
/** Copy Constructor */
IpoptCalculatedQuantities(const IpoptCalculatedQuantities&);
/** Overloaded Equals Operator */
void operator=(const IpoptCalculatedQuantities&);
//@}
/** @name Pointers for easy access to data and NLP information */
//@{
/** Ipopt NLP object */
SmartPtr<IpoptNLP> ip_nlp_;
/** Ipopt Data object */
SmartPtr<IpoptData> ip_data_;
/** Chen-Goldfarb specific calculated quantities */
SmartPtr<IpoptAdditionalCq> add_cq_;
//@}
/** @name Algorithmic Parameters that can be set throught the
* options list. Those parameters are initialize by calling the
* Initialize method.*/
//@{
/** Parameter in formula for computing overall primal-dual
* optimality error */
Number s_max_;
/** Weighting factor for the linear damping term added to the
* barrier objective funciton. */
Number kappa_d_;
/** fractional movement allowed in bounds */
Number slack_move_;
/** Norm type to be used when calculating the constraint violation */
ENormType constr_viol_normtype_;
/** Flag indicating whether the TNLP with identical structure has
* already been solved before. */
bool warm_start_same_structure_;
/** Desired value of the barrier parameter */
Number mu_target_;
//@}
/** @name Caches for slacks */
//@{
CachedResults< SmartPtr<Vector> > curr_slack_x_L_cache_;
CachedResults< SmartPtr<Vector> > curr_slack_x_U_cache_;
CachedResults< SmartPtr<Vector> > curr_slack_s_L_cache_;
CachedResults< SmartPtr<Vector> > curr_slack_s_U_cache_;
CachedResults< SmartPtr<Vector> > trial_slack_x_L_cache_;
CachedResults< SmartPtr<Vector> > trial_slack_x_U_cache_;
CachedResults< SmartPtr<Vector> > trial_slack_s_L_cache_;
CachedResults< SmartPtr<Vector> > trial_slack_s_U_cache_;
Index num_adjusted_slack_x_L_;
Index num_adjusted_slack_x_U_;
Index num_adjusted_slack_s_L_;
Index num_adjusted_slack_s_U_;
//@}
/** @name Cached for objective function stuff */
//@{
CachedResults<Number> curr_f_cache_;
CachedResults<Number> trial_f_cache_;
CachedResults< SmartPtr<const Vector> > curr_grad_f_cache_;
CachedResults< SmartPtr<const Vector> > trial_grad_f_cache_;
//@}
/** @name Caches for barrier function stuff */
//@{
CachedResults<Number> curr_barrier_obj_cache_;
CachedResults<Number> trial_barrier_obj_cache_;
CachedResults< SmartPtr<const Vector> > curr_grad_barrier_obj_x_cache_;
CachedResults< SmartPtr<const Vector> > curr_grad_barrier_obj_s_cache_;
CachedResults< SmartPtr<const Vector> > grad_kappa_times_damping_x_cache_;
CachedResults< SmartPtr<const Vector> > grad_kappa_times_damping_s_cache_;
//@}
/** @name Caches for constraint stuff */
//@{
CachedResults< SmartPtr<const Vector> > curr_c_cache_;
CachedResults< SmartPtr<const Vector> > trial_c_cache_;
CachedResults< SmartPtr<const Vector> > curr_d_cache_;
CachedResults< SmartPtr<const Vector> > trial_d_cache_;
CachedResults< SmartPtr<const Vector> > curr_d_minus_s_cache_;
CachedResults< SmartPtr<const Vector> > trial_d_minus_s_cache_;
CachedResults< SmartPtr<const Matrix> > curr_jac_c_cache_;
CachedResults< SmartPtr<const Matrix> > trial_jac_c_cache_;
CachedResults< SmartPtr<const Matrix> > curr_jac_d_cache_;
CachedResults< SmartPtr<const Matrix> > trial_jac_d_cache_;
CachedResults< SmartPtr<const Vector> > curr_jac_cT_times_vec_cache_;
CachedResults< SmartPtr<const Vector> > trial_jac_cT_times_vec_cache_;
CachedResults< SmartPtr<const Vector> > curr_jac_dT_times_vec_cache_;
CachedResults< SmartPtr<const Vector> > trial_jac_dT_times_vec_cache_;
CachedResults< SmartPtr<const Vector> > curr_jac_c_times_vec_cache_;
CachedResults< SmartPtr<const Vector> > curr_jac_d_times_vec_cache_;
CachedResults<Number> curr_constraint_violation_cache_;
CachedResults<Number> trial_constraint_violation_cache_;
CachedResults<Number> curr_nlp_constraint_violation_cache_;
CachedResults<Number> unscaled_curr_nlp_constraint_violation_cache_;
CachedResults<Number> unscaled_trial_nlp_constraint_violation_cache_;
//@}
/** Cache for the exact Hessian */
CachedResults< SmartPtr<const SymMatrix> > curr_exact_hessian_cache_;
/** @name Components of primal-dual error */
//@{
CachedResults< SmartPtr<const Vector> > curr_grad_lag_x_cache_;
CachedResults< SmartPtr<const Vector> > trial_grad_lag_x_cache_;
CachedResults< SmartPtr<const Vector> > curr_grad_lag_s_cache_;
CachedResults< SmartPtr<const Vector> > trial_grad_lag_s_cache_;
CachedResults< SmartPtr<const Vector> > curr_grad_lag_with_damping_x_cache_;
CachedResults< SmartPtr<const Vector> > curr_grad_lag_with_damping_s_cache_;
CachedResults< SmartPtr<const Vector> > curr_compl_x_L_cache_;
CachedResults< SmartPtr<const Vector> > curr_compl_x_U_cache_;
CachedResults< SmartPtr<const Vector> > curr_compl_s_L_cache_;
CachedResults< SmartPtr<const Vector> > curr_compl_s_U_cache_;
CachedResults< SmartPtr<const Vector> > trial_compl_x_L_cache_;
CachedResults< SmartPtr<const Vector> > trial_compl_x_U_cache_;
CachedResults< SmartPtr<const Vector> > trial_compl_s_L_cache_;
CachedResults< SmartPtr<const Vector> > trial_compl_s_U_cache_;
CachedResults< SmartPtr<const Vector> > curr_relaxed_compl_x_L_cache_;
CachedResults< SmartPtr<const Vector> > curr_relaxed_compl_x_U_cache_;
CachedResults< SmartPtr<const Vector> > curr_relaxed_compl_s_L_cache_;
CachedResults< SmartPtr<const Vector> > curr_relaxed_compl_s_U_cache_;
CachedResults<Number> curr_primal_infeasibility_cache_;
CachedResults<Number> trial_primal_infeasibility_cache_;
CachedResults<Number> curr_dual_infeasibility_cache_;
CachedResults<Number> trial_dual_infeasibility_cache_;
CachedResults<Number> unscaled_curr_dual_infeasibility_cache_;
CachedResults<Number> curr_complementarity_cache_;
CachedResults<Number> trial_complementarity_cache_;
CachedResults<Number> curr_centrality_measure_cache_;
CachedResults<Number> curr_nlp_error_cache_;
CachedResults<Number> unscaled_curr_nlp_error_cache_;
CachedResults<Number> curr_barrier_error_cache_;
CachedResults<Number> curr_primal_dual_system_error_cache_;
CachedResults<Number> trial_primal_dual_system_error_cache_;
//@}
/** @name Caches for fraction to the boundary step sizes */
//@{
CachedResults<Number> primal_frac_to_the_bound_cache_;
CachedResults<Number> dual_frac_to_the_bound_cache_;
//@}
/** @name Caches for sigma matrices */
//@{
CachedResults< SmartPtr<const Vector> > curr_sigma_x_cache_;
CachedResults< SmartPtr<const Vector> > curr_sigma_s_cache_;
//@}
/** Cache for average of current complementarity */
CachedResults<Number> curr_avrg_compl_cache_;
/** Cache for average of trial complementarity */
CachedResults<Number> trial_avrg_compl_cache_;
/** Cache for grad barrier obj. fn inner product with step */
CachedResults<Number> curr_gradBarrTDelta_cache_;
/** @name Indicator vectors required for the linear damping terms
* to handle unbounded solution sets. */
//@{
/** Indicator vector for selecting the elements in x that have
* only lower bounds. */
SmartPtr<Vector> dampind_x_L_;
/** Indicator vector for selecting the elements in x that have
* only upper bounds. */
SmartPtr<Vector> dampind_x_U_;
/** Indicator vector for selecting the elements in s that have
* only lower bounds. */
SmartPtr<Vector> dampind_s_L_;
/** Indicator vector for selecting the elements in s that have
* only upper bounds. */
SmartPtr<Vector> dampind_s_U_;
//@}
/** @name Temporary vectors for intermediate calcuations. We keep
* these around to avoid unnecessarily many new allocations of
* Vectors. */
//@{
SmartPtr<Vector> tmp_x_;
SmartPtr<Vector> tmp_s_;
SmartPtr<Vector> tmp_c_;
SmartPtr<Vector> tmp_d_;
SmartPtr<Vector> tmp_x_L_;
SmartPtr<Vector> tmp_x_U_;
SmartPtr<Vector> tmp_s_L_;
SmartPtr<Vector> tmp_s_U_;
/** Accessor methods for the temporary vectors */
Vector& Tmp_x();
Vector& Tmp_s();
Vector& Tmp_c();
Vector& Tmp_d();
Vector& Tmp_x_L();
Vector& Tmp_x_U();
Vector& Tmp_s_L();
Vector& Tmp_s_U();
//@}
/** flag indicating if Initialize method has been called (for
* debugging) */
bool initialize_called_;
/** @name Auxiliary functions */
//@{
/** Compute new vector containing the slack to a lower bound
* (uncached)
*/
SmartPtr<Vector> CalcSlack_L(const Matrix& P,
const Vector& x,
const Vector& x_bound);
/** Compute new vector containing the slack to a upper bound
* (uncached)
*/
SmartPtr<Vector> CalcSlack_U(const Matrix& P,
const Vector& x,
const Vector& x_bound);
/** Compute barrier term at given point
* (uncached)
*/
Number CalcBarrierTerm(Number mu,
const Vector& slack_x_L,
const Vector& slack_x_U,
const Vector& slack_s_L,
const Vector& slack_s_U);
/** Compute complementarity for slack / multiplier pair */
SmartPtr<const Vector> CalcCompl(const Vector& slack,
const Vector& mult);
/** Compute fraction to the boundary parameter for lower and upper bounds */
Number CalcFracToBound(const Vector& slack_L,
Vector& tmp_L,
const Matrix& P_L,
const Vector& slack_U,
Vector& tmp_U,
const Matrix& P_U,
const Vector& delta,
Number tau);
/** Compute the scaling factors for the optimality error. */
void ComputeOptimalityErrorScaling(const Vector& y_c, const Vector& y_d,
const Vector& z_L, const Vector& z_U,
const Vector& v_L, const Vector& v_U,
Number s_max,
Number& s_d, Number& s_c);
/** Check if slacks are becoming too small. If slacks are
* becoming too small, they are change. The return value is the
* number of corrected slacks. */
Index CalculateSafeSlack(SmartPtr<Vector>& slack,
const SmartPtr<const Vector>& bound,
const SmartPtr<const Vector>& curr_point,
const SmartPtr<const Vector>& multiplier);
/** Computes the indicator vectors that can be used to filter out
* those entries in the slack_... variables, that correspond to
* variables with only lower and upper bounds. This is required
* for the linear damping term in the barrier objective function
* to handle unbounded solution sets. */
void ComputeDampingIndicators(SmartPtr<const Vector>& dampind_x_L,
SmartPtr<const Vector>& dampind_x_U,
SmartPtr<const Vector>& dampind_s_L,
SmartPtr<const Vector>& dampind_s_U);
/** Check if we are in the restoration phase. Returns true, if the
* ip_nlp is of the type RestoIpoptNLP. ToDo: We probably want to
* handle this more elegant and don't have an explicit dependency
* here. Now I added this because otherwise the caching doesn't
* work properly since the restoration phase objective function
* depends on the current barrier parameter. */
bool in_restoration_phase();
//@}
};
} // namespace Ipopt
#endif