/home/coin/SVN-release/CoinAll-1.1.0/Alps/src/AlpsKnowledgeBroker.h

Go to the documentation of this file.
00001 /*===========================================================================*
00002  * This file is part of the Abstract Library for Parallel Search (ALPS).     *
00003  *                                                                           *
00004  * ALPS is distributed under the Common Public License as part of the        *
00005  * COIN-OR repository (http://www.coin-or.org).                              *
00006  *                                                                           *
00007  * Authors:                                                                  *
00008  *                                                                           *
00009  *          Yan Xu, Lehigh University                                        *
00010  *          Ted Ralphs, Lehigh University                                    *
00011  *                                                                           *
00012  * Conceptual Design:                                                        *
00013  *                                                                           *
00014  *          Yan Xu, Lehigh University                                        *
00015  *          Ted Ralphs, Lehigh University                                    *
00016  *          Laszlo Ladanyi, IBM T.J. Watson Research Center                  *
00017  *          Matthew Saltzman, Clemson University                             *
00018  *                                                                           * 
00019  *                                                                           *
00020  * Copyright (C) 2001-2007, Lehigh University, Yan Xu, and Ted Ralphs.       *
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         // Check if alread have one.
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             // AlpsKnowledgePool* akp = static_cast<AlpsKnowledgePool*>(kp);
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; } /* Serial is master */
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

Generated on Sun Nov 14 14:06:28 2010 for Coin-All by  doxygen 1.4.7