void LinearConstraint::augmentStructure(MIP &mip, Cost &cost, int varindex, map<Value, Cost> &delta) { for (map<Value, Cost>::iterator i = delta.begin(); i != delta.end();i++) { int var1 = mapvar[varindex][i->first]; mip.objCoeff(var1, mip.objCoeff(var1)-i->second); // update unary cost if (mip.sol(var1) == 1){ // using this value? cost -= i->second; } } }
void LinearConstraint::checkRemoved(MIP &mip, Cost &cost, vector<int> &rmv) { pair<Cost, bool> result; vector<int> cDomain, cDomain2; //bool deleted = false; bool flag = false; for (int i=0;i<arity_;i++) { cDomain.clear(); getDomainFromMIP(mip, i, cDomain); // getDomain sort(cDomain.begin(), cDomain.end()); EnumeratedVariable* y = (EnumeratedVariable*)getVar(i); for (EnumeratedVariable::iterator v = y->begin(); v != y->end();++v) { vector<int>::iterator it = find(cDomain.begin(), cDomain.end(), *v); if (it == cDomain.end()) { cout << "non exist a value ?" << endl; for (vector<int>::iterator v=cDomain.begin();v != cDomain.end();v++) { cout << *v << " "; } cout << endl; for (EnumeratedVariable::iterator v = y->begin(); v != y->end();++v) { cout << *v << " "; } cout << endl; exit(0); } cDomain.erase(it); //deleted = true; } if (!cDomain.empty()) { cDomain2.clear(); rmv.push_back(i); for (vector<int>::iterator v=cDomain.begin();v != cDomain.end();v++) { int var1 = mapvar[i][*v]; if (mip.sol(var1) == 1){ // checking if this value is being used flag = true; } mip.colUpperBound(var1, 0); // removeDomain } //deleted = true; } } if (flag){ cost = solveMIP(); // solve } }
virtual int sol(int var1) { if (solver) return solver->sol(var1); return 0; }
virtual int sol(int varindex, int value) { if (solver) solver->sol(varindex, value); return 0; }