00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef __IPREGOPTIONS_HPP__
00010 #define __IPREGOPTIONS_HPP__
00011
00012 #include "IpUtils.hpp"
00013 #include "IpReferenced.hpp"
00014 #include "IpException.hpp"
00015 #include "IpSmartPtr.hpp"
00016
00017 #include <map>
00018
00019 namespace Ipopt
00020 {
00021
00022 enum RegisteredOptionType
00023 {
00024 OT_Number,
00025 OT_Integer,
00026 OT_String,
00027 OT_Unknown
00028 };
00029
00033 class RegisteredOption : public ReferencedObject
00034 {
00035 public:
00037 class string_entry
00038 {
00039 public:
00040 string_entry(const std::string& value, const std::string& description)
00041 : value_(value), description_(description)
00042 {}
00043 std::string value_;
00044 std::string description_;
00045 };
00046
00049 RegisteredOption(Index counter)
00050 :
00051 type_(OT_Unknown),
00052 has_lower_(false),
00053 has_upper_(false),
00054 counter_(counter)
00055 {}
00056
00057 RegisteredOption(const std::string& name,
00058 const std::string& short_description,
00059 const std::string& long_description,
00060 const std::string& registering_category,
00061 Index counter)
00062 :
00063 name_(name),
00064 short_description_(short_description),
00065 long_description_(long_description),
00066 registering_category_(registering_category),
00067 type_(OT_Unknown),
00068 has_lower_(false),
00069 has_upper_(false),
00070 counter_(counter)
00071 {}
00072
00073 RegisteredOption(const RegisteredOption& copy)
00074 :
00075 name_(copy.name_),
00076 short_description_(copy.short_description_),
00077 long_description_(copy.long_description_),
00078 registering_category_(copy.registering_category_),
00079 type_(copy.type_),
00080 has_lower_(copy.has_lower_),
00081 lower_(copy.lower_),
00082 has_upper_(copy.has_upper_),
00083 upper_(copy.upper_),
00084 valid_strings_(copy.valid_strings_),
00085 counter_(copy.counter_)
00086 {}
00087
00088 virtual ~RegisteredOption()
00089 {}
00091
00092 DECLARE_STD_EXCEPTION(ERROR_CONVERTING_STRING_TO_ENUM);
00093
00097 virtual const std::string& Name() const
00098 {
00099 return name_;
00100 }
00102 virtual void SetName(const std::string& name)
00103 {
00104 name_ = name;
00105 }
00107 virtual const std::string& ShortDescription() const
00108 {
00109 return short_description_;
00110 }
00112 virtual const std::string& LongDescription() const
00113 {
00114 return long_description_;
00115 }
00117 virtual void SetShortDescription(const std::string& short_description)
00118 {
00119 short_description_ = short_description;
00120 }
00122 virtual void SetLongDescription(const std::string& long_description)
00123 {
00124 long_description_ = long_description;
00125 }
00127 virtual const std::string& RegisteringCategory() const
00128 {
00129 return registering_category_;
00130 }
00132 virtual void SetRegisteringCategory(const std::string& registering_category)
00133 {
00134 registering_category_ = registering_category;
00135 }
00137 virtual const RegisteredOptionType& Type() const
00138 {
00139 return type_;
00140 }
00142 virtual void SetType(const RegisteredOptionType& type)
00143 {
00144 type_ = type;
00145 }
00147 virtual Index Counter() const
00148 {
00149 return counter_;
00150 }
00152
00159 virtual const bool& HasLower() const
00160 {
00161 DBG_ASSERT(type_ == OT_Number || type_ == OT_Integer);
00162 return has_lower_;
00163 }
00166 virtual const bool& LowerStrict() const
00167 {
00168 DBG_ASSERT(type_ == OT_Number && has_lower_ == true);
00169 return lower_strict_;
00170 }
00173 virtual Number LowerNumber() const
00174 {
00175 DBG_ASSERT(has_lower_ == true && type_ == OT_Number);
00176 return lower_;
00177 }
00180 virtual void SetLowerNumber(const Number& lower, const bool& strict)
00181 {
00182 DBG_ASSERT(type_ == OT_Number);
00183 lower_ = lower;
00184 lower_strict_ = strict, has_lower_ = true;
00185 }
00188 virtual Index LowerInteger() const
00189 {
00190 DBG_ASSERT(has_lower_ == true && type_ == OT_Integer);
00191 return (Index)lower_;
00192 }
00195 virtual void SetLowerInteger(const Index& lower)
00196 {
00197 DBG_ASSERT(type_ == OT_Integer);
00198 lower_ = (Number)lower;
00199 has_lower_ = true;
00200 }
00203 virtual const bool& HasUpper() const
00204 {
00205 DBG_ASSERT(type_ == OT_Number || type_ == OT_Integer);
00206 return has_upper_;
00207 }
00210 virtual const bool& UpperStrict() const
00211 {
00212 DBG_ASSERT(type_ == OT_Number && has_upper_ == true);
00213 return upper_strict_;
00214 }
00217 virtual Number UpperNumber() const
00218 {
00219 DBG_ASSERT(has_upper_ == true && type_ == OT_Number);
00220 return upper_;
00221 }
00224 virtual void SetUpperNumber(const Number& upper, const bool& strict)
00225 {
00226 DBG_ASSERT(type_ == OT_Number);
00227 upper_ = upper;
00228 upper_strict_ = strict;
00229 has_upper_ = true;
00230 }
00233 virtual Index UpperInteger() const
00234 {
00235 DBG_ASSERT(has_upper_ == true && type_ == OT_Integer);
00236 return (Index)upper_;
00237 }
00240 virtual void SetUpperInteger(const Index& upper)
00241 {
00242 DBG_ASSERT(type_ == OT_Integer);
00243 upper_ = (Number)upper;
00244 has_upper_ = true;
00245 }
00248 virtual void AddValidStringSetting(const std::string value,
00249 const std::string description)
00250 {
00251 DBG_ASSERT(type_ == OT_String);
00252 valid_strings_.push_back(string_entry(value, description));
00253 }
00255 virtual Number DefaultNumber() const
00256 {
00257 DBG_ASSERT(type_ == OT_Number);
00258 return default_number_;
00259 }
00261 virtual void SetDefaultNumber(const Number& default_value)
00262 {
00263 DBG_ASSERT(type_ == OT_Number);
00264 default_number_ = default_value;
00265 }
00267 virtual Index DefaultInteger() const
00268 {
00269 DBG_ASSERT(type_ == OT_Integer);
00270 return (Index)default_number_;
00271 }
00274 virtual void SetDefaultInteger(const Index& default_value)
00275 {
00276 DBG_ASSERT(type_ == OT_Integer);
00277 default_number_ = (Number)default_value;
00278 }
00280 virtual std::string DefaultString() const
00281 {
00282 DBG_ASSERT(type_ == OT_String);
00283 return default_string_;
00284 }
00288 virtual Index DefaultStringAsEnum() const
00289 {
00290 DBG_ASSERT(type_ == OT_String);
00291 return MapStringSettingToEnum(default_string_);
00292 }
00294 virtual void SetDefaultString(const std::string& default_value)
00295 {
00296 DBG_ASSERT(type_ == OT_String);
00297 default_string_ = default_value;
00298 }
00300 virtual std::vector<string_entry> GetValidStrings() const
00301 {
00302 DBG_ASSERT(type_ == OT_String);
00303 return valid_strings_;
00304 }
00307 virtual bool IsValidNumberSetting(const Number& value) const
00308 {
00309 DBG_ASSERT(type_ == OT_Number);
00310 if (has_lower_ && ((lower_strict_ == true && value <= lower_) ||
00311 (lower_strict_ == false && value < lower_))) {
00312 return false;
00313 }
00314 if (has_upper_ && ((upper_strict_ == true && value >= upper_) ||
00315 (upper_strict_ == false && value > upper_))) {
00316 return false;
00317 }
00318 return true;
00319 }
00322 virtual bool IsValidIntegerSetting(const Index& value) const
00323 {
00324 DBG_ASSERT(type_ == OT_Integer);
00325 if (has_lower_ && value < lower_) {
00326 return false;
00327 }
00328 if (has_upper_ && value > upper_) {
00329 return false;
00330 }
00331 return true;
00332 }
00335 virtual bool IsValidStringSetting(const std::string& value) const;
00336
00340 virtual std::string MapStringSetting(const std::string& value) const;
00341
00346 virtual Index MapStringSettingToEnum(const std::string& value) const;
00348
00350 virtual void OutputDescription(const Journalist& jnlst) const;
00352 virtual void OutputShortDescription(const Journalist& jnlst) const;
00354 virtual void OutputLatexDescription(const Journalist& jnlst) const;
00355
00356 private:
00357 std::string name_;
00358 std::string short_description_;
00359 std::string long_description_;
00360 std::string registering_category_;
00361 RegisteredOptionType type_;
00362
00363 bool has_lower_;
00364 bool lower_strict_;
00365 Number lower_;
00366 bool has_upper_;
00367 bool upper_strict_;
00368 Number upper_;
00369 Number default_number_;
00370
00371 void MakeValidLatexString(std::string source, std::string& dest) const;
00372 std::string MakeValidLatexNumber(Number value) const;
00373
00376 bool string_equal_insensitive(const std::string& s1,
00377 const std::string& s2) const;
00378
00379 std::vector<string_entry> valid_strings_;
00380 std::string default_string_;
00381
00384 const Index counter_;
00385 };
00386
00390 class RegisteredOptions : public ReferencedObject
00391 {
00392 public:
00396 RegisteredOptions()
00397 :
00398 next_counter_(0),
00399 current_registering_category_("Uncategorized")
00400 {}
00401
00403 virtual ~RegisteredOptions()
00404 {}
00406
00407 DECLARE_STD_EXCEPTION(OPTION_ALREADY_REGISTERED);
00408
00413 virtual void SetRegisteringCategory(const std::string& registering_category)
00414 {
00415 current_registering_category_ = registering_category;
00416 }
00417
00419 virtual std::string RegisteringCategory()
00420 {
00421 return current_registering_category_;
00422 }
00423
00425 virtual void AddNumberOption(const std::string& name,
00426 const std::string& short_description,
00427 Number default_value,
00428 const std::string& long_description="");
00430 virtual void AddLowerBoundedNumberOption(const std::string& name,
00431 const std::string& short_description,
00432 Number lower, bool strict,
00433 Number default_value,
00434 const std::string& long_description="");
00436 virtual void AddUpperBoundedNumberOption(const std::string& name,
00437 const std::string& short_description,
00438 Number upper, bool strict,
00439 Number default_value,
00440 const std::string& long_description="");
00442 virtual void AddBoundedNumberOption(const std::string& name,
00443 const std::string& short_description,
00444 Number lower, bool lower_strict,
00445 Number upper, bool upper_strict,
00446 Number default_value,
00447 const std::string& long_description="");
00449 virtual void AddIntegerOption(const std::string& name,
00450 const std::string& short_description,
00451 Index default_value,
00452 const std::string& long_description="");
00454 virtual void AddLowerBoundedIntegerOption(const std::string& name,
00455 const std::string& short_description,
00456 Index lower, Index default_value,
00457 const std::string& long_description="");
00459 virtual void AddUpperBoundedIntegerOption(const std::string& name,
00460 const std::string& short_description,
00461 Index upper, Index default_value,
00462 const std::string& long_description="");
00464 virtual void AddBoundedIntegerOption(const std::string& name,
00465 const std::string& short_description,
00466 Index lower, Index upper,
00467 Index default_value,
00468 const std::string& long_description="");
00469
00471 virtual void AddStringOption(const std::string& name,
00472 const std::string& short_description,
00473 const std::string& default_value,
00474 const std::vector<std::string>& settings,
00475 const std::vector<std::string>& descriptions,
00476 const std::string& long_description="");
00479 virtual void AddStringOption1(const std::string& name,
00480 const std::string& short_description,
00481 const std::string& default_value,
00482 const std::string& setting1,
00483 const std::string& description1,
00484 const std::string& long_description="");
00485 virtual void AddStringOption2(const std::string& name,
00486 const std::string& short_description,
00487 const std::string& default_value,
00488 const std::string& setting1,
00489 const std::string& description1,
00490 const std::string& setting2,
00491 const std::string& description2,
00492 const std::string& long_description="");
00493 virtual void AddStringOption3(const std::string& name,
00494 const std::string& short_description,
00495 const std::string& default_value,
00496 const std::string& setting1,
00497 const std::string& description1,
00498 const std::string& setting2,
00499 const std::string& description2,
00500 const std::string& setting3,
00501 const std::string& description3,
00502 const std::string& long_description="");
00503 virtual void AddStringOption4(const std::string& name,
00504 const std::string& short_description,
00505 const std::string& default_value,
00506 const std::string& setting1,
00507 const std::string& description1,
00508 const std::string& setting2,
00509 const std::string& description2,
00510 const std::string& setting3,
00511 const std::string& description3,
00512 const std::string& setting4,
00513 const std::string& description4,
00514 const std::string& long_description="");
00515 virtual void AddStringOption5(const std::string& name,
00516 const std::string& short_description,
00517 const std::string& default_value,
00518 const std::string& setting1,
00519 const std::string& description1,
00520 const std::string& setting2,
00521 const std::string& description2,
00522 const std::string& setting3,
00523 const std::string& description3,
00524 const std::string& setting4,
00525 const std::string& description4,
00526 const std::string& setting5,
00527 const std::string& description5,
00528 const std::string& long_description="");
00529 virtual void AddStringOption6(const std::string& name,
00530 const std::string& short_description,
00531 const std::string& default_value,
00532 const std::string& setting1,
00533 const std::string& description1,
00534 const std::string& setting2,
00535 const std::string& description2,
00536 const std::string& setting3,
00537 const std::string& description3,
00538 const std::string& setting4,
00539 const std::string& description4,
00540 const std::string& setting5,
00541 const std::string& description5,
00542 const std::string& setting6,
00543 const std::string& description6,
00544 const std::string& long_description="");
00545 virtual void AddStringOption7(const std::string& name,
00546 const std::string& short_description,
00547 const std::string& default_value,
00548 const std::string& setting1,
00549 const std::string& description1,
00550 const std::string& setting2,
00551 const std::string& description2,
00552 const std::string& setting3,
00553 const std::string& description3,
00554 const std::string& setting4,
00555 const std::string& description4,
00556 const std::string& setting5,
00557 const std::string& description5,
00558 const std::string& setting6,
00559 const std::string& description6,
00560 const std::string& setting7,
00561 const std::string& description7,
00562 const std::string& long_description="");
00563 virtual void AddStringOption8(const std::string& name,
00564 const std::string& short_description,
00565 const std::string& default_value,
00566 const std::string& setting1,
00567 const std::string& description1,
00568 const std::string& setting2,
00569 const std::string& description2,
00570 const std::string& setting3,
00571 const std::string& description3,
00572 const std::string& setting4,
00573 const std::string& description4,
00574 const std::string& setting5,
00575 const std::string& description5,
00576 const std::string& setting6,
00577 const std::string& description6,
00578 const std::string& setting7,
00579 const std::string& description7,
00580 const std::string& setting8,
00581 const std::string& description8,
00582 const std::string& long_description="");
00583 virtual void AddStringOption9(const std::string& name,
00584 const std::string& short_description,
00585 const std::string& default_value,
00586 const std::string& setting1,
00587 const std::string& description1,
00588 const std::string& setting2,
00589 const std::string& description2,
00590 const std::string& setting3,
00591 const std::string& description3,
00592 const std::string& setting4,
00593 const std::string& description4,
00594 const std::string& setting5,
00595 const std::string& description5,
00596 const std::string& setting6,
00597 const std::string& description6,
00598 const std::string& setting7,
00599 const std::string& description7,
00600 const std::string& setting8,
00601 const std::string& description8,
00602 const std::string& setting9,
00603 const std::string& description9,
00604 const std::string& long_description="");
00605 virtual void AddStringOption10(const std::string& name,
00606 const std::string& short_description,
00607 const std::string& default_value,
00608 const std::string& setting1,
00609 const std::string& description1,
00610 const std::string& setting2,
00611 const std::string& description2,
00612 const std::string& setting3,
00613 const std::string& description3,
00614 const std::string& setting4,
00615 const std::string& description4,
00616 const std::string& setting5,
00617 const std::string& description5,
00618 const std::string& setting6,
00619 const std::string& description6,
00620 const std::string& setting7,
00621 const std::string& description7,
00622 const std::string& setting8,
00623 const std::string& description8,
00624 const std::string& setting9,
00625 const std::string& description9,
00626 const std::string& setting10,
00627 const std::string& description10,
00628 const std::string& long_description="");
00629
00632 virtual SmartPtr<const RegisteredOption> GetOption(const std::string& name);
00633
00636 virtual void OutputOptionDocumentation(const Journalist& jnlst, std::list<std::string>& categories);
00637
00639 virtual void OutputLatexOptionDocumentation(const Journalist& jnlst, std::list<std::string>& categories);
00641
00642 typedef std::map<std::string, SmartPtr<RegisteredOption> > RegOptionsList;
00643
00646 virtual const RegOptionsList& RegisteredOptionsList () const
00647 {
00648 return registered_options_;
00649 }
00650
00651 private:
00652 Index next_counter_;
00653 std::string current_registering_category_;
00654 std::map<std::string, SmartPtr<RegisteredOption> > registered_options_;
00655 };
00656 }
00657
00658 #endif