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.
 
 
 
 
 
 

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