## ----include = FALSE----------------------------------------------------------
knitr::opts_chunk$set(
  collapse = TRUE,
  eval = FALSE,
  comment = "#>"
)

## ----setup, eval = FALSE------------------------------------------------------
# library(filearray)
# 
# options(digits = 3)
# filearray_threads()
# #> [1] 8
# 
# # Create file array and initialize partitions
# set.seed(1)
# file <- tempfile()
# unlink(file, recursive = TRUE)
# x_dbl <- filearray_create(file, rep(100, 4))
# x_dbl$initialize_partition()
# 
# file <- tempfile()
# unlink(file, recursive = TRUE)
# x_flt <- filearray_create(file, rep(100, 4), type = "float")
# x_flt$initialize_partition()
# 
# # 800 MB double array
# y <- array(rnorm(length(x_dbl)), dim(x_dbl))

## ----eval = FALSE-------------------------------------------------------------
# microbenchmark::microbenchmark(
#     double = {
#         for (i in 1:100) {
#             x_dbl[, , , i] <- y[, , , i]
#         }
#     },
#     float = {
#         for (i in 1:100) {
#             x_flt[, , , i] <- y[, , , i]
#         }
#     },
#     unit = "s",
#     times = 3
# )
# 
# #> Unit: seconds
# #>    expr   min    lq mean median   uq  max neval
# #>  double 0.933 0.935 1.44  0.936 1.69 2.45     3
# #>   float 1.027 1.057 1.07  1.086 1.10 1.11     3

## ----eval = FALSE-------------------------------------------------------------
# microbenchmark::microbenchmark(
#     double = {
#         for (i in 1:100) {
#             x_dbl[, , i, ] <- y[, , i, ]
#         }
#     },
#     float = {
#         for (i in 1:100) {
#             x_flt[, , i, ] <- y[, , i, ]
#         }
#     },
#     unit = "s",
#     times = 3
# )
# 
# #> Unit: seconds
# #>   expr  min   lq mean median   uq  max neval
# #> double 1.23 1.27 1.47   1.30 1.59 1.89     3
# #>  float 1.23 1.24 1.41   1.24 1.50 1.76     3

## ----eval = FALSE-------------------------------------------------------------
# microbenchmark::microbenchmark(
#     double = {
#         for (i in 1:100) {
#             x_dbl[i, , , ] <- y[i, , , ]
#         }
#     },
#     float = {
#         for (i in 1:100) {
#             x_flt[i, , , ] <- y[i, , , ]
#         }
#     },
#     unit = "s",
#     times = 3
# )
# 
# #> Unit: seconds
# #>    expr   min    lq  mean median    uq   max neval
# #>  double  3.18  3.22  3.28   3.27  3.32  3.38     3
# #>   float 20.04 20.04 20.44  20.05 20.64 21.22     3

## ----eval = FALSE-------------------------------------------------------------
# microbenchmark::microbenchmark(
#     double = {
#         for (i in 1:10) {
#             idx <- (i - 1) * 10 + 1:10
#             x_dbl[, , , idx] <- y[, , , idx]
#         }
#     },
#     float = {
#         for (i in 1:10) {
#             idx <- (i - 1) * 10 + 1:10
#             x_flt[, , , idx] <- y[, , , idx]
#         }
#     },
#     unit = "s",
#     times = 3
# )
# 
# #> Unit: seconds
# #>    expr   min    lq  mean median    uq  max neval
# #>  double 0.650 0.684 0.911  0.718 1.041 1.37     3
# #>   float 0.626 0.662 0.783  0.698 0.861 1.02     3

## ----eval = FALSE-------------------------------------------------------------
# microbenchmark::microbenchmark(
#     double = {
#         for (i in 1:10) {
#             idx <- (i - 1) * 10 + 1:10
#             x_dbl[, , idx, ] <- y[, , idx, ]
#         }
#     },
#     float = {
#         for (i in 1:10) {
#             idx <- (i - 1) * 10 + 1:10
#             x_flt[, , idx, ] <- y[, , idx, ]
#         }
#     },
#     unit = "s",
#     times = 3
# )
# 
# #> Unit: seconds
# #>    expr   min    lq  mean median    uq   max neval
# #>  double 0.582 0.620 0.668  0.657 0.710 0.763     3
# #>   float 0.625 0.652 0.732  0.679 0.786 0.893     3

## ----eval = FALSE-------------------------------------------------------------
# microbenchmark::microbenchmark(
#     double = {
#         for (i in 1:10) {
#             idx <- (i - 1) * 10 + 1:10
#             x_dbl[idx, , , ] <- y[idx, , , ]
#         }
#     },
#     float = {
#         for (i in 1:10) {
#             idx <- (i - 1) * 10 + 1:10
#             x_flt[idx, , , ] <- y[idx, , , ]
#         }
#     },
#     unit = "s",
#     times = 3
# )
# 
# #> Unit: seconds
# #>    expr  min   lq mean median   uq  max neval
# #>  double 4.48 4.48 4.64   4.48 4.72 4.95     3
# #>   float 2.64 2.70 2.73   2.77 2.78 2.79     3

## ----eval = FALSE-------------------------------------------------------------
# microbenchmark::microbenchmark(
#     double = {
#         x_dbl[]
#     },
#     float = {
#         x_flt[]
#     },
#     unit = "s",
#     times = 3
# )
# 
# #> Unit: seconds
# #>    expr   min    lq  mean median    uq   max neval
# #>  double 0.155 0.172 0.185  0.188 0.200 0.211     3
# #>   float 0.104 0.106 0.144  0.107 0.164 0.220     3

## ----eval = FALSE-------------------------------------------------------------
# microbenchmark::microbenchmark(
#     farr_double_partition_margin = {
#         x_dbl[, , , 1]
#     },
#     farr_double_fast_margin = {
#         x_dbl[, , 1, ]
#     },
#     farr_double_slow_margin = {
#         x_dbl[1, , , ]
#     },
#     farr_float_partition_margin = {
#         x_flt[, , , 1]
#     },
#     farr_float_fast_margin = {
#         x_flt[, , 1, ]
#     },
#     farr_float_slow_margin = {
#         x_flt[1, , , ]
#     },
#     native_partition_margin = {
#         y[, , , 1]
#     },
#     native_fast_margin = {
#         y[, , 1, ]
#     },
#     native_slow_margin = {
#         y[1, , , ]
#     },
#     times = 100L,
#     unit = "ms"
# )
# 
# #> Unit: milliseconds
# #>                          expr   min    lq  mean median    uq    max neval
# #>  farr_double_partition_margin  2.01  2.66  4.02   2.85  3.64  71.06   100
# #>       farr_double_fast_margin  1.35  1.99  3.16   2.35  3.79  25.88   100
# #>       farr_double_slow_margin 33.25 36.52 44.11  37.32 38.76 125.61   100
# #>   farr_float_partition_margin  1.77  2.40  3.96   2.61  3.66  58.17   100
# #>        farr_float_fast_margin  1.33  1.85  2.80   2.08  3.43  11.01   100
# #>        farr_float_slow_margin 14.98 18.86 23.42  19.54 20.47 160.90   100
# #>       native_partition_margin  3.42  3.75  4.14   4.02  4.27   6.89   100
# #>            native_fast_margin  3.42  3.96  4.86   4.09  4.64  54.74   100
# #>            native_slow_margin 21.52 22.15 24.34  22.65 23.97  91.06   100

## ----eval = FALSE-------------------------------------------------------------
# # access 50 x 50 x 50 x 50 sub-array, with random indices
# idx1 <- sample(1:100, 50)
# idx2 <- sample(1:100, 50)
# idx3 <- sample(1:100, 50)
# idx4 <- sample(1:100, 50)
# 
# microbenchmark::microbenchmark(
#     farr_double = {
#         x_dbl[idx1, idx2, idx3, idx4]
#     },
#     farr_float = {
#         x_flt[idx1, idx2, idx3, idx4]
#     },
#     native = {
#         y[idx1, idx2, idx3, idx4]
#     },
#     times = 100L,
#     unit = "ms"
# )
# 
# #> Unit: milliseconds
# #>         expr   min    lq mean median   uq   max neval
# #>  farr_double 11.68 13.13 18.9  13.81 15.2 143.3   100
# #>   farr_float  8.29  8.89 12.0   9.95 10.6  63.6   100
# #>       native 30.86 31.94 34.0  32.62 33.1 103.0   100

## ----eval = FALSE-------------------------------------------------------------
# keep <- c(2, 4)
# output <- filearray_create(tempfile(), dim(x_dbl)[keep])
# output$initialize_partition()
# microbenchmark::microbenchmark(
#     farr_double = {
#         x_dbl$collapse(keep = keep, method = "sum")
#     },
#     farr_float = {
#         x_flt$collapse(keep = keep, method = "sum")
#     },
#     native = {
#         apply(y, keep, sum)
#     },
#     ravetools = {
#         ravetools::collapse(y, keep, average = FALSE)
#     },
#     unit = "s",
#     times = 5
# )
# 
# #> Unit: seconds
# #>         expr   min    lq  mean median    uq   max neval
# #>  farr_double 0.651 0.666 0.867  0.716 0.718 1.583     5
# #>   farr_float 0.628 0.637 0.737  0.642 0.652 1.124     5
# #>       native 1.011 1.029 1.128  1.078 1.207 1.316     5
# #>    ravetools 0.109 0.110 0.126  0.131 0.138 0.139     5

