00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef BonRegisteredOptions_H
00012 #define BonRegisteredOptions_H
00013
00014 #include "IpRegOptions.hpp"
00015 #include "IpException.hpp"
00016 #include "CoinError.hpp"
00017 #include "IpTypes.hpp"
00018 #include <iostream>
00019 namespace Bonmin {
00024 class RegisteredOptions: public Ipopt::RegisteredOptions{
00025 public:
00026 enum ExtraOptInfosBits{
00027 validInHybrid=0,
00028 validInQG,
00029 validInOA,
00030 validInBBB
00031 };
00032 enum ExtraCategoriesInfo{
00033 BonminCategory = 0,
00034 IpoptCategory ,
00035 FilterCategory ,
00036 BqpdCategory ,
00037 CouenneCategory
00038 };
00040 RegisteredOptions():
00041 Ipopt::RegisteredOptions(){
00042 }
00043
00045 ~RegisteredOptions(){
00046 }
00047
00048
00050 void SetRegisteringCategory (const std::string ®istering_category,
00051 const ExtraCategoriesInfo extra){
00052 Ipopt::RegisteredOptions::SetRegisteringCategory(registering_category);
00053 categoriesInfos_[registering_category] = extra;}
00054
00056 inline void optionExists(const std::string & option){
00057 if(!IsValid(GetOption(option))){
00058 std::string msg = "Try to access option: "+option;
00059 msg += "\n Option is not registered.\n";
00060 throw CoinError("Bonmin::RegisteredOption","optionExists",msg);
00061 }
00062 }
00063
00065 inline void setOptionExtraInfo(const std::string & option, int code){
00066 optionExists(option);
00067 bonOptInfos_[option] = code;
00068 }
00069
00071 inline void optionValidForHybrid(const std::string &option){
00072 optionExists(option);
00073 bonOptInfos_[option] |= 1 << validInHybrid;}
00074
00076 inline void optionValidForBQG(const std::string &option){
00077 optionExists(option);
00078 bonOptInfos_[option] |= 1 << validInQG;}
00079
00081 inline void optionValidForBOA(const std::string &option){
00082 optionExists(option);
00083 bonOptInfos_[option] |= 1 << validInOA;}
00084
00086 inline void optionValidForBBB(const std::string &option){
00087 optionExists(option);
00088 bonOptInfos_[option] |= 1 << validInBBB;}
00089
00090
00092 inline bool isValidForHybrid(const std::string &option){
00093 optionExists(option);
00094 std::map<std::string, int>::iterator i = bonOptInfos_.find(option);
00095 if(i != bonOptInfos_.end())
00096 return (i->second) & (1 << validInHybrid);
00097 else return true;}
00098
00100 inline bool isValidForBQG(const std::string &option){
00101 optionExists(option);
00102 std::map<std::string, int>::iterator i = bonOptInfos_.find(option);
00103 if(i != bonOptInfos_.end())
00104 return (i->second) & (1 << validInQG);
00105 else return true;}
00106
00108 inline bool isValidForBOA(const std::string &option){
00109 optionExists(option);
00110 std::map<std::string, int>::iterator i = bonOptInfos_.find(option);
00111 if(i != bonOptInfos_.end())
00112 return (i->second) & (1 << validInOA);
00113 return true;}
00114
00116 inline bool isValidForBBB(const std::string &option){
00117 optionExists(option);
00118 std::map<std::string, int>::iterator i = bonOptInfos_.find(option);
00119 if(i != bonOptInfos_.end())
00120 return (i->second) & (1 << validInBBB);
00121 return true;}
00123 void writeLatexOptionsTable(std::ostream &of, ExtraCategoriesInfo which);
00124
00126 void writeHtmlOptionsTable(std::ostream &of, ExtraCategoriesInfo which);
00127
00128
00130 void writeLatexHtmlDoc(std::ostream &of, ExtraCategoriesInfo which);
00132 void writeBonminOpt(std::ostream &os, ExtraCategoriesInfo which);
00133 private:
00135 void chooseOptions(ExtraCategoriesInfo which, std::list<Ipopt::RegisteredOption *> &options);
00137 void writeHtmlOptionsTable(std::ostream & os, std::list<Ipopt::RegisteredOption *> &options);
00139 std::map<std::string, int> bonOptInfos_;
00142 std::map<std::string, ExtraCategoriesInfo> categoriesInfos_;
00144 ExtraCategoriesInfo categoriesInfo(const std::string &s)
00145 {
00146 std::map<std::string, ExtraCategoriesInfo>::iterator i = categoriesInfos_.find(s);
00147 if(i == categoriesInfos_.end())
00148 return IpoptCategory;
00149 return i->second;
00150 }
00151 };
00152
00153 }
00154 #endif
00155