# tests/testthat/test-g01-quadratic.R In anqif/cvxr: Disciplined Convex Optimization

```context("test-g01-quadratic")

test_that("test elementwise power", {
x <- Variable(3)
y <- Variable(3)
expect_false(is_constant(x))
expect_true(is_affine(x))

expect_warning(s <- power(t(x) %*% y, 0))
expect_true(is_constant(s))
expect_true(is_affine(s))

t <- power(x-y, 1)
expect_false(is_constant(t))
expect_true(is_affine(t))

u <- power(x+2*y, 2)
expect_false(is_constant(u))
expect_false(is_affine(u))
expect_true(is_dcp(u))

w <- (x+2*y)^2
expect_false(is_constant(w))
expect_false(is_affine(w))
expect_true(is_dcp(w))
})

test_that("test matrix multiplication", {
x <- Variable(3, 5)
y <- Variable(3, 5)
expect_false(is_constant(x))
expect_true(is_affine(x))

expect_warning(s <- t(x) %*% y)
expect_false(is_constant(s))
expect_false(is_affine(s))
expect_false(is_dcp(s))
})

test_that("test quad_over_lin function", {
x <- Variable(3, 5)
y <- Variable(3, 5)
z <- Variable()
s <- quad_over_lin(x-y, z)
expect_false(is_constant(s))
expect_false(is_affine(s))
expect_true(is_dcp(s))

t <- quad_over_lin(x+2*y, 5)
expect_false(is_constant(t))
expect_false(is_affine(t))
expect_true(is_dcp(t))
})

test_that("test matrix_frac function", {
x <- Variable(5)
M <- diag(5)
P <- t(M) %*% M
s <- matrix_frac(x, P)
expect_false(is_constant(s))
expect_false(is_affine(s))
expect_true(is_dcp(s))
})

test_that("test quadratic form", {
x <- Variable(5)
P <- diag(5) - 2*matrix(1, nrow = 5, ncol = 5)
q <- matrix(1, nrow = 5, ncol = 1)

expect_warning(s <- t(x) %*% P %*% x + t(q) %*% x)
expect_false(is_constant(s))
expect_false(is_affine(s))
expect_false(is_dcp(s))
})

test_that("test sum_squares function", {
X <- Variable(5, 4)
P <- matrix(1, nrow = 3, ncol = 5)
Q <- matrix(1, nrow = 4, ncol = 7)
M <- matrix(1, nrow = 3, ncol = 7)

y <- P %*% X %*% Q + M
expect_false(is_constant(y))
expect_true(is_affine(y))
expect_true(is_dcp(y))

s <- sum_squares(y)
expect_false(is_constant(s))
expect_false(is_affine(s))
expect_true(is_dcp(s))

# Frobenius norm squared is indeed quadratic
# but can't show quadraticity using recursive rules
t <- norm(y, "F")^2
expect_false(is_constant(t))
expect_false(is_affine(t))
expect_true(is_dcp(t))
})

test_that("test indefinite quadratic", {
x <- Variable()
y <- Variable()
z <- Variable()

s <- y*z
expect_false(is_dcp(s))

t <- (x+y)^2 - s - z*z
expect_false(is_dcp(t))
})

x <- Variable()
y <- Variable()
z <- Variable()

s <- max_entries(vstack(x, y, z))^2

s <- max_entries(vstack(x^2, power(y, 2), z))
})

test_that("test affine product", {
x <- Variable(3, 5)
y <- Variable(5, 4)

expect_warning(s <- x %*% y)
expect_false(is_constant(s))
expect_false(is_affine(s))