[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