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 #ifdef COIN_HAS_ASL
00020
00021 namespace Ipopt{
00022 class AmplOptionsList;
00023 }
00024 #endif
00025 namespace Bonmin {
00030 class RegisteredOptions: public Ipopt::RegisteredOptions{
00031 public:
00032 enum ExtraOptInfosBits{
00033 validInHybrid=0,
00034 validInQG,
00035 validInOA,
00036 validInBBB,
00037 validInEcp,
00038 validIniFP,
00039 validInCbc
00040 };
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 enum ExtraCategoriesInfo{
00053 BonminCategory = 0,
00054 IpoptCategory ,
00055 FilterCategory ,
00056 BqpdCategory ,
00057 CouenneCategory ,
00058 UndocumentedCategory
00059 };
00061 RegisteredOptions():
00062 Ipopt::RegisteredOptions(){
00063 }
00064
00066 ~RegisteredOptions(){
00067 }
00068
00069
00071 void SetRegisteringCategory (const std::string ®istering_category,
00072 const ExtraCategoriesInfo extra){
00073 Ipopt::RegisteredOptions::SetRegisteringCategory(registering_category);
00074 categoriesInfos_[registering_category] = extra;}
00075
00077 inline void optionExists(const std::string & option){
00078 if(!IsValid(GetOption(option))){
00079 std::string msg = "Try to access option: "+option;
00080 msg += "\n Option is not registered.\n";
00081 throw CoinError("Bonmin::RegisteredOption","optionExists",msg);
00082 }
00083 }
00084
00086 inline void setOptionExtraInfo(const std::string & option, int code){
00087 optionExists(option);
00088 bonOptInfos_[option] = code;
00089 }
00090
00092 inline void optionValidForHybrid(const std::string &option){
00093 optionExists(option);
00094 bonOptInfos_[option] |= 1 << validInHybrid;}
00095
00097 inline void optionValidForBQG(const std::string &option){
00098 optionExists(option);
00099 bonOptInfos_[option] |= 1 << validInQG;}
00100
00102 inline void optionValidForBOA(const std::string &option){
00103 optionExists(option);
00104 bonOptInfos_[option] |= 1 << validInOA;}
00105
00107 inline void optionValidForBBB(const std::string &option){
00108 optionExists(option);
00109 bonOptInfos_[option] |= 1 << validInBBB;}
00110
00112 inline void optionValidForBEcp(const std::string &option){
00113 optionExists(option);
00114 bonOptInfos_[option] |= 1 << validInEcp;}
00115
00117 inline void optionValidForBiFP(const std::string &option){
00118 optionExists(option);
00119 bonOptInfos_[option] |= 1 << validIniFP;}
00120
00122 inline void optionValidForCbc(const std::string &option){
00123 optionExists(option);
00124 bonOptInfos_[option] |= 1 << validInCbc;}
00125
00126
00128 inline bool isValidForHybrid(const std::string &option){
00129 optionExists(option);
00130 std::map<std::string, int>::iterator i = bonOptInfos_.find(option);
00131 if(i != bonOptInfos_.end())
00132 return (i->second) & (1 << validInHybrid);
00133 else return true;}
00134
00136 inline bool isValidForBQG(const std::string &option){
00137 optionExists(option);
00138 std::map<std::string, int>::iterator i = bonOptInfos_.find(option);
00139 if(i != bonOptInfos_.end())
00140 return (i->second) & (1 << validInQG);
00141 else return true;}
00142
00144 inline bool isValidForBOA(const std::string &option){
00145 optionExists(option);
00146 std::map<std::string, int>::iterator i = bonOptInfos_.find(option);
00147 if(i != bonOptInfos_.end())
00148 return (i->second) & (1 << validInOA);
00149 return true;}
00150
00152 inline bool isValidForBBB(const std::string &option){
00153 optionExists(option);
00154 std::map<std::string, int>::iterator i = bonOptInfos_.find(option);
00155 if(i != bonOptInfos_.end())
00156 return (i->second) & (1 << validInBBB);
00157 return true;}
00158
00159
00161 inline bool isValidForBEcp(const std::string &option){
00162 optionExists(option);
00163 std::map<std::string, int>::iterator i = bonOptInfos_.find(option);
00164 if(i != bonOptInfos_.end())
00165 return (i->second) & (1 << validInEcp);
00166 return true;}
00167
00168
00170 inline bool isValidForBiFP(const std::string &option){
00171 optionExists(option);
00172 std::map<std::string, int>::iterator i = bonOptInfos_.find(option);
00173 if(i != bonOptInfos_.end())
00174 return (i->second) & (1 << validIniFP);
00175 return true;}
00176
00177
00179 inline bool isValidForCbc(const std::string &option){
00180 optionExists(option);
00181 std::map<std::string, int>::iterator i = bonOptInfos_.find(option);
00182 if(i != bonOptInfos_.end())
00183 return (i->second) & (1 << validInCbc);
00184 return true;}
00185
00186
00188 void writeLatexOptionsTable(std::ostream &of, ExtraCategoriesInfo which);
00189
00191 void writeHtmlOptionsTable(std::ostream &of, ExtraCategoriesInfo which);
00192
00193
00195 void writeLatexHtmlDoc(std::ostream &of, ExtraCategoriesInfo which);
00197 void writeBonminOpt(std::ostream &os, ExtraCategoriesInfo which);
00198
00200 ExtraCategoriesInfo categoriesInfo(const std::string &s)
00201 {
00202 std::map<std::string, ExtraCategoriesInfo>::iterator i = categoriesInfos_.find(s);
00203 if(i == categoriesInfos_.end())
00204 return IpoptCategory;
00205 return i->second;
00206 }
00207
00208 #ifdef COIN_HAS_ASL
00209
00210 void fillAmplOptionList(ExtraCategoriesInfo which, Ipopt::AmplOptionsList * amplOptList);
00211 #endif
00212 private:
00214 void chooseOptions(ExtraCategoriesInfo which, std::list<Ipopt::RegisteredOption *> &options);
00216 void writeHtmlOptionsTable(std::ostream & os, std::list<Ipopt::RegisteredOption *> &options);
00218 std::map<std::string, int> bonOptInfos_;
00221 std::map<std::string, ExtraCategoriesInfo> categoriesInfos_;
00222 };
00223
00224 }
00225 #endif
00226