// -*- C++ -*-
/**
* @brief BonminProblem implements the interface between OT and Bonmin for
* optimization problems. It is derived from Bonmin::TMINLP to ensure
* compatibility with Bonmin algorithms.
*
* Copyright 2005-2021 Airbus-EDF-IMACS-ONERA-Phimeca
*
* This library is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library. If not, see .
*
*/
#ifndef OPENTURNS_BONMINPROBLEM_HXX
#define OPENTURNS_BONMINPROBLEM_HXX
#include "openturns/OTprivate.hxx"
#include "openturns/OptimizationAlgorithmImplementation.hxx"
#include
#include
BEGIN_NAMESPACE_OPENTURNS
typedef ::Bonmin::TMINLP::VariableType * VariableTypeTable;
typedef ::Ipopt::TNLP::LinearityType * LinearityTypeTable;
class BonminProblem
: public ::Bonmin::TMINLP // Namespace to be confirmed
{
public:
/** Constructor with parameters */
BonminProblem( const OptimizationProblem & optimProblem,
const Point & startingPoint,
const UnsignedInteger maximumEvaluationNumber
);
/** Retrieving objective function input.output history */
Sample getInputHistory() const;
Sample getOutputHistory() const;
/** Overloading functions from Bonmin::TMINLP
See BonTMINLP.hpp for description */
// n: number of variables
// m: number of constraints
bool get_nlp_info(int & n,
int & m,
int & nnz_jac_g, // Number of non-zero components in the Jacobian of g
int & nnz_h_lag, // Number of non-zero components in Hessian of Lagrangean
::Ipopt::TNLP::IndexStyleEnum & index_style);
bool get_variables_types( int n,
VariableTypeTable var_types);
bool get_variables_linearity( int n,
LinearityTypeTable var_types);
bool get_constraints_linearity( int m,
LinearityTypeTable const_types);
bool get_bounds_info( int n,
double* x_l, // Lower bounds
double* x_u, // Upper bounds
int m,
double* g_l, // Lower bounds
double* g_u); // Upper bounds
bool get_starting_point(int n,
bool init_x,
double* x,
bool init_z,
double* z_L,
double* z_U,
int m,
bool init_lambda,
double* lambda);
bool eval_f(int n,
const double* x,
bool new_x,
double& obj_value);
bool eval_grad_f( int n,
const double* x,
bool new_x,
double* grad_f);
bool eval_g(int n,
const double* x,
bool new_x,
int m,
double* g);
bool eval_jac_g(int n,
const double* x,
bool new_x,
int m,
int nele_jac,
int* iRow,
int *jCol,
double* values);
bool eval_h(int n,
const double* x,
bool new_x,
double obj_factor,
int m,
const double* lambda,
bool new_lambda,
int nele_hess,
int* iRow,
int* jCol,
double* values);
bool eval_gi(int n,
const double* x,
bool new_x,
int i,
double& gi);
bool eval_grad_gi(int n,
const double* x,
bool new_x,
int i,
int& nele_grad_gi,
int* jCol,
double* values);
void finalize_solution( ::Bonmin::TMINLP::SolverReturn status,
::Ipopt::Index n,
const ::Ipopt::Number* x,
::Ipopt::Number obj_value);
const ::Bonmin::TMINLP::BranchingInfo * branchingInfo() const
{
return NULL;
};
const ::Bonmin::TMINLP::SosInfo * sosConstraints() const
{
return NULL;
};
Point getOptimalPoint() const
{
return optimalPoint_;
}
Point getOptimalValue() const
{
return optimalValue_;
}
virtual void setProgressCallback(OptimizationAlgorithmImplementation::ProgressCallback callBack, void * state = 0)
{
progressCallback_ = std::pair(callBack, state);
}
virtual void setStopCallback(OptimizationAlgorithmImplementation::StopCallback callBack, void * state = 0)
{
stopCallback_ = std::pair(callBack, state);
}
private:
const OptimizationProblem optimProblem_;
const Point startingPoint_;
Sample evaluationInputHistory_;
Sample evaluationOutputHistory_;
Point optimalPoint_;
Point optimalValue_;
// Callbacks
UnsignedInteger maximumEvaluationNumber_;
std::pair< OptimizationAlgorithmImplementation::ProgressCallback, void *> progressCallback_;
std::pair< OptimizationAlgorithmImplementation::StopCallback, void *> stopCallback_;
};
END_NAMESPACE_OPENTURNS
#endif