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.