The LP Procedure

Converting Standard MPS Format to Sparse Format

The MPS input format was introduced by IBM as a way of specifying data for linear and integer programs. Before you can solve a linear program specified in the MPS input format by using the LP procedure, the data must be converted to the sparse format of the LP procedure. If you want to solve a linear program specified in the sparse LP format by using the OPTLP procedure, you must convert the data into an MPS-format SAS data set. This section describes how to perform both conversions.

SASMPSXS is a SAS macro function that converts the standard MPS format to the sparse format of the LP procedure. The following is an example of the MPS format:

   NAME          EXAMPLE                                               
   * THIS IS DATA FOR THE PRODUCT MIX PROBLEM.                         
   ROWS                                                                
    N  PROFIT                                                           
    L  STAMP                                                            
    L  ASSEMB                                                           
    L  FINISH                                                           
    N  CHNROW                                                           
    N  PRICE                                                            
   COLUMNS                                                                                                                                          
       DESK      STAMP          3.00000   ASSEMB        10.00000        
       DESK      FINISH        10.00000   PROFIT        95.00000        
       DESK      PRICE        175.00000                                 
       CHAIR     STAMP          1.50000   ASSEMB         6.00000        
       CHAIR     FINISH         8.00000   PROFIT        41.00000        
       CHAIR     PRICE         95.00000                                 
       CABINET   STAMP          2.00000   ASSEMB         8.00000        
       CABINET   FINISH         8.00000   PROFIT        84.00000        
       CABINET   PRICE        145.00000                                 
       BOOKCSE   STAMP          2.00000   ASSEMB         7.00000        
       BOOKCSE   FINISH         7.00000   PROFIT        76.00000        
       BOOKCSE   PRICE        130.00000   CHNROW         1.00000        
   RHS                                                                 
       TIME      STAMP        800.00000   ASSEMB       1200.0000        
       TIME      FINISH       800.00000                                 
   RANGES                                                              
       T1        ASSEMB       900.00000                                 
   BOUNDS                                                              
       UP        CHAIR         75.00000                                 
       LO        BOOKCSE       50.00000                                 
   ENDATA                                                              

In this example, the company tries to find an optimal product mix of four items: a DESK, a CHAIR, a CABINET, and a BOOKCASE. Each item is processed in a stamping department (STAMP), an assembly department (ASSEMB), and a finishing department (FINISH). The time each item requires in each department is given in the input data. Because of resource limitations, each department has an upper limit on the time available for processing. Furthermore, because of labor constraints, the assembly department must work at least 300 hours. Finally, marketing tells you not to make more than 75 chairs, to make at least 50 bookcases, and to find the range over which the selling price of a bookcase can vary without changing the optimal product mix.

The SASMPSXS macro function uses MPSFILE='FILENAME' as an argument to read an MPS input file. It then converts the file and saves the conversion to a default SAS data set, PROB. The FILENAME should include the path.

Running the following statements on the preceding example

   %sasmpsxs(mpsfile='filename');

   proc print data=prob;
   run;

produces the sparse input form of the LP procedure:

 OBS    _TYPE_      _COL_      _ROW1_    _COEF1_    _ROW2_    _COEF2_           
                                                                                
  1    *OW                                  .                    .              
  2    FREE                   PROFIT        .                    .              
  3    LE                     STAMP         .                    .              
  4    LE                     ASSEMB        .                    .              
  5    LE                     FINISH        .                    .              
  6    FREE                   CHNROW        .                    .              
  7    FREE                   PRICE         .                    .              
  8    *OL         MNS                      .                    .              
  9                DESK       STAMP        3.0     ASSEMB       10              
 10                DESK       FINISH      10.0     PROFIT       95              
 11                DESK       PRICE      175.0                   .              
 12                CHAIR      STAMP        1.5     ASSEMB        6              
 13                CHAIR      FINISH       8.0     PROFIT       41              
 14                CHAIR      PRICE       95.0                   .              
 15                CABINET    STAMP        2.0     ASSEMB        8              
 16                CABINET    FINISH       8.0     PROFIT       84              
 17                CABINET    PRICE      145.0                   .              
 18                BOOKCSE    STAMP         2      ASSEMB        7              
 19                BOOKCSE    FINISH        7      PROFIT       76              
 20                BOOKCSE    PRICE       130      CHNROW        1              
 21    *HS                                  .                    .              
 22    RHS         TIME       STAMP       800      ASSEMB     1200              
 23    RHS         TIME       FINISH      800                    .              
 24    *AN         ES                       .                    .              
 25    RANGE       T1         ASSEMB      900                    .              
 26    *OU         DS                       .                    .              
 27    UPPERBDD    CHAIR      UP           75                    .              
 28    LOWERBDD    BOOKCSE    LO           50                    .              

SASMPSXS recognizes four MPS row types: E, L, G, and N. It converts them into types EQ, LE, GE, and FREE. Since objective rows, price change rows and free rows all share the same type N in the MPS format, you need a DATA step to assign proper types to the objective rows and price change rows.

   data;
      set prob;
      if _type_='free' and _row1_='profit' then _type_='max';
      if _type_='free' and _row1_='chnrow' then _type_='pricesen';
   run;

   proc lp sparsedata;
   run;

In the MPS format, the variable types include LO, UP, FX, FR, MI, and BV. The SASMPSXS macro converts them into types LOWERBD, UPPERBD, FIXED, UNRESTRICTED, -INFINITY, and BINARY, respectively. Occasionally, you may need to define your own variable types, in which case, you must add corresponding type handling entries in the SASMPSXS.SAS program and use the SAS %INCLUDE macro to include the file at the beginning of your program. The SASMPSXS macro function can be found in the SAS sample library. Information on the MPS format can be obtained from Murtagh (1981).

SASMPSXS can take no arguments, or it can take one or two arguments. If no arguments are present, SASMPSXS assumes that the MPS input file has been saved to a SAS data set named RAW. The macro then takes information from that data set and converts it into the sparse form of the LP procedure. The RAW data set should have the following six variables:

   data RAW;
      infile ...;
      input field1 $ 2-3   field2 $ 5-12
            field3 $ 15-22 field4   25-36
            field5 $ 40-47 field6   50-61;
      ...
   run;

If the preceding MPS input data set has a name other than RAW, you can use MPSDATA=SAS-data-set as an argument in the SASMPSXS macro function. If you want the converted sparse form data set to have a name other than PROB, you can use LPDATA=SAS-data-set as an argument. The order of the arguments in the SASMPSXS macro function is not important.