Commit 0e8980ae authored by Ilya Korsunsky's avatar Ilya Korsunsky
Browse files

optimized lres collapse

parent e7beffc4
Loading
Loading
Loading
Loading
+38 −9
Original line number Diff line number Diff line
@@ -188,6 +188,32 @@ make_betanames_df <- function(model, has_offset) {
    
}

#' @export 
collapse_lres <- function(lres) {
    res <- list()
    res$beta <- purrr::map(lres, 'beta') %>% collapse_vecs(length(lres))
    colnames(res$beta) <- names(lres)

    res$epsilon <- purrr::map(lres, 'epsilon') %>% collapse_vecs(length(lres))
    colnames(res$epsilon) <- names(lres)

    res$epsilon_pearson <- purrr::map(lres, 'epsilon_pearson') %>% collapse_vecs(length(lres))
    colnames(res$epsilon_pearson) <- names(lres)

    res$prior_sd <- purrr::map(lres, 'prior_sd') %>% collapse_vecs(length(lres))
    colnames(res$prior_sd) <- names(lres)

    covmat_list <- purrr::map(lres, 'covmat')
    res$covmat <- collapse_mats(covmat_list, length(covmat_list))
    dnames <- dimnames(covmat_list[[1]])
    dnames[[3]] <- names(covmat_list)
    dimnames(res$covmat) <- dnames    

    return(res)
}



#' @export 
presto.presto <- function(
    formula, 
@@ -259,15 +285,17 @@ presto.presto <- function(
    if (verbose > 0) {
        message('Aggregate the results')
    }
    common_el <- purrr::reduce(map(lres, names), intersect) %>% setdiff('status')
    res <- map(common_el, function(name) {
        if (name == 'covmat') {
            purrr::reduce(purrr::map(lres, name), abind::abind, along = 3)
        } else {
            as.matrix(purrr::map_dfr(lres, name))            
        }
    })
    names(res) <- common_el
    res <- collapse_lres(lres) 
    
#     common_el <- purrr::reduce(map(lres, names), intersect) %>% setdiff('status')
#     res <- map(common_el, function(name) {
#         if (name == 'covmat') {
#             purrr::reduce(purrr::map(lres, name), abind::abind, along = 3)
#         } else {
#             as.matrix(purrr::map_dfr(lres, name))            
#         }
#     })
#     names(res) <- common_el

    ## clean up names in covmat
    if (verbose > 0) {
@@ -323,6 +351,7 @@ presto.presto <- function(




#' @export 
correct_counts <- function(object, effects_remove, umi_common, verbose=0) {
    

src/utils.cpp

0 → 100644
+37 −0
Original line number Diff line number Diff line
#include <RcppArmadillo.h>
#include <Rcpp.h>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace Rcpp;

// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::depends(Rcpp]]


using namespace std;


// [[Rcpp::export]]
arma::cube collapse_mats(vector<arma::mat> mat_list, unsigned n) {
//     arma::cube result = arma::zeros<arma::cube>(10, 10, n);
    arma::cube result = arma::zeros<arma::cube>(mat_list[0].n_rows, mat_list[0].n_cols, n);
    for (int i = 0; i < n; i++) {
        result.slice(i) = mat_list[i];
    }
    return result;
}


// [[Rcpp::export]]
arma::mat collapse_vecs(vector<arma::vec> vec_list, unsigned n) {
//     arma::cube result = arma::zeros<arma::cube>(10, 10, n);
    arma::mat result = arma::zeros<arma::mat>(vec_list[0].n_elem, n);
    for (int i = 0; i < n; i++) {
        result.col(i) = vec_list[i];
    }
    return result;
}


+603 −780

File changed.

Preview size limit exceeded, changes collapsed.