context("test-g04-scs")
TOL <- 1e-3
x <- Variable(2, name = "x")
y <- Variable(2, name = "y")
A <- Variable(2, 2, name = "A")
B <- Variable(2, 2, name = "B")
C <- Variable(3, 2, name = "C")
test_that("Test log problem", {
## Log in objective
skip_on_cran()
obj <- Maximize(sum(log(x)))
constr <- list(x <= matrix(c(1, exp(1))))
p <- Problem(obj, constr)
result <- solve(p, solver = "SCS")
expect_equal(result$value, 1, tolerance = TOL)
expect_equal(result$getValue(x), matrix(c(1, exp(1))), tolerance = TOL)
## Log in constraint
obj <- Minimize(sum(x))
constr <- list(log(x) >= 0, x <= matrix(c(1,1)))
p <- Problem(obj, constr)
result <- solve(p, solver = "SCS")
expect_equal(result$value, 2, tolerance = TOL)
expect_equal(result$getValue(x), matrix(c(1, 1)), tolerance = TOL)
## Index into log
obj <- Maximize(log(x)[2])
constr <- list(x <= c(1, exp(1)))
p <- Problem(obj, constr)
result <- solve(p, solver = "SCS")
expect_equal(result$value, 1, tolerance = TOL)
})
test_that("Test sigma_max", {
skip_on_cran()
const <- Constant(rbind(c(1,2), c(3,4), c(5,6)))
constr <- list(C == const)
prob <- Problem(Minimize(norm(C, "F")), constr)
result <- solve(prob, solver = "SCS")
expect_equal(result$value, value(sqrt(sum(const^2))), tolerance = TOL)
expect_equal(result$getValue(C), value(const), tolerance = TOL)
})
test_that("Test sdp variable", {
skip_on_cran()
const <- Constant(rbind(c(1,2,3), c(4,5,6), c(7,8,9)))
X <- Variable(3, 3, PSD = TRUE)
prob <- Problem(Minimize(0), list(X == const))
result <- solve(prob, verbose = TRUE, solver = "SCS")
expect_equal(tolower(result$status), "infeasible")
})
test_that("Test complex matrices", {
skip_on_cran()
# Complex-valued matrix.
K <- matrix(runif(4), nrow = 2, ncol = 2) + 1i*matrix(runif(4), nrow = , ncol = 2) # Example matrix.
n1 <- sum(svd(K)$d) # Trace norm of K.
# Dual problem.
X <- Variable(2, 2, complex = TRUE)
Y <- Variable(2, 2, complex = TRUE)
# X, Y >= 0 so trace is real.
objective <- Minimize(Re(0.5*matrix_trace(X) + 0.5*matrix_trace(Y)))
constraints <- list(bmat(list(list(X, -t(Conj(K))), list(-K, Y))) %>>% 0, X %>>% 0, Y %>>% 0)
problem <- Problem(objective, constraints)
sol_scs <- solve(problem, solver = "SCS")
expect_equal(dim(sol_scs$getDualValue(constraints[[1]])), c(4, 4))
expect_equal(dim(sol_scs$getDualValue(constraints[[2]])), c(2, 2))
expect_equal(dim(sol_scs$getDualValue(constraints[[3]])), c(2, 2))
expect_equal(sol_scs$value, n1, tolerance = TOL)
})
test_that("Test a problem with kl_div", {
skip_on_cran()
kK <- 50
set.seed(10)
# Generate a random reference distribution.
npSPriors <- runif(kK, 0, 1)
npSPriors <- npSPriors/sum(npSPriors)
# Reference distribution.
p_refProb <- Parameter(kK, 1, nonneg = TRUE)
value(p_refProb) <- npSPriors
# Distributio nto be estimated.
v_prob <- Variable(kK, 1)
objkl <- 0.0
for(k in seq_len(kK))
objkl <- objkl + kl_div(v_prob[k, 1], p_refProb[k, 1])
constrs <- list(do.call("sum", lapply(seq_len(kK), function(k) { v_prob[k, 1] })) == 1)
klprob <- Problem(Minimize(objkl), constrs)
result <- solve(klprob, solver = "SCS", verbose = TRUE)
expect_equal(result$getValue(v_prob), matrix(npSPriors), tolerance = TOL)
})
test_that("Test a problem with entr", {
skip_on_cran()
for(n in c(5, 10, 25)) {
print(n)
x <- Variable(n)
obj <- Maximize(sum(entr(x)))
p <- Problem(obj, list(sum(x) == 1))
result <- solve(p, solver = "SCS", verbose = TRUE)
expect_equal(result$getValue(x), matrix(rep(1.0/n, times = n)), tolerance = TOL)
}
})
test_that("Test a problem with exp", {
skip_on_cran()
for(n in c(5, 10, 25)) {
print(n)
x <- Variable(n)
obj <- Minimize(sum(exp(x)))
p <- Problem(obj, list(sum(x) == 1))
result <- solve(p, solver = "SCS", verbose = TRUE)
expect_equal(result$getValue(x), matrix(rep(1.0/n, times = n)), tolerance = TOL)
}
})
test_that("Test a problem with log", {
skip_on_cran()
for(n in c(5, 10, 25)) {
print(n)
x <- Variable(n)
obj <- Maximize(sum(log(x)))
p <- Problem(obj, list(sum(x) == 1))
result <- solve(p, solver = "SCS", verbose = TRUE)
expect_equal(result$getValue(x), matrix(rep(1.0/n, times = n)), tolerance = TOL)
}
})
test_that("Test warm starting", {
skip_on_cran()
x <- Variable(10)
obj <- Minimize(sum(exp(x)))
prob <- Problem(obj, list(sum(x) == 1))
result <- solve(prob, solver = "SCS")
expect_equal(solve(prob, solver = "SCS")$value, result$value)
## expect_false(solve(prob, solver = "SCS", warm_start = TRUE, verbose = TRUE) == result)
})
test_that("Test PSD constraint", {
skip_on_cran()
s <- Variable(2, 2)
obj <- Maximize(min_elemwise(s[1,2], 10))
const <- list(s %>>% 0, diag(s) == c(1,1))
prob <- Problem(obj, const)
r <- solve(prob, solver = "SCS")
s <- r$getValue(s)
# TODO_NARAS_13: print(residual(const[[1]])) TODO: Need to implement the residual function.
cat("value", r$value)
cat("s", s)
eigs <- eigen(s + t(s), only.values = TRUE)$values
cat("eigs", eigs)
expect_true(all(eigs >= 0))
})
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.