tests/testthat/test-collapse.R

# Testing collapse is time consuming, skip if ran
skip_collapse <- Sys.getenv("FILEARRAY_SKIP_COLLAPSE", unset = "") == "TRUE"
testthat::skip_if(skip_collapse)

collapse_real <- function(y, keep, transform = c("asis", "10log10", "square", "sqrt", "normalize")){
    re <- switch (
        transform,
        'asis' = {
            apply(y, keep, function(x){
                mean(x)
            })
        },
        '10log10' = {
            apply(y, keep, function(x){
                mean(10* log10(x))
            })
        },
        'square' = {
            apply(y, keep, function(x){
                mean(x^2)
            })
        },
        'sqrt' = {
            apply(y, keep, function(x){
                mean(sqrt(x))
            })
        }, {
            stop("wrong transform")
        }
    )
    # if(storage.mode(re) != "double"){
    #     storage.mode(re) <- 'double'
    # }
    re
}

collapse_cplx <- function(y, keep, transform = c("asis", "10log10", "square", "sqrt", "normalize")){
    re <- switch (
        transform,
        'asis' = {
            apply(y, keep, mean)
        },
        '10log10' = {
            apply(y, keep, function(x){
                mean(20 * log10(Mod(x)))
            })
        },
        'square' = {
            apply(y, keep, function(x){
                mean(Mod(x)^2)
            })
        },
        'sqrt' = {
            apply(y, keep, function(x){
                mean(Mod(x))
            })
        },
        'normalize' = {
            apply(y, keep, function(x){
                mean(x / Mod(x))
            })
        },
        {
            stop("wrong transform")
        }
    )
    # if(storage.mode(re) != "double"){
    #     storage.mode(re) <- 'double'
    # }
    re
}

expect_equivalent_cplx <- function(x, y, eps = 1e-6){
    expect_equal(is.na(x), is.na(y))
    if(is.complex(x)){
        expect_lte(max(abs(Re(x - y)), na.rm = TRUE), eps)
        expect_lte(max(abs(Im(x - y)), na.rm = TRUE), eps)
    } else {
        expect_lte(max(abs(x - y), na.rm = TRUE), eps)
    }
}

test_that("R/C++ - Collapse", {
    testthat::skip_on_cran()
    bsz <- get_buffer_size()
    on.exit({
        set_buffer_size(bsz)
        max_buffer_size(2097152)
    })
    set_buffer_size(16L)
    max_buffer_size(64L)

    # dim <- c(287, 100, 301, 7)
    dim <- c(33:36)
    set.seed(5)
    file <- tempfile()
    unlink(file, recursive = TRUE)
    x <- filearray_create(file, dim, type = "integer", partition_size = 2, initialize = FALSE)
    y <- array(1:(prod(dim)), dim)
    y[[20, 3, 3, 3]] <- NA
    storage.mode(y) <- "integer"
    x[] <- y

    # make sure x[] == y
    expect_equal(x[], y)



    # collapse
    keep <- c(1,2,3,4)
    for(transform in c("asis", "10log10", "square", "sqrt")){
        expect_equal(
            x$collapse(keep = keep, transform = transform, method = 'mean'),
            collapse_real(y, keep, transform = transform)
        )
    }

    keep <- c(1,4,3,2)
    expect_equal(
        x$collapse(keep = keep, transform = 'asis', method = 'mean'),
        collapse_real(y, keep, transform = 'asis')
    )

    keep <- c(4,2,3,1)
    expect_equal(
        x$collapse(keep = keep, transform = 'asis', method = 'mean'),
        collapse_real(y, keep, transform = 'asis')
    )

    keep <- c(3,1)
    for(transform in c("asis", "10log10", "square", "sqrt")){
        expect_equal(
            x$collapse(keep = keep, transform = transform, method = 'mean'),
            collapse_real(y, keep, transform = transform)
        )
    }

    keep <- c(4,1)
    for(transform in c("asis", "10log10", "square", "sqrt")){
        expect_equal(
            x$collapse(keep = keep, transform = transform, method = 'mean'),
            collapse_real(y, keep, transform = transform)
        )
    }

    keep <- c(4,2)
    for(transform in c("asis", "10log10", "square", "sqrt")){
        expect_equal(
            x$collapse(keep = keep, transform = transform, method = 'mean'),
            collapse_real(y, keep, transform = transform)
        )
    }
    keep <- c(4,3)
    for(transform in c("asis", "10log10", "square", "sqrt")){
        expect_equal(
            x$collapse(keep = keep, transform = transform, method = 'mean'),
            collapse_real(y, keep, transform = transform)
        )
    }
    keep <- c(4)
    for(transform in c("asis", "10log10", "square", "sqrt")){
        k <- x$collapse(keep = keep, transform = transform, method = 'mean')
        s <- collapse_real(y, keep, transform = transform)
        diff <- max(abs(1-s / k), na.rm = TRUE)
        # cat(transform, diff, "\n")
        expect_lt(diff, 1e-6)
    }
    keep <- c(4,1,3)
    for(transform in c("asis", "10log10", "square", "sqrt")){
        expect_equal(
            x$collapse(keep = keep, transform = transform, method = 'mean'),
            collapse_real(y, keep, transform = transform)
        )
    }
    keep <- c(3)
    for(transform in c("asis", "10log10", "square", "sqrt")){
        k <- x$collapse(keep = keep, transform = transform, method = 'mean')
        s <- collapse_real(y, keep, transform = transform)
        diff <- max(abs(1-s / k), na.rm = TRUE)
        # cat(transform, diff, "\n")
        expect_lt(diff, 1e-6)
    }
    keep <- c(1)
    for(transform in c("asis", "10log10", "square", "sqrt")){
        k <- x$collapse(keep = keep, transform = transform, method = 'mean')
        s <- collapse_real(y, keep, transform = transform)
        diff <- max(abs(1-s / k), na.rm = TRUE)
        # cat(transform, diff, "\n")
        expect_lt(diff, 1e-6)
    }

})

test_that("R/C++ - Float", {
    testthat::skip_on_cran()
    bsz <- get_buffer_size()
    on.exit({
        set_buffer_size(bsz)
        max_buffer_size(2097152)
    })
    set_buffer_size(16L)
    max_buffer_size(64L)

    # dim <- c(287, 100, 301, 7)
    dim <- c(33:36)
    set.seed(5)
    file <- tempfile()
    unlink(file, recursive = TRUE)
    x <- filearray_create(file, dim, type = "float", partition_size = 2, initialize = FALSE)
    y <- array(rnorm(length(x))^2, dim)
    y[[20, 3, 3, 3]] <- NA
    x[] <- y

    # make sure x[] == y
    eps <- 10^(ceiling(log10(max(abs(y), na.rm = TRUE))) - 7)
    expect_equal(x[], y, tolerance = eps)
    y <- x[]



    # collapse
    keep <- c(1,2,3,4)
    for(transform in c("asis", "10log10", "square", "sqrt")){
        expect_equal(
            x$collapse(keep = keep, transform = transform, method = 'mean'),
            collapse_real(y, keep, transform = transform)
        )
    }

    keep <- c(1,4,3,2)
    expect_equal(
        x$collapse(keep = keep, transform = 'asis', method = 'mean'),
        collapse_real(y, keep, transform = 'asis')
    )

    keep <- c(4,2,3,1)
    expect_equal(
        x$collapse(keep = keep, transform = 'asis', method = 'mean'),
        collapse_real(y, keep, transform = 'asis')
    )

    keep <- c(3,1)
    for(transform in c("asis", "10log10", "square", "sqrt")){
        expect_equal(
            x$collapse(keep = keep, transform = transform, method = 'mean'),
            collapse_real(y, keep, transform = transform)
        )
    }

    keep <- c(4,1)
    for(transform in c("asis", "10log10", "square", "sqrt")){
        expect_equal(
            x$collapse(keep = keep, transform = transform, method = 'mean'),
            collapse_real(y, keep, transform = transform)
        )
    }

    keep <- c(4,2)
    for(transform in c("asis", "10log10", "square", "sqrt")){
        expect_equal(
            x$collapse(keep = keep, transform = transform, method = 'mean'),
            collapse_real(y, keep, transform = transform)
        )
    }
    keep <- c(4,3)
    for(transform in c("asis", "10log10", "square", "sqrt")){
        expect_equal(
            x$collapse(keep = keep, transform = transform, method = 'mean'),
            collapse_real(y, keep, transform = transform)
        )
    }
    keep <- c(4)
    for(transform in c("asis", "10log10", "square", "sqrt")){
        k <- x$collapse(keep = keep, transform = transform, method = 'mean')
        s <- collapse_real(y, keep, transform = transform)
        diff <- max(abs(1-s / k), na.rm = TRUE)
        # cat(transform, diff, "\n")
        expect_lt(diff, 1e-6)
    }
    keep <- c(4,1,3)
    for(transform in c("asis", "10log10", "square", "sqrt")){
        expect_equal(
            x$collapse(keep = keep, transform = transform, method = 'mean'),
            collapse_real(y, keep, transform = transform)
        )
    }
    keep <- c(3)
    for(transform in c("asis", "10log10", "square", "sqrt")){
        k <- x$collapse(keep = keep, transform = transform, method = 'mean')
        s <- collapse_real(y, keep, transform = transform)
        diff <- max(abs(1-s / k), na.rm = TRUE)
        # cat(transform, diff, "\n")
        expect_lt(diff, 1e-6)
    }
    keep <- c(1)
    for(transform in c("asis", "10log10", "square", "sqrt")){
        k <- x$collapse(keep = keep, transform = transform, method = 'mean')
        s <- collapse_real(y, keep, transform = transform)
        diff <- max(abs(1-s / k), na.rm = TRUE)
        # cat(transform, diff, "\n")
        expect_lt(diff, 1e-6)
    }

})

test_that("R/C++ - Collapse (complex)", {
    testthat::skip_on_cran()
    bsz <- get_buffer_size()
    on.exit({
        set_buffer_size(bsz)
        max_buffer_size(2097152)
    })
    set_buffer_size(16L)
    max_buffer_size(64L)

    # dim <- c(287, 100, 301, 7)
    dim <- c(33:36)
    set.seed(5)
    file <- tempfile()
    unlink(file, recursive = TRUE)
    x <- filearray_create(file, dim, type = "complex", partition_size = 2, initialize = FALSE)
    y <- array(rnorm(length(x)) + rnorm(length(x)) * 1i, dim)
    y[[20, 3, 3, 3]] <- NA
    x[] <- y

    # make sure x[] == y
    expect_equivalent_cplx(x[], y)

    y <- x[]

    # collapse
    keep <- c(1,2,3,4)
    for(transform in c("asis", "10log10", "square", "sqrt", "normalize")){
        expect_equal(
            x$collapse(keep = keep, transform = transform, method = 'mean'),
            collapse_cplx(y, keep, transform = transform)
        )
    }

    keep <- c(1,4,3,2)
    expect_equal(
        x$collapse(keep = keep, transform = 'asis', method = 'mean'),
        collapse_cplx(y, keep, transform = 'asis')
    )

    keep <- c(4,2,3,1)
    expect_equal(
        x$collapse(keep = keep, transform = 'asis', method = 'mean'),
        collapse_cplx(y, keep, transform = 'asis')
    )

    keep <- c(3,1)
    for(transform in c("asis", "10log10", "square", "sqrt", "normalize")){
        expect_equal(
            x$collapse(keep = keep, transform = transform, method = 'mean'),
            collapse_cplx(y, keep, transform = transform)
        )
    }

    keep <- c(4,1)
    for(transform in c("asis", "10log10", "square", "sqrt", "normalize")){
        expect_equal(
            x$collapse(keep = keep, transform = transform, method = 'mean'),
            collapse_cplx(y, keep, transform = transform)
        )
    }

    keep <- c(4,2)
    for(transform in c("asis", "10log10", "square", "sqrt", "normalize")){
        expect_equal(
            x$collapse(keep = keep, transform = transform, method = 'mean'),
            collapse_cplx(y, keep, transform = transform)
        )
    }
    keep <- c(4,3)
    for(transform in c("asis", "10log10", "square", "sqrt", "normalize")){
        expect_equal(
            x$collapse(keep = keep, transform = transform, method = 'mean'),
            collapse_cplx(y, keep, transform = transform)
        )
    }
    keep <- c(4)
    for(transform in c("asis", "10log10", "square", "sqrt", "normalize")){
        expect_equal(
            max(abs(x$collapse(keep = keep, transform = transform, method = 'mean')-
                        collapse_cplx(y, keep, transform = transform)), na.rm = TRUE),
            0
        )
    }
    keep <- c(4,1,3)
    for(transform in c("asis", "10log10", "square", "sqrt", "normalize")){
        expect_equal(
            x$collapse(keep = keep, transform = transform, method = 'mean'),
            collapse_cplx(y, keep, transform = transform)
        )
    }
    keep <- c(3)
    for(transform in c("asis", "10log10", "square", "sqrt", "normalize")){
        expect_equal(
            max(abs(x$collapse(keep = keep, transform = transform, method = 'mean')-
                        collapse_cplx(y, keep, transform = transform)), na.rm = TRUE),
            0
        )
    }
    keep <- c(1)
    for(transform in c("asis", "10log10", "square", "sqrt", "normalize")){
        expect_equal(
            max(abs(x$collapse(keep = keep, transform = transform, method = 'mean')-
                        collapse_cplx(y, keep, transform = transform)), na.rm = TRUE),
            0
        )
    }

})


Sys.setenv("FILEARRAY_SKIP_COLLAPSE" = "TRUE")

Try the filearray package in your browser

Any scripts or data that you put into this service are public.

filearray documentation built on July 9, 2023, 5:53 p.m.