/*-------------------------------------------------------------------------------------*/
/* 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 Pareto_Front.hpp
\brief Pareto front (headers)
\author Sebastien Le Digabel
\date 2010-04-09
\see Pareto_Front.cpp
*/
#ifndef __PARETO_FRONT__
#define __PARETO_FRONT__
#include "Pareto_Point.hpp"
namespace NOMAD {
/// Pareto front for two objective functions.
/**
Browse the front with the following instructions:
\code
const Eval_Point * cur = pareto_front.begin();
while ( cur ) {
...
cur = pareto_front.next();
}
\endcode
*/
class Pareto_Front : private NOMAD::Uncopyable {
private:
/// The set of Pareto points.
std::set _pareto_pts;
/// Iterator to browse the front with begin() and next().
mutable std::set::const_iterator _it;
public:
/// Constructor.
Pareto_Front ( void ) {}
/// Destructor.
virtual ~Pareto_Front ( void ) {}
/// Access to the first Pareto point.
/**
Used to initialize a loop on the Pareto points.
\return A pointer to the first Pareto point and \c NULL if the front
is empty.
*/
const NOMAD::Eval_Point * begin ( void ) const;
/// Access to the next Pareto point.
/**
Used to increment a loop on the Pareto points.
\return A pointer to the next Pareto point and \c NULL if
the current point is the last point in the front.
*/
const NOMAD::Eval_Point * next ( void ) const;
/// Access to the number of Pareto points.
/**
\return The number of Pareto points.
*/
int size ( void ) const { return static_cast(_pareto_pts.size()); }
/// Check if the front is empty.
/**
\return A boolean equal to \c true if the front is empty.
*/
bool empty ( void ) const { return _pareto_pts.empty(); }
/// Computation and access to the reference point.
/**
\param xj A pointer to the reference point; Is equal to \c NULL if
no reference exists -- \b OUT.
\param delta_j The \c delta stats measuring the front repartition -- \b OUT.
\return A pointer to the reference point and
\c NULL if there is no reference point.
*/
NOMAD::Point * get_ref ( const NOMAD::Pareto_Point *& xj ,
NOMAD::Double & delta_j ) const;
/// Access to the Pareto point minimizing f2(x).
/**
\return A pointer to the Pareto point minimizing f2 and
\c NULL if such a point does not exist.
*/
const NOMAD::Eval_Point * get_best_f2 ( void ) const;
/// Compute the stats \c delta and \c surf.
/**
- \c delta measures the front repartition (lower is best).
- \c surf measures the front quality (lower is best).
\param delta_j The \c delta stat -- \b OUT.
\param surf The \c surf stat -- \b OUT.
\param f_bounds NOMAD::Point with 4 values (f1_min, f1_max, f2_min, and f2_max)
defining bounds for f1 and f2 for the computation
of the \c surf stat -- \b IN.
*/
void get_delta_surf ( NOMAD::Double & delta_j ,
NOMAD::Double & surf ,
const NOMAD::Point & f_bounds ) const;
/// Insertion of a point in the Pareto front.
/**
\param x The point to be inserted -- \b IN.
\return A boolean equal to \c true if the point is a new Pareto point.
*/
bool insert ( const NOMAD::Eval_Point & x );
/// Display the Pareto points.
/**
\param out The NOMAD::Display object -- \b IN.
*/
void display ( const NOMAD::Display & out ) const;
};
/// Display a NOMAD::Pareto_Front object.
/**
\param out The NOMAD::Display object -- \b IN.
\param pf The NOMAD::Pareto_Front object to be displayed -- \b IN.
\return The NOMAD::Display object.
*/
inline const NOMAD::Display & operator << ( const NOMAD::Display & out ,
const NOMAD::Pareto_Front & pf ) {
pf.display ( out );
return out;
}
}
#endif