Debugging Your Program

This chapter provides you with information about the Optimization Library subroutines that may help debug your application program. See also "Handling Problems" for debugging suggestions. 


Using EKKSMAP for Debugging

EKKSMAP may be used to determine if you are out of, or soon to be out of, storage. EKKSMAP informs you of the first and last indices of low storage and high storage that are used. For example, a call to EKKSMAP could produce the following output:

EKK0075I   1 to 5456 and 97476 to 100000 are used in storage

This indicates that dspace from 1 to 5456 and from 97476 to 100000 is in use. Therefore, dspace from 5457 to 97475 is available. Also, the index control variables Nfirstfree and Nlastfree are set to 5457 and 97475 respectively.

EKKSMAP can be called several times in your program to check storage allocation for debugging purposes. If your program is running out of dspace, a call to EKKSMAP after every Optimization Library subroutine call can pinpoint operations that are using lots of storage.

EKKSMAP generates message EKK0075I (amount of storage used). Using EKKMSET you can cause a similar message to be issued after each Optimization Library subroutine completes. This message, EKK0083I, provides information that is similar to EKK0075I; however, EKK0083I is only printed when the storage map has changed between entry and exit from a subroutine. A call to EKKMSET is required to enable printing of EKK0083I, because the default is not to print it. 


Using EKKSTAT for Debugging

EKKSTAT provides statistics about the element values and the row and column bounds of the current model. It is particularly valuable for determining whether the model data is correct without having to print the entire constraint matrix. For example, you can call EKKSTAT after calling EKKLMDL to check that the data was passed correctly. Also, you can get information on the ranges of the row and column activities, the row slack variables and column reduced costs, and the original column costs.

The information provided by EKKSTAT is similar to that provided by EKKPRTS. EKKPRTS allows you to select various different parts of the matrix by setting the integer control variable Iprtinfomask. EKKSTAT does not give information on row and column names and the status of each variable. Instead, it provides a convenient summary of the information given by EKKPRTS.

For example, if you insert a call to EKKSTAT after the call to EKKLMDL in "Sample FORTRAN Program EXLMDL", you will get the following output for EKKSTAT:

 
                                          Entering OSL subroutine EKKSTAT
          Description of Problem
                  Matrix has 5 rows, 8 columns and 14 entries
          Lower Bound region and Rows section have 5 elements
          Breakdown of 1 negative entries
                    1.000000D+30  <           1 entries
          Breakdown of 4 positive entries
                        1.000000  <           4 entries <             10.00000
          Lower Bound region and Columns section have 8 elements
          6 of the entries in the region had a value of zero
          Breakdown of 2 positive entries
                       0.1000000  <           1 entries <            1.0000000
                        1.000000  <           1 entries <             10.00000
          Solution region and Rows section have 5 elements
          5 of the entries in the region had a value of zero
          Solution region and Columns section have 8 elements
          6 of the entries in the region had a value of zero
          Breakdown of 2 positive entries
                       0.1000000  <           1 entries <            1.0000000
                        1.000000  <           1 entries <             10.00000
          Upper Bound region and Rows section have 5 elements
          Breakdown of 5 positive entries
                        1.000000  <           3 entries <             10.00000
                        10.00000  <           1 entries <             100.0000
                    1.000000D+30  <           1 entries
          Upper Bound region and Columns section have 8 elements
          Breakdown of 8 positive entries
                        1.000000  <           3 entries <             10.00000
                    1.000000D+30  <           5 entries
          Dual/Reduced costs region and Rows section have 5 elements
          5 of the entries in the region had a value of zero
          Dual/Reduced costs region and Columns section have 8 elements
          8 of the entries in the region had a value of zero
          Original Costs region and Columns section have 8 elements
          Breakdown of 1 negative entries
                                1 entries =    1.0
          5 of the entries in the region had a value of zero
          Breakdown of 2 positive entries
                                1 entries =    1.0
                        1.000000  <           1 entries <             10.00000
          Matrix type 2, Column base 0, Row base 0
                  There are 14 elements in the matrix block
          Breakdown of 4 negative entries
                                2 entries =    1.0
                        1.000000  <           2 entries <             10.00000
          Breakdown of 10 positive entries
                                4 entries =    1.0
                        1.000000  <           6 entries <             10.00000

Explanation of EKKSTAT Output

Matrix Description

The following section of output from EKKSTAT shows the name of the problem and the number of rows, columns, and elements in the matrix.

 EKK0050I                                 Entering OSL subroutine EKKSTAT
 EKK0008I Description of Problem
 EKK0016I         Matrix has 5 rows, 8 columns and 14 entries

This is the same information that you would get if you called EKKPRTS with the integer control variable Iprtinfomask set to any value.

Lower Bound Information

The following section of output from EKKSTAT shows the number of lower bounds for rows and columns and the number of lower bounds in a given range:

 EKK0121I Lower Bound region and Rows section have 5 elements
 EKK0122I Breakdown of 1 negative entries
 EKK0128I           1.000000D+30  <           1 entries
 EKK0123I Breakdown of 4 positive entries
 EKK0126I               1.000000  <           4 entries <=             10.00000
 EKK0121I Lower Bound region and Columns section have 8 elements
 EKK0124I 6 of the entries in the region had a value of zero
 EKK0123I Breakdown of 2 positive entries
 EKK0126I              0.1000000  <           1 entries <=            1.0000000
 EKK0126I               1.000000  <           1 entries <=             10.00000

For the rows and columns, the number of lower bounds is printed, followed by a breakdown of the lower bound values. In this breakdown, the following information is printed:

If there are no lower bounds of a given type, no information is printed.

The ranges that are checked for the existence of lower bounds are:

Range start 

Range end 

 

Range start 

Range end 

 

Range start 

Range end 

-infinity

10-12 

 

10 -3 

< 10-2 

 

104

105 

10-12 

10-8 

 

10-2 

10-1

 

105

106 

10-8 

10-7

 

10-1 

101 

 

106 

107 

10-7 

10-6 

 

= 101 

= 101

 

107 

108 

10-6

10-5

 

101 

102

 

108

1012 

10-5 

10-4 

 

102

103

 

1012 

1030

10-4 

10-3 

 

103

104

 

1030 

+infinity 

You may retrieve the lower bounds directly from dspace by using the index control variables Nrowlower and Ncollower. See "EKKNGET - Request Current Start Indices of OSL Information" for more information on using index control variables.

Solution Information

The following section of output from EKKSTAT shows the number of row and column activities and the number of activities in a given range:

 EKK0121I Solution region and Rows section have 5 elements
 EKK0124I 5 of the entries in the region had a value of zero
 EKK0121I Solution region and Columns section have 8 elements
 EKK0124I 6 of the entries in the region had a value of zero
 EKK0123I Breakdown of 2 positive entries
 EKK0126I              0.1000000  <           1 entries <=            1.0000000
 EKK0126I               1.000000  <           1 entries <=             10.00000

For the rows and columns, a breakdown similar to the breakdown for lower bounds is printed. The order of information and the ranges checked is exactly the same.

In this example, the activities are at initial values because EKKSSLV had not been called yet. If EKKSTAT were called after EKKSSLV in this program, the solution information from EKKSTAT would be as follows:

 EKK0121I Solution region and Rows section have 5 elements
 EKK0124I 1 of the entries in the region had a value of zero
 EKK0123I Breakdown of 4 positive entries
 EKK0126I               1.000000  <           3 entries <=             10.00000
 EKK0126I               10.00000  <           1 entries <=             100.0000
 EKK0121I Solution region and Columns section have 8 elements
 EKK0124I 4 of the entries in the region had a value of zero
 EKK0123I Breakdown of 4 positive entries
 EKK0126I              0.1000000  <           1 entries <=            1.0000000
 EKK0127I                       1 entries =    1.0
 EKK0126I               1.000000  <           2 entries <=             10.00000

You can retrieve the activity values directly from dspace by using the index control variables Nrowacts and Ncolsol. See "EKKNGET - Request Current Start Indices of OSL Information" for more information on using index control variables.

Upper Bound Information

The following section of output from EKKSTAT shows the number of upper bounds for rows and columns and the number of upper bounds in a given range:

 EKK0121I Upper Bound region and Rows section have 5 elements
 EKK0123I Breakdown of 5 positive entries
 EKK0126I               1.000000  <           3 entries <=             10.00000
 EKK0126I               10.00000  <           1 entries <=             100.0000
 EKK0128I           1.000000D+30  <           1 entries
 EKK0121I Upper Bound region and Columns section have 8 elements
 EKK0123I Breakdown of 8 positive entries
 EKK0126I               1.000000  <           3 entries <=             10.00000
 EKK0128I           1.000000D+30  <           5 entries

For the rows and columns, a breakdown similar to the breakdown for lower bounds is printed. The order of information and the ranges checked is exactly the same.

You can retrieve the activity values directly from dspace by using the index control variables Nrowupper and Ncolupper. See "EKKNGET - Request Current Start Indices of OSL Information" for more information on using index control variables.

Row Slack Variables and Reduced Costs Information

The following section of output from EKKSTAT shows the number of slack variables for rows, the reduced costs for columns, and the slack variables and reduced costs in a given range:

 EKK0121I Dual/Reduced costs region and Rows section have 5 elements
 EKK0124I 5 of the entries in the region had a value of zero
 EKK0121I Dual/Reduced costs region and Columns section have 8 elements
 EKK0124I 8 of the entries in the region had a value of zero

For the rows and columns, a breakdown similar to the breakdown for lower bounds will be printed. The order of information and the ranges checked are exactly the same.

In this example, the slack variables and reduced costs are at initial values, because EKKSSLV had not yet been called. If EKKSTAT were called after EKKSSLV in this program, the solution information from EKKSTAT would be as follows:

 EKK0121I Dual/Reduced costs region and Rows section have 5 elements
 EKK0124I 4 of the entries in the region had a value of zero
 EKK0123I Breakdown of 1 positive entries
 EKK0126I               1.000000  <           1 entries <=             10.00000
 EKK0121I Dual/Reduced costs region and Columns section have 8 elements
 EKK0124I 6 of the entries in the region had a value of zero
 EKK0123I Breakdown of 2 positive entries
 EKK0126I               1.000000  <           1 entries <=             10.00000
 EKK0126I               10.00000  <           1 entries <=             100.0000

You can retrieve the slack variables and reduced costs directly from dspace by using the index control variables Nrowduals and Ncolrcosts, respectively. See "EKKNGET - Request Current Start Indices of OSL Information" for more information on using index control variables.

Original Costs Information

The following section of output from EKKSTAT shows the number of original costs for columns and the original costs in a given range. This is equivalent to providing information about the objective function coefficients.

 EKK0121I Original Costs region and Columns section have 8 elements
 EKK0122I Breakdown of 1 negative entries
 EKK0127I                       1 entries =    1.0
 EKK0124I 5 of the entries in the region had a value of zero
 EKK0123I Breakdown of 2 positive entries
 EKK0127I                       1 entries =    1.0
 EKK0126I               1.000000  <           1 entries <=             10.00000

For columns, a breakdown similar to the breakdown for lower bounds is printed. The order of information and the ranges checked are exactly the same.

You can retrieve the original costs directly from dspace by using the index control variable Nobjective. See "EKKNGET - Request Current Start Indices of OSL Information" for more information on using index control variables.

Matrix Elements

The following section of output from EKKSTAT shows the type, offset, and number of elements for each block of the matrix, followed by a breakdown of the element values:

 EKK0007I Block storage type 2, Column base 0, Row base 0
 EKK0051I         There are 14 elements in the matrix block
 EKK0122I Breakdown of 4 negative entries
 EKK0127I                       2 entries =    1.0
 EKK0126I               1.000000  <           2 entries <=             10.00000
 EKK0123I Breakdown of 10 positive entries
 EKK0127I                       4 entries =    1.0
 EKK0126I               1.000000  <           6 entries <=             10.00000

For each block, a breakdown similar to the breakdown for lower bounds is printed. The order of information and the ranges checked are exactly the same.

This is the same information that you would get if you called EKKPRTS with the integer control variable Iprtinfomask set to a value greater than or equal to 512.

Remember that a call to EKKCOPY or EKKNWMT consolidates all blocks of the matrix in the copy, so that there will be only one block of information on matrix elements from EKKSTAT if either of those subroutines has been called.


[ Top of Page | Previous Page | Next Page | Table of Contents ]