00001 #ifndef DIPPY_DECOMPALGO_INCLUDED 00002 #define DIPPY_DECOMPALGO_INCLUDED 00003 00004 #include "Decomp.h" 00005 #include "DecompAlgoC.h" 00006 #include "DecompAlgoPC.h" 00007 #include "DecompAlgoRC.h" 00008 #include "DecompAlgoD.h" 00009 #include "DecompCutPool.h" 00010 #include "AlpsDecompTreeNode.h" 00011 00012 #include "Python.h" 00013 00022 class DippyAlgoMixin { 00023 private: 00024 PyObject* pDownLB; 00025 PyObject* pDownUB; 00026 PyObject* pUpLB; 00027 PyObject* pUpUB; 00028 00029 protected: 00030 PyObject* m_pProb; 00031 UtilParameters* m_utilParam; 00032 public: 00039 DippyAlgoMixin(UtilParameters* utilParam, PyObject* pProb) 00040 : m_pProb(pProb), m_utilParam(utilParam), pDownLB(NULL), 00041 pDownUB(NULL), pUpLB(NULL), pUpUB(NULL) { 00042 } 00043 00044 bool chooseBranchSet(DecompAlgo* algo, 00045 std::vector< std::pair<int, double> >& downBranchLB, 00046 std::vector< std::pair<int, double> >& downBranchUB, 00047 std::vector< std::pair<int, double> >& upBranchLB, 00048 std::vector< std::pair<int, double> >& upBranchUB); 00049 00050 PyObject* getPDownLB() { 00051 return pDownLB; 00052 }; 00053 PyObject* getPDownUB() { 00054 return pDownUB; 00055 }; 00056 PyObject* getPUpLB() { 00057 return pUpLB; 00058 }; 00059 PyObject* getPpUpUB() { 00060 return pUpUB; 00061 }; 00062 00063 void postProcessBranch(DecompAlgo* algo, DecompStatus decompStatus); 00064 00065 void postProcessNode(DecompAlgo* algo, DecompStatus decompStatus); 00066 00067 }; 00068 00073 class DippyAlgoC : DippyAlgoMixin, public DecompAlgoC { 00074 public: 00075 DippyAlgoC(DecompApp* app, UtilParameters* utilParam, PyObject* pProb) 00076 : DippyAlgoMixin(utilParam, pProb), DecompAlgoC(app, utilParam) { 00077 } 00078 00079 virtual bool chooseBranchSet( 00080 std::vector< std::pair<int, double> >& downBranchLB, 00081 std::vector< std::pair<int, double> >& downBranchUB, 00082 std::vector< std::pair<int, double> >& upBranchLB, 00083 std::vector< std::pair<int, double> >& upBranchUB) { 00084 bool ret_val = DippyAlgoMixin::chooseBranchSet(this, downBranchLB, downBranchUB, 00085 upBranchLB, upBranchUB); 00086 return ret_val; 00087 } 00088 00089 virtual void postProcessBranch(DecompStatus decompStatus) { 00090 DippyAlgoMixin::postProcessBranch(this, decompStatus); 00091 } 00092 00093 virtual void postProcessNode(DecompStatus decompStatus) { 00094 DippyAlgoMixin::postProcessNode(this, decompStatus); 00095 } 00096 00097 }; 00098 00103 class DippyAlgoPC : DippyAlgoMixin, public DecompAlgoPC { 00104 public: 00105 DippyAlgoPC(DecompApp* app, UtilParameters* utilParam, PyObject* pProb) 00106 : DippyAlgoMixin(utilParam, pProb), DecompAlgoPC(app, utilParam) { 00107 } 00108 00109 virtual bool chooseBranchSet(std::vector< std::pair<int, double> >& downBranchLB, 00110 std::vector< std::pair<int, double> >& downBranchUB, 00111 std::vector< std::pair<int, double> >& upBranchLB, 00112 std::vector< std::pair<int, double> >& upBranchUB) { 00113 return DippyAlgoMixin::chooseBranchSet(this, downBranchLB, downBranchUB, 00114 upBranchLB, upBranchUB); 00115 } 00116 00117 virtual void postProcessBranch(DecompStatus decompStatus) { 00118 DippyAlgoMixin::postProcessBranch(this, decompStatus); 00119 } 00120 00121 virtual void postProcessNode(DecompStatus decompStatus) { 00122 DippyAlgoMixin::postProcessNode(this, decompStatus); 00123 } 00124 00125 }; 00126 00131 class DippyAlgoRC : DippyAlgoMixin, public DecompAlgoRC { 00132 public: 00133 DippyAlgoRC(DecompApp* app, UtilParameters* utilParam, PyObject* pProb) 00134 : DippyAlgoMixin(utilParam, pProb), DecompAlgoRC(app, utilParam) { 00135 } 00136 00137 virtual bool chooseBranchSet(std::vector< std::pair<int, double> >& downBranchLB, 00138 std::vector< std::pair<int, double> >& downBranchUB, 00139 std::vector< std::pair<int, double> >& upBranchLB, 00140 std::vector< std::pair<int, double> >& upBranchUB) { 00141 return DippyAlgoMixin::chooseBranchSet(this, downBranchLB, downBranchUB, 00142 upBranchLB, upBranchUB); 00143 } 00144 00145 virtual void postProcessBranch(DecompStatus decompStatus) { 00146 DippyAlgoMixin::postProcessBranch(this, decompStatus); 00147 } 00148 00149 virtual void postProcessNode(DecompStatus decompStatus) { 00150 DippyAlgoMixin::postProcessNode(this, decompStatus); 00151 } 00152 00153 }; 00154 00155 #endif