How can I change the final duality gap?

Calling SDPT3 4.0: 6661 variables, 321 equality constraints
   For improved efficiency, SDPT3 is solving the dual problem.

 num. of constraints = 321
 dim. of socp   var  = 6040,   num. of socp blk  = 20
 dim. of linear var  = 620
 dim. of free   var  =  1 *** convert ublk to lblk
   SDPT3: Infeasible path-following algorithms
 version  predcorr  gam  expon  scale_data
    NT      1      0.000   1        0    
it pstep dstep pinfeas dinfeas  gap      prim-obj      dual-obj    cputime
 0|0.000|0.000|1.9e+02|7.9e+01|7.7e+05| 5.153741e+03  0.000000e+00| 0:0:00| chol  1  1 
 1|0.974|0.824|4.9e+00|1.4e+01|1.4e+05| 4.984902e+03 -2.764888e+01| 0:0:01| chol  1  1 
 2|1.000|0.981|7.8e-07|3.6e-01|7.3e+03| 4.217334e+03 -3.059662e+01| 0:0:01| chol  1  1 
 3|0.123|0.001|8.1e-06|3.6e-01|6.7e+03| 3.572003e+03 -3.044209e+01| 0:0:02| chol  1  1 
 4|0.974|0.835|4.3e-06|6.6e-02|7.8e+02| 4.155288e+02 -1.368001e+01| 0:0:02| chol  1  1 
 5|0.990|0.980|7.0e-06|3.7e-03|5.5e+01| 4.130050e+01 -6.974684e-01| 0:0:02| chol  1  1 
 6|0.986|0.827|2.7e-07|1.2e-03|2.5e+00| 1.743883e+00 -5.013177e-01| 0:0:03| chol  1  1 
 7|0.879|0.274|3.4e-08|9.2e-04|3.6e-01|-1.552745e-01 -4.906518e-01| 0:0:03| chol  1  1 
 8|0.636|0.764|1.3e-08|2.2e-04|1.3e-01|-3.401472e-01 -4.650332e-01| 0:0:04| chol  1  1 
 9|0.148|0.210|1.3e-08|1.8e-04|1.1e-01|-3.529494e-01 -4.591465e-01| 0:0:04| chol  1  1 
10|0.126|0.838|1.2e-08|2.9e-05|8.8e-02|-3.644045e-01 -4.519992e-01| 0:0:04| chol  1  1 
11|0.207|0.322|1.1e-08|1.9e-05|7.0e-02|-3.798011e-01 -4.495155e-01| 0:0:05| chol  1  1 
12|0.492|0.438|6.0e-09|1.1e-05|3.8e-02|-4.072044e-01 -4.451512e-01| 0:0:05| chol  1  1 
13|0.261|0.603|4.4e-09|4.4e-06|2.6e-02|-4.146660e-01 -4.409448e-01| 0:0:05| chol  2  2 
14|0.287|0.385|3.2e-09|2.7e-06|1.9e-02|-4.203834e-01 -4.391031e-01| 0:0:06| chol  1  2 
15|0.501|0.506|1.6e-09|1.3e-06|9.9e-03|-4.268073e-01 -4.366563e-01| 0:0:06| chol  2  2 
16|0.335|0.563|1.1e-09|5.9e-07|6.2e-03|-4.289585e-01 -4.351069e-01| 0:0:07| chol  2  2 
17|0.318|0.611|7.0e-10|2.4e-07|3.9e-03|-4.303139e-01 -4.341814e-01| 0:0:07| chol  2  2 
18|0.329|0.472|4.6e-10|1.3e-07|2.6e-03|-4.312418e-01 -4.337945e-01| 0:0:07| chol  2  2 
19|0.626|0.714|3.1e-10|4.9e-08|9.8e-04|-4.324077e-01 -4.333849e-01| 0:0:08| chol  2  2 
20|0.721|0.787|2.2e-10|1.5e-08|2.9e-04|-4.329219e-01 -4.332074e-01| 0:0:08| chol  2  2 
21|0.856|0.894|2.4e-10|4.0e-09|4.8e-05|-4.331016e-01 -4.331496e-01| 0:0:09| chol  2  2 
22|0.967|0.905|9.1e-11|6.7e-10|2.9e-06|-4.331363e-01 -4.331392e-01| 0:0:09| chol  2  2 
23|0.976|0.942|1.6e-10|4.7e-11|1.4e-07|-4.331378e-01 -4.331379e-01| 0:0:09| chol  2  2 
24|0.488|0.867|1.3e-10|3.1e-11|4.0e-08|-4.331378e-01 -4.331378e-01| 0:0:10| chol  2  2 
25|0.483|0.930|1.8e-10|2.8e-11|1.6e-08|-4.331378e-01 -4.331378e-01| 0:0:10|
  stop: max(relative gap, infeasibilities) < 1.49e-08
 number of iterations   = 25
 primal objective value = -4.33137796e-01
 dual   objective value = -4.33137812e-01
 gap := trace(XZ)       = 1.58e-08
 relative gap           = 8.49e-09
 actual relative gap    = 8.46e-09
 rel. primal infeas (scaled problem)   = 1.80e-10
 rel. dual     "        "       "      = 2.82e-11
 rel. primal infeas (unscaled problem) = 0.00e+00
 rel. dual     "        "       "      = 0.00e+00
 norm(X), norm(y), norm(Z) = 1.2e+00, 5.4e-01, 8.2e+00
 norm(A), norm(b), norm(C) = 8.6e+01, 2.0e+00, 7.8e+00
 Total CPU time (secs)  = 10.26  
 CPU time per iteration = 0.41  
 termination code       =  0
 DIMACS: 1.8e-10  0.0e+00  1.3e-10  0.0e+00  8.5e-09  8.5e-09
Status: Solved
Optimal value (cvx_optval): +0.433138

The value of variable cvx_slvtol is 8.489593604822530e-09. I want to change this (the stopping criterion). How to? Thanks.

(Mark L. Stone) #2

Have you read ?

If you want more control over solver parameters, you can use cvx_solver_settings

Using a second order solver, such as SDPT3, on a continuous variable problem, you are not likely to get a much smaller duality gap. And trying for a larger duality gap might not save you much, if any, computing time…


Thanks for your kind help.
Yes, I am just trying to set a larger duality gap as the stopping criterion, such as 1e-5. I’ve read the two links shared by you but I didn’t obtain enough information. Could you please tell me the exact matlab code? Thanks!

(Mark L. Stone) #4

help cvx_precision

cvx_precision Controls CVX solver precision.
The cvx_precision command controls the precision-related stopping criteria
for the numerical solver. Up to 3 precision levels can be specified:
0 <= PBEST <= PHIGH <= PLOW << 1.
— PBEST: the solver’s target precision. The solver is instructed
to iterate until it achieves this precision OR until it can
make no further progress.
— PHIGH: the ‘standard’ precision level. Any problem achieving
PRECISION <= PHIGH is considered accurately solved (returning
cvx_status = ‘Solved’).
— PLOW: the ‘minimum acceptable’ precision level. Any problem
achieving PHIGH < PRECISION <= PLOW is considered inaccurately
solved (returning cvx_status = ‘Inaccurate/Solved’).
Problems which cannot achieve PRECISION <= PLOW are considered unsolved
(returning cvx_status = ‘Failed’). These precision levels apply in
appropriate ways to infeasible and unbounded problems as well.

cvx_precision(TOL), where TOL is a positive scalar, sets
    PBEST = MAX(TOL,eps^0.5), PHIGH = TOL, 
    PLOW = min(sqrt(TOL),max(TOL,eps^0.25)).
Note that if TOL>eps^0.25, then PLOW=PHIGH.

cvx_precision(TOL), where TOL is a nonnegative 2-vector, 
    PBEST = MAX(MIN(TOL),eps^0.5), PHIGH = MIN(TOL), and PLOW = MAX(TOL).

cvx_precision(TOL), where TOL is a 3-vector, sets
MIN(TOL) may be zero, but the other two elements must be positive.

A number of text-based options are provided for convenience:
    cvx_precision DEFAULT: [eps^0.5,  eps^0.5,   eps^0.25 ]
    cvx_precision HIGH   : [eps^0.75, eps^0.75,  eps^0.375] 
    cvx_precision MEDIUM : [eps^0.5,  eps^0.375, eps^0.25 ]
    cvx_precision LOW    : [eps^0.5,  eps^0.25,  eps^0.25 ]
    cvx_precision BEST   : [0,        eps^0.5,   eps^0.25 ]

cvx_precision([]) is the same as cvx_precision DEFAULT.

cvx_precision BEST creates a 'best effort' mode. By setting PBSET=0,
it instructs the solver to proceed as long as it can make any useful
progress. By setting PLOW and PHIGH to their default values, it returns
exactly the same CVX_STATUS values as the DEFAULT setting. Therefore,
it yields higher precision when it can be achieved, without penalizing
models for which it cannot. Of course, higher precision comes at a cost
of increased computation time as well.

If cvx_precision(TOL) is called within a model---that is, between the
statements CVX_BEGIN and CVX_END---then the new precision applies only to
that particular model. If called outside of a model, then the change 
applies to all subsequent models.

On exit, cvx_precision(TOL) returns the *previous* precision, so that it
can be saved and restored later; for example:
    otol = cvx_precision(tol);
Of course, this is equivalent to
but the former syntax it may come in handy if you wish to solve several 
models in a row with a different precision.

cvx_precision, with no arguments, returns the current precision value.

You can try


It’s very kind if you. Thanks a lot!!!