00001
00002
00003 #ifndef _CSP_COLGEN_H
00004 #define _CSP_COLGEN_H
00005
00006 #include <OsiClpSolverInterface.hpp>
00007
00008 #include "CSP.hpp"
00009
00010 class UserData;
00011
00012
00013 class CSP_subProblem {
00014 public:
00015
00016 const CSPROBLEM* csproblem;
00017 UserData* user;
00018
00019 double perturb_factor;
00020 int perturb_num;
00021
00022
00023 int nBaseRows;
00024
00025
00026
00027
00028
00029 int * numBits;
00030
00031
00032 int maxNumBits;
00033
00034
00035
00036
00037
00038 double* lowerBounds;
00039 double* upperBounds;
00040
00041
00042 int numCols;
00043
00044 OsiClpSolverInterface solver;
00045
00046
00047 CSP_subProblem(){}
00048
00049
00050 ~CSP_subProblem(){
00051 delete [] lowerBounds;
00052 delete [] upperBounds;
00053 delete [] numBits;
00054 }
00055
00056
00057
00058
00059 CSP_subProblem(const CSP_subProblem&);
00060
00061
00062 CSP_subProblem& operator=(const CSP_subProblem&);
00063 };
00064
00065
00066
00067 class CSP_colgen {
00068 private:
00069
00070
00071 int maxCols_;
00072
00073
00074 int maxNumBits_;
00075
00076
00077 std::vector<CSP_subProblem*> subProblems;
00078
00079
00080
00081
00082
00083
00084 const bool ownSetMembers;
00085
00086
00087 const CSPROBLEM* csproblem_;
00088
00089
00090 private:
00091 void resetColBounds(OsiSolverInterface& si, const int numCols,
00092 const double* colLBs, const double* colUBs){
00093 int i;
00094 for (i=0; i<numCols; ++i){
00095 si.setColLower(i,colLBs[i]);
00096 si.setColUpper(i,colUBs[i]);
00097 }
00098 }
00099
00100 void gutsOfDestructor() {
00101 if (ownSetMembers) {
00102 delete csproblem_;
00103 }
00104 for(size_t i=0; i<subProblems.size(); ++i){
00105 delete subProblems[i];
00106 }
00107 }
00108
00109
00110 public:
00111
00112
00113
00114 CSP_colgen(const bool own) : maxCols_(0),
00115 maxNumBits_(0),
00116 subProblems(),
00117 ownSetMembers(own){}
00118
00119 ~CSP_colgen() {
00120 gutsOfDestructor();
00121 }
00122
00123
00124
00125
00126
00127
00128 void setCsp(const CSPROBLEM* a, double perturb_factor, int perturb_num);
00129
00130
00131
00132
00133 void applyExclusions(const std::vector<const PATTERN*> &excl_patterns );
00134
00135
00136 std::vector<PATTERN*>
00137 generateColumns(const double* pi, const double detol, const bool feasible);
00138 };
00139
00140 #endif