openpilot is an open source driver assistance system. openpilot performs the functions of Automated Lane Centering and Adaptive Cruise Control for over 200 supported car makes and models.
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.
 
 
 
 
 
 

185 lines
5.7 KiB

// Copyright (C) 2004, 2006 International Business Machines and others.
// All Rights Reserved.
// This code is published under the Eclipse Public License.
//
// $Id: IpAlgStrategy.hpp 1861 2010-12-21 21:34:47Z andreasw $
//
// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13
#ifndef __IPALGSTRATEGY_HPP__
#define __IPALGSTRATEGY_HPP__
#include "IpOptionsList.hpp"
#include "IpJournalist.hpp"
#include "IpIpoptCalculatedQuantities.hpp"
#include "IpIpoptNLP.hpp"
#include "IpIpoptData.hpp"
namespace Ipopt
{
/** This is the base class for all algorithm strategy objects. The
* AlgorithmStrategyObject base class implements a common interface
* for all algorithm strategy objects. A strategy object is a
* component of the algorithm for which different alternatives or
* implementations exists. It allows to compose the algorithm
* before execution for a particular configuration, without the
* need to call alternatives based on enums. For example, the
* LineSearch object is a strategy object, since different line
* search options might be used for different runs.
*
* This interface is used for
* things that are done to all strategy objects, like
* initialization and setting options.
*/
class AlgorithmStrategyObject : public ReferencedObject
{
public:
/**@name Constructors/Destructors */
//@{
/** Default Constructor */
AlgorithmStrategyObject()
:
initialize_called_(false)
{}
/** Default Destructor */
virtual ~AlgorithmStrategyObject()
{}
//@}
/** This method is called every time the algorithm starts again -
* it is used to reset any internal state. The pointers to the
* Journalist, as well as to the IpoptNLP, IpoptData, and
* IpoptCalculatedQuantities objects should be stored in the
* instanciation of this base class. This method is also used to
* get all required user options from the OptionsList. Here, if
* prefix is given, each tag (identifying the options) is first
* looked for with the prefix in front, and if not found, without
* the prefix. Note: you should not cue off of the iteration
* count to indicate the "start" of an algorithm!
*
* Do not overload this method, since it does some general
* initialization that is common for all strategy objects.
* Overload the protected InitializeImpl method instead.
*/
bool Initialize(const Journalist& jnlst,
IpoptNLP& ip_nlp,
IpoptData& ip_data,
IpoptCalculatedQuantities& ip_cq,
const OptionsList& options,
const std::string& prefix)
{
initialize_called_ = true;
// Copy the pointers for the problem defining objects
jnlst_ = &jnlst;
ip_nlp_ = &ip_nlp;
ip_data_ = &ip_data;
ip_cq_ = &ip_cq;
bool retval = InitializeImpl(options, prefix);
if (!retval) {
initialize_called_ = false;
}
return retval;
}
/** Reduced version of the Initialize method, which does not
* require special Ipopt information. This is useful for
* algorithm objects that could be used outside Ipopt, such as
* linear solvers. */
bool ReducedInitialize(const Journalist& jnlst,
const OptionsList& options,
const std::string& prefix)
{
initialize_called_ = true;
// Copy the pointers for the problem defining objects
jnlst_ = &jnlst;
ip_nlp_ = NULL;
ip_data_ = NULL;
ip_cq_ = NULL;
bool retval = InitializeImpl(options, prefix);
if (!retval) {
initialize_called_ = false;
}
return retval;
}
protected:
/** Implementation of the initialization method that has to be
* overloaded by for each derived class. */
virtual bool InitializeImpl(const OptionsList& options,
const std::string& prefix)=0;
/** @name Accessor methods for the problem defining objects.
* Those should be used by the derived classes. */
//@{
const Journalist& Jnlst() const
{
DBG_ASSERT(initialize_called_);
return *jnlst_;
}
IpoptNLP& IpNLP() const
{
DBG_ASSERT(initialize_called_);
DBG_ASSERT(IsValid(ip_nlp_));
return *ip_nlp_;
}
IpoptData& IpData() const
{
DBG_ASSERT(initialize_called_);
DBG_ASSERT(IsValid(ip_data_));
return *ip_data_;
}
IpoptCalculatedQuantities& IpCq() const
{
DBG_ASSERT(initialize_called_);
DBG_ASSERT(IsValid(ip_cq_));
return *ip_cq_;
}
bool HaveIpData() const
{
return IsValid(ip_data_);
}
//@}
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 */
//AlgorithmStrategyObject();
/** Copy Constructor */
AlgorithmStrategyObject(const AlgorithmStrategyObject&);
/** Overloaded Equals Operator */
void operator=(const AlgorithmStrategyObject&);
//@}
/** @name Pointers to objects defining a particular optimization
* problem */
//@{
SmartPtr<const Journalist> jnlst_;
SmartPtr<IpoptNLP> ip_nlp_;
SmartPtr<IpoptData> ip_data_;
SmartPtr<IpoptCalculatedQuantities> ip_cq_;
//@}
/** flag indicating if Initialize method has been called (for
* debugging) */
bool initialize_called_;
};
} // namespace Ipopt
#endif