/*-------------------------------------------------------------------------------------*/
/* NOMAD - Nonlinear Optimization by Mesh Adaptive Direct search - version 3.6.1 */
/* */
/* Copyright (C) 2001-2012 Mark Abramson - the Boeing Company, Seattle */
/* Charles Audet - Ecole Polytechnique, Montreal */
/* Gilles Couture - Ecole Polytechnique, Montreal */
/* John Dennis - Rice University, Houston */
/* Sebastien Le Digabel - Ecole Polytechnique, Montreal */
/* Christophe Tribes - Ecole Polytechnique, Montreal */
/* */
/* funded in part by AFOSR and Exxon Mobil */
/* */
/* Author: Sebastien Le Digabel */
/* */
/* Contact information: */
/* Ecole Polytechnique de Montreal - GERAD */
/* C.P. 6079, Succ. Centre-ville, Montreal (Quebec) H3C 3A7 Canada */
/* e-mail: nomad@gerad.ca */
/* phone : 1-514-340-6053 #6928 */
/* fax : 1-514-340-5665 */
/* */
/* This program 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 program 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 program. If not, see . */
/* */
/* You can find information on the NOMAD software at www.gerad.ca/nomad */
/*-------------------------------------------------------------------------------------*/
/**
\file Extended_Poll.hpp
\brief Extended poll for categorical variables (headers)
\author Sebastien Le Digabel
\date 2010-04-14
\see Extended_Poll.cpp
*/
#ifndef __EXTENDED_POLL__
#define __EXTENDED_POLL__
#include "Mads.hpp"
#include "Signature_Element.hpp"
namespace NOMAD {
/// Generic class for the extended poll.
/**
This is an abstract class (it is not possible to create
NOMAD::Extended_Poll objects).
*/
class Extended_Poll : public NOMAD::Uncopyable {
protected:
/// Parameters (includes the standard signature).
NOMAD::Parameters & _p;
/// Add an extended poll point.
/**
Get, check and register the extended point and its signature
created by the user in \c construct_extended_points().
\param ep Extended poll point -- \b IN.
\param s Associated signature -- \b IN.
*/
void add_extended_poll_point ( NOMAD::Point & ep , NOMAD::Signature & s );
/*---------------------------------------------------------------------*/
private:
/// Executable for getting neighbors in batch mode.
std::string _neighbors_exe;
/// Set of signatures (does not include the standard signature).
std::set _signatures;
/// Signatures used during one poll step.
std::set _poll_signatures;
/// Extended points for one poll step.
std::list _extended_points;
/*---------------------------------------------------------------------*/
/// Evaluation of an extended poll point.
/**
\param y The extended poll point -- \b IN/OUT.
\param mads NOMAD::Mads object invoking the poll -- \b IN/OUT.
\param stop Stop flag -- \b IN/OUT.
\param stop_reason Stop reason -- \b OUT.
\param success Type of success -- \b OUT.
\param new_feas_inc New feasible incumbent -- \b IN/OUT.
\param new_infeas_inc New infeasible incumbent -- \b IN/OUT.
\return A pointer to the evaluated point; may be \c NULL if
the evaluation failed.
*/
const NOMAD::Eval_Point * eval_epp
( NOMAD::Eval_Point * y ,
Mads & mads ,
bool & stop ,
NOMAD::stop_type & stop_reason ,
NOMAD::success_type & success ,
const NOMAD::Eval_Point *& new_feas_inc ,
const NOMAD::Eval_Point *& new_infeas_inc ) const;
/// Sort the evaluated extended poll points.
/**
\param evaluated_pts The list of evaluated extended poll points -- \b IN/OUT.
*/
void sort_epp ( const std::list & evaluated_pts );
/// Check the extended poll trigger.
/**
\param old_bf A pointer to the old best feasible point -- \b IN.
\param old_bi A pointer to the old best infeasible point -- \b IN.
\param y A pointer to the extended poll center -- \b IN.
\return A boolean equal to \c true if the extended poll has to be performed.
*/
bool check_trigger ( const NOMAD::Eval_Point * old_bf ,
const NOMAD::Eval_Point * old_bi ,
const NOMAD::Eval_Point * y ) const;
/// Check only the \c f values for the extended poll trigger.
/**
\param old_f Old \c f value -- \b IN.
\param new_f New \c f value -- \b IN.
\return A boolean equal to \c true if the extended poll has to be performed.
*/
bool check_trigger_on_f ( const NOMAD::Double & old_f ,
const NOMAD::Double & new_f ) const;
/// Create the descent parameters.
/**
\param y Starting point -- \b IN.
\param stats Stats -- \b IN.
\param descent_p Descent parameters -- \b IN/OUT.
*/
void set_descent_parameters ( const NOMAD::Eval_Point * y ,
const NOMAD::Stats & stats ,
NOMAD::Parameters & descent_p ) const;
/// Descent from the extended poll center.
/**
\param y Extended poll center -- \b IN.
\param mads NOMAD::Mads object invoking the poll -- \b IN/OUT.
\param nb_ext_poll_pts Number of extended poll points -- \b IN/OUT.
\param stop Stop flag -- \b IN/OUT.
\param stop_reason Stop reason -- \b OUT.
\param success Type of success -- \b OUT.
\param new_feas_inc New feasible incumbent -- \b IN/OUT.
\param new_infeas_inc New infeasible incumbent -- \b IN/OUT.
*/
void descent ( const NOMAD::Eval_Point * y ,
Mads & mads ,
int & nb_ext_poll_pts ,
bool & stop ,
NOMAD::stop_type & stop_reason ,
NOMAD::success_type & success ,
const NOMAD::Eval_Point *& new_feas_inc ,
const NOMAD::Eval_Point *& new_infeas_inc );
/*---------------------------------------------------------------------*/
public:
/// Constructor.
/**
\param p Parameters -- \b IN.
*/
Extended_Poll ( NOMAD::Parameters & p ) : _p ( p ) {}
/// Destructor.
virtual ~Extended_Poll ( void );
/// Construct the extended poll points.
/**
- Has to be implemented by every NOMAD::Extended_Poll subclass.
- The extended poll points are the neighbors of \c xk where
categorical variables have different values.
- The default implementation of this method uses parameter NEIGHBORS_EXE.
\param xk Poll center.
*/
virtual void construct_extended_points ( const NOMAD::Eval_Point & xk );
/// Set the neighbors executable name for the default implementation.
/**
\param error_str A string containing a possible error message -- \b OUT.
\return \c true if no error.
*/
bool set_neighbors_exe ( std::string & error_str );
/// Reset.
void reset ( void );
/// Poll reset.
/**
Before the extended poll is launched.
*/
void poll_reset ( void );
/// Access to the poll signatures.
/**
\return The set of poll signatures.
*/
const std::set & get_poll_signatures ( void ) const
{
return _poll_signatures;
}
/// Run the extended poll.
/**
\param mads NOMAD::Mads object invoking this poll -- \b IN/OUT.
\param nb_ext_poll_pts Number of extended poll points -- \b OUT.
\param stop Stop flag -- \b IN/OUT.
\param stop_reason Stop reason -- \b OUT.
\param success Type of success -- \b OUT.
\param new_feas_inc New feasible incumbent -- \b IN/OUT.
\param new_infeas_inc New infeasible incumbent -- \b IN/OUT.
*/
void run ( Mads & mads ,
int & nb_ext_poll_pts ,
bool & stop ,
NOMAD::stop_type & stop_reason ,
NOMAD::success_type & success ,
const NOMAD::Eval_Point *& new_feas_inc ,
const NOMAD::Eval_Point *& new_infeas_inc );
};
}
#endif