Logging

Pre-Execution Logging

The solver logs all the parameter information before execution:

------------------------------------------------------------------------
                          DuaLip v1.0     2021
             Dual Decomposition based Linear Program Solver
------------------------------------------------------------------------
Settings:
--driver.objectiveClass com.linkedin.dualip.problem.MooSolverDualObjectiveFunction
--driver.solverOutputPath /dualip/test
--driver.gamma 1E-6
--driver.outputFormat avro
--driver.projectionType simplex
--driver.verbosity 1
--input.ACblocksPath /unit-test/moo/60/data
--input.vectorBPath /unit-test/moo/60/constraint
--input.format avro
--optimizer.solverType LBFGSB
--optimizer.dualTolerance 1E-8
--optimizer.slackTolerance 5E-6
--optimizer.maxIter 100

In-Execution Logging

The solver prints the following information during execution. (Note: Which variables are reported depends on the solver.)

Variables

Description

gradientCall

The number of calls to compute the gradient in the solver.

iter

Iteration number.

dual_obj

Dual objective value (including regularization term).

cx

Primal objective value without regularization term, i.e. \(c^\top x\).

feasibility

\(\max_j \{ (Ax-b)_j / (1 + |b_j|)\}\).

\(\lambda(Ax-b)\)

\(\lambda^\top (Ax - b)\).

\(\frac{\gamma}{2}||x||^2\)

Regularization term.

max_pos_slack

\(\max_{j: \lambda_j \neq 0} | (Ax-b)_j | / (1 + |b_j|)\) (only over inequality constraints).

max_zero_slack

\(\max_{j: \lambda_j = 0} \{ (Ax-b)_j, 0\} / (1 + |b_j|)\) (only over inequality constraints).

abs_slack_sum

Sum of constraint violations.

time

Execution time of this iteration in seconds.

step

Step size for the gradient optimizer.

Termination Logging

The solver prints one of the four possible results at termination:

Status

Description

Converged

The algorithm has converged according to the convergence criteria.

Infeasible

This happens when the dual objective has exceeded the primal upper bound.

Terminated

The solver has reached maximum number of iterations. Users can look at the log to determine if the results are good enough to be used.

Failed

The solver failed during execution. Specific failure reason will be given in logs.

We also show the number of iterations, the final primal and dual objective values and the number of active constraints.

Sample log

------------------------------------------------------------------------
                          DuaLip v1.0     2021
             Dual Decomposition based Linear Program Solver
------------------------------------------------------------------------
Settings:
--driver.objectiveClass com.linkedin.dualip.problem.MooSolverDualObjectiveFunction
--driver.solverOutputPath /dualip/test
--driver.gamma 1E-6
--driver.outputFormat avro
--driver.projectionType simplex
--driver.verbosity 1
--input.ACblocksPath /unit-test/moo/60/data
--input.vectorBPath /unit-test/moo/60/constraint
--input.format avro
--optimizer.solverType LBFGSB
--optimizer.dualTolerance 1E-8
--optimizer.slackTolerance 5E-6
--optimizer.maxIter 100

Optimizer: LBFGSB solver
primalUpperBound: 2.50000000e-05, maxIter: 100, dualTolerance: 1.0E-8 slackTolerance: 5.0E-6

gradientCall:     0     iter:     0     dual_obj: -4.99999750e+01       cx: -5.00000000e+01     feasibility: 2.217486e+01       λ(Ax-b): 0.000000e+00   γ||x||/2: 2.500000e-05  max_pos_slack: -Infinity        max_zero_slack: 2.217486e+01    abs_slack_sum: 3.146621e+01     time(sec): 5.135
gradientCall:     1     iter:     1     dual_obj: -4.99999750e+01       cx: -5.00000000e+01     feasibility: 2.217486e+01       λ(Ax-b): 0.000000e+00   γ||x||/2: 2.500000e-05  max_pos_slack: -Infinity        max_zero_slack: 2.217486e+01    abs_slack_sum: 3.146621e+01     time(sec): 1.035
gradientCall:     2     iter:     1     dual_obj: -1.36522019e+01       cx: -1.00000000e+00     feasibility: -2.833599e-01      λ(Ax-b): -1.265221e+01  γ||x||/2: 5.400000e-06  max_pos_slack: 2.833599e-01     max_zero_slack: -Infinity       abs_slack_sum: 0.000000e+00     time(sec): 2.079
gradientCall:     3     iter:     1     dual_obj: -1.36522019e+01       cx: -1.00000000e+00     feasibility: -2.833599e-01      λ(Ax-b): -1.265221e+01  γ||x||/2: 5.400000e-06  max_pos_slack: 2.833599e-01     max_zero_slack: -Infinity       abs_slack_sum: 0.000000e+00     time(sec): 1.038
gradientCall:     4     iter:     2     dual_obj: -1.36522019e+01       cx: -1.00000000e+00     feasibility: -2.833599e-01      λ(Ax-b): -1.265221e+01  γ||x||/2: 5.400000e-06  max_pos_slack: 2.833599e-01     max_zero_slack: -Infinity       abs_slack_sum: 0.000000e+00     time(sec): 1.552
gradientCall:     5     iter:     2     dual_obj: -1.34925665e+01       cx: -1.00000000e+00     feasibility: -2.833599e-01      λ(Ax-b): -1.249257e+01  γ||x||/2: 5.400000e-06  max_pos_slack: 2.833599e-01     max_zero_slack: -Infinity       abs_slack_sum: 0.000000e+00     time(sec): 0.945
gradientCall:     6     iter:     2     dual_obj: -1.34127487e+01       cx: -1.00000000e+00     feasibility: -2.833599e-01      λ(Ax-b): -1.241275e+01  γ||x||/2: 5.400000e-06  max_pos_slack: 2.833599e-01     max_zero_slack: -Infinity       abs_slack_sum: 0.000000e+00     time(sec): 1.392
gradientCall:     7     iter:     2     dual_obj: -1.32930221e+01       cx: -1.00000000e+00     feasibility: -2.833599e-01      λ(Ax-b): -1.229303e+01  γ||x||/2: 5.400000e-06  max_pos_slack: 2.833599e-01     max_zero_slack: -Infinity       abs_slack_sum: 0.000000e+00     time(sec): 1.279
gradientCall:     8     iter:     2     dual_obj: -1.31134322e+01       cx: -1.00000000e+00     feasibility: -2.833599e-01      λ(Ax-b): -1.211344e+01  γ||x||/2: 5.400000e-06  max_pos_slack: 2.833599e-01     max_zero_slack: -Infinity       abs_slack_sum: 0.000000e+00     time(sec): 0.580
gradientCall:     9     iter:     2     dual_obj: -1.28440474e+01       cx: -1.00000000e+00     feasibility: -2.833599e-01      λ(Ax-b): -1.184405e+01  γ||x||/2: 5.400000e-06  max_pos_slack: 2.833599e-01     max_zero_slack: -Infinity       abs_slack_sum: 0.000000e+00     time(sec): 0.965
gradientCall:    10     iter:     2     dual_obj: -1.24399701e+01       cx: -1.00000000e+00     feasibility: -2.833599e-01      λ(Ax-b): -1.143998e+01  γ||x||/2: 5.400000e-06  max_pos_slack: 2.833599e-01     max_zero_slack: -Infinity       abs_slack_sum: 0.000000e+00     time(sec): 0.690
gradientCall:    11     iter:     2     dual_obj: -1.18338541e+01       cx: -1.00000000e+00     feasibility: -2.833599e-01      λ(Ax-b): -1.083386e+01  γ||x||/2: 5.400000e-06  max_pos_slack: 2.833599e-01     max_zero_slack: -Infinity       abs_slack_sum: 0.000000e+00     time(sec): 0.832
gradientCall:    12     iter:     2     dual_obj: -1.09246802e+01       cx: -1.00000000e+00     feasibility: -2.833599e-01      λ(Ax-b): -9.924686e+00  γ||x||/2: 5.400000e-06  max_pos_slack: 2.833599e-01     max_zero_slack: -Infinity       abs_slack_sum: 0.000000e+00     time(sec): 1.559
gradientCall:    13     iter:     2     dual_obj: -9.56091935e+00       cx: -1.00000000e+00     feasibility: -2.833599e-01      λ(Ax-b): -8.560925e+00  γ||x||/2: 5.400000e-06  max_pos_slack: 2.833599e-01     max_zero_slack: -Infinity       abs_slack_sum: 0.000000e+00     time(sec): 1.265
gradientCall:    14     iter:     2     dual_obj: -7.68762043e+00       cx: -2.00000000e+00     feasibility: -2.473638e-01      λ(Ax-b): -5.687626e+00  γ||x||/2: 5.800000e-06  max_pos_slack: 2.473638e-01     max_zero_slack: -Infinity       abs_slack_sum: 0.000000e+00     time(sec): 0.594
gradientCall:    15     iter:     2     dual_obj: -7.68762043e+00       cx: -2.00000000e+00     feasibility: -2.473638e-01      λ(Ax-b): -5.687626e+00  γ||x||/2: 5.800000e-06  max_pos_slack: 2.473638e-01     max_zero_slack: -Infinity       abs_slack_sum: 0.000000e+00     time(sec): 1.231
gradientCall:    16     iter:     3     dual_obj: -7.68762043e+00       cx: -2.00000000e+00     feasibility: -2.473638e-01      λ(Ax-b): -5.687626e+00  γ||x||/2: 5.800000e-06  max_pos_slack: 2.473638e-01     max_zero_slack: -Infinity       abs_slack_sum: 0.000000e+00     time(sec): 0.664
gradientCall:    17     iter:     3     dual_obj: -4.99999750e+01       cx: -5.00000000e+01     feasibility: 2.217486e+01       λ(Ax-b): 0.000000e+00   γ||x||/2: 2.500000e-05  max_pos_slack: -Infinity        max_zero_slack: 2.217486e+01    abs_slack_sum: 3.146621e+01     time(sec): 0.859
gradientCall:    18     iter:     3     dual_obj: -5.59665447e+00       cx: -7.00000000e+00     feasibility: 1.518062e-01       λ(Ax-b): 1.403338e+00   γ||x||/2: 7.800000e-06  max_pos_slack: 1.518062e-01     max_zero_slack: -Infinity       abs_slack_sum: 2.154136e-01     time(sec): 0.611
gradientCall:    19     iter:     3     dual_obj: -5.59665447e+00       cx: -7.00000000e+00     feasibility: 1.518062e-01       λ(Ax-b): 1.403338e+00   γ||x||/2: 7.800000e-06  max_pos_slack: 1.518062e-01     max_zero_slack: -Infinity       abs_slack_sum: 2.154136e-01     time(sec): 0.385
gradientCall:    20     iter:     4     dual_obj: -5.59665447e+00       cx: -7.00000000e+00     feasibility: 1.518062e-01       λ(Ax-b): 1.403338e+00   γ||x||/2: 7.800000e-06  max_pos_slack: 1.518062e-01     max_zero_slack: -Infinity       abs_slack_sum: 2.154136e-01     time(sec): 0.448
gradientCall:    21     iter:     4     dual_obj: -5.84994265e+00       cx: -4.00000000e+00     feasibility: -1.278211e-01      λ(Ax-b): -1.849949e+00  γ||x||/2: 6.600000e-06  max_pos_slack: 1.278211e-01     max_zero_slack: -Infinity       abs_slack_sum: 0.000000e+00     time(sec): 1.024
gradientCall:    22     iter:     4     dual_obj: -5.53061009e+00       cx: -5.00000000e+00     feasibility: -4.952939e-02      λ(Ax-b): -5.306171e-01  γ||x||/2: 7.000000e-06  max_pos_slack: 4.952939e-02     max_zero_slack: -Infinity       abs_slack_sum: 0.000000e+00     time(sec): 0.842
gradientCall:    23     iter:     4     dual_obj: -5.53061009e+00       cx: -5.00000000e+00     feasibility: -4.952939e-02      λ(Ax-b): -5.306171e-01  γ||x||/2: 7.000000e-06  max_pos_slack: 4.952939e-02     max_zero_slack: -Infinity       abs_slack_sum: 0.000000e+00     time(sec): 1.021
gradientCall:    24     iter:     5     dual_obj: -5.53061009e+00       cx: -5.00000000e+00     feasibility: -4.952939e-02      λ(Ax-b): -5.306171e-01  γ||x||/2: 7.000000e-06  max_pos_slack: 4.952939e-02     max_zero_slack: -Infinity       abs_slack_sum: 0.000000e+00     time(sec): 0.855
gradientCall:    25     iter:     5     dual_obj: -5.51271230e+00       cx: -5.00000000e+00     feasibility: -4.952939e-02      λ(Ax-b): -5.127193e-01  γ||x||/2: 7.000000e-06  max_pos_slack: 4.952939e-02     max_zero_slack: -Infinity       abs_slack_sum: 0.000000e+00     time(sec): 0.645
gradientCall:    26     iter:     5     dual_obj: -5.50376340e+00       cx: -5.00000000e+00     feasibility: -4.952939e-02      λ(Ax-b): -5.037704e-01  γ||x||/2: 7.000000e-06  max_pos_slack: 4.952939e-02     max_zero_slack: -Infinity       abs_slack_sum: 0.000000e+00     time(sec): 0.730
gradientCall:    27     iter:     5     dual_obj: -5.50964555e+00       cx: -6.00000000e+00     feasibility: 4.952939e-02       λ(Ax-b): 4.903471e-01   γ||x||/2: 7.400000e-06  max_pos_slack: 4.952939e-02     max_zero_slack: -Infinity       abs_slack_sum: 7.028239e-02     time(sec): 0.779
gradientCall:    28     iter:     5     dual_obj: -5.50037908e+00       cx: -5.00000000e+00     feasibility: -4.952939e-02      λ(Ax-b): -5.003861e-01  γ||x||/2: 7.000000e-06  max_pos_slack: 4.952939e-02     max_zero_slack: -Infinity       abs_slack_sum: 0.000000e+00     time(sec): 0.915
gradientCall:    29     iter:     5     dual_obj: -5.50110192e+00       cx: -6.00000000e+00     feasibility: 4.952939e-02       λ(Ax-b): 4.988907e-01   γ||x||/2: 7.400000e-06  max_pos_slack: 4.952939e-02     max_zero_slack: -Infinity       abs_slack_sum: 7.028239e-02     time(sec): 2.274
gradientCall:    30     iter:     5     dual_obj: -5.50002401e+00       cx: -5.00000000e+00     feasibility: -4.952939e-02      λ(Ax-b): -5.000310e-01  γ||x||/2: 7.000000e-06  max_pos_slack: 4.952939e-02     max_zero_slack: -Infinity       abs_slack_sum: 0.000000e+00     time(sec): 0.460
gradientCall:    31     iter:     5     dual_obj: -5.50012824e+00       cx: -6.00000000e+00     feasibility: 4.952939e-02       λ(Ax-b): 4.998644e-01   γ||x||/2: 7.400000e-06  max_pos_slack: 4.952939e-02     max_zero_slack: -Infinity       abs_slack_sum: 7.028239e-02     time(sec): 1.187
gradientCall:    32     iter:     5     dual_obj: -5.49999490e+00       cx: -6.00000000e+00     feasibility: 4.952939e-02       λ(Ax-b): 4.999977e-01   γ||x||/2: 7.400000e-06  max_pos_slack: 4.952939e-02     max_zero_slack: -Infinity       abs_slack_sum: 7.028239e-02     time(sec): 0.341
gradientCall:    33     iter:     5     dual_obj: -5.49999588e+00       cx: -5.00000000e+00     feasibility: -4.952939e-02      λ(Ax-b): -5.000029e-01  γ||x||/2: 7.000000e-06  max_pos_slack: 4.952939e-02     max_zero_slack: -Infinity       abs_slack_sum: 0.000000e+00     time(sec): 0.770
gradientCall:    34     iter:     5     dual_obj: -5.49999301e+00       cx: -5.82333310e+00     feasibility: 3.202898e-02       λ(Ax-b): 3.233328e-01   γ||x||/2: 7.242060e-06  max_pos_slack: 3.202898e-02     max_zero_slack: -Infinity       abs_slack_sum: 4.544925e-02     time(sec): 0.691
gradientCall:    35     iter:     5     dual_obj: -5.49999301e+00       cx: -5.82333310e+00     feasibility: 3.202898e-02       λ(Ax-b): 3.233328e-01   γ||x||/2: 7.242060e-06  max_pos_slack: 3.202898e-02     max_zero_slack: -Infinity       abs_slack_sum: 4.544925e-02     time(sec): 0.758
gradientCall:    36     iter:     6     dual_obj: -5.49999301e+00       cx: -5.82333310e+00     feasibility: 3.202898e-02       λ(Ax-b): 3.233328e-01   γ||x||/2: 7.242060e-06  max_pos_slack: 3.202898e-02     max_zero_slack: -Infinity       abs_slack_sum: 4.544925e-02     time(sec): 0.713
gradientCall:    37     iter:     6     dual_obj: -5.51201647e+00       cx: -5.00000000e+00     feasibility: -4.952939e-02      λ(Ax-b): -5.120235e-01  γ||x||/2: 7.000000e-06  max_pos_slack: 4.952939e-02     max_zero_slack: -Infinity       abs_slack_sum: 0.000000e+00     time(sec): 0.748
gradientCall:    38     iter:     6     dual_obj: -5.50127583e+00       cx: -5.00000000e+00     feasibility: -4.952939e-02      λ(Ax-b): -5.012828e-01  γ||x||/2: 7.000000e-06  max_pos_slack: 4.952939e-02     max_zero_slack: -Infinity       abs_slack_sum: 0.000000e+00     time(sec): 1.102
gradientCall:    39     iter:     6     dual_obj: -5.50012959e+00       cx: -5.00000000e+00     feasibility: -4.952939e-02      λ(Ax-b): -5.001366e-01  γ||x||/2: 7.000000e-06  max_pos_slack: 4.952939e-02     max_zero_slack: -Infinity       abs_slack_sum: 0.000000e+00     time(sec): 0.500
gradientCall:    40     iter:     6     dual_obj: -5.50000727e+00       cx: -5.00000000e+00     feasibility: -4.952939e-02      λ(Ax-b): -5.000143e-01  γ||x||/2: 7.000000e-06  max_pos_slack: 4.952939e-02     max_zero_slack: -Infinity       abs_slack_sum: 0.000000e+00     time(sec): 0.686
gradientCall:    41     iter:     6     dual_obj: -5.49999421e+00       cx: -5.00000000e+00     feasibility: -4.952939e-02      λ(Ax-b): -5.000012e-01  γ||x||/2: 7.000000e-06  max_pos_slack: 4.952939e-02     max_zero_slack: -Infinity       abs_slack_sum: 0.000000e+00     time(sec): 0.484
gradientCall:    42     iter:     6     dual_obj: -5.49999295e+00       cx: -5.44549277e+00     feasibility: -5.399420e-03      λ(Ax-b): -5.450721e-02  γ||x||/2: 7.029980e-06  max_pos_slack: 5.399420e-03     max_zero_slack: -Infinity       abs_slack_sum: 0.000000e+00     time(sec): 0.777
gradientCall:    43     iter:     6     dual_obj: -5.49999295e+00       cx: -5.44549277e+00     feasibility: -5.399420e-03      λ(Ax-b): -5.450721e-02  γ||x||/2: 7.029980e-06  max_pos_slack: 5.399420e-03     max_zero_slack: -Infinity       abs_slack_sum: 0.000000e+00     time(sec): 0.735
gradientCall:    44     iter:     7     dual_obj: -5.49999295e+00       cx: -5.44549277e+00     feasibility: -5.399420e-03      λ(Ax-b): -5.450721e-02  γ||x||/2: 7.029980e-06  max_pos_slack: 5.399420e-03     max_zero_slack: -Infinity       abs_slack_sum: 0.000000e+00     time(sec): 0.925
gradientCall:    45     iter:     7     dual_obj: -5.49999295e+00       cx: -5.50000000e+00     feasibility: 9.492812e-13       λ(Ax-b): 9.583005e-12   γ||x||/2: 7.050000e-06  max_pos_slack: 9.492812e-13     max_zero_slack: -Infinity       abs_slack_sum: 1.347034e-12     time(sec): 0.934
gradientCall:    46     iter:     7     dual_obj: -5.49999295e+00       cx: -5.50000000e+00     feasibility: 9.492812e-13       λ(Ax-b): 9.583005e-12   γ||x||/2: 7.050000e-06  max_pos_slack: 9.492812e-13     max_zero_slack: -Infinity       abs_slack_sum: 1.347034e-12     time(sec): 1.155
Total LBFGS iterations: 7
Status:Converged
Total number of iterations: 47
Primal: -5.44548574018906
Dual: -5.499992951782625
Number of Active Constraints: 1