Skip to content

Commit c9a14f0

Browse files
committed
add precisionoutput parameter
1 parent a5f28a3 commit c9a14f0

File tree

6 files changed

+53
-11
lines changed

6 files changed

+53
-11
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: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ int doExitParam(CoinParam &param);
3030
int doHelpParam(CoinParam &param);
3131
int doImportParam(CoinParam &param);
3232
int doPrintMaskParam(CoinParam &param);
33+
int doOutputPrecisionParam(CoinParam &param);
3334
int doNothingParam(CoinParam &param);
3435
int doSolutionParam(CoinParam &param);
3536
int doUnimplementedParam(CoinParam &param);

src/CbcParameters.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,11 @@ void CbcParameters::init(int strategy){
6565
lastSolnOut_ = "stdout";
6666
printMode_ = 0;
6767
printMask_ = "";
68+
#ifndef CLP_OUTPUT_FORMAT
69+
outputPrecision_ = "%15.8g";
70+
#else
71+
outputPrecision_ = "CLP_OUTPUT_FORMAT";
72+
#endif
6873
noPrinting_ = false;
6974
printWelcome_ = true;
7075
useSignalHandler_ = false;
@@ -358,6 +363,7 @@ void CbcParameters::setDefaults(int strategy) {
358363
parameters_[CbcParam::MODELFILE]->setDefault(std::string("prob.mod"));
359364
parameters_[CbcParam::NEXTSOLFILE]->setDefault(std::string("next.sol"));
360365
parameters_[CbcParam::PRINTMASK]->setDefault("");
366+
parameters_[CbcParam::OUTPUTPRECISION]->setDefault("%15.8g");
361367
parameters_[CbcParam::PRIORITYFILE]->setDefault(std::string("priorities.txt"));
362368
parameters_[CbcParam::SOLUTIONFILE]->setDefault(std::string("opt.sol"));
363369
parameters_[CbcParam::SOLUTIONBINARYFILE]->setDefault(std::string("solution.file"));
@@ -1131,8 +1137,14 @@ void CbcParameters::addCbcSolverStrParams() {
11311137
"This is only active if model has names.");
11321138
parameters_[CbcParam::PRINTMASK]->setPushFunc(CbcParamUtils::doPrintMaskParam);
11331139

1140+
parameters_[CbcParam::OUTPUTPRECISION]->setup(
1141+
"precision!Output", "Handle format precision with string print mask",
1142+
"Precision: %.nf → n digits after decimal; %.ng → n significant digits"
1143+
"Width: %mw → minimum field width, padded with spaces by default."
1144+
"Remember the f or g at end as %18.5 by itself gives garbage".
1145+
);
1146+
parameters_[CbcParam::OUTPUTPRECISION]->setPushFunc(CbcParamUtils::doOutputPrecisionParam);
11341147
}
1135-
11361148
//###########################################################################
11371149
//###########################################################################
11381150

src/CbcParameters.hpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1622,6 +1622,13 @@ class CBCLIB_EXPORT CbcParameters {
16221622
inline std::string getPrintMask() { return (printMask_);
16231623
}
16241624

1625+
/*! \brief Get output precision */
1626+
inline std::string getOutputPrecision() { return (outputPrecision_);
1627+
}
1628+
1629+
/*! \brief Set output precision */
1630+
inline void setOutputPrecision(std::string outputPrecision) { outputPrecision_ = outputPrecision; }
1631+
16251632
/*! \brief Set print mask */
16261633
inline void setPrintMask(std::string mask) { printMask_ = mask; }
16271634

@@ -2068,7 +2075,10 @@ class CBCLIB_EXPORT CbcParameters {
20682075
060920.
20692076
*/
20702077
std::string printMask_;
2071-
2078+
2079+
/*! \brief Printing precision */
2080+
std::string outputPrecision_;
2081+
20722082
/*! \brief Disable printing altogether */
20732083
bool noPrinting_;
20742084

src/CbcSolution.cpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -575,6 +575,15 @@ int CbcParamUtils::doPrintMaskParam(CoinParam &param)
575575

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

src/CbcSolver.cpp

Lines changed: 15 additions & 6 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,8 +10292,17 @@ int CbcMain1(std::deque<std::string> inputQueue, CbcModel &model,
1029210292
continue;
1029310293
}
1029410294
break;
10295-
10296-
case CbcParam::WRITEMODEL:{
10295+
case CbcParam::OUTPUTPRECISION:
10296+
if ((status = cbcParam->readValue(inputQueue, field, &message))){
10297+
printGeneralMessage(model_, message);
10298+
continue;
10299+
}
10300+
if (cbcParam->setVal(field, &message)){
10301+
printGeneralMessage(model_, message);
10302+
continue;
10303+
}
10304+
break;
10305+
case CbcParam::WRITEMODEL:{
1029710306
cbcParam->readValue(inputQueue, fileName, &message);
1029810307
CoinParamUtils::processFile(fileName,
1029910308
parameters[CbcParam::DIRECTORY]->dirName());
@@ -11165,12 +11174,12 @@ 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+
parameters[CbcParam::OUTPUTPRECISION]->strVal().c_str(),
11178+
parameters[CbcParam::OUTPUTPRECISION]->strVal().c_str());
1117011179
char printIntFormat[50];
1117111180
sprintf(printIntFormat, " %s %s\n",
1117211181
CLP_QUOTE(CLP_INTEGER_OUTPUT_FORMAT),
11173-
CLP_QUOTE(CLP_OUTPUT_FORMAT));
11182+
parameters[CbcParam::OUTPUTPRECISION]->strVal().c_str());
1117411183
if (printMode > 2 && printMode < 5) {
1117511184
for (iRow = 0; iRow < numberRows; iRow++) {
1117611185
int type = printMode - 3;

0 commit comments

Comments
 (0)