[mlpack-git] master: more refactoring (fe56151)

gitdub at big.cc.gt.atl.ga.us gitdub at big.cc.gt.atl.ga.us
Thu Mar 5 22:13:55 EST 2015


Repository : https://github.com/mlpack/mlpack

On branch  : master
Link       : https://github.com/mlpack/mlpack/compare/904762495c039e345beba14c1142fd719b3bd50e...f94823c800ad6f7266995c700b1b630d5ffdcf40

>---------------------------------------------------------------

commit fe56151f37767f4119ba0c98f193f4e5942f5536
Author: Stephen Tu <stephent at berkeley.edu>
Date:   Wed Jan 21 11:26:02 2015 -0800

    more refactoring


>---------------------------------------------------------------

fe56151f37767f4119ba0c98f193f4e5942f5536
 src/mlpack/core/optimizers/sdp/primal_dual.cpp | 64 ++++++++++----------------
 1 file changed, 24 insertions(+), 40 deletions(-)

diff --git a/src/mlpack/core/optimizers/sdp/primal_dual.cpp b/src/mlpack/core/optimizers/sdp/primal_dual.cpp
index 3a0e3be..e81911d 100644
--- a/src/mlpack/core/optimizers/sdp/primal_dual.cpp
+++ b/src/mlpack/core/optimizers/sdp/primal_dual.cpp
@@ -104,6 +104,16 @@ AlphaHat(const arma::mat& A, const arma::mat& dA)
   return 1. / alphahatinv;
 }
 
+static inline double
+Alpha(const arma::mat& A, const arma::mat& dA, double tau)
+{
+  double alphahat = AlphaHat(A, dA);
+  if (alphahat < 0.)
+    // dA is PSD already
+    alphahat = 1.;
+  return std::min(1., tau * alphahat);
+}
+
 /**
  * Solve the following Lyapunov equation (for X)
  *
@@ -211,7 +221,7 @@ PrimalDualSolver::Optimize(arma::mat& X,
   ydense = ydense0;
   Z = Z0;
 
-  arma::vec sx, sz, /*dy,*/ dysparse, dydense, dsx, dsz;
+  arma::vec sx, sz, dysparse, dydense, dsx, dsz;
   arma::mat dX, dZ;
 
   math::Svec(X, sx);
@@ -219,7 +229,7 @@ PrimalDualSolver::Optimize(arma::mat& X,
 
   arma::vec rp, rd, rc, gk;
 
-  arma::mat Rc, /*E,*/ F, Einv_F_AsparseT, Einv_F_AdenseT, Gk,
+  arma::mat Rc, F, Einv_F_AsparseT, Einv_F_AdenseT, Gk,
             M, DualCheck;
 
   rp.set_size(sdp.NumConstraints());
@@ -228,7 +238,7 @@ PrimalDualSolver::Optimize(arma::mat& X,
   Einv_F_AdenseT.set_size(n2bar, sdp.NumDenseConstraints());
   M.set_size(sdp.NumConstraints(), sdp.NumConstraints());
 
-  double primal_obj = 0., alpha, beta, sigma, mu, alphahatX, alphahatZ;
+  double primal_obj = 0., alpha, beta;
   for (size_t iteration = 0; iteration < maxIterations; iteration++)
   {
     if (sdp.NumSparseConstraints())
@@ -244,7 +254,6 @@ PrimalDualSolver::Optimize(arma::mat& X,
     if (sdp.HasDenseObjective())
       rd += scdense;
 
-    //math::SymKronId(Z, E);
     math::SymKronId(X, F);
 
     for (size_t i = 0; i < sdp.NumSparseConstraints(); i++)
@@ -296,54 +305,29 @@ PrimalDualSolver::Optimize(arma::mat& X,
 
     const double sxdotsz = arma::dot(sx, sz);
 
+    // TODO(stephentu): computing these alphahats should take advantage of
+    // the cholesky decomposition of X and Z which we should have available
+    // when we use more efficient methods above.
+
     Rc = -0.5*(X*Z + Z*X);
     math::Svec(Rc, rc);
-
     SolveKKTSystem(Asparse, Adense, Z, M, F, rp, rd, rc, dsx, dysparse, dydense, dsz);
-
     math::Smat(dsx, dX);
     math::Smat(dsz, dZ);
+    alpha = Alpha(X, dX, tau);
+    beta = Alpha(Z, dZ, tau);
 
-    // TODO(stephentu): computing these alphahats should take advantage of
-    // the cholesky decomposition of X and Z which we should have available
-    // when we use more efficient methods above.
-
-    alphahatX = AlphaHat(X, dX);
-    if (alphahatX < 0.)
-      // dX is PSD
-      alphahatX = 1.;
-
-    alphahatZ = AlphaHat(Z, dZ);
-    if (alphahatZ < 0.)
-      // dZ is PSD
-      alphahatZ = 1.;
-
-    alpha = std::min(1., tau * alphahatX);
-    beta = std::min(1., tau * alphahatZ);
-
-    sigma = std::pow(arma::dot(X + alpha * dX, Z + beta * dZ) / sxdotsz, 3);
-    mu = sigma * sxdotsz / n;
+    const double sigma =
+      std::pow(arma::dot(X + alpha * dX, Z + beta * dZ) / sxdotsz, 3);
+    const double mu = sigma * sxdotsz / n;
 
     Rc = mu*arma::eye<arma::mat>(n, n) - 0.5*(X*Z + Z*X + dX*dZ + dZ*dX);
     math::Svec(Rc, rc);
-
     SolveKKTSystem(Asparse, Adense, Z, M, F, rp, rd, rc, dsx, dysparse, dydense, dsz);
-
     math::Smat(dsx, dX);
     math::Smat(dsz, dZ);
-
-    alphahatX = AlphaHat(X, dX);
-    if (alphahatX < 0.)
-      // dX is PSD
-      alphahatX = 1.;
-
-    alphahatZ = AlphaHat(Z, dZ);
-    if (alphahatZ < 0.)
-      // dZ is PSD
-      alphahatZ = 1.;
-
-    alpha = std::min(1., tau * alphahatX);
-    beta = std::min(1., tau * alphahatZ);
+    alpha = Alpha(X, dX, tau);
+    beta = Alpha(Z, dZ, tau);
 
     X += alpha * dX;
     math::Svec(X, sx);



More information about the mlpack-git mailing list