From d1dbc98911a224e2131d7e9db8596dad670430bc Mon Sep 17 00:00:00 2001 From: raller09 Date: Thu, 10 Oct 2024 14:45:15 +0200 Subject: [PATCH] added "allcsv" (like "all" but in csv format) as new printing mode (#622) --- src/CbcParameters.cpp | 1 + src/CbcParameters.hpp | 1 + src/CbcSolver.cpp | 109 +++++++++++++++++++++++++++++++++--------- 3 files changed, 89 insertions(+), 22 deletions(-) diff --git a/src/CbcParameters.cpp b/src/CbcParameters.cpp index f70cebd68..4171a31da 100644 --- a/src/CbcParameters.cpp +++ b/src/CbcParameters.cpp @@ -1213,6 +1213,7 @@ void CbcParameters::addCbcSolverKwdParams() { parameters_[CbcParam::INTPRINT]->appendKwd("boundsall", CbcParameters::PMBoundsAll); parameters_[CbcParam::INTPRINT]->appendKwd("fixint", CbcParameters::PMFixInt); parameters_[CbcParam::INTPRINT]->appendKwd("fixall", CbcParameters::PMFixAll); + parameters_[CbcParam::INTPRINT]->appendKwd("allcsv", CbcParameters::PMAllCsv); parameters_[CbcParam::NODESTRATEGY]->setup( "node!Strategy", diff --git a/src/CbcParameters.hpp b/src/CbcParameters.hpp index 64937b34f..aac4ff63e 100644 --- a/src/CbcParameters.hpp +++ b/src/CbcParameters.hpp @@ -474,6 +474,7 @@ class CBCLIB_EXPORT CbcParameters { PMBoundsAll, PMFixInt, PMFixAll, + PMAllCsv, PMEndMarker }; diff --git a/src/CbcSolver.cpp b/src/CbcSolver.cpp index e0a9583f0..b4d66c130 100644 --- a/src/CbcSolver.cpp +++ b/src/CbcSolver.cpp @@ -10776,6 +10776,15 @@ clp watson.mps -\nscaling off\nprimalsimplex"); #endif break; } + + bool printingAllAsCsv = false; + if (printMode == 15) { + // when allcsv then set printMode to all and + // change the output format to csv + printMode = 4; + printingAllAsCsv = true; + } + if (printMode < 5) { if (cbcParamCode == CbcParam::WRITENEXTSOL) { // save @@ -11139,6 +11148,7 @@ clp watson.mps -\nscaling off\nprimalsimplex"); } break; } + char printFormat[50]; sprintf(printFormat, " %s %s\n", CLP_QUOTE(CLP_OUTPUT_FORMAT), @@ -11146,11 +11156,19 @@ clp watson.mps -\nscaling off\nprimalsimplex"); if (printMode > 2 && printMode < 5) { for (iRow = 0; iRow < numberRows; iRow++) { int type = printMode - 3; + + std::string valueHasTolerance; + std::string rowName; + if (primalRowSolution[iRow] > rowUpper[iRow] + primalTolerance || primalRowSolution[iRow] < rowLower[iRow] - primalTolerance) { - fprintf(fp, "** "); + if (printingAllAsCsv) { + valueHasTolerance = "**"; + } else { + fprintf(fp, "** "); + } type = 2; } else if (fabs(primalRowSolution[iRow]) > 1.0e-8) { type = 1; @@ -11161,18 +11179,39 @@ clp watson.mps -\nscaling off\nprimalsimplex"); !maskMatches(maskStarts, masks, rowNames[iRow])) type = 0; if (type) { - fprintf(fp, "%7d ", iRow); + if (!printingAllAsCsv) { + fprintf(fp, "%7d ", iRow); + } + if (lengthName) { - const char *name = rowNames[iRow].c_str(); - size_t n = strlen(name); - size_t i; - for (i = 0; i < n; i++) - fprintf(fp, "%c", name[i]); - for (; i < lengthPrint; i++) - fprintf(fp, " "); + if (printingAllAsCsv) { + rowName = rowNames[iRow]; + } + else{ + const char *name = rowNames[iRow].c_str(); + size_t n = strlen(name); + size_t i; + + for (i = 0; i < n; i++) + fprintf(fp, "%c", name[i]); + for (; i < lengthPrint; i++) + fprintf(fp, " "); + } + } + + if (!printingAllAsCsv) { + fprintf(fp, printFormat, primalRowSolution[iRow], + dualRowSolution[iRow]); } - fprintf(fp, printFormat, primalRowSolution[iRow], - dualRowSolution[iRow]); + else{ + fprintf(fp, + "%s,%d,%s,%.15g,%.15g\n", + valueHasTolerance.c_str(), + iRow, + rowName.c_str(), + primalRowSolution[iRow], + dualRowSolution[iRow]); + } } } } @@ -11193,11 +11232,19 @@ clp watson.mps -\nscaling off\nprimalsimplex"); } for (iColumn = 0; iColumn < numberColumns; iColumn++) { int type = (printMode > 3) ? 1 : 0; + + std::string valueHasTolerance; + std::string colName; + if (primalColumnSolution[iColumn] > columnUpper[iColumn] + primalTolerance || primalColumnSolution[iColumn] < columnLower[iColumn] - primalTolerance) { - fprintf(fp, "** "); + if (printingAllAsCsv) { + valueHasTolerance = "**"; + } else { + fprintf(fp, "** "); + } type = 2; } else if (fabs(primalColumnSolution[iColumn]) > 1.0e-8) { type = 1; @@ -11214,18 +11261,35 @@ clp watson.mps -\nscaling off\nprimalsimplex"); type = 0; if (type) { if (printMode != 5) { - fprintf(fp, "%7d ", iColumn); + if (!printingAllAsCsv) { + fprintf(fp, "%7d ", iColumn); + } + if (lengthName) { - const char *name = columnNames[iColumn].c_str(); - size_t n = strlen(name); - size_t i; - for (i = 0; i < n; i++) - fprintf(fp, "%c", name[i]); - for (; i < lengthPrint; i++) - fprintf(fp, " "); + if (printingAllAsCsv) { + colName = columnNames[iColumn]; + } else { + const char *name = columnNames[iColumn].c_str(); + size_t n = strlen(name); + size_t i; + for (i = 0; i < n; i++) + fprintf(fp, "%c", name[i]); + for (; i < lengthPrint; i++) + fprintf(fp, " "); + } + } + if (!printingAllAsCsv) { + fprintf(fp, printFormat, primalColumnSolution[iColumn], + dualColumnSolution[iColumn]); + } else { + fprintf(fp, + "%s,%d,%s,%.15g,%.15g\n", + valueHasTolerance.c_str(), + iColumn, + colName.c_str(), + primalColumnSolution[iColumn], + dualColumnSolution[iColumn]); } - fprintf(fp, printFormat, primalColumnSolution[iColumn], - dualColumnSolution[iColumn]); } else { char temp[100]; if (lengthName) { @@ -11248,6 +11312,7 @@ clp watson.mps -\nscaling off\nprimalsimplex"); } } } + if (cbcParamCode == CbcParam::WRITENEXTSOL) { if (saveLpSolver) { clpSolver->swapModelPtr(saveLpSolver);