00001 // Copyright (C) 2005, International Business Machines 00002 // Corporation and others. All Rights Reserved. 00003 #ifndef CSP_USEREXITS_H 00004 #define CSP_USEREXITS_H 00005 00006 #include <algorithm> 00007 #include <vector> 00008 00009 #include <OsiClpSolverInterface.hpp> 00010 00011 class CSP_subProblem; 00012 00013 class UserData { 00014 public: 00015 CSP_subProblem* subProblem; 00016 OsiClpSolverInterface* solver; 00017 int cutMode; 00018 int nBaseRows; 00019 std::vector<const double*> denseSols; 00020 std::vector<double> objval; 00021 public: 00022 void clear() { 00023 for (int i = denseSols.size() - 1; i >= 0; --i) 00024 delete[] denseSols[i]; 00025 denseSols.clear(); 00026 objval.clear(); 00027 } 00028 bool addSol(const double* sol, double val) { 00029 const int size = solver->getNumCols(); 00030 for (int i = denseSols.size() - 1; i >= 0; --i) { 00031 if (fabs(objval[i] - val) > 1e-3) 00032 continue; 00033 if (std::equal(sol, sol + size, denseSols[i])) { 00034 delete[] sol; 00035 return false; 00036 } 00037 } 00038 denseSols.push_back(sol); 00039 objval.push_back(val); 00040 return true; 00041 } 00042 int numSolutions() { 00043 return denseSols.size(); 00044 } 00045 const double* solution(int i) { 00046 return denseSols[i]; 00047 } 00048 00049 UserData() : subProblem(0), solver(0), cutMode(0) {} 00050 ~UserData() { clear(); } 00051 }; 00052 00053 UserData* initializeUserData(CSP_subProblem* sp, OsiClpSolverInterface* solver, 00054 int baseRows); 00055 00056 #endif