The following subsections describe what to expect in the SAS log when you run the decomposition algorithm.
In the setup phase of the algorithm, information about the method you choose and the structure of the model is written to the SAS log. One of the most important pieces of information displayed in the log is the number of disjoint blocks and the coverage of those blocks with respect to both variables and constraints in the original presolved model. As explained in the section Overview: Decomposition Algorithm, the decomposition algorithm usually performs better than standard approaches only if the subproblems cover a significant amount of the original problem. However, this is not always a straightforward indicator for MILPs, because the strength of the subproblem with respect to integrality is not always proportional to the size of the system.
After the structural information is written to the log, the algorithm begins and the iteration log is displayed.
When the decomposition algorithm solves LPs, the iteration log shows the progress of convergence in finding the appropriate set of columns in the reformulated space.
The following information is written to the iteration log:
indicates the iteration number.
indicates the best dual bound found so far.
indicates the current amount of infeasibility in phase I and the primal objective value of the current solution in phase II.
indicates the relative difference between the master objective and the best known dual bound. This indicates how close the algorithm is to convergence. If the best bound is 0, or if the relative gap is greater than 1000%, then the absolute gap is written.
indicates the CPU time elapsed (in seconds).
indicates the real time elapsed (in seconds).
Entries are made in the log at a frequency that is specified in the LOGFREQ= option. If LOGFREQ=0, then the iteration log is disabled. If the LOGFREQ= value is positive, then an entry is made in the log at the first iteration, at the last iteration, and at intervals that are specified by the LOGFREQ= value. An entry is also made each time an improved bound is found.
The behavior of objective values in the iteration log depends on both the current phase and on which solver you choose. In phase I, the master formulation has an artificial objective value that decreases to 0 when a feasible solution is found. In phase II, the decomposition algorithm maintains a primal feasible solution, so a minimization problem has decreasing objective values in the iteration log.
When you specify LOGLEVEL=MODERATE or LOGLEVEL=AGGRESSIVE in the DECOMP statement, information about the subproblem solves is written before each iteration line.
When the decomposition algorithm solves MILPs, the iteration log shows the progress of convergence in finding the appropriate set of columns in the reformulated space, in addition to the global convergence of the branch-and-bound algorithm for finding an optimal integer solution.
You can control the amount of information at each node by using the LOGLEVEL= option in the DECOMP statement. By default, the continuous iteration log for the root node is written at the interval specified in the LOGFREQ= option in the DECOMP statement. Then the branch-and-bound node log is written at the interval specified in the LOGFREQ= main solver option.
When the algorithm solves MILPs, the continuous iteration log is similar to the iteration log described in the section Iteration Log for LPs except that information about integer-feasible solutions is also displayed. The following information is printed in the continuous iteration log when the algorithm solves MILPs:
indicates the iteration number.
indicates the best dual bound found so far.
indicates the current amount of infeasibility in phase I and the primal objective value of the current solution in phase II.
indicates the objective of the best integer-feasible solution found so far.
indicates the relative difference between the master objective and the best known dual bound. This indicates how close the algorithm for this particular node is to convergence. If the best bound is 0, or if the relative gap is greater than 1000%, then the absolute gap is displayed.
indicates the relative difference between the best integer and the best known dual bound. This indicates how close the branch-and-bound algorithm is to convergence. If the best bound is 0, or if the relative gap is greater than 1000%, then the absolute gap is displayed.
indicates the CPU time elapsed (in seconds).
indicates the real time elapsed (in seconds).
After the root node is complete, the algorithm then moves into the branch-and-bound phase. By default, it displays the branch-and-bound node log and suppresses the continuous iteration log. The following information is printed in the branch-and-bound node log when the algorithm solves MILPs:
indicates the sequence number of the current node in the search tree.
indicates the current number of active nodes in the branch-and-bound tree.
indicates the number of feasible solutions found so far.
indicates the objective of the best integer-feasible solution found so far.
indicates the best dual bound found so far.
indicates the relative difference between the best integer and the best known dual bound. This indicates how close the branch-and-bound algorithm is to convergence. If the best bound is 0, or if the relative gap is greater than 1000%, then the absolute gap is displayed.
indicates the CPU time elapsed (in seconds).
indicates the real time elapsed (in seconds).
If the LOGLEVEL= option in the DECOMP statement is set to BASIC, MODERATE or AGGRESSIVE, then the continuous iteration log is displayed for each branch-and-bound node at the interval specified in the LOGFREQ= option in the DECOMP statement.
Additional information can be displayed to the log by specifying the LOGLEVEL= option in each of the algorithmic component statements (DECOMP_MASTER, DECOMP_MASTER_IP, and DECOMP_SUBPROB). By default, the individual component log levels are all disabled.