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