//===========================================================================// DecompConstraintSet * ATM_DecompApp::createModelRelax2(const int d){ UtilPrintFuncBegin(m_osLog, m_classTag, "createModelRelax2()", m_appParam.LogLevel, 2); int a, t, nRows, pairIndex, nRowsMax; double rhs, coefA, coefC; pair<int,int> adP; vector<int>::const_iterator vi; const int nSteps = m_appParam.NumSteps; const int nAtms = m_instance.getNAtms(); const vector<int> & pairsAD = m_instance.getPairsAD(); const double * a_ad = m_instance.get_a_ad(); //dense storage const double * b_ad = m_instance.get_b_ad(); //dense storage const double * c_ad = m_instance.get_c_ad(); //dense storage const double * d_ad = m_instance.get_d_ad(); //dense storage const double * e_ad = m_instance.get_e_ad(); //dense storage const double * w_ad = m_instance.get_w_ad(); //dense storage const double * B_d = m_instance.get_B_d(); const int nCols = numCoreCols(); if(m_appParam.UseTightModel) nRowsMax = 3*nAtms + 1 + getNAtmsSteps(); else nRowsMax = 2*nAtms + 1 + (3*getNAtmsSteps()); //--- //--- A'[d] for d in D (independent blocks) //--- for a in A //--- f+[a,d] - f-[a,d] = //--- a[a,d] sum{t in T} (t/n) x1[a,t] + //--- b[a,d] x2[a] + //--- c[a,d] sum{t in T} (t/n) z[a,t] + //--- d[a,d] x3[a] + //--- e[a,d] //--- f-[a,d] <= w[a,d] * v[a,d] //--- sum{a in A} (f+[a,d] - f-[a,d]) <= B[d] //--- for a in A, t in T: //--- z[a,t] <= x1[a,t], //--- z[a,t] <= x2[a], //--- z[a,t] >= x1[a,t] + x2[a] - 1. //--- DecompConstraintSet * model = new DecompConstraintSet(); CoinAssertHint(model, "Error: Out of Memory"); model->M = new CoinPackedMatrix(false, 0.0, 0.0); CoinAssertHint(model->M, "Error: Out of Memory"); model->M->setDimensions(0, nCols); model->reserve(nRowsMax, nCols); CoinPackedVector rowBudget; nRows = 0; pairIndex = 0; for(vi = pairsAD.begin(); vi != pairsAD.end(); vi++){ adP = m_instance.getIndexADInv(*vi); if(d != adP.second){ pairIndex++; continue; } a = adP.first; //--- //--- sum{a in A} (f+[a,d] - f-[a,d]) <= B[d] //--- rowBudget.insert(getColOffset_fp() + pairIndex, 1.0); rowBudget.insert(getColOffset_fm() + pairIndex, -1.0); //--- //--- f+[a,d] - f-[a,d] = //--- a[a,d] sum{t in T} (t/n) x1[a,t] + //--- b[a,d] x2[a] + //--- c[a,d] sum{t in T} (t/n) z[a,t] + //--- d[a,d] x3[a] + //--- e[a,d] //--- CoinPackedVector row; string rowName = "demand_def(a_" + m_instance.getAtmName(a) + ",d_" + m_instance.getDateName(d) + ")"; row.insert(colIndex_fp(pairIndex), 1.0); row.insert(colIndex_fm(pairIndex), -1.0); coefA = -a_ad[*vi] / nSteps; coefC = -c_ad[*vi] / nSteps; if(m_appParam.UseTightModel){ for(t = 0; t <= nSteps; t++){ row.insert(colIndex_x1(a,t), t * coefA); row.insert(colIndex_z (a,t), t * coefC); } } else{ for(t = 0; t < nSteps; t++){ row.insert(colIndex_x1(a,t), (t+1) * coefA); row.insert(colIndex_z (a,t), (t+1) * coefC); } } row.insert(colIndex_x2(a), -b_ad[*vi]); row.insert(colIndex_x3(a), -d_ad[*vi]); rhs = e_ad[*vi]; model->appendRow(row, rhs, rhs, rowName); nRows++; //--- //--- f-[a,d] <= w[a,d] * v[a,d] //--- CoinPackedVector rowLink; string rowNameLink = "linkv(a_" + m_instance.getAtmName(a) + ",d_" + m_instance.getDateName(d) + ")"; rowLink.insert(colIndex_fm(pairIndex), 1.0); rowLink.insert(colIndex_v (pairIndex), -w_ad[*vi]); model->appendRow(rowLink, -DecompInf, 0.0, rowNameLink); nRows++; pairIndex++; } string rowNameBudget = "budget(d_" + m_instance.getDateName(d) + ")"; model->appendRow(rowBudget, -DecompInf, B_d[d], rowNameBudget); nRows++; for(a = 0; a < nAtms; a++) nRows += createConZtoX(model, a); assert(nRows <= nRowsMax); //--- //--- create model columns //--- createModelColumns(model, -1, d); UtilPrintFuncEnd(m_osLog, m_classTag, "createModelRelax2()", m_appParam.LogLevel, 2); return model; }
//===========================================================================// DecompConstraintSet * ATM_DecompApp::createModelRelaxCount(){ UtilPrintFuncBegin(m_osLog, m_classTag, "createModelRelaxCount()", m_appParam.LogLevel, 2); int a, d, t, nRows, pairIndex, nRowsMax; double rhs, coefA, coefC; pair<int,int> adP; vector<int>::const_iterator vi; const int nSteps = m_appParam.NumSteps; const int nAtms = m_instance.getNAtms(); const int nDates = m_instance.getNDates(); const int nPairs = m_instance.getNPairs(); const int nAtmsSteps = getNAtmsSteps(); const vector<int> & pairsAD = m_instance.getPairsAD(); const double * a_ad = m_instance.get_a_ad(); //dense storage const double * b_ad = m_instance.get_b_ad(); //dense storage const double * c_ad = m_instance.get_c_ad(); //dense storage const double * d_ad = m_instance.get_d_ad(); //dense storage const double * e_ad = m_instance.get_e_ad(); //dense storage const double * w_ad = m_instance.get_w_ad(); //dense storage const double * B_d = m_instance.get_B_d(); const int nCols = numCoreCols(); if(m_appParam.UseTightModel) nRowsMax = nDates + 2*nAtms + nAtmsSteps + 2*nPairs; else nRowsMax = nDates + nAtms + 3*nAtmsSteps + 2*nPairs; //TODO: // try the nested idea - so master has ConZtoX and we price without that // but we solve with gap the harder oracle with those constraints //--- //--- A' (relax): //--- for d in D: //--- sum{a in A} (f+[a,d] - f-[a,d]) <= B[d] <---- makes it hard //OPT //--- for a in A: //--- sum{t in T} x1[a,t] <= 1 //OPT //--- for a in A, t in T: //--- z[a,t] <= x1[a,t], //--- z[a,t] <= x2[a], //--- z[a,t] >= x1[a,t] + x2[a] - 1. //--- for a in A, d in D: //--- f+[a,d] - f-[a,d] = //--- a[a,d] sum{t in T} (t/n) x1[a,t] + //--- b[a,d] x2[a] + //--- c[a,d] sum{t in T} (t/n) z[a,t] + //--- d[a,d] x3[a] + //--- e[a,d] //--- f-[a,d] <= w[a,d] * v[a,d] //--- DecompConstraintSet * model = new DecompConstraintSet(); CoinAssertHint(model, "Error: Out of Memory"); model->M = new CoinPackedMatrix(false, 0.0, 0.0); CoinAssertHint(model->M, "Error: Out of Memory"); model->M->setDimensions(0, nCols); model->reserve(nRowsMax, nCols); //--- //--- create nDates empty rowBudget packed vectors //--- vector<CoinPackedVector> rowBudget; for(d = 0; d < nDates; d++){ CoinPackedVector row; rowBudget.push_back(row); } nRows = 0; pairIndex = 0; for(vi = pairsAD.begin(); vi != pairsAD.end(); vi++){ adP = m_instance.getIndexADInv(*vi); a = adP.first; d = adP.second; //--- //--- sum{a in A} (f+[a,d] - f-[a,d]) <= B[d] //--- rowBudget[d].insert(getColOffset_fp() + pairIndex, 1.0); rowBudget[d].insert(getColOffset_fm() + pairIndex, -1.0); //--- //--- f+[a,d] - f-[a,d] = //--- a[a,d] sum{t in T} (t/n) x1[a,t] + //--- b[a,d] x2[a] + //--- c[a,d] sum{t in T} (t/n) z[a,t] + //--- d[a,d] x3[a] + //--- e[a,d] //--- CoinPackedVector row; string rowName = "demand_def(a_" + m_instance.getAtmName(a) + ",d_" + m_instance.getDateName(d) + ")"; row.insert(colIndex_fp(pairIndex), 1.0); row.insert(colIndex_fm(pairIndex), -1.0); coefA = -a_ad[*vi] / nSteps; coefC = -c_ad[*vi] / nSteps; if(m_appParam.UseTightModel){ for(t = 0; t <= nSteps; t++){ row.insert(colIndex_x1(a,t), t * coefA); row.insert(colIndex_z (a,t), t * coefC); } } else{ for(t = 0; t < nSteps; t++){ row.insert(colIndex_x1(a,t), (t+1) * coefA); row.insert(colIndex_z (a,t), (t+1) * coefC); } } row.insert(colIndex_x2(a), -b_ad[*vi]); row.insert(colIndex_x3(a), -d_ad[*vi]); rhs = e_ad[*vi]; model->appendRow(row, rhs, rhs, rowName); nRows++; //--- //--- f-[a,d] <= w[a,d] * v[a,d] //--- CoinPackedVector rowLink; string rowNameLink = "linkv(a_" + m_instance.getAtmName(a) + ",d_" + m_instance.getDateName(d) + ")"; rowLink.insert(colIndex_fm(pairIndex), 1.0); rowLink.insert(colIndex_v (pairIndex), -w_ad[*vi]); model->appendRow(rowLink, -DecompInf, 0.0, rowNameLink); nRows++; pairIndex++; } for(d = 0; d < nDates; d++){ string rowNameBudget = "budget(d_" + m_instance.getDateName(d) + ")"; model->appendRow(rowBudget[d], -DecompInf, B_d[d], rowNameBudget); nRows++; } //--- //--- for a in A: //--- sum{t in T} x1[a,t] <= 1 //--- for a in A, t in T: //--- z[a,t] <= x1[a,t], //--- z[a,t] <= x2[a], //--- z[a,t] >= x1[a,t] + x2[a] - 1. //--- //THINK: if you use this, shouldn't we postprocess z=x1*x2? // putting those constaints in master are unneccessary... // in fact, why not just do that in block version too... //for(a = 0; a < nAtms; a++){ //nRows += createConZtoX(model, a); //nRows += createConPickOne(model, a); //} assert(nRows <= nRowsMax); //--- //--- create model columns //--- createModelColumns(model); UtilPrintFuncEnd(m_osLog, m_classTag, "createModelRelaxCount()", m_appParam.LogLevel, 2); return model; }
//===========================================================================// DecompConstraintSet * ATM_DecompApp::createModelCore1(bool includeCount){ UtilPrintFuncBegin(m_osLog, m_classTag, "createModelCore1()", m_appParam.LogLevel, 2); int a, d, pairIndex; pair<int,int> adP; vector<int>::const_iterator vi; const int nAtms = m_instance.getNAtms(); const int nDates = m_instance.getNDates(); const vector<int> & pairsAD = m_instance.getPairsAD(); const double * B_d = m_instance.get_B_d(); const int nCols = numCoreCols(); int nRows = nDates; if(includeCount) nRows += nAtms; DecompConstraintSet * model = new DecompConstraintSet(); CoinAssertHint(model, "Error: Out of Memory"); model->M = new CoinPackedMatrix(false, 0.0, 0.0); CoinAssertHint(model->M, "Error: Out of Memory"); model->M->setDimensions(0, nCols); model->reserve(nRows, nCols); //--- //--- for d in D: //--- sum{a in A} (f+[a,d] - f-[a,d]) <= B[d] //--- CoinPackedVector * rowsD = new CoinPackedVector[nDates]; pairIndex = 0; for(vi = pairsAD.begin(); vi != pairsAD.end(); vi++){ adP = m_instance.getIndexADInv(*vi); a = adP.first; d = adP.second; rowsD[d].insert(getColOffset_fp() + pairIndex, 1.0); rowsD[d].insert(getColOffset_fm() + pairIndex, -1.0); pairIndex++; } for(d = 0; d < nDates; d++){ string rowName = "budget(d_" + m_instance.getDateName(d) + ")"; model->appendRow(rowsD[d], -DecompInf, B_d[d], rowName); } UTIL_DELARR(rowsD); if(includeCount){ //--- for a in A: //--- sum{d in D} v[a,d] <= K[a] //--- for(a = 0; a < nAtms; a++){ createConCount(model, a); } } //--- //--- create model columns //--- createModelColumns(model); UtilPrintFuncEnd(m_osLog, m_classTag, "createModelCore1()", m_appParam.LogLevel, 2); return model; }