| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658 |
- // Copyright (C) 2004, 2007 International Business Machines and others.
- // All Rights Reserved.
- // This code is published under the Eclipse Public License.
- //
- // $Id: IpRegOptions.hpp 2189 2013-03-31 15:06:11Z stefan $
- //
- // Authors: Carl Laird, Andreas Waechter IBM 2005-06-18
- #ifndef __IPREGOPTIONS_HPP__
- #define __IPREGOPTIONS_HPP__
- #include "IpUtils.hpp"
- #include "IpReferenced.hpp"
- #include "IpException.hpp"
- #include "IpSmartPtr.hpp"
- #include <map>
- namespace Ipopt
- {
- enum RegisteredOptionType
- {
- OT_Number,
- OT_Integer,
- OT_String,
- OT_Unknown
- };
- /** Base class for registered options. The derived types are more
- * specific to a string option or a Number (real) option, etc.
- */
- class RegisteredOption : public ReferencedObject
- {
- public:
- /** class to hold the valid string settings for a string option */
- class string_entry
- {
- public:
- string_entry(const std::string& value, const std::string& description)
- : value_(value), description_(description)
- {}
- std::string value_;
- std::string description_;
- };
- /** Constructors / Destructors */
- //@{
- RegisteredOption(Index counter)
- :
- type_(OT_Unknown),
- has_lower_(false),
- has_upper_(false),
- counter_(counter)
- {}
- RegisteredOption(const std::string& name,
- const std::string& short_description,
- const std::string& long_description,
- const std::string& registering_category,
- Index counter)
- :
- name_(name),
- short_description_(short_description),
- long_description_(long_description),
- registering_category_(registering_category),
- type_(OT_Unknown),
- has_lower_(false),
- has_upper_(false),
- counter_(counter)
- {}
- RegisteredOption(const RegisteredOption& copy)
- :
- name_(copy.name_),
- short_description_(copy.short_description_),
- long_description_(copy.long_description_),
- registering_category_(copy.registering_category_),
- type_(copy.type_),
- has_lower_(copy.has_lower_),
- lower_(copy.lower_),
- has_upper_(copy.has_upper_),
- upper_(copy.upper_),
- valid_strings_(copy.valid_strings_),
- counter_(copy.counter_)
- {}
- virtual ~RegisteredOption()
- {}
- //@}
- DECLARE_STD_EXCEPTION(ERROR_CONVERTING_STRING_TO_ENUM);
- /** Standard Get / Set Methods */
- //@{
- /** Get the option's name (tag in the input file) */
- virtual const std::string& Name() const
- {
- return name_;
- }
- /** Set the option's name (tag in the input file) */
- virtual void SetName(const std::string& name)
- {
- name_ = name;
- }
- /** Get the short description */
- virtual const std::string& ShortDescription() const
- {
- return short_description_;
- }
- /** Get the long description */
- virtual const std::string& LongDescription() const
- {
- return long_description_;
- }
- /** Set the short description */
- virtual void SetShortDescription(const std::string& short_description)
- {
- short_description_ = short_description;
- }
- /** Set the long description */
- virtual void SetLongDescription(const std::string& long_description)
- {
- long_description_ = long_description;
- }
- /** Get the registering class */
- virtual const std::string& RegisteringCategory() const
- {
- return registering_category_;
- }
- /** Set the registering class */
- virtual void SetRegisteringCategory(const std::string& registering_category)
- {
- registering_category_ = registering_category;
- }
- /** Get the Option's type */
- virtual const RegisteredOptionType& Type() const
- {
- return type_;
- }
- /** Get the Option's type */
- virtual void SetType(const RegisteredOptionType& type)
- {
- type_ = type;
- }
- /** Counter */
- virtual Index Counter() const
- {
- return counter_;
- }
- //@}
- /** @name Get / Set methods valid for specific types - NOTE: the Type
- * must be set before calling these methods.
- */
- //@{
- /** check if the option has a lower bound - can be called for
- * OT_Number & OT_Integer*/
- virtual const bool& HasLower() const
- {
- DBG_ASSERT(type_ == OT_Number || type_ == OT_Integer);
- return has_lower_;
- }
- /** check if the lower bound is strict - can be called for
- OT_Number */
- virtual const bool& LowerStrict() const
- {
- DBG_ASSERT(type_ == OT_Number && has_lower_ == true);
- return lower_strict_;
- }
- /** get the Number version of the lower bound - can be called for
- * OT_Number */
- virtual Number LowerNumber() const
- {
- DBG_ASSERT(has_lower_ == true && type_ == OT_Number);
- return lower_;
- }
- /** set the Number version of the lower bound - can be called for
- * OT_Number */
- virtual void SetLowerNumber(const Number& lower, const bool& strict)
- {
- DBG_ASSERT(type_ == OT_Number);
- lower_ = lower;
- lower_strict_ = strict, has_lower_ = true;
- }
- /** get the Integer version of the lower bound can be called for
- * OT_Integer*/
- virtual Index LowerInteger() const
- {
- DBG_ASSERT(has_lower_ == true && type_ == OT_Integer);
- return (Index)lower_;
- }
- /** set the Integer version of the lower bound - can be called for
- * OT_Integer */
- virtual void SetLowerInteger(const Index& lower)
- {
- DBG_ASSERT(type_ == OT_Integer);
- lower_ = (Number)lower;
- has_lower_ = true;
- }
- /** check if the option has an upper bound - can be called for
- * OT_Number & OT_Integer*/
- virtual const bool& HasUpper() const
- {
- DBG_ASSERT(type_ == OT_Number || type_ == OT_Integer);
- return has_upper_;
- }
- /** check if the upper bound is strict - can be called for
- * OT_Number */
- virtual const bool& UpperStrict() const
- {
- DBG_ASSERT(type_ == OT_Number && has_upper_ == true);
- return upper_strict_;
- }
- /** get the Number version of the upper bound - can be called for
- * OT_Number */
- virtual Number UpperNumber() const
- {
- DBG_ASSERT(has_upper_ == true && type_ == OT_Number);
- return upper_;
- }
- /** set the Number version of the upper bound - can be called for
- * OT_Number */
- virtual void SetUpperNumber(const Number& upper, const bool& strict)
- {
- DBG_ASSERT(type_ == OT_Number);
- upper_ = upper;
- upper_strict_ = strict;
- has_upper_ = true;
- }
- /** get the Integer version of the upper bound - can be called for
- * OT_Integer*/
- virtual Index UpperInteger() const
- {
- DBG_ASSERT(has_upper_ == true && type_ == OT_Integer);
- return (Index)upper_;
- }
- /** set the Integer version of the upper bound - can be called for
- * OT_Integer */
- virtual void SetUpperInteger(const Index& upper)
- {
- DBG_ASSERT(type_ == OT_Integer);
- upper_ = (Number)upper;
- has_upper_ = true;
- }
- /** method to add valid string entries - can be called for
- * OT_String */
- virtual void AddValidStringSetting(const std::string value,
- const std::string description)
- {
- DBG_ASSERT(type_ == OT_String);
- valid_strings_.push_back(string_entry(value, description));
- }
- /** get the default as a Number - can be called for OT_Number */
- virtual Number DefaultNumber() const
- {
- DBG_ASSERT(type_ == OT_Number);
- return default_number_;
- }
- /** Set the default as a Number - can be called for OT_Number */
- virtual void SetDefaultNumber(const Number& default_value)
- {
- DBG_ASSERT(type_ == OT_Number);
- default_number_ = default_value;
- }
- /** get the default as an Integer - can be called for OT_Integer*/
- virtual Index DefaultInteger() const
- {
- DBG_ASSERT(type_ == OT_Integer);
- return (Index)default_number_;
- }
- /** Set the default as an Integer - can be called for
- OT_Integer */
- virtual void SetDefaultInteger(const Index& default_value)
- {
- DBG_ASSERT(type_ == OT_Integer);
- default_number_ = (Number)default_value;
- }
- /** get the default as a string - can be called for OT_String */
- virtual std::string DefaultString() const
- {
- DBG_ASSERT(type_ == OT_String);
- return default_string_;
- }
- /** get the default as a string, but as the index of the string in
- * the list - helps map from a string to an enum- can be called
- * for OT_String */
- virtual Index DefaultStringAsEnum() const
- {
- DBG_ASSERT(type_ == OT_String);
- return MapStringSettingToEnum(default_string_);
- }
- /** Set the default as a string - can be called for OT_String */
- virtual void SetDefaultString(const std::string& default_value)
- {
- DBG_ASSERT(type_ == OT_String);
- default_string_ = default_value;
- }
- /** get the valid string settings - can be called for OT_String */
- virtual std::vector<string_entry> GetValidStrings() const
- {
- DBG_ASSERT(type_ == OT_String);
- return valid_strings_;
- }
- /** Check if the Number value is a valid setting - can be called
- * for OT_Number */
- virtual bool IsValidNumberSetting(const Number& value) const
- {
- DBG_ASSERT(type_ == OT_Number);
- if (has_lower_ && ((lower_strict_ == true && value <= lower_) ||
- (lower_strict_ == false && value < lower_))) {
- return false;
- }
- if (has_upper_ && ((upper_strict_ == true && value >= upper_) ||
- (upper_strict_ == false && value > upper_))) {
- return false;
- }
- return true;
- }
- /** Check if the Integer value is a valid setting - can be called
- * for OT_Integer */
- virtual bool IsValidIntegerSetting(const Index& value) const
- {
- DBG_ASSERT(type_ == OT_Integer);
- if (has_lower_ && value < lower_) {
- return false;
- }
- if (has_upper_ && value > upper_) {
- return false;
- }
- return true;
- }
- /** Check if the String value is a valid setting - can be called
- * for OT_String */
- virtual bool IsValidStringSetting(const std::string& value) const;
- /** Map a user setting (allowing any case) to the case used when
- * the setting was registered.
- */
- virtual std::string MapStringSetting(const std::string& value) const;
- /** Map a user setting (allowing any case) to the index of the
- * matched setting in the list of string settings. Helps map a
- * string setting to an enumeration.
- */
- virtual Index MapStringSettingToEnum(const std::string& value) const;
- //@}
- /** output a description of the option */
- virtual void OutputDescription(const Journalist& jnlst) const;
- /** output a more concise version */
- virtual void OutputShortDescription(const Journalist& jnlst) const;
- /** output a latex version */
- virtual void OutputLatexDescription(const Journalist& jnlst) const;
- private:
- std::string name_;
- std::string short_description_;
- std::string long_description_;
- std::string registering_category_;
- RegisteredOptionType type_;
- bool has_lower_;
- bool lower_strict_;
- Number lower_;
- bool has_upper_;
- bool upper_strict_;
- Number upper_;
- Number default_number_;
- void MakeValidLatexString(std::string source, std::string& dest) const;
- std::string MakeValidLatexNumber(Number value) const;
- /** Compare two strings and return true if they are equal (case
- insensitive comparison) */
- bool string_equal_insensitive(const std::string& s1,
- const std::string& s2) const;
- std::vector<string_entry> valid_strings_;
- std::string default_string_;
- /** Has the information as how many-th option this one was
- * registered. */
- const Index counter_;
- };
- /** Class for storing registered options. Used for validation and
- * documentation.
- */
- class RegisteredOptions : public ReferencedObject
- {
- public:
- /** Constructors / Destructors */
- //@{
- /** Standard Constructor */
- RegisteredOptions()
- :
- next_counter_(0),
- current_registering_category_("Uncategorized")
- {}
- /** Standard Destructor */
- virtual ~RegisteredOptions()
- {}
- //@}
- DECLARE_STD_EXCEPTION(OPTION_ALREADY_REGISTERED);
- /** Methods to interact with registered options */
- //@{
- /** set the registering class. All subsequent options will be
- * added with the registered class */
- virtual void SetRegisteringCategory(const std::string& registering_category)
- {
- current_registering_category_ = registering_category;
- }
- /** retrieve the value of the current registering category */
- virtual std::string RegisteringCategory()
- {
- return current_registering_category_;
- }
- /** Add a Number option (with no restrictions) */
- virtual void AddNumberOption(const std::string& name,
- const std::string& short_description,
- Number default_value,
- const std::string& long_description="");
- /** Add a Number option (with a lower bound) */
- virtual void AddLowerBoundedNumberOption(const std::string& name,
- const std::string& short_description,
- Number lower, bool strict,
- Number default_value,
- const std::string& long_description="");
- /** Add a Number option (with a upper bound) */
- virtual void AddUpperBoundedNumberOption(const std::string& name,
- const std::string& short_description,
- Number upper, bool strict,
- Number default_value,
- const std::string& long_description="");
- /** Add a Number option (with a both bounds) */
- virtual void AddBoundedNumberOption(const std::string& name,
- const std::string& short_description,
- Number lower, bool lower_strict,
- Number upper, bool upper_strict,
- Number default_value,
- const std::string& long_description="");
- /** Add a Integer option (with no restrictions) */
- virtual void AddIntegerOption(const std::string& name,
- const std::string& short_description,
- Index default_value,
- const std::string& long_description="");
- /** Add a Integer option (with a lower bound) */
- virtual void AddLowerBoundedIntegerOption(const std::string& name,
- const std::string& short_description,
- Index lower, Index default_value,
- const std::string& long_description="");
- /** Add a Integer option (with a upper bound) */
- virtual void AddUpperBoundedIntegerOption(const std::string& name,
- const std::string& short_description,
- Index upper, Index default_value,
- const std::string& long_description="");
- /** Add a Integer option (with a both bounds) */
- virtual void AddBoundedIntegerOption(const std::string& name,
- const std::string& short_description,
- Index lower, Index upper,
- Index default_value,
- const std::string& long_description="");
- /** Add a String option (with no restrictions) */
- virtual void AddStringOption(const std::string& name,
- const std::string& short_description,
- const std::string& default_value,
- const std::vector<std::string>& settings,
- const std::vector<std::string>& descriptions,
- const std::string& long_description="");
- /** Methods that make adding string options with only a few
- * entries easier */
- virtual void AddStringOption1(const std::string& name,
- const std::string& short_description,
- const std::string& default_value,
- const std::string& setting1,
- const std::string& description1,
- const std::string& long_description="");
- virtual void AddStringOption2(const std::string& name,
- const std::string& short_description,
- const std::string& default_value,
- const std::string& setting1,
- const std::string& description1,
- const std::string& setting2,
- const std::string& description2,
- const std::string& long_description="");
- virtual void AddStringOption3(const std::string& name,
- const std::string& short_description,
- const std::string& default_value,
- const std::string& setting1,
- const std::string& description1,
- const std::string& setting2,
- const std::string& description2,
- const std::string& setting3,
- const std::string& description3,
- const std::string& long_description="");
- virtual void AddStringOption4(const std::string& name,
- const std::string& short_description,
- const std::string& default_value,
- const std::string& setting1,
- const std::string& description1,
- const std::string& setting2,
- const std::string& description2,
- const std::string& setting3,
- const std::string& description3,
- const std::string& setting4,
- const std::string& description4,
- const std::string& long_description="");
- virtual void AddStringOption5(const std::string& name,
- const std::string& short_description,
- const std::string& default_value,
- const std::string& setting1,
- const std::string& description1,
- const std::string& setting2,
- const std::string& description2,
- const std::string& setting3,
- const std::string& description3,
- const std::string& setting4,
- const std::string& description4,
- const std::string& setting5,
- const std::string& description5,
- const std::string& long_description="");
- virtual void AddStringOption6(const std::string& name,
- const std::string& short_description,
- const std::string& default_value,
- const std::string& setting1,
- const std::string& description1,
- const std::string& setting2,
- const std::string& description2,
- const std::string& setting3,
- const std::string& description3,
- const std::string& setting4,
- const std::string& description4,
- const std::string& setting5,
- const std::string& description5,
- const std::string& setting6,
- const std::string& description6,
- const std::string& long_description="");
- virtual void AddStringOption7(const std::string& name,
- const std::string& short_description,
- const std::string& default_value,
- const std::string& setting1,
- const std::string& description1,
- const std::string& setting2,
- const std::string& description2,
- const std::string& setting3,
- const std::string& description3,
- const std::string& setting4,
- const std::string& description4,
- const std::string& setting5,
- const std::string& description5,
- const std::string& setting6,
- const std::string& description6,
- const std::string& setting7,
- const std::string& description7,
- const std::string& long_description="");
- virtual void AddStringOption8(const std::string& name,
- const std::string& short_description,
- const std::string& default_value,
- const std::string& setting1,
- const std::string& description1,
- const std::string& setting2,
- const std::string& description2,
- const std::string& setting3,
- const std::string& description3,
- const std::string& setting4,
- const std::string& description4,
- const std::string& setting5,
- const std::string& description5,
- const std::string& setting6,
- const std::string& description6,
- const std::string& setting7,
- const std::string& description7,
- const std::string& setting8,
- const std::string& description8,
- const std::string& long_description="");
- virtual void AddStringOption9(const std::string& name,
- const std::string& short_description,
- const std::string& default_value,
- const std::string& setting1,
- const std::string& description1,
- const std::string& setting2,
- const std::string& description2,
- const std::string& setting3,
- const std::string& description3,
- const std::string& setting4,
- const std::string& description4,
- const std::string& setting5,
- const std::string& description5,
- const std::string& setting6,
- const std::string& description6,
- const std::string& setting7,
- const std::string& description7,
- const std::string& setting8,
- const std::string& description8,
- const std::string& setting9,
- const std::string& description9,
- const std::string& long_description="");
- virtual void AddStringOption10(const std::string& name,
- const std::string& short_description,
- const std::string& default_value,
- const std::string& setting1,
- const std::string& description1,
- const std::string& setting2,
- const std::string& description2,
- const std::string& setting3,
- const std::string& description3,
- const std::string& setting4,
- const std::string& description4,
- const std::string& setting5,
- const std::string& description5,
- const std::string& setting6,
- const std::string& description6,
- const std::string& setting7,
- const std::string& description7,
- const std::string& setting8,
- const std::string& description8,
- const std::string& setting9,
- const std::string& description9,
- const std::string& setting10,
- const std::string& description10,
- const std::string& long_description="");
- /** Get a registered option - this will return NULL if the option
- * does not exist */
- virtual SmartPtr<const RegisteredOption> GetOption(const std::string& name);
- /** Output documentation for the options - gives a description,
- * etc. */
- virtual void OutputOptionDocumentation(const Journalist& jnlst, std::list<std::string>& categories);
- /** Output documentation in Latex format to include in a latex file */
- virtual void OutputLatexOptionDocumentation(const Journalist& jnlst, std::list<std::string>& categories);
- //@}
- typedef std::map<std::string, SmartPtr<RegisteredOption> > RegOptionsList;
- /** Giving access to iteratable representation of the registered
- * options */
- virtual const RegOptionsList& RegisteredOptionsList () const
- {
- return registered_options_;
- }
- private:
- Index next_counter_;
- std::string current_registering_category_;
- std::map<std::string, SmartPtr<RegisteredOption> > registered_options_;
- };
- } // namespace Ipopt
- #endif
|