/*-------------------------------------------------------------------------------------*/
/* 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 Parameter_Entry.cpp
\brief Parameter entry (implementation)
\author Sebastien Le Digabel
\date 2010-04-05
\see Parameter_Entry.hpp
*/
#include "Parameter_Entry.hpp"
/*-----------------------------------*/
/* . constructor (from a string) */
/* . ignores all entries after '#' */
/*-----------------------------------*/
NOMAD::Parameter_Entry::Parameter_Entry ( const std::string & entry ,
bool remove_comments )
: _ok ( false ) ,
_unique ( true ) ,
_next ( NULL ) ,
_has_been_interpreted ( false )
{
int i , idst;
std::string s;
std::istringstream in ( entry );
in >> _name;
if ( remove_comments && _name[0] == '#' )
_name.clear();
else {
NOMAD::toupper ( _name );
bool stats_file_name_read = false;
while ( true ) {
in >> s;
if ( in.fail() )
break;
// comment:
if ( remove_comments && s[0]=='#' )
break;
// string with quotes:
bool had_quotes = false;
if ( s[0] == '\"' || s[0] == '\'' ) {
had_quotes = true;
char quote = s[0];
s.erase ( s.begin() );
if ( s[s.size()-1] == quote )
s.resize ( s.size() - 1 );
else {
std::string ss;
getline ( in , ss , quote );
if ( in.fail() || !in.good()) {
_ok = false;
return;
}
s = s + ss;
}
}
// DISPLAY_STATS or STATS_FILE:
if ( _name == "STATS_FILE" && !stats_file_name_read )
stats_file_name_read = true;
else if ( _name == "DISPLAY_STATS" || _name == "STATS_FILE" ) {
if ( had_quotes ) {
_ok = false;
return;
}
std::string keyword , ss = s;
bool interpreted = false;
NOMAD::toupper ( ss );
NOMAD::display_stats_type dst = NOMAD::DS_OBJ;
while ( dst < NOMAD::DS_UNDEFINED ) {
keyword = NOMAD::Display::get_display_stats_keyword (dst);
i = static_cast ( ss.rfind ( keyword , ss.size()-1 ) );
if ( i >= 0 ) {
std::string s1 = s.substr ( 0 , i );
std::string s2 = s.substr ( i+keyword.size() );
if ( !s1.empty() )
_values.push_back ( s1 );
_values.push_back ( keyword );
if ( !s2.empty() )
_values.push_back ( s2 );
_values.push_back ( std::string() );
interpreted = true;
break;
}
// loop increment:
idst = dst;
++idst;
dst = static_cast ( idst );
}
if ( !interpreted ) {
_values.push_back ( s );
_values.push_back ( std::string() );
}
continue;
}
// vector:
if ( s.size() > 1 && ( s[0] == '[' || s[0] == '(' ) ) {
_values.push_back ( s[0]=='[' ? "[" : "(" );
s.erase(s.begin());
}
int sm1 = static_cast(s.size()) - 1;
char c = s[sm1];
if ( s.size() > 1 && ( c == ']' || c == ')' ) ) {
s.resize(sm1);
_values.push_back (s);
_values.push_back ( c==']' ? "]" : ")" );
continue;
}
// other values:
_values.push_back ( s );
}
if ( !_values.empty() )
_ok = true;
}
}
/*------------------------------*/
/* display */
/*------------------------------*/
void NOMAD::Parameter_Entry::display ( const NOMAD::Display & out ) const
{
if ( _ok ) {
out << _name << ": ";
std::list::const_iterator end = _values.end();
for ( std::list::const_iterator it = _values.begin() ; it != end ; ++it )
out << "[" << *it << "] ";
}
}