From aac2b5d497dda85dcedbd6f557a1148a84032876 Mon Sep 17 00:00:00 2001
From: Luke Zappia <lazappi@users.noreply.github.com>
Date: Mon, 15 Apr 2019 15:51:21 +1000
Subject: [PATCH] Protect against integer overflow in sim functions

Fixes #49
---
 R/lun-simulate.R    |  8 +++++---
 R/simple-simulate.R |  7 ++++---
 R/splat-simulate.R  | 13 ++++++++-----
 3 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/R/lun-simulate.R b/R/lun-simulate.R
index b94c656..526733e 100644
--- a/R/lun-simulate.R
+++ b/R/lun-simulate.R
@@ -105,9 +105,11 @@ lunSimulate <- function(params = newLunParams(), verbose = TRUE, ...) {
     rownames(cell.means) <- gene.names
 
     if (verbose) {message("Simulating counts...")}
-    counts <- matrix(rnbinom(nGenes * nCells, mu = cell.means,
-                             size = 1 / count.disp),
-                     nrow = nGenes, ncol = nCells)
+    counts <- matrix(rnbinom(
+            as.numeric(nGenes) * as.numeric(nCells),
+            mu = cell.means, size = 1 / count.disp
+        ),
+    nrow = nGenes, ncol = nCells)
 
     if (verbose) {message("Creating final dataset...")}
     rownames(counts) <- gene.names
diff --git a/R/simple-simulate.R b/R/simple-simulate.R
index 3c074ce..6ca63d3 100644
--- a/R/simple-simulate.R
+++ b/R/simple-simulate.R
@@ -43,9 +43,10 @@ simpleSimulate <- function(params = newSimpleParams(), verbose = TRUE, ...) {
     means <- rgamma(nGenes, shape = mean.shape, rate = mean.rate)
 
     if (verbose) {message("Simulating counts...")}
-    counts <- matrix(rnbinom(nGenes * nCells, mu = means,
-                             size = 1 / count.disp),
-                     nrow = nGenes, ncol = nCells)
+    counts <- matrix(rnbinom(
+            as.numeric(nGenes) * as.numeric(nCells),
+            mu = means, size = 1 / count.disp),
+    nrow = nGenes, ncol = nCells)
 
     if (verbose) {message("Creating final dataset...")}
     cell.names <- paste0("Cell", seq_len(nCells))
diff --git a/R/splat-simulate.R b/R/splat-simulate.R
index 6c9a0e7..238dedd 100644
--- a/R/splat-simulate.R
+++ b/R/splat-simulate.R
@@ -646,9 +646,10 @@ splatSimBCVMeans <- function(sim, params) {
         bcv <- (bcv.common + (1 / sqrt(base.means.cell)))
     }
 
-    means.cell <- matrix(rgamma(nGenes * nCells, shape = 1 / (bcv ^ 2),
-                                scale = base.means.cell * (bcv ^ 2)),
-                         nrow = nGenes, ncol = nCells)
+    means.cell <- matrix(rgamma(
+        as.numeric(nGenes) * as.numeric(nCells),
+        shape = 1 / (bcv ^ 2), scale = base.means.cell * (bcv ^ 2)),
+    nrow = nGenes, ncol = nCells)
 
     colnames(means.cell) <- cell.names
     rownames(means.cell) <- gene.names
@@ -680,8 +681,10 @@ splatSimTrueCounts <- function(sim, params) {
     nCells <- getParam(params, "nCells")
     cell.means <- assays(sim)$CellMeans
 
-    true.counts <- matrix(rpois(nGenes * nCells, lambda = cell.means),
-                          nrow = nGenes, ncol = nCells)
+    true.counts <- matrix(rpois(
+        as.numeric(nGenes) * as.numeric(nCells),
+        lambda = cell.means),
+    nrow = nGenes, ncol = nCells)
 
     colnames(true.counts) <- cell.names
     rownames(true.counts) <- gene.names
-- 
GitLab