/*-------------------------------------------------------------------------------------*/ /* 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 Signature.hpp \brief Evaluation point signature (headers) \author Sebastien Le Digabel \date 2010-04-22 \see Signature.cpp */ #ifndef __SIGNATURE__ #define __SIGNATURE__ #include "Variable_Group.hpp" namespace NOMAD { /// Evaluation point signature. class Signature { private: #ifdef MEMORY_DEBUG static int _cardinality; ///< Number of NOMAD::Signature objects in memory. static int _max_cardinality; ///< Max number of NOMAD::Signature objects in memory. #endif NOMAD::Point _lb; ///< Lower bounds. NOMAD::Point _ub; ///< Upper bounds. NOMAD::Point _scaling; ///< Scaling. NOMAD::Point _fixed_variables; ///< Fixed variables. std::vector _input_types; ///< Input types. bool _all_continuous; ///< Flag equal to \c true if all variables are continuous. bool _has_categorical; ///< Flag equal to \c true if there are categorical variables. static bool _warning_has_been_displayed; ///< Flag equal to \c true if the warning has already been displayed std::vector _periodic_variables; ///< Periodic variables. /// Groups of variables. /** Include the directions/ */ std::list _var_groups; /// Mesh associated to this signature. NOMAD::Mesh * _mesh; /** Flag equal to \c true if the signature is standard (i.e created in Parameters class). */ bool _std; // Feasible successful direction. /** Mutable since it is not used in \c operator \c < and have to be often changed. */ mutable NOMAD::Direction _feas_success_dir; // Infeasible successful direction. /** Mutable since it is not used in \c operator \c < and have to be often changed. */ mutable NOMAD::Direction _infeas_success_dir; // Direction group index int _dir_group_index; // Display NOMAD::Display _out; /*---------------------------------------------------------------------------*/ /// Initializations. /** \param n Number of variables -- \b IN. \param input_types Types of the variables -- \b IN. \param initial_mesh_size Initial mesh size -- \b IN. \param min_mesh_size Minimum mesh size -- \b IN. \param min_poll_size Minimum poll size -- \b IN. \param lb Lower bounds -- \b IN. \param ub Upper bounds -- \b IN. \param scaling Scaling -- \b IN. \param fixed_variables Fixed variables -- \b IN. \param periodic_variables Periodic variables -- \b IN. \param var_groups Groups of variables -- \b IN. */ void init ( int n , const std::vector & input_types , const NOMAD::Point & initial_mesh_size , const NOMAD::Point & min_mesh_size , const NOMAD::Point & min_poll_size , const NOMAD::Point & lb , const NOMAD::Point & ub , const NOMAD::Point & scaling , const NOMAD::Point & fixed_variables , const std::vector & periodic_variables , std::set & var_groups ); /// Reset groups of variables. void reset_var_groups ( void ); /// Clear. /** Private method called by the destructor and after an exception is thrown. */ void clear ( void ); /// Affectation operator. /** \param s The right-hand side object. */ const Signature & operator = ( const Signature & s ); public: /*---------------------------------------------------------------------------*/ /// Exception class for an invalid signature. class Signature_Error : public NOMAD::Exception { public: /// Constructor. Signature_Error ( const std::string & file , int line , Signature & s , const std::string & msg ) : NOMAD::Exception ( file , line , msg ) { s.clear(); } }; /*---------------------------------------------------------------------------*/ /// Constructor #1. /** Advanced version. \param n Number of variables -- \b IN. \param input_types Types of the variables -- \b IN. \param initial_mesh_size Initial mesh size -- \b IN. \param min_mesh_size Minimum mesh size -- \b IN. \param min_poll_size Minimum poll size -- \b IN. \param lb Lower bounds -- \b IN. \param ub Upper bounds -- \b IN. \param scaling Scaling -- \b IN. \param fixed_variables Fixed variables -- \b IN. \param periodic_variables Periodic variables -- \b IN. \param var_groups Groups of variables -- \b IN. \param out Display -- \b IN. */ Signature ( int n , const std::vector & input_types , const NOMAD::Point & initial_mesh_size , const NOMAD::Point & min_mesh_size , const NOMAD::Point & min_poll_size , const NOMAD::Point & lb , const NOMAD::Point & ub , const NOMAD::Point & scaling , const NOMAD::Point & fixed_variables , const std::vector & periodic_variables , std::set & var_groups , const NOMAD::Display & out=NOMAD::Display() ); /// Constructor #2. /** Basic version that will automatically construct groups of variables. \param n Number of variables -- \b IN. \param input_types Types of the variables -- \b IN. \param initial_mesh_size Initial mesh size -- \b IN. \param lb Lower bounds -- \b IN. \param ub Upper bounds -- \b IN. \param direction_types Types of directions -- \b IN. \param sec_poll_dir_types Types of directions for secondary poll -- \b IN. \param halton_seed Halton seed -- \b IN. \param out Display -- \b IN. */ Signature ( int n , const std::vector & input_types , const NOMAD::Point & initial_mesh_size , const NOMAD::Point & lb , const NOMAD::Point & ub , const std::set & direction_types , const std::set & sec_poll_dir_types , int halton_seed , const NOMAD::Display & out = NOMAD::Display() ); /// Copy constructor. /** \param s The copied object. */ Signature ( const Signature & s ); /// Destructor. virtual ~Signature ( void ); /// Reset. /** \param n Number of variables -- \b IN. \param input_types Types of the variables -- \b IN. \param initial_mesh_size Initial mesh size -- \b IN. \param min_mesh_size Minimum mesh size -- \b IN. \param min_poll_size Minimum poll size -- \b IN. \param lb Lower bounds -- \b IN. \param ub Upper bounds -- \b IN. \param scaling Scaling -- \b IN. \param fixed_variables Fixed variables -- \b IN. \param periodic_variables Periodic variables -- \b IN. \param var_groups Groups of variables -- \b IN. */ void reset ( int n , const std::vector & input_types , const NOMAD::Point & initial_mesh_size , const NOMAD::Point & min_mesh_size , const NOMAD::Point & min_poll_size , const NOMAD::Point & lb , const NOMAD::Point & ub , const NOMAD::Point & scaling , const NOMAD::Point & fixed_variables , const std::vector & periodic_variables , std::set & var_groups ); /// Define a signature to be standard. void set_std ( void ) { _std = true; } /// Set a feasible successful direction. /** \param dir The direction -- \b IN. */ void set_feas_success_dir ( const NOMAD::Direction & dir ); /// Set an infeasible successful direction. /** \param dir The direction -- \b IN. */ void set_infeas_success_dir ( const NOMAD::Direction & dir ); /// Reset the feasible successful direction. void reset_feas_success_dir ( void ) const { _feas_success_dir.clear(); } /// Reset the infeasible successful direction. void reset_infeas_success_dir ( void ) const { _infeas_success_dir.clear(); } /// Scaling. /** Performed before an evaluation. \param x The scaled point -- \b IN/OUT. */ void scale ( NOMAD::Point & x ); /// Unscaling. /** Performed after an evaluation. \param x The unscaled point -- \b IN/OUT. */ void unscale ( NOMAD::Point & x ); /// Snap to bounds. /** - Supposes that \c this->treat_periodic_variables() has already been invoked. - If periodic variables have been treated, then bounds are satisfied and there is no need to snap anymore. \param x The point to snap -- \b IN/OUT. \param direction A pointer to the direction associated to this point (may be \c NULL) -- \b IN/OUT. \return A Boolean equal to \c true if \c x has been modified. */ bool snap_to_bounds ( NOMAD::Point & x , NOMAD::Direction * direction ); /// Treat the periodic variables. /** \param x The point to treat -- \b IN/OUT. \param old_dir A pointer to the direction associated to this point (before the treatment; may be \c NULL) -- \b IN. \param new_dir A pointer to the direction associated to this point (after the treatment; may be \c NULL) -- \b OUT. \return A boolean equal to \c true if \c x has been modified. */ bool treat_periodic_variables ( NOMAD::Point & x , const NOMAD::Direction * old_dir , NOMAD::Direction *& new_dir ); /// Access to the lower bounds. /** \return The lower bounds. */ const NOMAD::Point & get_lb ( void ) const { return _lb; } /// Access to the upper bounds. /** \return The upper bounds. */ const NOMAD::Point & get_ub ( void ) const { return _ub; } /// Access to the scaling. /** \return The scaling. */ const NOMAD::Point & get_scaling ( void ) const { return _scaling; } /// Access to the fixed variables. /** \return The fixed variables. */ const NOMAD::Point & get_fixed_variables ( void ) const { return _fixed_variables; } /// Access to the feasible successful direction. /** \return The feasible successful direction (may be undefined). */ const NOMAD::Direction & get_feas_success_dir ( void ) const { return _feas_success_dir; } /// Access to the infeasible successful direction. /** \return The infeasible successful direction (may be undefined). */ const NOMAD::Direction & get_infeas_success_dir ( void ) const { return _infeas_success_dir; } /// Access to the periodic variables. /** \return The periodic variables. */ const std::vector & get_periodic_variables ( void ) const { return _periodic_variables; } /// Check if all variables are continuous. /** \return A boolean equal to \c true if all variables are continuous. */ bool all_continuous ( void ) const { return _all_continuous; } /// Check if there are categorical variables. /** \return A boolean equal to \c true if there are categorical variables. */ bool has_categorical ( void ) const { return _has_categorical; } /// Access to the number of categorical variables. /** \return Integer equal to the number of categorical variables. */ int get_n_categorical ( void ) const ; /// Access to the number of variables. /** \return The number of variables. */ int get_n ( void ) const { return static_cast ( _input_types.size() ); } /// Access to the input types. /** \return The input types. */ const std::vector & get_input_types ( void ) const { return _input_types; } /// Access to the input types. /** \return The input types. */ const std::vector & get_input_type ( void ) const { return _input_types; } /// Access to the groups of variables. /** \return The groups of variables. */ const std::list & get_var_groups ( void ) const { return _var_groups; } /// Access to the mesh. /** \return A pointer to the mesh. */ const NOMAD::Mesh & get_mesh ( void ) const { return *_mesh; } /// Check the compatibility of a point. /** - Only the number of variables is checked. - Other criteria (fixed variables, binary variables,...) are checked by NOMAD::Eval_Point::check(). \param x The point to check -- \b IN. \return A boolean equal to \c true if the point is compatible with the signature. */ bool is_compatible ( const NOMAD::Point & x ) const; /// Access to the directions. /** - The computed directions already include Delta^k_m. \param dirs List of directions -- \b OUT. \param poll Type of poll (primary or secondary) -- \b IN. \param poll_center Poll center -- \b IN. \param mesh_index Mesh index ell -- \b IN. */ void get_directions ( std::list & dirs , NOMAD::poll_type poll , const NOMAD::Point & poll_center , int mesh_index ); /// Access to one direction for a given mesh. /** Used for example in the VNS search. \param dir The direction -- \b OUT. \param mesh_index Mesh index ell -- \b IN. \param halton_index Halton index -- \b IN. */ void get_one_direction ( NOMAD::Direction & dir , int mesh_index , int halton_index ) const; /// Comparison operator \c < . /** Successful directions are not considered. \param s The right-hand side object -- \b IN. \return A boolean equal to \c true if \c *this \c < \c s. */ bool operator < ( const Signature & s ) const; /// Comparison operator \c != . /** \param s The right-hand side object -- \b IN. \return A boolean equal to \c true if \c *this \c != \c s. */ bool operator != ( const Signature & s ) const { return ( (*this < s) || (s < *this) ); } #ifdef MEMORY_DEBUG /// Access to the number of NOMAD::Signature objects in memory. /** \return Number of NOMAD::Signature objects in memory. */ static int get_cardinality ( void ) { return Signature::_cardinality; } /// Access to the max number of NOMAD::Signature objects in memory. /** \return Max number of NOMAD::Signature objects in memory. */ static int get_max_cardinality ( void ) { return Signature::_max_cardinality; } #endif /// Display. /** \param out The NOMAD::Display object -- \b IN. */ void display ( const NOMAD::Display & out ) const; }; /// Display a NOMAD::Signature object. /** \param out The NOMAD::Display object -- \b IN. \param s The NOMAD::Signature object to be displayed -- \b IN. \return The NOMAD::Display object. */ inline const NOMAD::Display & operator << ( const NOMAD::Display & out , const NOMAD::Signature & s ) { s.display ( out ); return out; } } #endif