[sdpb] 94/233: Some cosmetic changes and cleanup
Tobias Hansen
thansen at moszumanska.debian.org
Thu Mar 9 04:06:24 UTC 2017
This is an automated email from the git hooks/post-receive script.
thansen pushed a commit to branch master
in repository sdpb.
commit 06b08d61d1666a7a04fb9a60d270fa86b0ef7347
Author: David Simmons-Duffin <dsd at minerva.sns.ias.edu>
Date: Sat Oct 18 23:59:33 2014 -0400
Some cosmetic changes and cleanup
---
src/SDPSolver.cpp | 79 ++++++-----------------------------------------------
src/SDPSolver.h | 8 ++----
src/SDPSolverIO.cpp | 13 +++++----
src/main.cpp | 18 ++++++++++--
4 files changed, 35 insertions(+), 83 deletions(-)
diff --git a/src/SDPSolver.cpp b/src/SDPSolver.cpp
index c50d625..64cb3af 100644
--- a/src/SDPSolver.cpp
+++ b/src/SDPSolver.cpp
@@ -32,12 +32,12 @@ SDPSolver::SDPSolver(const SDP &sdp):
SchurBlocks(sdp.schurBlockDims()),
SchurBlocksCholesky(SchurBlocks),
SchurUpdateLowRank(sdp.FreeVarMatrix),
+ schurStabilizeIndices(SchurBlocks.blocks.size()),
+ schurStabilizeLambdas(SchurBlocks.blocks.size()),
stabilizeBlocks(SchurBlocks.blocks.size()),
Q(sdp.FreeVarMatrix.cols, sdp.FreeVarMatrix.cols),
Qpivots(sdp.FreeVarMatrix.cols),
basicKernelCoords(Q.rows),
- schurStabilizeIndices(SchurBlocks.blocks.size()),
- schurStabilizeLambdas(SchurBlocks.blocks.size()),
StepMatrixWorkspace(X)
{
// initialize bilinearPairingsWorkspace, eigenvaluesWorkspace, QRWorkspace
@@ -483,37 +483,6 @@ Real stepLength(BlockDiagonalMatrix &XCholesky,
return -gamma/lambda;
}
-void SDPSolver::initializeSchurComplementSolverOld(const BlockDiagonalMatrix &BilinearPairingsXInv,
- const BlockDiagonalMatrix &BilinearPairingsY) {
-
- computeSchurBlocks(sdp, BilinearPairingsXInv, BilinearPairingsY, SchurBlocks);
- choleskyDecompositionStabilized(SchurBlocks, SchurBlocksCholesky, schurStabilizeIndices, schurStabilizeLambdas);
-
- // SchurUpdateLowRank = {{- 1, 0}, {E, G}}
- SchurUpdateLowRank.setCols(sdp.FreeVarMatrix.cols);
- SchurUpdateLowRank.copyFrom(sdp.FreeVarMatrix);
- for (unsigned int b = 0; b < SchurBlocks.blocks.size(); b++) {
- for (unsigned int i = 0; i < schurStabilizeIndices[b].size(); i++) {
- int fullIndex = SchurBlocks.blockStartIndices[b] + schurStabilizeIndices[b][i];
- SchurUpdateLowRank.addColumn();
- SchurUpdateLowRank.elt(fullIndex, SchurUpdateLowRank.cols - 1) = schurStabilizeLambdas[b][i];
- }
- }
-
- // SchurUpdateLowRank = SchurBlocksCholesky^{-1} {{- 1, 0}, {E, G}}
- blockMatrixLowerTriangularSolve(SchurBlocksCholesky, SchurUpdateLowRank);
-
- // Q = SchurUpdateLowRank^T SchurUpdateLowRank - {{0,0},{0,1}}
- Q.setRowsCols(SchurUpdateLowRank.cols, SchurUpdateLowRank.cols);
- matrixSquare(SchurUpdateLowRank, Q);
- int stabilizerStart = FreeVarMatrixReduced.cols;
- for (int i = stabilizerStart; i < Q.cols; i++)
- Q.elt(i,i) -= 1;
-
- Qpivots.resize(Q.rows);
- LUDecomposition(Q, Qpivots);
-}
-
void SDPSolver::initializeSchurComplementSolver(const BlockDiagonalMatrix &BilinearPairingsXInv,
const BlockDiagonalMatrix &BilinearPairingsY) {
@@ -608,24 +577,6 @@ void SDPSolver::initializeSchurComplementSolver(const BlockDiagonalMatrix &Bilin
LUDecomposition(Q, Qpivots);
}
-void SDPSolver::solveSchurComplementEquationOld(Vector &dx) {
- // dx = SchurBlocksCholesky^{-1} dx
- blockMatrixLowerTriangularSolve(SchurBlocksCholesky, dx);
-
- // k = -SchurUpdateLowRank^T dx
- basicKernelCoords.resize(SchurUpdateLowRank.cols);
- vectorScaleMatrixMultiplyTransposeAdd(-1, SchurUpdateLowRank, dx, 0, basicKernelCoords);
-
- // k = Q^{-1} k
- solveWithLUDecomposition(Q, Qpivots, basicKernelCoords);
-
- // dx = dx + SchurUpdateLowRank k
- vectorScaleMatrixMultiplyAdd(1, SchurUpdateLowRank, basicKernelCoords, 1, dx);
-
- // dx = SchurBlocksCholesky^{-T} dx
- blockMatrixLowerTriangularTransposeSolve(SchurBlocksCholesky, dx);
-}
-
void SDPSolver::solveSchurComplementEquation(Vector &dx) {
// dx = SchurBlocksCholesky^{-1} dx
blockMatrixLowerTriangularSolve(SchurBlocksCholesky, dx);
@@ -707,26 +658,14 @@ void SDPSolver::initialize(const SDPSolverParameters ¶meters) {
Y.addDiagonal(parameters.initialMatrixScaleDual);
}
-SDPSolverTerminateReason finishWith(const SDPSolverTerminateReason reason) {
- timers["Run solver"].stop();
- //saveCheckpoint(checkpointFile);
- return reason;
-}
-
SDPSolverTerminateReason SDPSolver::run(const SDPSolverParameters ¶meters,
const path checkpointFile) {
- printSolverHeader();
- timers["Run solver"].start();
- timers["Save checkpoint"].start();
- nanosecond_type const checkpointNanoseconds = parameters.checkpointInterval * 1000000000LL;
- nanosecond_type const maxRuntimeNanoseconds = parameters.maxRuntime * 1000000000LL;
-
for (int iteration = 1; iteration <= parameters.maxIterations; iteration++) {
- if (timers["Save checkpoint"].elapsed().wall >= checkpointNanoseconds)
+ if (timers["Save checkpoint"].elapsed().wall >= parameters.checkpointInterval * 1000000000LL)
saveCheckpoint(checkpointFile);
- if (timers["Run solver"].elapsed().wall >= maxRuntimeNanoseconds)
- return finishWith(MaxRuntimeExceeded);
+ if (timers["Run solver"].elapsed().wall >= parameters.maxRuntime * 1000000000LL)
+ return MaxRuntimeExceeded;
// Maintain the invariant x_B = g + E^T x_N
basicCompletion(dualObjectiveReduced, FreeVarMatrixReduced, basicIndices, nonBasicIndices, x);
@@ -754,15 +693,15 @@ SDPSolverTerminateReason SDPSolver::run(const SDPSolverParameters ¶meters,
const bool isOptimal = status.dualityGap() < parameters.dualityGapThreshold;
if (isPrimalFeasible && isDualFeasible && isOptimal)
- return finishWith(PrimalDualOptimal);
+ return PrimalDualOptimal;
else if (isDualFeasible && status.dualObjective > parameters.maxDualObjective)
- return finishWith(DualFeasibleMaxObjectiveExceeded);
+ return DualFeasibleMaxObjectiveExceeded;
initializeSchurComplementSolver(BilinearPairingsXInv, BilinearPairingsY);
Real mu = frobeniusProductSymmetric(X, Y)/X.dim;
if (mu > parameters.maxComplementarity)
- return finishWith(MaxComplementarityExceeded);
+ return MaxComplementarityExceeded;
// Mehrotra predictor solution for (dx, dX, dY)
Real betaPredictor = predictorCenteringParameter(parameters, isPrimalFeasible && isDualFeasible);
@@ -794,5 +733,5 @@ SDPSolverTerminateReason SDPSolver::run(const SDPSolverParameters ¶meters,
Y += dY;
}
- return finishWith(MaxIterationsExceeded);
+ return MaxIterationsExceeded;
}
diff --git a/src/SDPSolver.h b/src/SDPSolver.h
index 46ec222..bf1bd7a 100644
--- a/src/SDPSolver.h
+++ b/src/SDPSolver.h
@@ -21,6 +21,7 @@ public:
int maxIterations;
int maxRuntime;
int checkpointInterval;
+ bool saveFinalCheckpoint;
int precision;
int maxThreads;
Real dualityGapThreshold;
@@ -114,6 +115,8 @@ public:
BlockDiagonalMatrix SchurBlocksCholesky;
Matrix SchurUpdateLowRank;
+ vector<vector<int> > schurStabilizeIndices;
+ vector<vector<Real> > schurStabilizeLambdas;
vector<int> stabilizeBlockIndices;
vector<int> stabilizeBlockUpdateRow;
vector<int> stabilizeBlockUpdateColumn;
@@ -122,8 +125,6 @@ public:
Matrix Q;
vector<Integer> Qpivots;
Vector basicKernelCoords;
- vector<vector<int> > schurStabilizeIndices;
- vector<vector<Real> > schurStabilizeLambdas;
// additional workspace variables
BlockDiagonalMatrix StepMatrixWorkspace;
@@ -137,9 +138,6 @@ public:
void initializeSchurComplementSolver(const BlockDiagonalMatrix &BilinearPairingsXInv,
const BlockDiagonalMatrix &BilinearPairingsY);
void solveSchurComplementEquation(Vector &dx);
- void initializeSchurComplementSolverOld(const BlockDiagonalMatrix &BilinearPairingsXInv,
- const BlockDiagonalMatrix &BilinearPairingsY);
- void solveSchurComplementEquationOld(Vector &dx);
void computeSearchDirection(const Real &beta, const Real &mu, const bool correctorPhase);
Vector freeVariableSolution();
void saveCheckpoint(const path &checkpointFile);
diff --git a/src/SDPSolverIO.cpp b/src/SDPSolverIO.cpp
index 96f96ba..43bd2ab 100644
--- a/src/SDPSolverIO.cpp
+++ b/src/SDPSolverIO.cpp
@@ -50,6 +50,7 @@ ostream& operator<<(ostream& os, const SDPSolverParameters& p) {
os << "maxIterations = " << p.maxIterations << endl;
os << "maxRuntime = " << p.maxRuntime << endl;
os << "checkpointInterval = " << p.checkpointInterval << endl;
+ os << "saveFinalCheckpoint = " << p.saveFinalCheckpoint << endl;
os << "precision(actual) = " << p.precision << "(" << mpf_get_default_prec() << ")" << endl;
os << "maxThreads = " << p.maxThreads << endl;
os << "dualityGapThreshold = " << p.dualityGapThreshold << endl;
@@ -68,19 +69,19 @@ ostream& operator<<(ostream& os, const SDPSolverParameters& p) {
ostream &operator<<(ostream& os, const SDPSolverTerminateReason& r) {
switch(r) {
case PrimalDualOptimal:
- os << "found primal-dual optimal solution.";
+ os << "found primal-dual optimal solution";
break;
case MaxIterationsExceeded:
- os << "maxIterations exceeded.";
+ os << "maxIterations exceeded";
break;
case MaxRuntimeExceeded:
- os << "maxRuntime exceeded.";
+ os << "maxRuntime exceeded";
break;
case DualFeasibleMaxObjectiveExceeded:
- os << "found dual feasible solution with dualObjective exceeding maxDualObjective.";
+ os << "found dual feasible solution with dualObjective exceeding maxDualObjective";
break;
case MaxComplementarityExceeded:
- os << "maxComplementarity exceeded.";
+ os << "maxComplementarity exceeded";
break;
}
return os;
@@ -121,7 +122,7 @@ void SDPSolver::loadCheckpoint(const path &checkpointFile) {
void SDPSolver::saveSolution(const SDPSolverTerminateReason terminateReason, const path &outFile) {
boost::filesystem::ofstream ofs(outFile);
- cout << "Saving solution to: " << outFile << endl;
+ cout << "Saving solution to : " << outFile << endl;
ofs.precision(int(status.primalObjective.get_prec() * 0.30102999566398114 + 5));
ofs << "terminateReason = \"" << terminateReason << "\";\n";
ofs << "primalObjective = " << status.primalObjective << ";\n";
diff --git a/src/main.cpp b/src/main.cpp
index 25f4cd7..15eef50 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1,4 +1,5 @@
#include <iostream>
+#include <iomanip>
#include <fstream>
#include <ostream>
#include "omp.h"
@@ -15,6 +16,8 @@
using std::cout;
using std::cerr;
using std::endl;
+using std::setfill;
+using std::setw;
using boost::filesystem::path;
using boost::posix_time::second_clock;
@@ -51,11 +54,19 @@ int solveSDP(const path &sdpFile,
else
solver.initialize(parameters);
+ timers["Run solver"].start();
+ timers["Save checkpoint"].start();
+ printSolverHeader();
SDPSolverTerminateReason reason = solver.run(parameters, checkpointFile);
- cout << "Terminated: " << reason << endl;
- cout << endl;
+ timers["Run solver"].stop();
+ timers["Save checkpoint"].stop();
+
+ cout << "-----" << setfill('-') << setw(100) << std::left << reason << endl << endl;
cout << solver.status << endl;
cout << timers << endl;
+
+ if (parameters.saveFinalCheckpoint)
+ solver.saveCheckpoint(checkpointFile);
solver.saveSolution(reason, outFile);
return 0;
@@ -103,6 +114,9 @@ int main(int argc, char** argv) {
("checkpointInterval",
po::value<int>(¶meters.checkpointInterval)->default_value(3600),
"Save checkpoints to checkpointFile every checkpointInterval seconds.")
+ ("saveFinalCheckpoint",
+ po::value<bool>(¶meters.saveFinalCheckpoint)->default_value(true),
+ "Save a final checkpoint after terminating (useful to turn off when debugging).")
("maxIterations",
po::value<int>(¶meters.maxIterations)->default_value(500),
"Maximum number of iterations to run the solver.")
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/sdpb.git
More information about the debian-science-commits
mailing list