[sdpb] 93/233: Removed timing information, made a few small fixes
Tobias Hansen
thansen at moszumanska.debian.org
Thu Mar 9 04:06:23 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 fd8315bbde51d6586d8b3f2f3d87dea4c522fd19
Author: David Simmons-Duffin <dsd at minerva.sns.ias.edu>
Date: Sat Oct 18 22:19:35 2014 -0400
Removed timing information, made a few small fixes
---
src/SDPSolver.cpp | 98 ++++++++++------------------------------------------
src/SDPSolverIO.cpp | 1 +
src/mpack/Rgetrf.cpp | 13 -------
3 files changed, 19 insertions(+), 93 deletions(-)
diff --git a/src/SDPSolver.cpp b/src/SDPSolver.cpp
index a2c8524..c50d625 100644
--- a/src/SDPSolver.cpp
+++ b/src/SDPSolver.cpp
@@ -486,14 +486,9 @@ Real stepLength(BlockDiagonalMatrix &XCholesky,
void SDPSolver::initializeSchurComplementSolverOld(const BlockDiagonalMatrix &BilinearPairingsXInv,
const BlockDiagonalMatrix &BilinearPairingsY) {
- timers["computeSchurBlocks "].resume();
computeSchurBlocks(sdp, BilinearPairingsXInv, BilinearPairingsY, SchurBlocks);
- timers["computeSchurBlocks "].stop();
- timers["choleskyDecomposeSchurBlocks"].resume();
choleskyDecompositionStabilized(SchurBlocks, SchurBlocksCholesky, schurStabilizeIndices, schurStabilizeLambdas);
- timers["choleskyDecomposeSchurBlocks"].stop();
- timers["prepare U "].resume();
// SchurUpdateLowRank = {{- 1, 0}, {E, G}}
SchurUpdateLowRank.setCols(sdp.FreeVarMatrix.cols);
SchurUpdateLowRank.copyFrom(sdp.FreeVarMatrix);
@@ -506,46 +501,28 @@ void SDPSolver::initializeSchurComplementSolverOld(const BlockDiagonalMatrix &Bi
}
// SchurUpdateLowRank = SchurBlocksCholesky^{-1} {{- 1, 0}, {E, G}}
- timers["prepare U: schurblocksolve "].resume();
blockMatrixLowerTriangularSolve(SchurBlocksCholesky, SchurUpdateLowRank);
- timers["prepare U: schurblocksolve "].stop();
- timers["prepare U "].stop();
- timers["prepare Q "].resume();
- timers["prepare Q: setRowsCols "].resume();
// Q = SchurUpdateLowRank^T SchurUpdateLowRank - {{0,0},{0,1}}
Q.setRowsCols(SchurUpdateLowRank.cols, SchurUpdateLowRank.cols);
- timers["prepare Q: setRowsCols "].stop();
- timers["prepare Q: matrixSquare "].resume();
matrixSquare(SchurUpdateLowRank, Q);
- timers["prepare Q: matrixSquare "].stop();
int stabilizerStart = FreeVarMatrixReduced.cols;
for (int i = stabilizerStart; i < Q.cols; i++)
Q.elt(i,i) -= 1;
- timers["prepare Q "].stop();
- timers["LU decompose Q "].resume();
Qpivots.resize(Q.rows);
LUDecomposition(Q, Qpivots);
- timers["LU decompose Q "].stop();
}
void SDPSolver::initializeSchurComplementSolver(const BlockDiagonalMatrix &BilinearPairingsXInv,
const BlockDiagonalMatrix &BilinearPairingsY) {
- timers["computeSchurBlocks "].resume();
computeSchurBlocks(sdp, BilinearPairingsXInv, BilinearPairingsY, SchurBlocks);
- timers["computeSchurBlocks "].stop();
- timers["choleskyDecomposeSchurBlocks"].resume();
choleskyDecompositionStabilized(SchurBlocks, SchurBlocksCholesky, schurStabilizeIndices, schurStabilizeLambdas);
- timers["choleskyDecomposeSchurBlocks"].stop();
- timers["prepare U "].resume();
// SchurUpdateLowRank = {{- 1, 0}, {E, G}}
- // Can probably remove this line eventually
- SchurUpdateLowRank.setCols(sdp.FreeVarMatrix.cols);
- SchurUpdateLowRank.copyFrom(sdp.FreeVarMatrix);
+ SchurUpdateLowRank.copyFrom(sdp.FreeVarMatrix);
blockMatrixLowerTriangularSolve(SchurBlocksCholesky, SchurUpdateLowRank);
int updateColumns = SchurUpdateLowRank.cols;
@@ -585,9 +562,7 @@ void SDPSolver::initializeSchurComplementSolver(const BlockDiagonalMatrix &Bilin
&stabilizeBlocks[b].elt(0, 0),
stabilizeBlocks[b].rows);
}
- timers["prepare U "].stop();
- timers["prepare Q "].resume();
// Q = SchurUpdateLowRank^T SchurUpdateLowRank - {{0,0},{0,1}}
Q.setRowsCols(updateColumns, updateColumns);
Q.setZero();
@@ -628,12 +603,9 @@ void SDPSolver::initializeSchurComplementSolver(const BlockDiagonalMatrix &Bilin
for (int c = 0; c < SchurUpdateLowRank.cols; c++)
for (int r = SchurUpdateLowRank.cols; r < Q.rows; r++)
Q.elt(c,r) = Q.elt(r,c);
- timers["prepare Q "].stop();
- timers["LU decompose Q "].resume();
Qpivots.resize(Q.rows);
LUDecomposition(Q, Qpivots);
- timers["LU decompose Q "].stop();
}
void SDPSolver::solveSchurComplementEquationOld(Vector &dx) {
@@ -735,6 +707,12 @@ 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();
@@ -742,24 +720,13 @@ SDPSolverTerminateReason SDPSolver::run(const SDPSolverParameters ¶meters,
timers["Save checkpoint"].start();
nanosecond_type const checkpointNanoseconds = parameters.checkpointInterval * 1000000000LL;
nanosecond_type const maxRuntimeNanoseconds = parameters.maxRuntime * 1000000000LL;
- SDPSolverTerminateReason finished = MaxIterationsExceeded;
- for (int iteration = 1;; iteration++) {
+ for (int iteration = 1; iteration <= parameters.maxIterations; iteration++) {
- if (timers["Save checkpoint"].elapsed().wall >= checkpointNanoseconds) {
+ if (timers["Save checkpoint"].elapsed().wall >= checkpointNanoseconds)
saveCheckpoint(checkpointFile);
- timers["Save checkpoint"].start();
- }
- if (timers["Run solver"].elapsed().wall >= maxRuntimeNanoseconds) {
- finished = MaxRuntimeExceeded;
- break;
- }
- if (iteration > parameters.maxIterations) {
- finished = MaxIterationsExceeded;
- break;
- }
-
- timers["basic+choleskyDecomposition"].resume();
+ if (timers["Run solver"].elapsed().wall >= maxRuntimeNanoseconds)
+ return finishWith(MaxRuntimeExceeded);
// Maintain the invariant x_B = g + E^T x_N
basicCompletion(dualObjectiveReduced, FreeVarMatrixReduced, basicIndices, nonBasicIndices, x);
@@ -767,15 +734,9 @@ SDPSolverTerminateReason SDPSolver::run(const SDPSolverParameters ¶meters,
choleskyDecomposition(X, XCholesky);
choleskyDecomposition(Y, YCholesky);
- timers["basic+choleskyDecomposition"].stop();
- timers["compute bilinear pairings "].resume();
-
computeInvBilinearPairingsWithCholesky(XCholesky, sdp.bilinearBases, bilinearPairingsWorkspace, BilinearPairingsXInv);
computeBilinearPairings(Y, sdp.bilinearBases, bilinearPairingsWorkspace, BilinearPairingsY);
- timers["compute bilinear pairings "].stop();
- timers["compute residues "].resume();
-
// d_k = c_k - Tr(F_k Y)
computeDualResidues(sdp, Y, BilinearPairingsY, dualResidues);
nonBasicShift(FreeVarMatrixReduced, basicIndices, nonBasicIndices, dualResidues, dualResiduesReduced);
@@ -792,43 +753,25 @@ SDPSolverTerminateReason SDPSolver::run(const SDPSolverParameters ¶meters,
const bool isDualFeasible = status.dualError < parameters.dualErrorThreshold;
const bool isOptimal = status.dualityGap() < parameters.dualityGapThreshold;
- if (isPrimalFeasible && isDualFeasible && isOptimal) {
- finished = PrimalDualOptimal;
- break;
- } else if (isDualFeasible && status.dualObjective > parameters.maxDualObjective) {
- finished = DualFeasibleMaxObjectiveExceeded;
- break;
- }
-
- timers["compute residues "].stop();
- timers["initialize SchurComplement "].resume();
+ if (isPrimalFeasible && isDualFeasible && isOptimal)
+ return finishWith(PrimalDualOptimal);
+ else if (isDualFeasible && status.dualObjective > parameters.maxDualObjective)
+ return finishWith(DualFeasibleMaxObjectiveExceeded);
initializeSchurComplementSolver(BilinearPairingsXInv, BilinearPairingsY);
- timers["initialize SchurComplement "].stop();
-
Real mu = frobeniusProductSymmetric(X, Y)/X.dim;
- if (mu > parameters.maxComplementarity) {
- finished = MaxComplementarityExceeded;
- break;
- }
-
- timers["Mehrotra predictor solution"].resume();
+ if (mu > parameters.maxComplementarity)
+ return finishWith(MaxComplementarityExceeded);
// Mehrotra predictor solution for (dx, dX, dY)
Real betaPredictor = predictorCenteringParameter(parameters, isPrimalFeasible && isDualFeasible);
computeSearchDirection(betaPredictor, mu, false);
- timers["Mehrotra predictor solution"].stop();
- timers["Mehrotra corrector solution"].resume();
-
// Mehrotra corrector solution for (dx, dX, dY)
Real betaCorrector = correctorCenteringParameter(parameters, X, dX, Y, dY, mu, isPrimalFeasible && isDualFeasible);
computeSearchDirection(betaCorrector, mu, true);
- timers["Mehrotra corrector solution"].stop();
- timers["step length computation "].resume();
-
// Step length to preserve positive definiteness
Real primalStepLength = stepLength(XCholesky, dX, StepMatrixWorkspace,
eigenvaluesWorkspace, QRWorkspace, parameters);
@@ -840,8 +783,6 @@ SDPSolverTerminateReason SDPSolver::run(const SDPSolverParameters ¶meters,
dualStepLength = primalStepLength;
}
- timers["step length computation "].stop();
-
printSolverInfo(iteration, mu, status, primalStepLength, dualStepLength, betaCorrector);
// Update current point
@@ -853,8 +794,5 @@ SDPSolverTerminateReason SDPSolver::run(const SDPSolverParameters ¶meters,
Y += dY;
}
- timers["Run solver"].stop();
- //saveCheckpoint(checkpointFile);
- //timers["Save checkpoint"].start();
- return finished;
+ return finishWith(MaxIterationsExceeded);
}
diff --git a/src/SDPSolverIO.cpp b/src/SDPSolverIO.cpp
index b6b7097..96f96ba 100644
--- a/src/SDPSolverIO.cpp
+++ b/src/SDPSolverIO.cpp
@@ -109,6 +109,7 @@ void SDPSolver::saveCheckpoint(const path &checkpointFile) {
boost::archive::text_oarchive ar(ofs);
cout << "Saving checkpoint to : " << checkpointFile << endl;
boost::serialization::serializeSDPSolverState(ar, x, X, Y);
+ timers["Save checkpoint"].start();
}
void SDPSolver::loadCheckpoint(const path &checkpointFile) {
diff --git a/src/mpack/Rgetrf.cpp b/src/mpack/Rgetrf.cpp
index 7d8d0ee..6cf6257 100644
--- a/src/mpack/Rgetrf.cpp
+++ b/src/mpack/Rgetrf.cpp
@@ -67,7 +67,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <mblas.h>
#include <mlapack.h>
-#include "../Timers.h"
void Rgetrf(INTEGER m, INTEGER n, REAL * A, INTEGER lda, INTEGER * ipiv, INTEGER * info)
{
@@ -95,18 +94,14 @@ void Rgetrf(INTEGER m, INTEGER n, REAL * A, INTEGER lda, INTEGER * ipiv, INTEGER
nb = iMlaenv(1, "Rgetrf", " ", m, n, -1, -1);
if (nb <= 1 || nb >= min(m, n)) {
//Use unblocked code.
- timers["Rgetf2 unblocked"].resume();
Rgetf2(m, n, A, lda, ipiv, info);
- timers["Rgetf2 unblocked"].stop();
} else {
//Use blocked code.
for (j = 1; j <= min(m, n); j = j + nb) {
jb = min(min(m, n) - j + 1, nb);
//Factor diagonal and subdiagonal blocks and test for exact
//singularity.
- timers["Rgetf2 blocked"].resume();
Rgetf2(m - j + 1, jb, &A[(j - 1) + (j - 1) * lda], lda, &ipiv[j - 1], &iinfo);
- timers["Rgetf2 blocked"].stop();
//Adjust INFO and the pivot indices.
if (*info == 0 && iinfo > 0) {
*info = iinfo + j - 1;
@@ -115,24 +110,16 @@ void Rgetrf(INTEGER m, INTEGER n, REAL * A, INTEGER lda, INTEGER * ipiv, INTEGER
ipiv[i - 1] = j - 1 + ipiv[i - 1];
}
//Apply interchanges to columns 1:J-one
- timers["Rlaswp columns"].resume();
Rlaswp(j - 1, A, lda, j, j + jb - 1, ipiv, 1);
- timers["Rlaswp columns"].stop();
if (j + jb <= n) {
//Apply interchanges to columns J+JB:N.
- timers["Rlaswp columns2"].resume();
Rlaswp(n - j - jb + 1, &A[0 + (j + jb - 1) * lda], lda, j, j + jb - 1, ipiv, 1);
- timers["Rlaswp columns2"].stop();
//Compute block row of U.
- timers["Rtrsm"].resume();
Rtrsm("Left", "Lower", "No transpose", "Unit", jb, n - j - jb + 1, One, &A[(j - 1) + (j - 1) * lda], lda, &A[(j - 1) + (j + jb - 1) * lda], lda);
- timers["Rtrsm"].stop();
if (j + jb <= m) {
//Update trailing submatrix.
- timers["Rgemm"].resume();
RgemmParallel("No transpose", "No transpose", m - j - jb + 1,
n - j - jb + 1, jb, -One, &A[(j + jb - 1) + (j - 1) * lda], lda, &A[(j - 1) + (j + jb - 1) * lda], lda, One, &A[(j + jb - 1) + (j + jb - 1) * lda], lda);
- timers["Rgemm"].stop();
}
}
}
--
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