---
title: "Performance"
author: Eunseop Kim
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Performance}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---
```{r, include=FALSE}
knitr::opts_chunk$set(
  collapse = TRUE, comment = "#>", dpi = 300, fig.width = 7, fig.height = 5,
  fig.align = "center", out.width = "100%"
)
```
```{r, echo=FALSE}
library(melt, warn.conflicts = FALSE)
```

All the tests were done on an Arch Linux x86_64 machine with an Intel(R) 
Core(TM) i7 CPU (1.90GHz).


## Empirical likelihood computation

We show the performance of computing empirical likelihood with `el_mean()`. We 
test the computation speed with simulated data sets in two different settings: 
1) the number of observations increases with the number of parameters fixed, 
and 2) the number of parameters increases with the number of observations fixed. 


## Increasing the number of observations

We fix the number of parameters at \(p = 10\), and simulate the parameter value 
and \(n \times p\) matrices using `rnorm()`. In order to ensure convergence with 
a large \(n\), we set a large threshold value using `el_control()`.

```{r}
library(ggplot2)
library(microbenchmark)
set.seed(3175775)
p <- 10
par <- rnorm(p, sd = 0.1)
ctrl <- el_control(th = 1e+10)
result <- microbenchmark(
  n1e2 = el_mean(matrix(rnorm(100 * p), ncol = p), par = par, control = ctrl),
  n1e3 = el_mean(matrix(rnorm(1000 * p), ncol = p), par = par, control = ctrl),
  n1e4 = el_mean(matrix(rnorm(10000 * p), ncol = p), par = par, control = ctrl),
  n1e5 = el_mean(matrix(rnorm(100000 * p), ncol = p), par = par, control = ctrl)
)
```

Below are the results:

```{r message=FALSE}
result
autoplot(result)
```


## Increasing the number of parameters\

This time we fix the number of observations at \(n = 1000\), and evaluate 
empirical likelihood at zero vectors of different sizes.
```{r}
n <- 1000
result2 <- microbenchmark(
  p5 = el_mean(matrix(rnorm(n * 5), ncol = 5),
    par = rep(0, 5),
    control = ctrl
  ),
  p25 = el_mean(matrix(rnorm(n * 25), ncol = 25),
    par = rep(0, 25),
    control = ctrl
  ),
  p100 = el_mean(matrix(rnorm(n * 100), ncol = 100),
    par = rep(0, 100),
    control = ctrl
  ),
  p400 = el_mean(matrix(rnorm(n * 400), ncol = 400),
    par = rep(0, 400),
    control = ctrl
  )
)
```

```{r message=FALSE}
result2
autoplot(result2)
```

On average, evaluating empirical likelihood with a 100000×10 or 1000×400 matrix 
at a parameter value satisfying the convex hull constraint takes less than a 
second.
