library( linprog )

## Example 1
## Steinhauser, Langbehn and Peters (1992)
cvec <- c(1800, 600, 600)  # gross margins
names(cvec) <- c("Cows","Bulls","Pigs")
bvec <- c(40, 90, 2500)  # endowment
names(bvec) <- c("Land","Stable","Labor")
Amat <- rbind( c(  0.7,   0.35,   0 ),
               c(  1.5,   1,      3 ),
               c( 50,    12.5,   20 ) )
result1a <- solveLP( cvec, bvec, Amat, TRUE, verbose = 1 )
print( result1a )
# print summary results
summary( result1a )
# print all elements of the returned object
print.default( result1a )
# also estimate the dual problem
result1aD <- solveLP( cvec, bvec, Amat, TRUE, verbose = 1, solve.dual = TRUE )
result1aD$con
all.equal( result1a[-c(8,12)], result1aD[-c(8,10,13)] )

# estimation with verbose = TRUE
result1b <- solveLP( cvec, bvec, Amat, TRUE, verbose = 4 )
all.equal( result1a, result1b )
# also estimate the dual problem
result1bD <- solveLP( cvec, bvec, Amat, TRUE, verbose = 4, solve.dual = TRUE )
all.equal( result1aD, result1bD )

# estimation with lpSolve
result1c <- solveLP( cvec, bvec, Amat, TRUE, lpSolve = TRUE, verbose = 4 )
print( result1c )
# print summary results
summary( result1c )
# print all elements of the returned object
print.default( result1c )
# also estimate the dual problem
result1cD <- solveLP( cvec, bvec, Amat, TRUE, lpSolve = TRUE, solve.dual = TRUE )
result1cD$con
all.equal( result1c[-c(5,8)], result1cD[-c(5,6,9)] )

# using argument const.dir
const.dir <- c( ">=", ">=", ">=" )
result1d <- solveLP( cvec, -bvec, -Amat, maximum = TRUE, verbose = 1,
   const.dir = const.dir )
print( result1d )
all.equal( result1a[-8], result1d[-8] )
# also estimate the dual problem
result1dD <- solveLP( cvec, -bvec, -Amat, TRUE, verbose = 1,
   const.dir = const.dir, solve.dual = TRUE )
result1dD$con
all.equal( result1aD[-8], result1dD[-8] )

# using argument const.dir and lpSolve
result1e <-solveLP( cvec, -bvec, -Amat, maximum = TRUE, verbose = 1,
   const.dir = const.dir, lpSolve = TRUE )
print( result1e )
all.equal( result1c[-5], result1e[-5] )
# also estimate the dual problem
result1eD <- solveLP( cvec, -bvec, -Amat, TRUE, verbose = 1,
   const.dir = const.dir, lpSolve = TRUE, solve.dual = TRUE )
result1eD$con
all.equal( result1cD[-5], result1eD[-5] )


## Example 2
## example 1.1.3 of Witte, Deppe and Born (1975)
cvec <- c(2.5, 2 )  # prices of feed
names(cvec) <- c("Feed1","Feed2")
bvec <- c( -10, -1.5, 12)
names(bvec) <- c("Protein","Fat","Fibre")
Amat <- rbind( c(-1.6,-2.4 ),
               c(-0.5,-0.2 ),
               c( 2.0, 2.0 ) )
result2a <- solveLP( cvec, bvec, Amat, verbose = 1 )
print( result2a )
# print summary results
summary( result2a )
# print all elements of the returned object
print.default( result2a )
# also estimate the dual problem
result2aD <- solveLP( cvec, bvec, Amat, verbose = 1, solve.dual = TRUE )
result2aD$con
all.equal( result2a[-c(8,12)], result2aD[-c(8,10,13)] )

# estimation with verbose = TRUE
result2b <- solveLP( cvec, bvec, Amat, verbose = 4 )
all.equal( result1a, result1b )
# also estimate the dual problem
result2bD <- solveLP( cvec, bvec, Amat, verbose = 4, solve.dual = TRUE )
all.equal( result2aD, result2bD )

# estimation with lpSolve
result2c <- solveLP( cvec, bvec, Amat, lpSolve = TRUE, verbose = 4 )
print( result2c )
# print summary results
summary( result2c )
# print all elements of the returned object
print.default( result2c )
# also estimate the dual problem
result2cD <- solveLP( cvec, bvec, Amat, lpSolve = TRUE, verbose = 4,
   solve.dual = TRUE )
result2cD$con
all.equal( result2c[-c(5,8)], result2cD[-c(5,6,9)] )

# using argument const.dir
const.dir <- c( ">=", ">=", "<=" )
result2d <- solveLP( cvec, abs( bvec ), abs( Amat ), verbose = 1,
   const.dir = const.dir )
print( result2d )
all.equal( result2a[-8], result2d[-8] )
# also estimate the dual problem
result2dD <- solveLP( cvec, abs( bvec ), abs( Amat ), verbose = 1,
   const.dir = const.dir, solve.dual = TRUE )
result2dD$con
all.equal( result2aD[-8], result2dD[-8] )

# using argument const.dir and lpSolve
result2e <- solveLP( cvec, abs( bvec ), abs( Amat ), verbose = 1,
   const.dir = const.dir, lpSolve = TRUE )
print( result2e )
all.equal( result2c[-5], result2e[-5] )
# also estimate the dual problem
result2eD <- solveLP( cvec, abs( bvec ), abs( Amat ), verbose = 1,
   const.dir = const.dir, lpSolve = TRUE, solve.dual = TRUE )
result2eD$con
all.equal( result2cD[-5], result2eD[-5] )


