/*-------------------------------------------------------------------------------------*/
/* 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 Priority_Eval_Point.hpp
\brief Evaluation point with a priority (headers)
\author Sebastien Le Digabel
\date 2010-04-22
\see Priority_Eval_Point.cpp
*/
#ifndef __PRIORITY_EVAL_POINT__
#define __PRIORITY_EVAL_POINT__
#include "Set_Element.hpp"
#include "Eval_Point.hpp"
namespace NOMAD {
/// Evaluation point with a priority.
class Priority_Eval_Point : public NOMAD::Set_Element {
private:
NOMAD::Double _h_min; ///< \c h_min value for comparison operator.
NOMAD::Double _f_sgte; ///< Objective surrogate value.
NOMAD::Double _h_sgte; ///< Feasibility surrogate value.
NOMAD::Double _f_model; ///< Objective model value.
NOMAD::Double _h_model; ///< Feasibility model value.
NOMAD::Double _angle_success_dir; ///< Angle with last successful direction.
NOMAD::Double _angle_simplex_grad; ///< Angle with simplex gradient.
/// Affectation operator.
/**
\param x The right-hand side object -- \b IN.
*/
Priority_Eval_Point & operator = ( const Priority_Eval_Point & x );
/// Compare the \c h values of two points.
/**
The two points to compare are \c x1 and \c x2.
\param hx1 \c h(x1) -- \b IN.
\param hx2 \c h(x2) -- \b IN.
\return \c h(x1) \c < \c h(x2)
with the following format:
- 1: \c x1 best than \c x2.
- -1: \c x2 best than \c x1.
- 0: undetermined.
*/
int compare_h_values ( const NOMAD::Double & hx1 ,
const NOMAD::Double & hx2 ) const;
/// Compare the \c h and \c f values of two points.
/**
The two points to compare are \c x1 and \c x2.
\param hx1 \c h(x1) -- \b IN.
\param fx1 \c f(x1) -- \b IN.
\param hx2 \c h(x2) -- \b IN.
\param fx2 \c f(x2) -- \b IN.
\return \c (h(x1),f(x1)) \c < \c (h(x2),f(x2))
with the following format:
- 1: \c x1 best than \c x2.
- -1: \c x2 best than \c x1.
- 0: undetermined.
*/
int compare_hf_values ( const NOMAD::Double & hx1 ,
const NOMAD::Double & fx1 ,
const NOMAD::Double & hx2 ,
const NOMAD::Double & fx2 ) const;
public:
/// Constructor.
/**
\param x A pointer to the evaluation point -- \b IN.
\param h_min \c h_min value -- \b IN.
*/
explicit Priority_Eval_Point ( const NOMAD::Eval_Point * x ,
const NOMAD::Double & h_min )
: NOMAD::Set_Element ( x ) ,
_h_min ( h_min ) {}
/// Copy constructor.
/**
\param pep The copied object -- \b IN.
*/
explicit Priority_Eval_Point ( const Priority_Eval_Point & pep )
: NOMAD::Set_Element ( pep.get_element() ) ,
_h_min ( pep._h_min ) ,
_f_sgte ( pep._f_sgte ) ,
_h_sgte ( pep._h_sgte ) ,
_f_model ( pep._f_model ) ,
_h_model ( pep._h_model ) ,
_angle_success_dir ( pep._angle_success_dir ) ,
_angle_simplex_grad ( pep._angle_simplex_grad ) {}
/// Destructor.
virtual ~Priority_Eval_Point ( void ) {}
/// Access to specific elements of comparison.
/**
- This method is defined virtual in NOMAD::Set_Element so that
\c operator \c < \c (Set_Element x) can invoke
it on \c x (which is in fact a \c Priority_Eval_Point).
- This avoids an expensive downcast in \c operator \c < .
\param f_sgte Objective surrogate value -- \b OUT.
\param h_sgte Feasibility surrogate value -- \b OUT.
\param f_model Objective model value -- \b OUT.
\param h_model Feasibility model value -- \b OUT.
\param angle_success_dir Angle with last successful direction -- \b OUT.
\param angle_simplex_grad Angle with simplex gradient -- \b OUT.
*/
virtual void get_priority_criteria ( NOMAD::Double & f_sgte ,
NOMAD::Double & h_sgte ,
NOMAD::Double & f_model ,
NOMAD::Double & h_model ,
NOMAD::Double & angle_success_dir ,
NOMAD::Double & angle_simplex_grad ) const
{
f_sgte = _f_sgte;
h_sgte = _h_sgte;
f_model = _f_model;
h_model = _h_model;
angle_success_dir = _angle_success_dir;
angle_simplex_grad = _angle_simplex_grad;
}
/// Comparison operator.
/**
This virtual function directly call \c dominates().
\param x The right-hand side object -- \b IN.
\return A boolean equal to \c true if \c *this \c < \c x.
*/
virtual bool operator < ( const NOMAD::Set_Element & x ) const
{ return dominates ( x ); }
/// Comparison operator.
/**
\param x The right-hand side object -- \b IN.
\return A boolean equal to \c true if \c *this \c < \c x.
*/
bool dominates ( const NOMAD::Set_Element & x ) const;
/// Access to the evaluation point.
/**
\return A pointer to the evaluation point.
*/
const NOMAD::Eval_Point * get_point ( void ) const { return get_element(); }
/// Set the angle with last successful direction.
/**
\param a The angle with last successful direction -- \b IN.
*/
void set_angle_success_dir ( const NOMAD::Double & a ) { _angle_success_dir = a; }
/// Set the angle with simplex gradient .
/**
\param a The angle with simplex gradient -- \b IN.
*/
void set_angle_simplex_grad ( const NOMAD::Double & a ) { _angle_simplex_grad = a; }
/// Set the objective surrogate value.
/**
\param f The objective surrogate value -- \b IN.
*/
void set_f_sgte ( const NOMAD::Double & f ) { _f_sgte = f; }
/// Set the feasibility surrogate value.
/**
\param h The feasibility surrogate value -- \b IN.
*/
void set_h_sgte ( const NOMAD::Double & h ) { _h_sgte = h; }
/// Set the objective model value.
/**
\param f The objective model value -- \b IN.
*/
void set_f_model ( const NOMAD::Double & f ) { _f_model = f; }
/// Set the feasibility model value.
/**
\param h The feasibility model value -- \b IN.
*/
void set_h_model ( const NOMAD::Double & h ) { _h_model = h; }
};
}
#endif