[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 &parameters) {
   Y.addDiagonal(parameters.initialMatrixScaleDual);
 }
 
-SDPSolverTerminateReason finishWith(const SDPSolverTerminateReason reason) {
-  timers["Run solver"].stop();
-  //saveCheckpoint(checkpointFile);
-  return reason;
-}
-
 SDPSolverTerminateReason SDPSolver::run(const SDPSolverParameters &parameters,
                                         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 &parameters,
     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 &parameters,
     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>(&parameters.checkpointInterval)->default_value(3600),
      "Save checkpoints to checkpointFile every checkpointInterval seconds.")
+    ("saveFinalCheckpoint",
+     po::value<bool>(&parameters.saveFinalCheckpoint)->default_value(true),
+     "Save a final checkpoint after terminating (useful to turn off when debugging).")
     ("maxIterations",
      po::value<int>(&parameters.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