/*-------------------------------------------------------------------------------------*/ /* 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 Barrier.hpp \brief Barrier for constraints handling (headers) \author Sebastien Le Digabel \date 2010-04-12 \see Barrier.cpp */ #ifndef __BARRIER__ #define __BARRIER__ #include "Cache.hpp" #include "Filter_Point.hpp" namespace NOMAD { /// Barrier class for constraints handling. /** The barrier is basically a structure that stores evaluation points. */ class Barrier : private NOMAD::Uncopyable { private: const NOMAD::Parameters & _p; ///< Parameters. NOMAD::eval_type _eval_type; ///< Truth or surrogate. NOMAD::Double _h_max; ///< Maximal value for \c h. const NOMAD::Eval_Point * _best_feasible; ///< Best feasible solution. /// Progressive barrier reference point. const NOMAD::Eval_Point * _ref; std::set _filter; ///< Filter. std::set _prefilter; ///< Pre-filter based on point tags. int _rho_leaps; ///< Number of trigger (rho) leaps. const NOMAD::Eval_Point * _poll_center; ///< Primary poll center. const NOMAD::Eval_Point * _sec_poll_center; ///< Secondary poll center. /** Number of constraints that have been changed to NOMAD::PEB_E (Extreme status for the PEB strategy). */ int _peb_changes; /** Number of times that the filter has been reseted following a PEB change of status. */ int _peb_filter_reset; /** List of all points that we tried to insert into the filter, with PEB constraints. */ std::list _peb_lop; /// List of all points that we tried to insert into the filter. std::list _all_inserted; NOMAD::success_type _one_eval_succ; ///< Success for one evaluation. NOMAD::success_type _success; ///< Success for a list of evaluations. /*----------------------------------------------------*/ /// Insertion of a feasible point. /** \param x The feasible point to insert -- \b IN. \return Success type of the insertion (NOMAD::FULL_SUCCESS or NOMAD::UNSUCCESSFUL). */ NOMAD::success_type insert_feasible ( const NOMAD::Eval_Point & x ); /// Insertion of an infeasible point. /** \param x The infeasible point to insert -- \b IN. \return Success type of the insertion (NOMAD::FULL_SUCCESS, NOMAD::UNSUCCESSFUL, or NOMAD::PARTIAL_SUCCESS). */ NOMAD::success_type insert_infeasible ( const NOMAD::Eval_Point & x ); /// Change the value of \c h_max. /** \param h_max The new value of \c h_max -- \b IN. */ void set_h_max ( const NOMAD::Double & h_max ); /// Insertion into the filter. /** \param x The point to insert -- \b IN. \param insert A boolean equal to \c true if the point has been inserted into the barrier -- \b OUT. */ void filter_insertion ( const NOMAD::Eval_Point & x , bool & insert ); /*----------------------------------------------------*/ public: /// Exception class for barrier update error. class Update_Error : public NOMAD::Exception { public: /// Constructor. Update_Error ( const std::string & file , int line , const std::string & msg ) : NOMAD::Exception ( file , line , msg ) {} }; /// Exception class for an insertion error. class Insert_Error : public NOMAD::Exception { public: /// Constructor. Insert_Error ( const std::string & file , int line , const std::string & msg ) : NOMAD::Exception ( file , line , msg ) {} }; /*----------------------------------------------------*/ /// Constructor. /** \param p Parameters -- \b IN. \param et Truth or surrogate -- \b IN. */ Barrier ( const NOMAD::Parameters & p , NOMAD::eval_type et ) : _p ( p ) , _eval_type ( et ) , _h_max ( p.get_h_max_0() ) , _best_feasible ( NULL ) , _ref ( NULL ) , _rho_leaps ( 0 ) , _poll_center ( NULL ) , _sec_poll_center ( NULL ) , _peb_changes ( 0 ) , _peb_filter_reset( 0 ) , _one_eval_succ ( NOMAD::UNSUCCESSFUL ) , _success ( NOMAD::UNSUCCESSFUL ) {} /// Destructor. virtual ~Barrier ( void ) {} /// Reset the barrier. void reset ( void ); /// Reset the success types. void reset_success ( void ) { _one_eval_succ = _success = NOMAD::UNSUCCESSFUL; } /// Poll center selection. /** \param last_it_success Success of the last iteration -- \b IN. */ void select_poll_center ( NOMAD::success_type last_it_success ); /// Barrier updates. void update_and_reset_success ( void ); /// Access to the best infeasible point. /** \return A pointer to the best infeasible point. */ const NOMAD::Eval_Point * get_best_infeasible ( void ) const; /// Access to the best feasible point. /** \return A pointer to the best feasible point. */ const NOMAD::Eval_Point * get_best_feasible ( void ) const { return _best_feasible; } /// Access to the best infeasible point with min. violation. /** \return A pointer to the best infeasible point with min. viol. */ const NOMAD::Eval_Point * get_best_infeasible_min_viol ( void ) const; /// Access to \c h_max. /** \return The value of \c h_max. */ const NOMAD::Double & get_h_max ( void ) const { return _h_max; } /// Access to the poll center. /** \return A pointer to the poll center. */ const NOMAD::Eval_Point * get_poll_center ( void ) const { return _poll_center; } /// Access to the success type of one evaluation. /** \return The success type of one evaluation. */ NOMAD::success_type get_one_eval_succ ( void ) const { return _one_eval_succ;} /// Access to the success type of a list of evaluations. /** \return The success type of a list of evaluations. */ NOMAD::success_type get_success ( void ) const { return _success; } /// Access to the secondary poll center. /** \return A pointer to the secondary poll center. */ const NOMAD::Eval_Point * get_sec_poll_center ( void ) const { return _sec_poll_center; } /// Access the list of all inserted points. /** \return A list with pointers to the inserted points. */ const std::list & get_all_inserted ( void ) const { return _all_inserted; } /// Insertion of a point into the barrier. /** \param x The point -- \b IN. */ void insert ( const NOMAD::Eval_Point & x ); /// Update the barrier from another barrier. /** Used by the VNS search. \param b The other barrier -- \b IN. */ void insert ( const Barrier & b ); /// Check the PEB constraints. /** This will change eventually the status of PEB constraints from NOMAD::PEB_P to NOMAD::PEB_E. \param x Point at which the constraints are checked -- \b IN. \param display A boolean equal to \c true if displays are authorized -- \b IN. */ void check_PEB_constraints ( const NOMAD::Eval_Point & x , bool display ); /// Display. /** \param out The NOMAD::Display object -- \b IN. */ void display ( const NOMAD::Display & out ) const; /// Display. /** Uses the NOMAD::Display object of the NOMAD::Parameters class. */ void display ( void ) const { display ( _p.out() ); } }; /// Display a NOMAD::Barrier object. /** \param out The NOMAD::Display object -- \b IN. \param b The NOMAD::Barrier object to be displayed -- \b IN. \return The NOMAD::Display object. */ inline const NOMAD::Display & operator << ( const NOMAD::Display & out , const NOMAD::Barrier & b ) { b.display ( out ); return out; } } #endif