[mlpack-git] master: restructure the primal-dual tests a bit (eecf8e1)

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


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

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

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

commit eecf8e129a8682405e6e8a56f7cf75f4ce1b9680
Author: Stephen Tu <tu.stephenl at gmail.com>
Date:   Thu Jan 15 18:29:08 2015 -0800

    restructure the primal-dual tests a bit


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

eecf8e129a8682405e6e8a56f7cf75f4ce1b9680
 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