source: trunk/Common/IpOptionsList.cpp @ 2

Last change on this file since 2 was 2, checked in by andreasw, 15 years ago

Initial revision

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 4.7 KB
Line 
1// Copyright (C) 2004, International Business Machines and others.
2// All Rights Reserved.
3// This code is published under the Common Public License.
4//
5// $Id: IpOptionsList.cpp 2 2004-10-21 01:03:09Z andreasw $
6//
7// Authors:  Carl Laird, Andreas Waechter     IBM    2004-08-13
8
9#include "IpOptionsList.hpp"
10#ifdef OLD_C_HEADERS
11# include <ctype.h>
12#else
13# include <cctype>
14#endif
15
16namespace Ipopt
17{
18
19  void OptionsList::SetValue(const std::string& tag, const std::string& value)
20  {
21    OptionsList::OptionValue optval(lowercase(value));
22    options_[lowercase(tag)] = optval;
23  }
24
25  void OptionsList::SetNumericValue(const std::string& tag, Number value)
26  {
27    char buffer[256];
28    sprintf(buffer, "%g", value);
29    OptionsList::OptionValue optval(buffer);
30    options_[lowercase(tag)] = optval;
31  }
32
33  void OptionsList::SetIntegerValue(const std::string& tag, Index value)
34  {
35    char buffer[256];
36    sprintf(buffer, "%d", value);
37    OptionsList::OptionValue optval(buffer);
38    options_[lowercase(tag)] = optval;
39  }
40
41  bool OptionsList::GetValue(const std::string& tag, std::string& value,
42                             const std::string& prefix) const
43  {
44    return find_tag(tag, prefix, value);
45  }
46
47  bool OptionsList::GetNumericValue(const std::string& tag, Number& value,
48                                    const std::string& prefix) const
49  {
50    std::string strvalue;
51    if (!find_tag(tag, prefix, strvalue)) {
52      return false;
53    }
54
55    char* p_end;
56    Number retval = strtod(strvalue.c_str(), &p_end);
57    if (*p_end!='\0' && !isspace(*p_end)) {
58      std::string msg = "Option \"" + tag +
59        "\": Double value expected, but non-numeric value \"" +
60        strvalue+"\" found.\n";
61      THROW_EXCEPTION(OPTION_VALUE_IS_NONNUMERIC, msg);
62    }
63    value = retval;
64    return true;
65  }
66
67  bool OptionsList::GetIntegerValue(const std::string& tag, Index& value,
68                                    const std::string& prefix) const
69  {
70    std::string strvalue;
71    if (!find_tag(tag, prefix, strvalue)) {
72      return false;
73    }
74
75    char* p_end;
76    Index retval = strtol(strvalue.c_str(), &p_end, 10);
77    if (*p_end!='\0' && !isspace(*p_end)) {
78      std::string msg = "Option \"" + tag +
79        "\": Integer value expected, but non-integer value \"" +
80        strvalue+"\" found.\n";
81      THROW_EXCEPTION(OPTION_VALUE_IS_NONINTEGER, msg);
82    }
83    value = retval;
84    return true;
85  }
86
87  const std::string& OptionsList::lowercase(const std::string tag) const
88  {
89    lowercase_buffer_ = tag;
90    for(Index i=0; i<(Index)tag.length(); i++) {
91      lowercase_buffer_[i] = tolower(tag[i]);
92    }
93    return lowercase_buffer_;
94  }
95
96  void OptionsList::PrintList(std::string& list) const
97  {
98    list.clear();
99    char buffer[256];
100    sprintf(buffer, "%40s   %-20s %s\n", "Name", "Value", "# times used");
101    list += buffer;
102    for(std::map< std::string, OptionValue >::const_iterator p = options_.begin();
103        p != options_.end();
104        p++ )
105      {
106        sprintf(buffer, "%40s = %-20s %6d\n", p->first.c_str(),
107                p->second.Value().c_str(), p->second.Counter());
108        list += buffer;
109      }
110  }
111
112  bool OptionsList::ReadFromFile(const Journalist& jnlst,
113                                 FILE* fp)
114  {
115    DBG_ASSERT(fp);
116
117    jnlst.Printf(J_DETAILED, J_MAIN, "Start reading options from file.\n");
118
119    while (true) {
120      std::string tag;
121      std::string value;
122
123      if (!readnexttoken(fp, tag)) {
124        // That's it - end of file reached.
125        jnlst.Printf(J_DETAILED, J_MAIN,
126                     "Finished reading options from file.\n");
127        return true;
128      }
129
130      if (!readnexttoken(fp, value)) {
131        // Can't read value for a given tag
132        jnlst.Printf(J_ERROR, J_MAIN,
133                     "Error reading value for tag %s from file.\n",
134                     tag.c_str());
135        return false;
136      }
137
138      // Now add the value for the options list
139      jnlst.Printf(J_DETAILED, J_MAIN,
140                   "Adding option \"%s\" with value \"%s\" to OptionsList.\n",
141                   tag.c_str(), value.c_str());
142      SetValue(tag, value);
143    }
144  }
145
146  bool OptionsList::find_tag(const std::string& tag,
147                             const std::string& prefix,
148                             std::string& value) const
149  {
150    bool found=false;
151    std::map< std::string, OptionValue >::const_iterator p;
152
153    if (prefix != "") {
154      p = options_.find(lowercase(prefix+tag));
155      if (p != options_.end()) {
156        found = true;
157      }
158    }
159
160    if (!found) {
161      p = options_.find(lowercase(tag));
162      if (p != options_.end()) {
163        found = true;
164      }
165    }
166
167    if (found) {
168      value = p->second.GetValue();
169    }
170
171    return found;
172  }
173
174  bool OptionsList::readnexttoken(FILE* fp, std::string& token)
175  {
176    token.clear();
177    char c = fgetc(fp);
178
179    // First get rid of all comments and white spaces
180    while (c!=EOF && (isspace(c) || c=='#') ) {
181      if (c=='#') {
182        for (c=fgetc(fp);
183             c!='\n' && c!=EOF;
184             c=fgetc(fp));
185      }
186      c=fgetc(fp);
187    }
188
189    // Now read the token
190    while (c!=EOF && !isspace(c)) {
191      token += c;
192      c = fgetc(fp);
193    }
194
195  return (c!=EOF);
196  }
197
198} // namespace Ipopt
199
Note: See TracBrowser for help on using the repository browser.