[mlpack-git] master: restructure the primal-dual tests a bit (5004bab)
gitdub at big.cc.gt.atl.ga.us
gitdub at big.cc.gt.atl.ga.us
Mon Feb 2 15:16:01 EST 2015
Repository : https://github.com/mlpack/mlpack
On branch : master
Link : https://github.com/mlpack/mlpack/compare/bb6e5c56aab07e6449d86021246b52a9e323f3a0...bd6cb33f8d8270b02a84e81e38727679bb6c319a
>---------------------------------------------------------------
commit 5004bab5ac7027f1c2136f26522286fc0a6a2b61
Author: Stephen Tu <tu.stephenl at gmail.com>
Date: Thu Jan 15 18:29:08 2015 -0800
restructure the primal-dual tests a bit
>---------------------------------------------------------------
5004bab5ac7027f1c2136f26522286fc0a6a2b61
src/mlpack/core/optimizers/sdp/primal_dual.cpp | 18 ++++++++-------
src/mlpack/core/optimizers/sdp/primal_dual.hpp | 13 ++++++-----
src/mlpack/tests/sdp_primal_dual_test.cpp | 31 +++++++++++++-------------
3 files changed, 34 insertions(+), 28 deletions(-)
diff --git a/src/mlpack/core/optimizers/sdp/primal_dual.cpp b/src/mlpack/core/optimizers/sdp/primal_dual.cpp
index 536e72c..ef46bfc 100644
--- a/src/mlpack/core/optimizers/sdp/primal_dual.cpp
+++ b/src/mlpack/core/optimizers/sdp/primal_dual.cpp
@@ -89,10 +89,11 @@ SolveLyapunov(arma::mat& X, const arma::mat& A, const arma::mat& H)
arma::syl(X, A, A, -H);
}
-double PrimalDualSolver::Optimize(arma::mat& X,
- arma::vec& ysparse,
- arma::vec& ydense,
- arma::mat& Z)
+std::pair<bool, double>
+PrimalDualSolver::Optimize(arma::mat& X,
+ arma::vec& ysparse,
+ arma::vec& ydense,
+ arma::mat& Z)
{
const size_t n = sdp.N();
const size_t n2bar = sdp.N2bar();
@@ -148,6 +149,7 @@ double PrimalDualSolver::Optimize(arma::mat& X,
Einv_F_AdenseT.set_size(n2bar, sdp.NumDenseConstraints());
M.set_size(sdp.NumConstraints(), sdp.NumConstraints());
+ double primal_obj = 0.;
for (size_t iteration = 0; iteration < maxIterations; iteration++)
{
@@ -306,7 +308,7 @@ double PrimalDualSolver::Optimize(arma::mat& X,
sparse_primal_infeas * sparse_primal_infeas +
dense_primal_infeas * dense_primal_infeas);
- double primal_obj = 0.;
+ primal_obj = 0.;
if (sdp.HasSparseObjective())
primal_obj += arma::dot(sdp.SparseC(), X);
if (sdp.HasDenseObjective())
@@ -343,11 +345,11 @@ double PrimalDualSolver::Optimize(arma::mat& X,
if (norm_XZ <= normXzTol &&
primal_infeas <= primalInfeasTol &&
dual_infeas <= dualInfeasTol)
- return primal_obj;
+ return std::make_pair(true, primal_obj);
}
- Log::Warn << "did not converge" << std::endl;
- return -1;
+ Log::Warn << "Did not converge!" << std::endl;
+ return std::make_pair(false, primal_obj);
}
} // namespace optimization
diff --git a/src/mlpack/core/optimizers/sdp/primal_dual.hpp b/src/mlpack/core/optimizers/sdp/primal_dual.hpp
index d01a177..8c3b863 100644
--- a/src/mlpack/core/optimizers/sdp/primal_dual.hpp
+++ b/src/mlpack/core/optimizers/sdp/primal_dual.hpp
@@ -23,12 +23,15 @@ class PrimalDualSolver {
const arma::vec& ydense0,
const arma::mat& Z0);
- double Optimize(arma::mat& X,
- arma::vec& ysparse,
- arma::vec& ydense,
- arma::mat &Z);
+ std::pair<bool, double>
+ Optimize(arma::mat& X,
+ arma::vec& ysparse,
+ arma::vec& ydense,
+ arma::mat &Z);
- double Optimize(arma::mat& X) {
+ std::pair<bool, double>
+ Optimize(arma::mat& X)
+ {
arma::vec ysparse, ydense;
arma::mat Z;
return Optimize(X, ysparse, ydense, Z);
diff --git a/src/mlpack/tests/sdp_primal_dual_test.cpp b/src/mlpack/tests/sdp_primal_dual_test.cpp
index 14e2213..534ea32 100644
--- a/src/mlpack/tests/sdp_primal_dual_test.cpp
+++ b/src/mlpack/tests/sdp_primal_dual_test.cpp
@@ -159,17 +159,8 @@ ConstructMaxCutSDPFromLaplacian(const std::string& laplacianFilename)
BOOST_AUTO_TEST_SUITE(SdpPrimalDualTest);
-/**
- * Start from a strictly feasible point
- */
-BOOST_AUTO_TEST_CASE(SmallMaxCutFeasibleSdp)
+static void SolveMaxCutFeasibleSDP(const SDP& sdp)
{
- //UndirectedGraph g;
- //UndirectedGraph::ErdosRenyiRandomGraph(g, 10, 0.3, true);
- //SDP sdp = ConstructMaxCutSDPFromGraph(g);
-
- SDP sdp = ConstructMaxCutSDPFromLaplacian("r10.txt");
-
arma::mat X0, Z0;
arma::vec ysparse0, ydense0;
ydense0.set_size(0);
@@ -178,16 +169,26 @@ BOOST_AUTO_TEST_CASE(SmallMaxCutFeasibleSdp)
ysparse0 = -1.1 * arma::vec(arma::sum(arma::abs(sdp.SparseC()), 0).t());
Z0 = -Diag(ysparse0) + sdp.SparseC();
- //std::cout << "ysparse0" << std::endl;
- //std::cout << ysparse0 << std::endl;
-
PrimalDualSolver solver(sdp, X0, ysparse0, ydense0, Z0);
- //solver.MaxIterations() = 1;
arma::mat X, Z;
arma::vec ysparse, ydense;
- solver.Optimize(X, ysparse, ydense, Z);
+ const auto p = solver.Optimize(X, ysparse, ydense, Z);
+ BOOST_REQUIRE(p.first);
+}
+
+/**
+ * Start from a strictly feasible point
+ */
+BOOST_AUTO_TEST_CASE(SmallMaxCutFeasibleSdp)
+{
+ SDP sdp = ConstructMaxCutSDPFromLaplacian("r10.txt");
+ SolveMaxCutFeasibleSDP(sdp);
+ UndirectedGraph g;
+ UndirectedGraph::ErdosRenyiRandomGraph(g, 10, 0.3, true);
+ sdp = ConstructMaxCutSDPFromGraph(g);
+ SolveMaxCutFeasibleSDP(sdp);
}
BOOST_AUTO_TEST_SUITE_END();
More information about the mlpack-git
mailing list