/*-------------------------------------------------------------------------------------*/ /* 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 Cache_Search.cpp \brief NOMAD::Search subclass for the cache search (implementation) \author Sebastien Le Digabel \date 2010-04-08 \see Cache_Search.hpp */ #include "Cache_Search.hpp" /*---------------------------------------------------------*/ /* the search */ /*---------------------------------------------------------*/ void NOMAD::Cache_Search::search ( NOMAD::Mads & mads , int & nb_search_pts , bool & stop , NOMAD::stop_type & stop_reason , NOMAD::success_type & success , bool & count_search , const NOMAD::Eval_Point *& new_feas_inc , const NOMAD::Eval_Point *& new_infeas_inc ) { new_feas_inc = new_infeas_inc = NULL; nb_search_pts = 0; success = NOMAD::UNSUCCESSFUL; count_search = false; NOMAD::Evaluator_Control & ev_control = mads.get_evaluator_control(); const Cache & cache = mads.get_cache(); int nb_extern_pts = cache.get_nb_extern_points(); // do not perform the search if the number of extern points did not change: if ( stop || nb_extern_pts == 0 || nb_extern_pts == _last_search_nb_extern_pts ) return; count_search = true; // initial display: const NOMAD::Display & out = _p.out(); NOMAD::dd_type display_degree = out.get_search_dd(); if ( display_degree == NOMAD::FULL_DISPLAY ) { std::ostringstream oss; oss << NOMAD::CACHE_SEARCH; out << std::endl << NOMAD::open_block ( oss.str() ) << std::endl; } std::list list_of_extern_pts; const NOMAD::Eval_Point * extern_pt = cache.get_and_remove_extern_point(); NOMAD::Eval_Point * pt = NULL; int n = _p.get_dimension(); // add the extern points to the list of points to be evaluated: while ( extern_pt ) { list_of_extern_pts.push_front ( extern_pt ); pt = &NOMAD::Cache::get_modifiable_point ( *extern_pt ); if ( extern_pt->get_signature() ) pt->set_signature ( extern_pt->get_signature() ); else if ( extern_pt->size() == n ) pt->set_signature ( _p.get_signature() ); if ( pt->get_signature() ) ev_control.add_eval_point ( pt , display_degree , false , NOMAD::Double() , NOMAD::Double() , NOMAD::Double() , NOMAD::Double() ); else { if ( display_degree != NOMAD::NO_DISPLAY && display_degree != NOMAD::MINIMAL_DISPLAY ) out << std::endl << "Warning (Cache_Search.cpp, " << __LINE__ << "): could not use the point " << *pt << "(no signature)" << std::endl; } extern_pt = cache.get_and_remove_extern_point(); } nb_search_pts = ev_control.get_nb_eval_points(); // display all the search points: if ( display_degree == NOMAD::FULL_DISPLAY ) ev_control.display_eval_lop ( NOMAD::CACHE_SEARCH ); // eval_list_of_points: new_feas_inc = new_infeas_inc = NULL; ev_control.eval_list_of_points ( NOMAD::CACHE_SEARCH , mads.get_true_barrier() , mads.get_sgte_barrier() , mads.get_pareto_front() , stop , stop_reason , new_feas_inc , new_infeas_inc , success ); // the method cache.get_and_remove_extern_point() removes the first extern // point from the cache. If the search is opportunistic and if there are // extern points that have not been treated, then they must be put back // in the cache list of extern points: { std::list::const_iterator it , end = list_of_extern_pts.end(); for ( it = list_of_extern_pts.begin() ; it != end ; ++it ) if ( !(*it)->get_current_run() ) cache.insert_extern_point ( **it ); } // update _last_search_nb_extern_pts: _last_search_nb_extern_pts = cache.get_nb_extern_points(); // final display: if ( display_degree == NOMAD::FULL_DISPLAY ) { std::ostringstream oss; oss << "end of cache search (" << success << ")"; out << std::endl << NOMAD::close_block ( oss.str() ) << std::endl; } }