[mlpack-git] master: primal dual method now takes adv of sparse constraints (ee91089)

gitdub at big.cc.gt.atl.ga.us gitdub at big.cc.gt.atl.ga.us
Mon Feb 2 15:16:28 EST 2015


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

On branch  : master
Link       : https://github.com/mlpack/mlpack/compare/bb6e5c56aab07e6449d86021246b52a9e323f3a0...bd6cb33f8d8270b02a84e81e38727679bb6c319a

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

commit ee91089deea53654d12bbc574d85148e0c65cb9b
Author: Stephen Tu <stephent at berkeley.edu>
Date:   Wed Jan 21 12:30:11 2015 -0800

    primal dual method now takes adv of sparse constraints


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

ee91089deea53654d12bbc574d85148e0c65cb9b
 src/mlpack/core/optimizers/sdp/primal_dual.cpp | 30 ++++++++++----------------
 1 file changed, 11 insertions(+), 19 deletions(-)

diff --git a/src/mlpack/core/optimizers/sdp/primal_dual.cpp b/src/mlpack/core/optimizers/sdp/primal_dual.cpp
index e81911d..36d32ca 100644
--- a/src/mlpack/core/optimizers/sdp/primal_dual.cpp
+++ b/src/mlpack/core/optimizers/sdp/primal_dual.cpp
@@ -86,12 +86,6 @@ PrimalDualSolver::PrimalDualSolver(const SDP& sdp,
       << std::endl;
 }
 
-static inline arma::mat
-DenseFromSparse(const arma::sp_mat& input)
-{
-  return arma::mat(input);
-}
-
 static inline double
 AlphaHat(const arma::mat& A, const arma::mat& dA)
 {
@@ -133,7 +127,7 @@ SolveLyapunov(arma::mat& X, const arma::mat& A, const arma::mat& H)
 }
 
 static inline void
-SolveKKTSystem(const arma::mat& Asparse,
+SolveKKTSystem(const arma::sp_mat& Asparse,
                const arma::mat& Adense,
                const arma::mat& Z,
                const arma::mat& M,
@@ -189,33 +183,31 @@ PrimalDualSolver::Optimize(arma::mat& X,
   const size_t n = sdp.N();
   const size_t n2bar = sdp.N2bar();
 
-  // TODO(stephentu): implementation does not take adv of sparsity yet
-
-  arma::mat Asparse(sdp.NumSparseConstraints(), n2bar);
-  arma::vec Ai;
+  arma::sp_mat Asparse(sdp.NumSparseConstraints(), n2bar);
+  arma::sp_mat Aisparse;
 
   for (size_t i = 0; i < sdp.NumSparseConstraints(); i++)
   {
-    math::Svec(DenseFromSparse(sdp.SparseA()[i]), Ai);
-    Asparse.row(i) = Ai.t();
+    math::Svec(sdp.SparseA()[i], Aisparse);
+    Asparse.row(i) = Aisparse.col(0).t();
   }
 
   arma::mat Adense(sdp.NumDenseConstraints(), n2bar);
+  arma::vec Aidense;
   for (size_t i = 0; i < sdp.NumDenseConstraints(); i++)
   {
-    math::Svec(sdp.DenseA()[i], Ai);
-    Adense.row(i) = Ai.t();
+    math::Svec(sdp.DenseA()[i], Aidense);
+    Adense.row(i) = Aidense.t();
   }
 
-  arma::vec scsparse;
+  arma::sp_mat scsparse;
   if (sdp.HasSparseObjective())
-    math::Svec(DenseFromSparse(sdp.SparseC()), scsparse);
+    math::Svec(sdp.SparseC(), scsparse);
 
   arma::vec scdense;
   if (sdp.HasDenseObjective())
     math::Svec(sdp.DenseC(), scdense);
 
-
   X = X0;
   ysparse = ysparse0;
   ydense = ydense0;
@@ -250,7 +242,7 @@ PrimalDualSolver::Optimize(arma::mat& X,
 
     rd = - sz - Asparse.t() * ysparse - Adense.t() * ydense;
     if (sdp.HasSparseObjective())
-      rd += scsparse;
+      rd += scsparse.col(0);
     if (sdp.HasDenseObjective())
       rd += scdense;
 



More information about the mlpack-git mailing list