FNLMath : Optimization : DENSE_LP
DENSE_LP
Solves a linear programming problem using an active set strategy.
 NOTE: DENSE_LP is available in double precision only.
Required Arguments
AM by NVAR matrix containing the coefficients of the M constraints. (Input)
BL — Vector of length M containing the lower limit of the general constraints; if there is no lower limit on the I-th constraint, then BL(I) is not referenced. (Input)
BU — Vector of length M containing the upper limit of the general constraints; if there is no upper limit on the I-th constraint, then BU(I) is not referenced; if there are no range constraints, BL and BU can share the same storage locations. (Input)
C — Vector of length NVAR containing the coefficients of the objective function. (Input)
IRTYPE — Vector of length M indicating the types of general constraints in the matrix A. (Input)
Let R(I) = A(I, 1) * XSOL(1) + … + A(I, NVAR) * XSOL(NVAR). Then, the value of IRTYPE(I) signifies the following:
Irtype[I]
I-th Constraint
0
BL(I) = R(I) = BU(I)
1
R(I) BU(I)
2
R(I) BL(I)
3
BL(I) R(I) BU(I)
4
Ignore this constraint
OBJ — Value of the objective function. (Output)
XSOL — Vector of length NVAR containing the primal solution.(Output)
DSOL — Vector of length M containing the dual solution. (Output)
Optional Arguments
M — Number of constraints. (Input)
Default: M = SIZE (A,1).
NVAR — Number of variables. (Input)
Default: NVAR = SIZE (A,2).
LDA — Leading dimension of A exactly as specified in the dimension statement of the calling program. (Input)
LDA must be at least M.
Default: LDA = SIZE (A,1).
XLB — Vector of length NVAR containing the lower bound on the variables; if there is no lower bound on a variable, then 1.0D30 should be set as the lower bound. (Input)
Default: XLB = 0.0D0.
XUB — Vector of length NVAR containing the upper bound on the variables; if there is no upper bound on a variable, then 1.0D30 should be set as the upper bound. (Input)
Default: No upperbound enforced.
ITREF — The type if iterative refinement used. (Input)
ITREF
Refinement
0
No refinement
1
Iterative refinement
2
Use extended refinement. Iterate until no more progress.
Default: ITREF = 0.
ITERS — Number of iterations. (Output)
IERR — Status flag indicating which warning conditions were set upon completion. (Output)
IERR
Status
≥ 0
Solution found. IERR = 0 indicates there are no warning conditions. If the solution was found with warning conditions IERR is incremented by the number given below.
1
1 is added to the value returned if there are multiple solutions giving essentially the same minimum.
2
2 is added to the value returned if there were some constraints discarded because they were too linearly dependent on other active constraints.
4
4 is added to the value returned if the constraints were not satisfied. L1 minimization was applied to all (including bounds on simple variables) but the equalities, to approximate violated non-equalities as well as possible. If a feasible solution is possible then refinement may help
8
8 is added to the value returned if the algorithm appears to be cycling. Using refinement may help.
FORTRAN 90 Interface
Generic: CALL DENSE_LP (A, BL, BU, C, IRTYPE, OBJ, XSOL, DSOL [])
Specific: The specific interface name is D_DENSE_LP. This subroutine is available in double precision only.
Description
The routine DENSE_LP solves the linear programming problem
where c is the objective coefficient vector, A is the coefficient matrix, and the vectors bl, bu, xl and xu are the lower and upper bounds on the constraints and the variables, respectively.
DENSE_LP uses an active set strategy.
Refer to the following paper for further information: Krogh, Fred, T. (2005), An Algorithm for Linear Programming, http://mathalacarte.com/fkrogh/pub/lp.pdf ,Tujunga, CA.
1. Informational errors
Type
Code
Description
1
1
Multiple solutions giving essentially the same solution exist.
3
1
Some constraints were discarded because they were too linearly dependent on other active constraints.
3
2
All constraints are not satisfied.
3
3
The algorithm appears to be cycling.
4
1
The problem appears vacuous.
4
2
The problem is unbounded.
4
3
An acceptable pivot could not be found.
4
4
The constraint bounds are inconsistent.
4
5
The variable bounds are inconsistent.
Examples
Example 1
The linear programming problem in the standard form
is solved.

USE UMACH_INT
USE WRRRN_INT
USE DENSE_LP_INT
IMPLICIT NONE
INTEGER NOUT, M, NVAR
PARAMETER (M=4, NVAR=6)
DOUBLE PRECISION A(M, NVAR), B(M), C(NVAR), XSOL(NVAR), &
DSOL(M), BL(M), BU(M), OBJ
INTEGER IRTYPE(M)
DATA A/1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, -1, &
0, 0, 0, 0, 1, 0, 0, 0, 0, 1/
DATA B/1.5, 0.5, 1.0, 1.0/
DATA C/-1.0, -3.0, 0.0, 0.0, 0.0, 0.0/
DATA BL/1.5, 0.5, 1.0, 1.0/
DATA BU/M*-1.D30/
DATA IRTYPE/M*0/

CALL UMACH(2, NOUT)
! Solve the LP problem
CALL DENSE_LP (A, BL, BU, C, IRTYPE, OBJ, XSOL, DSOL)

WRITE(NOUT, 99999) OBJ
CALL WRRRN('Solution', XSOL, 1, NVAR, 1)
99999 FORMAT (' Objective', F9.4)
END
Output

Objective -3.5000
Solution
1 2 3 4 5 6
0.500 1.000 0.000 1.000 0.500 0.000
Example 2
This example demonstrates how READ_MPS can be used together with DENSE_LP to solve a linear programming problem defined in an MPS file. The MPS file used in this example is an uncompressed version of the file ‘afiro’, available from http://www.netlib.org/lp/data/.

USE UMACH_INT
USE WRRRN_INT
USE DENSE_LP_INT
IMPLICIT NONE
REAL(KIND(1D0)) OBJ
REAL(KIND(1D0)), ALLOCATABLE :: XSOL(:)
REAL(KIND(1D0)), ALLOCATABLE :: DSOL(:)
REAL(KIND(1D0)), ALLOCATABLE :: A(:,:)
INTEGER, ALLOCATABLE :: IRTYPE(:)
TYPE(D_MPS) PROBLEM
CHARACTER NAME*256
INTEGER I,J, K, NOUT

CALL UMACH(2, NOUT)
! READ LP PROBLEM FROM THE MPS FILE.
NAME = 'afiro'
ALLOCATE (A(PROBLEM%NROWS, PROBLEM%NCOLUMNS))
ALLOCATE (IRTYPE(PROBLEM%NROWS))
ALLOCATE (XSOL(PROBLEM%NCOLUMNS))
ALLOCATE (DSOL(PROBLEM%NROWS))
A = 0
IRTYPE = 3
! FILL DENSE A
DO K = 1, PROBLEM%NONZEROS
I = PROBLEM%CONSTRAINT(K)%ROW
J = PROBLEM%CONSTRAINT(K)%COLUMN
A(I,J) = PROBLEM%CONSTRAINT(K)%VALUE
ENDDO
! CALL THE LP SOLVER
CALL DENSE_LP (A, PROBLEM%LOWER_RANGE, PROBLEM%UPPER_RANGE, &
PROBLEM%OBJECTIVE, IRTYPE, OBJ, XSOL, DSOL, &
XLB=PROBLEM%LOWER_BOUND, XUB=PROBLEM%UPPER_BOUND)
WRITE(NOUT, 99999) OBJ
CALL WRRRN('Solution', XSOL, 1, PROBLEM%NROWS, 1)

DEALLOCATE(A)
DEALLOCATE(IRTYPE)
DEALLOCATE(XSOL)
DEALLOCATE(DSOL)
99999 FORMAT('Objective: ', E16.7)
END
Output

Objective: -0.4647531E+03
Solution
1 2 3 4 5 6 7 8 9 10
80.0 25.5 54.5 84.8 57.9 0.0 0.0 0.0 0.0 0.0
11 12 13 14 15 16 17 18 19 20
0.0 0.0 18.2 39.7 61.3 500.0 475.9 24.1 0.0 215.0
21 22 23 24 25 26 27
363.9 0.0 0.0 0.0 0.0 0.0 0.0