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.
 
 
 
 
 
 

300 lines
11 KiB

// Copyright (C) 2004, 2010 International Business Machines and others.
// All Rights Reserved.
// This code is published under the Eclipse Public License.
//
// $Id: IpIpoptApplication.hpp 2690 2017-06-12 10:28:36Z stefan $
//
// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13
#ifndef __IPIPOPTAPPLICATION_HPP__
#define __IPIPOPTAPPLICATION_HPP__
#ifndef IPOPT_EXPORT
#ifdef _MSC_VER
#ifdef IPOPT_DLL
#define IPOPT_EXPORT(type) __declspec(dllexport) type __cdecl
#else
#define IPOPT_EXPORT(type) type __cdecl
#endif
#else
#define IPOPT_EXPORT(type) type
#endif
#endif
#include <iostream>
#include "IpJournalist.hpp"
#include "IpTNLP.hpp"
#include "IpNLP.hpp"
/* Return codes for the Optimize call for an application */
#include "IpReturnCodes.hpp"
namespace Ipopt
{
DECLARE_STD_EXCEPTION(IPOPT_APPLICATION_ERROR);
/* forward declarations */
class IpoptAlgorithm;
class IpoptNLP;
class IpoptData;
class IpoptCalculatedQuantities;
class AlgorithmBuilder;
class RegisteredOptions;
class OptionsList;
class SolveStatistics;
/** This is the main application class for making calls to Ipopt. */
class IpoptApplication : public ReferencedObject
{
public:
IpoptApplication(bool create_console_out = true,
bool create_empty = false);
/** Another constructor that assumes that the code in the
* (default) constructor has already been executed */
IpoptApplication(SmartPtr<RegisteredOptions> reg_options,
SmartPtr<OptionsList> options,
SmartPtr<Journalist> jnlst);
virtual ~IpoptApplication();
/** Method for creating a new IpoptApplication that uses the same
* journalist and registered options, and a copy of the options
list. */
virtual SmartPtr<IpoptApplication> clone();
/** Initialization method. This method reads options from the
* input stream and initializes the journalists. It returns
* something other than Solve_Succeeded if there was a
* problem in the initialization (such as an invalid option).
* You should call one of the initialization methods at some
* point before the first optimize call.
* Set @par allow_clobber to true if you want to allow
* overwriting options that are set by the input stream.
*/
virtual ApplicationReturnStatus Initialize(std::istream& is, bool allow_clobber = false);
/** Initialization method. This method reads options from the
* params file and initializes the journalists. It returns
* something other than Solve_Succeeded if there was a
* problem in the initialization (such as an invalid option).
* You should call one of the initialization methods at some
* point before the first optimize call.
* Note: You can skip the processing of a params file by
* setting params_file to "".
* Set @par allow_clobber to true if you want to allow
* overwriting options that are set by the params file.
*/
virtual ApplicationReturnStatus Initialize(std::string params_file, bool allow_clobber = false);
/** Initialization method. This method reads options from the
* params file and initializes the journalists. It returns
* something other than Solve_Succeeded if there was a
* problem in the initialization (such as an invalid option).
* You should call one of the initialization methods at some
* point before the first optimize call.
* Note: You can skip the processing of a params file by
* setting params_file to "".
* Set @par allow_clobber to true if you want to allow
* overwriting options that are set by the params file.
*/
virtual ApplicationReturnStatus Initialize(const char* params_file, bool allow_clobber = false)
{
return Initialize(std::string(params_file), allow_clobber);
}
/** Initialize method. This method reads the options file specified
* by the option_file_name option and initializes the journalists.
* You should call this method at some point before the first optimize
* call.
* It returns something other than Solve_Succeeded if there was a
* problem in the initialization (such as an invalid option).
* Set @par allow_clobber to true if you want to allow
* overwriting options that are set by the options file.
*/
virtual ApplicationReturnStatus Initialize(bool allow_clobber = false);
/**@name Solve methods */
//@{
/** Solve a problem that inherits from TNLP */
virtual ApplicationReturnStatus OptimizeTNLP(const SmartPtr<TNLP>& tnlp);
/** Solve a problem that inherits from NLP */
virtual ApplicationReturnStatus OptimizeNLP(const SmartPtr<NLP>& nlp);
/** Solve a problem that inherits from NLP */
virtual ApplicationReturnStatus OptimizeNLP(const SmartPtr<NLP>& nlp, SmartPtr<AlgorithmBuilder>& alg_builder);
/** Solve a problem (that inherits from TNLP) for a repeated time.
* The OptimizeTNLP method must have been called before. The
* TNLP must be the same object, and the structure (number of
* variables and constraints and position of nonzeros in Jacobian
* and Hessian must be the same). */
virtual ApplicationReturnStatus ReOptimizeTNLP(const SmartPtr<TNLP>& tnlp);
/** Solve a problem (that inherits from NLP) for a repeated time.
* The OptimizeNLP method must have been called before. The
* NLP must be the same object, and the structure (number of
* variables and constraints and position of nonzeros in Jacobian
* and Hessian must be the same). */
virtual ApplicationReturnStatus ReOptimizeNLP(const SmartPtr<NLP>& nlp);
//@}
/** Method for opening an output file with given print_level.
* Returns false if there was a problem. */
virtual bool OpenOutputFile(std::string file_name, EJournalLevel print_level);
/**@name Accessor methods */
//@{
/** Get the Journalist for printing output */
virtual SmartPtr<Journalist> Jnlst()
{
return jnlst_;
}
/** Get a pointer to RegisteredOptions object to
* add new options */
virtual SmartPtr<RegisteredOptions> RegOptions()
{
return reg_options_;
}
/** Get the options list for setting options */
virtual SmartPtr<OptionsList> Options()
{
return options_;
}
/** Get the options list for setting options (const version) */
virtual SmartPtr<const OptionsList> Options() const
{
return ConstPtr(options_);
}
/** Get the object with the statistics about the most recent
* optimization run. */
virtual SmartPtr<SolveStatistics> Statistics();
/** Get the IpoptNLP Object */
virtual SmartPtr<IpoptNLP> IpoptNLPObject();
/** Get the IpoptData Object */
SmartPtr<IpoptData> IpoptDataObject();
/** Get the IpoptCQ Object */
virtual SmartPtr<IpoptCalculatedQuantities> IpoptCQObject();
/** Get the Algorithm Object */
SmartPtr<IpoptAlgorithm> AlgorithmObject();
//@}
/** Method for printing Ipopt copyright message now instead of
* just before the optimization. If you want to have the copy
* right message printed earlier than by default, call this
* method at the convenient time. */
void PrintCopyrightMessage();
/** Method to set whether non-ipopt non-bad_alloc exceptions
* are rethrown by Ipopt.
* By default, non-Ipopt and non-std::bad_alloc exceptions are
* caught by Ipopts initialization and optimization methods
* and the status NonIpopt_Exception_Thrown is returned.
* This function allows to enable rethrowing of such exceptions.
*
* @return Returns whether non-ipopt exceptions were rethrown before.
*/
bool RethrowNonIpoptException(bool dorethrow)
{
bool oldval = rethrow_nonipoptexception_;
rethrow_nonipoptexception_ = dorethrow;
return oldval;
}
/** @name Methods for IpoptTypeInfo */
//@{
static void RegisterOptions(SmartPtr<RegisteredOptions> roptions);
//@}
/** Method to registering all Ipopt options. */
static void
RegisterAllIpoptOptions(const 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 */
// IpoptApplication();
/** Copy Constructor */
IpoptApplication(const IpoptApplication&);
/** Overloaded Equals Operator */
void operator=(const IpoptApplication&);
//@}
/** Method for the actual optimize call of the Ipopt algorithm.
* This is used both for Optimize and ReOptimize */
ApplicationReturnStatus call_optimize();
/**@name Variables that customize the application behavior */
//@{
/** Decide whether or not the ipopt.opt file should be read */
bool read_params_dat_;
/** Decide whether non-ipopt non-bad_alloc exceptions should be rethrown */
bool rethrow_nonipoptexception_;
//@}
/** Journalist for reporting output */
SmartPtr<Journalist> jnlst_;
/** RegisteredOptions */
SmartPtr<RegisteredOptions> reg_options_;
/** OptionsList used for the application */
SmartPtr<OptionsList> options_;
/** Object for storing statistics about the most recent
* optimization run. */
SmartPtr<SolveStatistics> statistics_;
/** Object with the algorithm sceleton.
*/
SmartPtr<IpoptAlgorithm> alg_;
/** IpoptNLP Object for the NLP. We keep this around for a
* ReOptimize warm start. */
SmartPtr<IpoptNLP> ip_nlp_;
/** IpoptData Object for the NLP. We keep this around for a
* ReOptimize warm start.
*/
SmartPtr<IpoptData> ip_data_;
/** IpoptCalculatedQuantities Object for the NLP. We keep this
* around for a ReOptimize warm start.
*/
SmartPtr<IpoptCalculatedQuantities> ip_cq_;
/** Pointer to the TNLPAdapter used to convert the TNLP to an NLP.
* We keep this around for the ReOptimizerTNLP call. */
SmartPtr<NLP> nlp_adapter_;
/** @name Algorithmic parameters */
//@{
/** Flag indicating if we are to use the inexact linear solver option */
bool inexact_algorithm_;
/** Flag indicating if all bounds should be replaced by inequality
* constraints. This is necessary for the inexact algorithm. */
bool replace_bounds_;
//@}
};
} // namespace Ipopt
extern "C" IPOPT_EXPORT(class Ipopt::IpoptApplication *) IpoptApplicationFactory();
#endif