00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef AlpsKnowledgeBroker_h_
00024 #define AlpsKnowledgeBroker_h_
00025
00026 #include <cmath>
00027 #include <iosfwd>
00028 #include <map>
00029 #include <string>
00030
00031 #include "CoinMessageHandler.hpp"
00032
00033 #include "AlpsSearchStrategy.h"
00034 #include "AlpsEnumProcessT.h"
00035 #include "AlpsKnowledge.h"
00036 #include "AlpsKnowledgePool.h"
00037 #include "AlpsMessage.h"
00038 #include "AlpsParams.h"
00039 #include "AlpsSolutionPool.h"
00040 #include "AlpsSubTree.h"
00041 #include "AlpsSubTreePool.h"
00042 #include "AlpsModel.h"
00043 #include "AlpsTime.h"
00044
00045
00046
00048 class AlpsKnowledgeBroker {
00049
00050 private:
00051
00052 AlpsKnowledgeBroker(const AlpsKnowledgeBroker&);
00053 AlpsKnowledgeBroker& operator=(const AlpsKnowledgeBroker&);
00054
00056 std::map<int, AlpsKnowledge*> decodeMap_;
00057
00058 protected:
00059
00061 std::string instanceName_;
00062
00064 AlpsModel *model_;
00065
00067 AlpsPhase phase_;
00068
00075 AlpsSubTreePool* subTreePool_;
00076
00078 AlpsSolutionPool* solPool_;
00079
00081 std::map<AlpsKnowledgeType, AlpsKnowledgePool*>* pools_;
00083
00089 AlpsSubTree* workingSubTree_;
00090
00092 bool needWorkingSubTree_;
00093
00095 AlpsNodeIndex_t nextIndex_;
00096
00098 AlpsNodeIndex_t maxIndex_;
00100
00105
00107 AlpsTimer timer_;
00108
00110 AlpsTimer subTreeTimer_;
00111
00113 AlpsTimer tempTimer_;
00114
00116 int nodeProcessedNum_;
00117
00119 int nodeLeftNum_;
00120
00122 int treeDepth_;
00123
00125 int bestSolDepth_;
00126
00128 int bestSolNode_;
00129
00131 double peakMemory_;
00132
00134 AlpsExitStatus exitStatus_;
00136
00142 AlpsSearchStrategy<AlpsSubTree*>* treeSelection_;
00143
00145 AlpsSearchStrategy<AlpsTreeNode*>* nodeSelection_;
00146
00148 AlpsSearchStrategy<AlpsTreeNode*>* rampUpNodeSelection_;
00150
00156 CoinMessageHandler * handler_;
00157
00159 CoinMessages messages_;
00160
00163 int msgLevel_;
00164
00167 int hubMsgLevel_;
00168
00171 int workerMsgLevel_;
00172
00175 int logFileLevel_;
00176
00178 std::string logfile_;
00180
00182 int nodeMemSize_;
00183
00185 double nodeProcessingTime_;
00186
00188 int largeSize_;
00189
00191 bool userBalancePeriod_;
00192
00193 public:
00194
00196 AlpsKnowledgeBroker();
00197
00199 virtual ~AlpsKnowledgeBroker();
00200
00201
00214 void registerClass(int name, AlpsKnowledge* userKnowledge) {
00215
00216 std::map<int, AlpsKnowledge*>::iterator pos, pos1;
00217 pos = decodeMap_.find(name);
00218 pos1 = decodeMap_.end();
00219
00220 if (pos != pos1) {
00221 AlpsKnowledge* kl = pos->second;
00222 decodeMap_.erase(pos);
00223 delete kl;
00224 }
00225
00226 decodeMap_[name] = userKnowledge;
00227 }
00228
00237 const AlpsKnowledge* decoderObject(int name) {
00238 return decodeMap_[name];
00239 }
00241
00242
00243
00249 virtual void initializeSearch(int argc,
00250 char* argv[],
00251 AlpsModel& model) = 0;
00252
00254 virtual void rootSearch(AlpsTreeNode* root) = 0;
00255
00257 virtual void search(AlpsModel *model) {
00258 AlpsTreeNode* root = model->createRoot();
00259 rootSearch(root);
00260 }
00262
00263
00264
00269 AlpsPhase getPhase() { return phase_; }
00270 void setPhase(AlpsPhase ph) { phase_ = ph; }
00272
00274 AlpsModel *getModel() { return model_; }
00275 void setModel(AlpsModel *m) { model_ = m; }
00277
00279 int getTreeDepth() { return treeDepth_; }
00280
00282 int getBestSolDepth() { return bestSolDepth_; }
00283
00285 void setBestSolDepth(int depth) { bestSolDepth_ = depth; }
00286
00288 void setPeakMemory(double size) { peakMemory_ = size; }
00289
00291 double getPeakMemory() { return peakMemory_; }
00292
00298 void setupKnowledgePools();
00299
00301 inline void addKnowledgePool(AlpsKnowledgeType kt, AlpsKnowledgePool* kp) {
00302 if(kt == AlpsKnowledgeTypeSolution || kt == AlpsKnowledgeTypeSubTree) {
00303
00304 pools_->insert
00305 (std::pair<AlpsKnowledgeType, AlpsKnowledgePool*>(kt, kp));
00306 }
00307 else {
00308 throw CoinError("Broker doesn't manage this type of knowledge",
00309 "addKnowledgePool()", "AlpsKnowledgeBroker");
00310 }
00311 }
00312
00314 inline AlpsKnowledgePool* getKnowledgePool(AlpsKnowledgeType kt) const {
00315 if(kt == AlpsKnowledgeTypeSolution || kt == AlpsKnowledgeTypeSubTree) {
00316 return (*pools_)[kt];
00317 }
00318 else {
00319 throw CoinError("Broker doesn't manage this type of knowledge",
00320 "getKnowledgePool()", "AlpsKnowledgeBroker");
00321 }
00322 }
00323
00325 virtual int getNumKnowledges(AlpsKnowledgeType kt) const;
00326
00329 virtual int getMaxNumKnowledges(AlpsKnowledgeType kt) const {
00330 if(kt == AlpsKnowledgeTypeSolution || kt == AlpsKnowledgeTypeSubTree) {
00331 return getKnowledgePool(kt)->getMaxNumKnowledges();
00332 }
00333 else {
00334 throw CoinError("Broker doesn't manage this type of knowledge",
00335 "getMaxNumKnowledges()", "AlpsKnowledgeBroker");
00336 }
00337 }
00338
00341 virtual void setMaxNumKnowledges(AlpsKnowledgeType kt, int num) {
00342 if(kt == AlpsKnowledgeTypeSolution || kt == AlpsKnowledgeTypeSubTree) {
00343 getKnowledgePool(kt)->setMaxNumKnowledges(num);
00344 }
00345 else {
00346 throw CoinError("Broker doesn't manage this type of knowledge",
00347 "setMaxNumKnowledges()", "AlpsKnowledgeBroker");
00348 }
00349 }
00350
00353 virtual bool hasKnowledge(AlpsKnowledgeType kt) const {
00354 if(kt == AlpsKnowledgeTypeSolution || kt == AlpsKnowledgeTypeSubTree)
00355 return getKnowledgePool(kt)->hasKnowledge();
00356 else
00357 throw CoinError("Broker doesn't manage this type of knowledge",
00358 "hasKnowledge()", "AlpsKnowledgeBroker");
00359 }
00360
00362 virtual std::pair<AlpsKnowledge*, double>
00363 getKnowledge(AlpsKnowledgeType kt) const {
00364 if(kt == AlpsKnowledgeTypeSolution || kt == AlpsKnowledgeTypeSubTree) {
00365 return getKnowledgePool(kt)->getKnowledge();
00366 }
00367 else {
00368 throw CoinError("Broker doesn't manage this type of knowledge",
00369 "getKnowledge()", "AlpsKnowledgeBroker");
00370 }
00371 }
00372
00374 virtual void popKnowledge(AlpsKnowledgeType kt) {
00375 if(kt == AlpsKnowledgeTypeSolution || kt == AlpsKnowledgeTypeSubTree) {
00376 getKnowledgePool(kt)->popKnowledge();
00377 }
00378 else {
00379 throw CoinError("Broker doesn't manage this type of knowledge",
00380 "popKnowledge()", "AlpsKnowledgeBroker");
00381 }
00382 }
00383
00385 virtual std::pair<AlpsKnowledge*, double>
00386 getBestKnowledge(AlpsKnowledgeType kt) const;
00387
00389 virtual void getAllKnowledges (AlpsKnowledgeType kt,
00390 std::vector<std::pair<AlpsKnowledge*,
00391 double> >& kls) const {
00392 if(kt == AlpsKnowledgeTypeSolution || kt == AlpsKnowledgeTypeSubTree) {
00393 getKnowledgePool(kt)->getAllKnowledges(kls);
00394 }
00395 else {
00396 throw CoinError("Broker doesn't manage this type of knowledge",
00397 "popKnowledge()", "AlpsKnowledgeBroker");
00398 }
00399 }
00400
00402 virtual void addKnowledge(AlpsKnowledgeType kt,
00403 AlpsKnowledge* kl,
00404 double value ) {
00405 if(kt == AlpsKnowledgeTypeSolution || kt == AlpsKnowledgeTypeSubTree) {
00406 getKnowledgePool(kt)->addKnowledge(kl, value);
00407 }
00408 else {
00409 throw CoinError("Broker doesn't manage this type of knowledge",
00410 "popKnowledge()", "AlpsKnowledgeBroker");
00411 }
00412 }
00414
00419 int getNumNodesProcessed() const {
00420 return nodeProcessedNum_;
00421 }
00422
00424 virtual int updateNumNodesLeft();
00425
00427 virtual AlpsTreeNode* getBestNode() const;
00428
00430 AlpsExitStatus getSolStatus() const {
00431 return exitStatus_;
00432 }
00433
00435 void setExitStatus(AlpsExitStatus status) {
00436 exitStatus_ = status;
00437 }
00438
00440 AlpsTimer & timer() {
00441 return timer_;
00442 }
00443
00445 AlpsTimer & subTreeTimer() {
00446 return subTreeTimer_;
00447 }
00448
00450 AlpsTimer & tempTimer() {
00451 return tempTimer_;
00452 }
00453
00455 virtual void searchLog() = 0;
00457
00462 int getNodeMemSize() { return nodeMemSize_; }
00463 void setNodeMemSize(int ms) { nodeMemSize_ = ms; }
00465
00470 double getNodeProcessingTime() { return nodeProcessingTime_; }
00471 void setNodeProcessingTime(double npTime) { nodeProcessingTime_ = npTime; }
00473
00474 int getLargeSize() const { return largeSize_; }
00475
00482 virtual double getIncumbentValue() const = 0;
00483
00486 virtual double getBestQuality() const = 0;
00487
00490 virtual void printBestSolution(char* outputFile = 0) const = 0;
00492
00494 virtual int getProcRank() const { return 0; }
00495
00497 virtual int getMasterRank() const { return 0; }
00498
00500 virtual AlpsProcessType getProcType() const
00501 { return AlpsProcessTypeMaster; }
00502
00503
00510 AlpsNodeIndex_t nextNodeIndex() { return nextIndex_++; }
00511
00513 AlpsNodeIndex_t getNextNodeIndex() const { return nextIndex_; }
00514
00516 void setNextNodeIndex(AlpsNodeIndex_t s) { nextIndex_ = s; }
00517
00519 AlpsNodeIndex_t getMaxNodeIndex() const { return maxIndex_; }
00520
00522 void setMaxNodeIndex(AlpsNodeIndex_t s) { maxIndex_ = s; }
00524
00529 AlpsSearchStrategy<AlpsSubTree*>* getSubTreeSelection() const {
00530 return treeSelection_;
00531 }
00532 void setSubTreeSelection(AlpsSearchStrategy<AlpsSubTree*>* tc) {
00533 if (treeSelection_) delete treeSelection_;
00534 treeSelection_ = tc;
00535 subTreePool_->setComparison(*treeSelection_);
00536 }
00537 AlpsSearchStrategy<AlpsTreeNode*>* getNodeSelection() const {
00538 return nodeSelection_;
00539 }
00540 void setNodeSelection(AlpsSearchStrategy<AlpsTreeNode*>* nc) {
00541 if (nodeSelection_) delete nodeSelection_;
00542 nodeSelection_ = nc;
00543 }
00544 AlpsSearchStrategy<AlpsTreeNode*>* getRampUpNodeSelection() const {
00545 return rampUpNodeSelection_;
00546 }
00547 void setRampUpNodeSelection(AlpsSearchStrategy<AlpsTreeNode*>* nc) {
00548 if (rampUpNodeSelection_) delete rampUpNodeSelection_;
00549 rampUpNodeSelection_ = nc;
00550 }
00552
00556 void passInMessageHandler(CoinMessageHandler * handler);
00557
00559 void newLanguage(CoinMessages::Language language);
00560 void setLanguage(CoinMessages::Language language)
00561 { newLanguage(language); }
00562
00564 CoinMessageHandler * messageHandler() const { return handler_; }
00565
00567 CoinMessages messages() { return messages_; }
00568
00570 CoinMessages * messagesPointer() { return &messages_; }
00571
00573 int getMsgLevel() { return msgLevel_; }
00574
00576 int getHubMsgLevel() { return hubMsgLevel_; }
00577
00579 int getMasterMsgLevel() { return workerMsgLevel_; }
00580
00582 int getlogFileLevel() { return logFileLevel_; }
00584 };
00585 #endif