[mlpack-git] master: add a check for dual feasibility (abf4a6b)

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


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

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

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

commit abf4a6b5c3a9d5ab3e2fd414e85b229577198e50
Author: Stephen Tu <stephent at berkeley.edu>
Date:   Thu Jan 15 17:31:28 2015 -0800

    add a check for dual feasibility


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

abf4a6b5c3a9d5ab3e2fd414e85b229577198e50
 src/mlpack/core/optimizers/sdp/primal_dual.cpp | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/src/mlpack/core/optimizers/sdp/primal_dual.cpp b/src/mlpack/core/optimizers/sdp/primal_dual.cpp
index 36c8ba8..536e72c 100644
--- a/src/mlpack/core/optimizers/sdp/primal_dual.cpp
+++ b/src/mlpack/core/optimizers/sdp/primal_dual.cpp
@@ -139,7 +139,7 @@ double PrimalDualSolver::Optimize(arma::mat& X,
 
   arma::mat Rc, E, F, Einv_F_AsparseT, Einv_F_AdenseT, Gk,
             M, Einv_Frd_rc_Mat, Frd_rc_Mat, Frd_ATdy_rc_Mat,
-            Einv_Frd_ATdy_rc_Mat;
+            Einv_Frd_ATdy_rc_Mat, DualCheck;
 
   rp.set_size(sdp.NumConstraints());
   rhs.set_size(sdp.NumConstraints());
@@ -318,6 +318,17 @@ double PrimalDualSolver::Optimize(arma::mat& X,
 
     const double duality_gap = primal_obj - dual_obj;
 
+    DualCheck = Z;
+    if (sdp.HasSparseObjective())
+      DualCheck -= sdp.SparseC();
+    if (sdp.HasDenseObjective())
+      DualCheck -= sdp.DenseC();
+    for (size_t i = 0; i < sdp.NumSparseConstraints(); i++)
+      DualCheck += ysparse(i) * sdp.SparseA()[i];
+    for (size_t i = 0; i < sdp.NumDenseConstraints(); i++)
+      DualCheck += ydense(i) * sdp.DenseA()[i];
+    const double dual_infeas = arma::norm(DualCheck, "fro");
+
     Log::Debug
       << "iter=" << iteration + 1 << ", "
       << "primal=" << primal_obj << ", "
@@ -325,11 +336,13 @@ double PrimalDualSolver::Optimize(arma::mat& X,
       << "gap=" << duality_gap << ", "
       << "||XZ||=" << norm_XZ << ", "
       << "primal_infeas=" << primal_infeas << ", "
+      << "dual_infeas=" << dual_infeas << ", "
       << "mu=" << mu
       << std::endl;
 
     if (norm_XZ <= normXzTol &&
-        primal_infeas <= primalInfeasTol)
+        primal_infeas <= primalInfeasTol &&
+        dual_infeas <= dualInfeasTol)
       return primal_obj;
   }
 



More information about the mlpack-git mailing list