[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