context("test-g05-cbc")
TOL <- 1e-6
a <- Variable(name='a')
b <- Variable(name='b')
c <- Variable(name='c')
x <- Variable(2, name='x')
y <- Variable(3, name='y')
z <- Variable(2, name='z')
A <- Variable(2, 2, name='A')
B <- Variable(2, 2, name='B')
C <- Variable(3, 2, name='C')
CBC_AVAILABLE <- "CBC" %in% installed_solvers()
test_that("Test basic LPs", {
skip_on_cran()
skip_if_not(CBC_AVAILABLE, "Skipping CBC test as it is not available.!")
## TODO: This _used to be_ a bug in the rcbc library. NOW FIXED!
prob <- Problem(Minimize(0), list(x == 2))
result <- solve(prob, verbose = FALSE, solver = "CBC")
expect_equal(result$value, 0, tolerance = TOL)
expect_equal(result$getValue(x), matrix(c(2,2)), tolerance = TOL)
prob <- Problem(Minimize(-a), list(a <= 1))
result <- solve(prob, verbose = FALSE, solver = "CBC")
expect_equal(result$value, -1, tolerance = TOL)
expect_equal(result$getValue(a), 1, tolerance = TOL)
})
test_that("Test a basic LP", {
skip_on_cran()
skip_if_not(CBC_AVAILABLE, "Skipping CBC test as it is not available.!")
prob <- Problem(Minimize(p_norm(x, 1)), list(x == 0))
result <- solve(prob, verbose = FALSE, solver = "CBC")
expect_equal(result$value, 0, tolerance = TOL)
expect_equal(result$getValue(x), matrix(c(0,0)), tolerance = TOL)
# Example from
# http://cvxopt.org/userguide/coneprog.html?highlight=solvers.lp#cvxopt.solvers.lp
objective <- Minimize(-4*x[1] - 5*x[2])
constraints <- list(2*x[1] + x[2] <= 3,
x[1] + 2*x[2] <= 3,
x[1] >= 0,
x[2] >= 0)
prob <- Problem(objective, constraints)
result <- solve(prob, verbose = FALSE, solver = "CBC")
expect_equal(result$value, -9, tolerance = TOL)
expect_equal(result$getValue(x), matrix(c(1,1)), tolerance = TOL)
})
test_that("Test a basic MILP", {
skip_on_cran()
skip_if_not(CBC_AVAILABLE, "Skipping CBC test as it is not available.!")
bool_var <- Variable(boolean = TRUE)
int_var <- Variable(integer = TRUE)
prob <- Problem(Minimize(p_norm(x, 1)),
list(x == bool_var, bool_var == 0))
result <- solve(prob, verbose = FALSE, solver = "CBC")
expect_equal(result$value, 0, tolerance = TOL)
expect_equal(result$getValue(bool_var), 0, tolerance = TOL)
expect_equal(result$getValue(x), matrix(c(0,0)), tolerance = TOL)
# Example from
# http://cvxopt.org/userguide/coneprog.html?highlight=solvers.lp#cvxopt.solvers.lp
objective <- Minimize(-4*x[1] - 5*x[2])
constraints <- list(2*x[1] + x[2] <= int_var,
x[1] + 2*x[2] <= 3*bool_var,
x[1] >= 0,
x[2] >= 0,
int_var == 3*bool_var,
int_var == 3)
prob <- Problem(objective, constraints)
result <- solve(prob, verbose = FALSE, solver = "CBC")
expect_equal(result$value, -9, tolerance = TOL)
expect_equal(result$getValue(int_var), 3, tolerance = TOL)
expect_equal(result$getValue(bool_var), 1, tolerance = TOL)
expect_equal(result$getValue(x), matrix(c(1,1)), tolerance = TOL)
})
test_that("Test a hard knapsack problem", {
skip_on_cran()
skip_if_not(CBC_AVAILABLE, "Skipping CBC test as it is not available.!")
## Instance "knapPI_1_50_1000_1" from "http://www.diku.dk/~pisinger/genhard.c"
n <- 50
c <- 995
z <- 8373
coeffs <- rbind(c(1, 94, 485, 0), c(2, 506, 326, 0), c(3, 416, 248, 0),
c(4, 992, 421, 0), c(5, 649, 322, 0), c(6, 237, 795, 0),
c(7, 457, 43, 1), c(8, 815, 845, 0), c(9, 446, 955, 0),
c(10, 422, 252, 0), c(11, 791, 9, 1), c(12, 359, 901, 0),
c(13, 667, 122, 1), c(14, 598, 94, 1), c(15, 7, 738, 0),
c(16, 544, 574, 0), c(17, 334, 715, 0), c(18, 766, 882, 0),
c(19, 994, 367, 0), c(20, 893, 984, 0), c(21, 633, 299, 0),
c(22, 131, 433, 0), c(23, 428, 682, 0), c(24, 700, 72, 1),
c(25, 617, 874, 0), c(26, 874, 138, 1), c(27, 720, 856, 0),
c(28, 419, 145, 0), c(29, 794, 995, 0), c(30, 196, 529, 0),
c(31, 997, 199, 1), c(32, 116, 277, 0), c(33, 908, 97, 1),
c(34, 539, 719, 0), c(35, 707, 242, 0), c(36, 569, 107, 0),
c(37, 537, 122, 0), c(38, 931, 70, 1), c(39, 726, 98, 1),
c(40, 487, 600, 0), c(41, 772, 645, 0), c(42, 513, 267, 0),
c(43, 81, 972, 0), c(44, 943, 895, 0), c(45, 58, 213, 0),
c(46, 303, 748, 0), c(47, 764, 487, 0), c(48, 536, 923, 0),
c(49, 724, 29, 1), c(50, 789, 674, 0)) # index, p / w / x
X <- Variable(n, boolean = TRUE)
prob <- Problem(Maximize(sum(multiply(coeffs[,2], X))),
list(sum(multiply(coeffs[,3], X)) <= c))
result <- solve(prob, verbose = FALSE, solver = "CBC")
expect_equal(result$value, z, tolerance = TOL) # objective
})
test_that("Test that all CBC solver options work", {
skip_on_cran()
skip_if_not(CBC_AVAILABLE, "Skipping CBC test as it is not available.!")
prob <- Problem(Minimize(p_norm(x, 1)),
list(x == Variable(2, boolean = TRUE)))
for(i in 1:2) {
# Some cut-generators seem to be buggy for now -> set to false
# result <- solve(prob, verbose = TRUE, solver = "CBC", GomoryCuts = TRUE, MIRCuts = TRUE,
# MIRCuts2 = TRUE, TwoMIRCuts = TRUE, ResidualCapacityCuts = TRUE,
# KnapsackCuts = TRUE, FlowCoverCuts = TRUE, CliqueCuts = TRUE,
# LiftProjectCuts = TRUE, AllDifferentCuts = FALSE, OddHoleCuts = TRUE,
# RedSplitCuts = FALSE, LandPCuts = FALSE, PreProcessCuts = FALSE,
# ProbingCuts = TRUE, SimpleRoundingCuts = TRUE)
result <- solve(prob, verbose = TRUE, solver = "CBC", maximumSeconds = 100)
expect_equal(result$getValue(x), matrix(c(0,0)), tolerance = TOL)
}
})
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.