Skip to content

Commit 83a4d5f

Browse files
author
Sami Nummelin
committed
Add outputPrecision parameter to configure precision of values.
1 parent a5f28a3 commit 83a4d5f

File tree

6 files changed

+47
-4
lines changed

6 files changed

+47
-4
lines changed

src/CbcParam.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ class CBCLIB_EXPORT CbcParam : public CoinParam {
120120
// String Parameters
121121
FIRSTSTRINGPARAM,
122122
PRINTMASK,
123+
OUTPUTPRECISION,
123124
LASTSTRINGPARAM,
124125

125126
// Cut Parameters

src/CbcParamUtils.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ int doExitParam(CoinParam &param);
3030
int doHelpParam(CoinParam &param);
3131
int doImportParam(CoinParam &param);
3232
int doPrintMaskParam(CoinParam &param);
33+
int doOutputPrecisionParam(CoinParam &param);
34+
3335
int doNothingParam(CoinParam &param);
3436
int doSolutionParam(CoinParam &param);
3537
int doUnimplementedParam(CoinParam &param);

src/CbcParameters.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ void CbcParameters::init(int strategy){
6565
lastSolnOut_ = "stdout";
6666
printMode_ = 0;
6767
printMask_ = "";
68+
outputPrecision_ = "%15.8g";
6869
noPrinting_ = false;
6970
printWelcome_ = true;
7071
useSignalHandler_ = false;
@@ -358,6 +359,7 @@ void CbcParameters::setDefaults(int strategy) {
358359
parameters_[CbcParam::MODELFILE]->setDefault(std::string("prob.mod"));
359360
parameters_[CbcParam::NEXTSOLFILE]->setDefault(std::string("next.sol"));
360361
parameters_[CbcParam::PRINTMASK]->setDefault("");
362+
parameters_[CbcParam::OUTPUTPRECISION]->setDefault("%15.8g");
361363
parameters_[CbcParam::PRIORITYFILE]->setDefault(std::string("priorities.txt"));
362364
parameters_[CbcParam::SOLUTIONFILE]->setDefault(std::string("opt.sol"));
363365
parameters_[CbcParam::SOLUTIONBINARYFILE]->setDefault(std::string("solution.file"));
@@ -1131,6 +1133,13 @@ void CbcParameters::addCbcSolverStrParams() {
11311133
"This is only active if model has names.");
11321134
parameters_[CbcParam::PRINTMASK]->setPushFunc(CbcParamUtils::doPrintMaskParam);
11331135

1136+
parameters_[CbcParam::OUTPUTPRECISION]->setup(
1137+
"output!precision", "Handle format precision with string print mask",
1138+
"Precision: %.nf → n digits after decimal; %.ng → n significant digits"
1139+
"Width: %mw → minimum field width, padded with spaces by default"
1140+
);
1141+
parameters_[CbcParam::OUTPUTPRECISION]->setPushFunc(CbcParamUtils::doOutputPrecisionParam);
1142+
11341143
}
11351144

11361145
//###########################################################################

src/CbcParameters.hpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1625,6 +1625,13 @@ class CBCLIB_EXPORT CbcParameters {
16251625
/*! \brief Set print mask */
16261626
inline void setPrintMask(std::string mask) { printMask_ = mask; }
16271627

1628+
/*! \brief Get output precision */
1629+
inline std::string getOutputPrecision() { return (outputPrecision_);
1630+
}
1631+
1632+
/*! \brief Set output precision */
1633+
inline void setOutputPrecision(std::string outputPrecision) { outputPrecision_ = outputPrecision; }
1634+
16281635
/*! \brief Get node search strategy */
16291636
inline CbcParameters::NodeStrategy getNodeStrategy() { return (nodeStrategy_);
16301637
}
@@ -2069,6 +2076,8 @@ class CBCLIB_EXPORT CbcParameters {
20692076
*/
20702077
std::string printMask_;
20712078

2079+
std::string outputPrecision_;
2080+
20722081
/*! \brief Disable printing altogether */
20732082
bool noPrinting_;
20742083

src/CbcSolution.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -576,5 +576,18 @@ int CbcParamUtils::doPrintMaskParam(CoinParam &param)
576576
return (0);
577577
}
578578

579+
int CbcParamUtils::doOutputPrecisionParam(CoinParam &param)
580+
{
581+
CbcParam &cbcParam = dynamic_cast<CbcParam &>(param);
582+
CbcParameters *parameters = cbcParam.parameters();
583+
assert(parameters != 0);
584+
585+
std::string outputPrecision = cbcParam.strVal();
586+
587+
parameters->setOutputPrecision(outputPrecision);
588+
589+
return (0);
590+
}
591+
579592
/* vi: softtabstop=2 shiftwidth=2 expandtab tabstop=2
580593
*/

src/CbcSolver.cpp

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ void printGeneralWarning(CbcModel &model, std::string message, int type)
181181
#endif
182182

183183
#ifndef CLP_OUTPUT_FORMAT
184-
#define CLP_OUTPUT_FORMAT % 15.8g
184+
char CLP_OUTPUT_FORMAT[32] = "%15.8g";
185185
#define CLP_INTEGER_OUTPUT_FORMAT % 15ld
186186
#endif
187187

@@ -10292,7 +10292,16 @@ int CbcMain1(std::deque<std::string> inputQueue, CbcModel &model,
1029210292
continue;
1029310293
}
1029410294
break;
10295-
10295+
10296+
case CbcParam::OUTPUTPRECISION: {
10297+
std::string parameter;
10298+
cbcParam->readValue(inputQueue, parameter, &message);
10299+
//printf("Handling CbcParam::OUTPUTPRECISION %s/%s\n", field.c_str(), parameter.c_str());
10300+
if (!parameter.empty()) {
10301+
std::strncpy(CLP_OUTPUT_FORMAT, parameter.c_str(), sizeof(CLP_OUTPUT_FORMAT) - 1);
10302+
CLP_OUTPUT_FORMAT[sizeof(CLP_OUTPUT_FORMAT) - 1] = '\0';
10303+
}
10304+
} break;
1029610305
case CbcParam::WRITEMODEL:{
1029710306
cbcParam->readValue(inputQueue, fileName, &message);
1029810307
CoinParamUtils::processFile(fileName,
@@ -11165,8 +11174,8 @@ clp watson.mps -\nscaling off\nprimalsimplex");
1116511174

1116611175
char printFormat[50];
1116711176
sprintf(printFormat, " %s %s\n",
11168-
CLP_QUOTE(CLP_OUTPUT_FORMAT),
11169-
CLP_QUOTE(CLP_OUTPUT_FORMAT));
11177+
CLP_OUTPUT_FORMAT,
11178+
CLP_OUTPUT_FORMAT);
1117011179
char printIntFormat[50];
1117111180
sprintf(printIntFormat, " %s %s\n",
1117211181
CLP_QUOTE(CLP_INTEGER_OUTPUT_FORMAT),

0 commit comments

Comments
 (0)