# Benchmarks

## Matt Galloway

This is a short effort to give users an idea of how long the functions take to process. The benchmark examples below are illustrative; exact timings vary by platform and R version.

We will be estimating a tri-diagonal precision matrix with dimension \(p = 100\):

\vspace{0.5cm}

    library(CVglasso)

    # generate data from tri-diagonal (sparse) matrix compute covariance matrix
    # (can confirm inverse is tri-diagonal)
    S = matrix(0, nrow = 100, ncol = 100)

    for (i in 1:100) {
        for (j in 1:100) {
            S[i, j] = 0.7^(abs(i - j))
        }
    }

    # generate 1000 x 100 matrix with rows drawn from iid N_p(0, S)
    set.seed(123)
    Z = matrix(rnorm(1000 * 100), nrow = 1000, ncol = 100)
    out = eigen(S, symmetric = TRUE)
    S.sqrt = out$vectors %*% diag(out$values^0.5) %*% t(out$vectors)
    X = Z %*% S.sqrt

    # calculate sample covariance matrix
    sample = (nrow(X) - 1)/nrow(X) * cov(X)

\vspace{0.5cm}

The code chunks below show how to run local benchmarks. To keep CRAN vignette builds fast and deterministic, these chunks are not evaluated during rendering.

- Default convergence tolerance with specified tuning parameter (no cross validation):

\vspace{0.5cm}

    # benchmark CVglasso - defaults
    library(microbenchmark)
    microbenchmark(CVglasso(S = sample, lam = 0.1, trace = "none"))

\vspace{0.5cm}

- Stricter convergence tolerance with specified tuning parameter (no cross validation):

\vspace{0.5cm}

    # benchmark CVglasso - tolerance 1e-6
    microbenchmark(CVglasso(S = sample, lam = 0.1, tol = 1e-06, trace = "none"))

\vspace{0.5cm}

- Default convergence tolerance with cross validation for `lam`:

\vspace{0.5cm}

    # benchmark CVglasso CV - default parameter grid
    microbenchmark(CVglasso(X, trace = "none"), times = 5)

\vspace{0.5cm}

- Parallel (`cores = 2`) cross validation:

\vspace{0.5cm}

    # benchmark CVglasso parallel CV
    microbenchmark(CVglasso(X, cores = 2, trace = "none"), times = 5)

\vspace{0.5cm}