From 7eb6ff398de2aef147b930a9ab5ab74abe171968 Mon Sep 17 00:00:00 2001
From: pqiao29 <pqiao@student.unimelb.edu.au>
Date: Wed, 1 Apr 2020 12:15:27 +1100
Subject: [PATCH] finish clean up departures.FUN

---
 R/Chu_departures.R               | 259 +++++++++++++++++++++++++++++
 R/internal_update_status.R       |  74 +++++++++
 R/mod_vital.R                    | 270 -------------------------------
 R/recovery.FUN.R                 |  52 ------
 man/departures.FUN.Rd            |   6 +-
 man/recovery.FUN.Rd              |   2 +-
 tests/testthat/test-departures.R |  21 +++
 7 files changed, 359 insertions(+), 325 deletions(-)
 create mode 100644 R/Chu_departures.R
 create mode 100644 R/internal_update_status.R
 create mode 100644 tests/testthat/test-departures.R

diff --git a/R/Chu_departures.R b/R/Chu_departures.R
new file mode 100644
index 0000000..0e5acfc
--- /dev/null
+++ b/R/Chu_departures.R
@@ -0,0 +1,259 @@
+departures.seiqhrf.icm <- function(dat, at, seed = NULL) {
+    
+    if(!is.null(seed)) set.seed(seed)
+    
+    # Conditions --------------------------------------------------------------
+    if (dat$param$vital == FALSE) {
+        return(dat)
+    }
+    
+    
+    # Variables ---------------------------------------------------------------
+    groups <- dat$param$groups
+    group <- dat$attr$group
+    
+    
+    # Susceptible departures ------------------------------------------------------
+    nDepartures <- nDeparturesG2 <- 0
+    idsElig <- which(dat$attr$active == 1 & dat$attr$status == "s")
+    nElig <- length(idsElig)
+    if (nElig > 0) {
+        
+        gElig <- group[idsElig]
+        rates <- c(dat$param$ds.rate, dat$param$ds.rate.g2)
+        ratesElig <- rates[gElig]
+        
+        if (dat$control$d.rand == TRUE) {
+            vecDepartures <- which(rbinom(nElig, 1, ratesElig) == 1)
+            if (length(vecDepartures) > 0) {
+                idsDpt <- idsElig[vecDepartures]
+                nDepartures <- sum(group[idsDpt] == 1)
+                nDeparturesG2 <- sum(group[idsDpt] == 2)
+                dat$attr$active[idsDpt] <- 0
+            }
+        } else {
+            nDepartures <- min(round(sum(ratesElig[gElig == 1])), sum(gElig == 1))
+            dat$attr$active[ssample(idsElig[gElig == 1], nDepartures)] <- 0
+            if (groups == 2) {
+                nDeparturesG2 <- min(round(sum(ratesElig[gElig == 2])), sum(gElig == 2))
+                dat$attr$active[ssample(idsElig[gElig == 2], nDeparturesG2)] <- 0
+            }
+        }
+    }
+    
+    if (at == 2) {
+        dat$epi$ds.flow <- c(0, nDepartures)
+        if (groups == 2) {
+            dat$epi$ds.flow.g2 <- c(0, nDeparturesG2)
+        }
+    } else {
+        dat$epi$ds.flow[at] <- nDepartures
+        if (groups == 2) {
+            dat$epi$ds.flow.g2[at] <- nDeparturesG2
+        }
+    }
+    
+    # Exposed Departures ---------------------------------------------------------
+    nDepartures <- nDeparturesG2 <- 0
+    idsElig <- which(dat$attr$active == 1 & dat$attr$status == "e")
+    nElig <- length(idsElig)
+    if (nElig > 0) {
+        
+        gElig <- group[idsElig]
+        rates <- c(dat$param$de.rate, dat$param$de.rate.g2)
+        ratesElig <- rates[gElig]
+        
+        if (dat$control$d.rand == TRUE) {
+            vecDepartures <- which(rbinom(nElig, 1, ratesElig) == 1)
+            if (length(vecDepartures) > 0) {
+                idsDpt <- idsElig[vecDepartures]
+                nDepartures <- sum(group[idsDpt] == 1)
+                nDeparturesG2 <- sum(group[idsDpt] == 2)
+                dat$attr$active[idsDpt] <- 0
+            }
+        } else {
+            nDepartures <- min(round(sum(ratesElig[gElig == 1])), sum(gElig == 1))
+            dat$attr$active[ssample(idsElig[gElig == 1], nDepartures)] <- 0
+            if (groups == 2) {
+                nDeparturesG2 <- min(round(sum(ratesElig[gElig == 2])), sum(gElig == 2))
+                dat$attr$active[ssample(idsElig[gElig == 2], nDeparturesG2)] <- 0
+            }
+        }
+    }
+    
+    if (at == 2) {
+        dat$epi$de.flow <- c(0, nDepartures)
+        if (groups == 2) {
+            dat$epi$de.flow.g2 <- c(0, nDeparturesG2)
+        }
+    } else {
+        dat$epi$de.flow[at] <- nDepartures
+        if (groups == 2) {
+            dat$epi$de.flow.g2[at] <- nDeparturesG2
+        }
+    }
+    
+    
+    # Infected Departures ---------------------------------------------------------
+    nDepartures <- nDeparturesG2 <- 0
+    idsElig <- which(dat$attr$active == 1 & dat$attr$status == "i")
+    nElig <- length(idsElig)
+    if (nElig > 0) {
+        
+        gElig <- group[idsElig]
+        rates <- c(dat$param$di.rate, dat$param$di.rate.g2)
+        ratesElig <- rates[gElig]
+        
+        if (dat$control$d.rand == TRUE) {
+            vecDepartures <- which(rbinom(nElig, 1, ratesElig) == 1)
+            if (length(vecDepartures) > 0) {
+                idsDpt <- idsElig[vecDepartures]
+                nDepartures <- sum(group[idsDpt] == 1)
+                nDeparturesG2 <- sum(group[idsDpt] == 2)
+                dat$attr$active[idsDpt] <- 0
+            }
+        } else {
+            nDepartures <- min(round(sum(ratesElig[gElig == 1])), sum(gElig == 1))
+            dat$attr$active[ssample(idsElig[gElig == 1], nDepartures)] <- 0
+            if (groups == 2) {
+                nDeparturesG2 <- min(round(sum(ratesElig[gElig == 2])), sum(gElig == 2))
+                dat$attr$active[ssample(idsElig[gElig == 2], nDeparturesG2)] <- 0
+            }
+        }
+    }
+    
+    if (at == 2) {
+        dat$epi$di.flow <- c(0, nDepartures)
+        if (groups == 2) {
+            dat$epi$di.flow.g2 <- c(0, nDeparturesG2)
+        }
+    } else {
+        dat$epi$di.flow[at] <- nDepartures
+        if (groups == 2) {
+            dat$epi$di.flow.g2[at] <- nDeparturesG2
+        }
+    }
+    
+    # Quarantined Departures ---------------------------------------------------------
+    nDepartures <- nDeparturesG2 <- 0
+    idsElig <- which(dat$attr$active == 1 & dat$attr$status == "q")
+    nElig <- length(idsElig)
+    if (nElig > 0) {
+        
+        gElig <- group[idsElig]
+        rates <- c(dat$param$dq.rate, dat$param$dq.rate.g2)
+        ratesElig <- rates[gElig]
+        
+        if (dat$control$d.rand == TRUE) {
+            vecDepartures <- which(rbinom(nElig, 1, ratesElig) == 1)
+            if (length(vecDepartures) > 0) {
+                idsDpt <- idsElig[vecDepartures]
+                nDepartures <- sum(group[idsDpt] == 1)
+                nDeparturesG2 <- sum(group[idsDpt] == 2)
+                dat$attr$active[idsDpt] <- 0
+            }
+        } else {
+            nDepartures <- min(round(sum(ratesElig[gElig == 1])), sum(gElig == 1))
+            dat$attr$active[ssample(idsElig[gElig == 1], nDepartures)] <- 0
+            if (groups == 2) {
+                nDeparturesG2 <- min(round(sum(ratesElig[gElig == 2])), sum(gElig == 2))
+                dat$attr$active[ssample(idsElig[gElig == 2], nDeparturesG2)] <- 0
+            }
+        }
+    }
+    
+    if (at == 2) {
+        dat$epi$dq.flow <- c(0, nDepartures)
+        if (groups == 2) {
+            dat$epi$dq.flow.g2 <- c(0, nDeparturesG2)
+        }
+    } else {
+        dat$epi$dq.flow[at] <- nDepartures
+        if (groups == 2) {
+            dat$epi$dq.flow.g2[at] <- nDeparturesG2
+        }
+    }
+    
+    # Hospitalised Departures ---------------------------------------------------------
+    nDepartures <- nDeparturesG2 <- 0
+    idsElig <- which(dat$attr$active == 1 & dat$attr$status == "h")
+    nElig <- length(idsElig)
+    if (nElig > 0) {
+        
+        gElig <- group[idsElig]
+        rates <- c(dat$param$dh.rate, dat$param$dh.rate.g2)
+        ratesElig <- rates[gElig]
+        
+        if (dat$control$d.rand == TRUE) {
+            vecDepartures <- which(rbinom(nElig, 1, ratesElig) == 1)
+            if (length(vecDepartures) > 0) {
+                idsDpt <- idsElig[vecDepartures]
+                nDepartures <- sum(group[idsDpt] == 1)
+                nDeparturesG2 <- sum(group[idsDpt] == 2)
+                dat$attr$active[idsDpt] <- 0
+            }
+        } else {
+            nDepartures <- min(round(sum(ratesElig[gElig == 1])), sum(gElig == 1))
+            dat$attr$active[ssample(idsElig[gElig == 1], nDepartures)] <- 0
+            if (groups == 2) {
+                nDeparturesG2 <- min(round(sum(ratesElig[gElig == 2])), sum(gElig == 2))
+                dat$attr$active[ssample(idsElig[gElig == 2], nDeparturesG2)] <- 0
+            }
+        }
+    }
+    
+    if (at == 2) {
+        dat$epi$dh.flow <- c(0, nDepartures)
+        if (groups == 2) {
+            dat$epi$dh.flow.g2 <- c(0, nDeparturesG2)
+        }
+    } else {
+        dat$epi$dh.flow[at] <- nDepartures
+        if (groups == 2) {
+            dat$epi$dh.flow.g2[at] <- nDeparturesG2
+        }
+    }
+    
+    
+    # Recovered Departures --------------------------------------------------------
+    nDepartures <- nDeparturesG2 <- 0
+    idsElig <- which(dat$attr$active == 1 & dat$attr$status == "r")
+    nElig <- length(idsElig)
+    if (nElig > 0) {
+        
+        gElig <- group[idsElig]
+        rates <- c(dat$param$dr.rate, dat$param$dr.rate.g2)
+        ratesElig <- rates[gElig]
+        
+        if (dat$control$d.rand == TRUE) {
+            vecDepartures <- which(rbinom(nElig, 1, ratesElig) == 1)
+            if (length(vecDepartures) > 0) {
+                idsDpt <- idsElig[vecDepartures]
+                nDepartures <- sum(group[idsDpt] == 1)
+                nDeparturesG2 <- sum(group[idsDpt] == 2)
+                dat$attr$active[idsDpt] <- 0
+            }
+        } else {
+            nDepartures <- min(round(sum(ratesElig[gElig == 1])), sum(gElig == 1))
+            dat$attr$active[ssample(idsElig[gElig == 1], nDepartures)] <- 0
+            if (groups == 2) {
+                nDeparturesG2 <- min(round(sum(ratesElig[gElig == 2])), sum(gElig == 2))
+                dat$attr$active[ssample(idsElig[gElig == 2], nDeparturesG2)] <- 0
+            }
+        }
+    }
+    
+    if (at == 2) {
+        dat$epi$dr.flow <- c(0, nDepartures)
+        if (groups == 2) {
+            dat$epi$dr.flow.g2 <- c(0, nDeparturesG2)
+        }
+    } else {
+        dat$epi$dr.flow[at] <- nDepartures
+        if (groups == 2) {
+            dat$epi$dr.flow.g2[at] <- nDeparturesG2
+        }
+    }
+    
+    return(dat)
+}
\ No newline at end of file
diff --git a/R/internal_update_status.R b/R/internal_update_status.R
new file mode 100644
index 0000000..dfa4e69
--- /dev/null
+++ b/R/internal_update_status.R
@@ -0,0 +1,74 @@
+# Needed for recovery.FUN --------------------------------------------------------------
+update_status <- function(rate, rand, active, status, label, state, at, prog, expTime = NULL, prog.dist.scale = NULL, prog.dist.shape = NULL){
+    
+    smp_sz <- 0
+    at_idx <- NULL
+    
+    idsElig <- which(active == 1 & status %in% label)
+    nElig <- length(idsElig)
+    
+    if (nElig > 0) {
+        gElig <- rep(1, nElig)
+        
+        if (rand) {
+            vecProg <- which(stats::rbinom(nElig, 1, rate) == 1)
+            if (length(vecProg) > 0) {
+                at_idx <- idsElig[vecProg]
+                smp_sz <- length(at_idx)
+                status[at_idx] <- state
+            }
+        }else{
+            do_sample <- TRUE
+            if(!prog){
+                smp_sz <- min(round(sum(rates[gElig == 1])), sum(gElig == 1))
+                smp_prob <- NULL
+            }else{
+                vecTimeSinceExp <- at - expTime[idsElig]
+                vecTimeSinceExp[is.na(vecTimeSinceExp)] <- 0
+                gammaRatesElig <- stats::pweibull(vecTimeSinceExp, prog.dist.shape, scale=prog.dist.scale)
+                smp_sz <- round(sum(gammaRatesElig[gElig == 1], na.rm=TRUE)) 
+                smp_prob <- gammaRatesElig[gElig == 1]
+                if(smp_sz <= 0) do_sample <- FALSE
+            }
+            
+            if(do_sample){
+                at_idx <- EpiModel::ssample(idsElig[gElig == 1], smp_sz, prob = smp_prob)
+                status[at_idx] <- state
+            }
+            
+            
+        }
+        
+    }
+    
+    list(smp_sz, at_idx, status)
+}
+
+# Needed for departures.FUN ------------------------------------------------------------
+update_active <- function(rate, rand, active, status, label){
+    
+    smp_sz <- 0
+    act_idx <- NULL
+    
+    idsElig <- which(active == 1 & status == label)
+    nElig <- length(idsElig)
+    
+    if (nElig > 0) {
+        
+        gElig <- rep(1, nElig)
+        
+        if (rand) {
+            vec <- which(stats::rbinom(nElig, 1, rate) == 1)
+            
+            if (length(vec) > 0) {
+                act_idx <- idsElig[vec]
+                smp_sz <- length(act_idx)
+            }
+        } else {
+            smp_sz <- min(round(sum(rate[gElig == 1])), sum(gElig == 1))
+            act_idx <- EpiModel::ssample(idsElig[gElig == 1], smp_sz)
+        }
+    }
+    
+    return(list(smp_sz, act_idx))
+}
\ No newline at end of file
diff --git a/R/mod_vital.R b/R/mod_vital.R
index 7082e67..43d7f7b 100644
--- a/R/mod_vital.R
+++ b/R/mod_vital.R
@@ -1,273 +1,3 @@
-#' Departures function
-#'
-#' Function to handel background demographics for the SEIQHRF model.
-#' Specifically departures (deaths not due to the virus, and emigration).
-#'
-#' @param dat Merged input parameters.
-#' @param at Step number
-#'
-#' @return Updated dat
-#' @export
-departures.FUN <- function(dat, at) {
-
-  # Conditions --------------------------------------------------------------
-  if (dat$param$vital == FALSE) {
-    return(dat)
-  }
-
-
-  # Variables ---------------------------------------------------------------
-  groups <- dat$param$groups
-  group <- dat$attr$group
-
-
-  # Susceptible departures ------------------------------------------------------
-  nDepartures <- nDeparturesG2 <- 0
-  idsElig <- which(dat$attr$active == 1 & dat$attr$status == "s")
-  nElig <- length(idsElig)
-  if (nElig > 0) {
-
-    gElig <- group[idsElig]
-    rates <- c(dat$param$ds.rate, dat$param$ds.rate.g2)
-    ratesElig <- rates[gElig]
-
-    if (dat$control$d.rand == TRUE) {
-      vecDepartures <- which(rbinom(nElig, 1, ratesElig) == 1)
-      if (length(vecDepartures) > 0) {
-        idsDpt <- idsElig[vecDepartures]
-        nDepartures <- sum(group[idsDpt] == 1)
-        nDeparturesG2 <- sum(group[idsDpt] == 2)
-        dat$attr$active[idsDpt] <- 0
-      }
-    } else {
-      nDepartures <- min(round(sum(ratesElig[gElig == 1])), sum(gElig == 1))
-      dat$attr$active[ssample(idsElig[gElig == 1], nDepartures)] <- 0
-      if (groups == 2) {
-        nDeparturesG2 <- min(round(sum(ratesElig[gElig == 2])), sum(gElig == 2))
-        dat$attr$active[ssample(idsElig[gElig == 2], nDeparturesG2)] <- 0
-      }
-    }
-  }
-
-  if (at == 2) {
-    dat$epi$ds.flow <- c(0, nDepartures)
-    if (groups == 2) {
-      dat$epi$ds.flow.g2 <- c(0, nDeparturesG2)
-    }
-  } else {
-    dat$epi$ds.flow[at] <- nDepartures
-    if (groups == 2) {
-      dat$epi$ds.flow.g2[at] <- nDeparturesG2
-    }
-  }
-
-# Exposed Departures ---------------------------------------------------------
-  nDepartures <- nDeparturesG2 <- 0
-  idsElig <- which(dat$attr$active == 1 & dat$attr$status == "e")
-  nElig <- length(idsElig)
-  if (nElig > 0) {
-
-    gElig <- group[idsElig]
-    rates <- c(dat$param$de.rate, dat$param$de.rate.g2)
-    ratesElig <- rates[gElig]
-
-    if (dat$control$d.rand == TRUE) {
-      vecDepartures <- which(rbinom(nElig, 1, ratesElig) == 1)
-      if (length(vecDepartures) > 0) {
-        idsDpt <- idsElig[vecDepartures]
-        nDepartures <- sum(group[idsDpt] == 1)
-        nDeparturesG2 <- sum(group[idsDpt] == 2)
-        dat$attr$active[idsDpt] <- 0
-      }
-    } else {
-      nDepartures <- min(round(sum(ratesElig[gElig == 1])), sum(gElig == 1))
-      dat$attr$active[ssample(idsElig[gElig == 1], nDepartures)] <- 0
-      if (groups == 2) {
-        nDeparturesG2 <- min(round(sum(ratesElig[gElig == 2])), sum(gElig == 2))
-        dat$attr$active[ssample(idsElig[gElig == 2], nDeparturesG2)] <- 0
-      }
-    }
-  }
-
-  if (at == 2) {
-    dat$epi$de.flow <- c(0, nDepartures)
-    if (groups == 2) {
-      dat$epi$de.flow.g2 <- c(0, nDeparturesG2)
-    }
-  } else {
-    dat$epi$de.flow[at] <- nDepartures
-    if (groups == 2) {
-      dat$epi$de.flow.g2[at] <- nDeparturesG2
-    }
-  }
-
-
-  # Infected Departures ---------------------------------------------------------
-  nDepartures <- nDeparturesG2 <- 0
-  idsElig <- which(dat$attr$active == 1 & dat$attr$status == "i")
-  nElig <- length(idsElig)
-  if (nElig > 0) {
-
-    gElig <- group[idsElig]
-    rates <- c(dat$param$di.rate, dat$param$di.rate.g2)
-    ratesElig <- rates[gElig]
-
-    if (dat$control$d.rand == TRUE) {
-      vecDepartures <- which(rbinom(nElig, 1, ratesElig) == 1)
-      if (length(vecDepartures) > 0) {
-        idsDpt <- idsElig[vecDepartures]
-        nDepartures <- sum(group[idsDpt] == 1)
-        nDeparturesG2 <- sum(group[idsDpt] == 2)
-        dat$attr$active[idsDpt] <- 0
-      }
-    } else {
-      nDepartures <- min(round(sum(ratesElig[gElig == 1])), sum(gElig == 1))
-      dat$attr$active[ssample(idsElig[gElig == 1], nDepartures)] <- 0
-      if (groups == 2) {
-        nDeparturesG2 <- min(round(sum(ratesElig[gElig == 2])), sum(gElig == 2))
-        dat$attr$active[ssample(idsElig[gElig == 2], nDeparturesG2)] <- 0
-      }
-    }
-  }
-
-  if (at == 2) {
-    dat$epi$di.flow <- c(0, nDepartures)
-    if (groups == 2) {
-      dat$epi$di.flow.g2 <- c(0, nDeparturesG2)
-    }
-  } else {
-    dat$epi$di.flow[at] <- nDepartures
-    if (groups == 2) {
-      dat$epi$di.flow.g2[at] <- nDeparturesG2
-    }
-  }
-
-  # Quarantined Departures ---------------------------------------------------------
-  nDepartures <- nDeparturesG2 <- 0
-  idsElig <- which(dat$attr$active == 1 & dat$attr$status == "q")
-  nElig <- length(idsElig)
-  if (nElig > 0) {
-
-    gElig <- group[idsElig]
-    rates <- c(dat$param$dq.rate, dat$param$dq.rate.g2)
-    ratesElig <- rates[gElig]
-
-    if (dat$control$d.rand == TRUE) {
-      vecDepartures <- which(rbinom(nElig, 1, ratesElig) == 1)
-      if (length(vecDepartures) > 0) {
-        idsDpt <- idsElig[vecDepartures]
-        nDepartures <- sum(group[idsDpt] == 1)
-        nDeparturesG2 <- sum(group[idsDpt] == 2)
-        dat$attr$active[idsDpt] <- 0
-      }
-    } else {
-      nDepartures <- min(round(sum(ratesElig[gElig == 1])), sum(gElig == 1))
-      dat$attr$active[ssample(idsElig[gElig == 1], nDepartures)] <- 0
-      if (groups == 2) {
-        nDeparturesG2 <- min(round(sum(ratesElig[gElig == 2])), sum(gElig == 2))
-        dat$attr$active[ssample(idsElig[gElig == 2], nDeparturesG2)] <- 0
-      }
-    }
-  }
-
-  if (at == 2) {
-    dat$epi$dq.flow <- c(0, nDepartures)
-    if (groups == 2) {
-      dat$epi$dq.flow.g2 <- c(0, nDeparturesG2)
-    }
-  } else {
-    dat$epi$dq.flow[at] <- nDepartures
-    if (groups == 2) {
-      dat$epi$dq.flow.g2[at] <- nDeparturesG2
-    }
-  }
-
-  # Hospitalised Departures ---------------------------------------------------------
-  nDepartures <- nDeparturesG2 <- 0
-  idsElig <- which(dat$attr$active == 1 & dat$attr$status == "h")
-  nElig <- length(idsElig)
-  if (nElig > 0) {
-
-    gElig <- group[idsElig]
-    rates <- c(dat$param$dh.rate, dat$param$dh.rate.g2)
-    ratesElig <- rates[gElig]
-
-    if (dat$control$d.rand == TRUE) {
-      vecDepartures <- which(rbinom(nElig, 1, ratesElig) == 1)
-      if (length(vecDepartures) > 0) {
-        idsDpt <- idsElig[vecDepartures]
-        nDepartures <- sum(group[idsDpt] == 1)
-        nDeparturesG2 <- sum(group[idsDpt] == 2)
-        dat$attr$active[idsDpt] <- 0
-      }
-    } else {
-      nDepartures <- min(round(sum(ratesElig[gElig == 1])), sum(gElig == 1))
-      dat$attr$active[ssample(idsElig[gElig == 1], nDepartures)] <- 0
-      if (groups == 2) {
-        nDeparturesG2 <- min(round(sum(ratesElig[gElig == 2])), sum(gElig == 2))
-        dat$attr$active[ssample(idsElig[gElig == 2], nDeparturesG2)] <- 0
-      }
-    }
-  }
-
-  if (at == 2) {
-    dat$epi$dh.flow <- c(0, nDepartures)
-    if (groups == 2) {
-      dat$epi$dh.flow.g2 <- c(0, nDeparturesG2)
-    }
-  } else {
-    dat$epi$dh.flow[at] <- nDepartures
-    if (groups == 2) {
-      dat$epi$dh.flow.g2[at] <- nDeparturesG2
-    }
-  }
-
-
-  # Recovered Departures --------------------------------------------------------
-  nDepartures <- nDeparturesG2 <- 0
-  idsElig <- which(dat$attr$active == 1 & dat$attr$status == "r")
-  nElig <- length(idsElig)
-  if (nElig > 0) {
-
-    gElig <- group[idsElig]
-    rates <- c(dat$param$dr.rate, dat$param$dr.rate.g2)
-    ratesElig <- rates[gElig]
-
-    if (dat$control$d.rand == TRUE) {
-      vecDepartures <- which(rbinom(nElig, 1, ratesElig) == 1)
-      if (length(vecDepartures) > 0) {
-        idsDpt <- idsElig[vecDepartures]
-        nDepartures <- sum(group[idsDpt] == 1)
-        nDeparturesG2 <- sum(group[idsDpt] == 2)
-        dat$attr$active[idsDpt] <- 0
-      }
-    } else {
-      nDepartures <- min(round(sum(ratesElig[gElig == 1])), sum(gElig == 1))
-      dat$attr$active[ssample(idsElig[gElig == 1], nDepartures)] <- 0
-      if (groups == 2) {
-        nDeparturesG2 <- min(round(sum(ratesElig[gElig == 2])), sum(gElig == 2))
-        dat$attr$active[ssample(idsElig[gElig == 2], nDeparturesG2)] <- 0
-      }
-    }
-  }
-
-  if (at == 2) {
-    dat$epi$dr.flow <- c(0, nDepartures)
-    if (groups == 2) {
-      dat$epi$dr.flow.g2 <- c(0, nDeparturesG2)
-    }
-  } else {
-    dat$epi$dr.flow[at] <- nDepartures
-    if (groups == 2) {
-      dat$epi$dr.flow.g2[at] <- nDeparturesG2
-    }
-  }
-
-  return(dat)
-}
-
-
-
 #' Arrivals function
 #'
 #' Function to handel background demographics for the SEIQHRF model.
diff --git a/R/recovery.FUN.R b/R/recovery.FUN.R
index 37af740..7bf3df6 100644
--- a/R/recovery.FUN.R
+++ b/R/recovery.FUN.R
@@ -1,50 +1,3 @@
-# internal function --------------------------------------------------------------
-update_status <- function(rate, rand, active, status, label, state, at, prog, expTime = NULL, prog.dist.scale = NULL, prog.dist.shape = NULL){
-  
-  smp_sz <- 0
-  at_idx <- NULL
-  
-  idsElig <- which(active == 1 & status %in% label)
-  nElig <- length(idsElig)
-  
-  if (nElig > 0) {
-    gElig <- rep(1, nElig)
-    
-    if (rand) {
-      vecProg <- which(stats::rbinom(nElig, 1, rate) == 1)
-      if (length(vecProg) > 0) {
-        at_idx <- idsElig[vecProg]
-        smp_sz <- length(at_idx)
-        status[at_idx] <- state
-      }
-    }else{
-      do_sample <- TRUE
-      if(!prog){
-        smp_sz <- min(round(sum(rates[gElig == 1])), sum(gElig == 1))
-        smp_prob <- NULL
-      }else{
-        vecTimeSinceExp <- at - expTime[idsElig]
-        vecTimeSinceExp[is.na(vecTimeSinceExp)] <- 0
-        gammaRatesElig <- stats::pweibull(vecTimeSinceExp, prog.dist.shape, scale=prog.dist.scale)
-        smp_sz <- round(sum(gammaRatesElig[gElig == 1], na.rm=TRUE)) 
-        smp_prob <- gammaRatesElig[gElig == 1]
-        if(smp_sz <= 0) do_sample <- FALSE
-      }
-      
-      if(do_sample){
-        at_idx <- EpiModel::ssample(idsElig[gElig == 1], smp_sz, prob = smp_prob)
-        status[at_idx] <- state
-      }
-      
-      
-    }
-    
-  }
-  
-  list(smp_sz, at_idx, status)
-}
-
-
 #' Progress icm
 #'
 #' Function to get progress of icms
@@ -73,14 +26,9 @@ recovery.FUN <- function(dat, at, seed = NULL) {
   # Variables ---------------------------------------------------------------------------
   active <- dat$attr$active
   status <- dat$attr$status
-  
   groups <- dat$param$groups
   group <- dat$attr$group
-  
   type <- dat$control$type
-  recovState <- ifelse(type %in% c("SIR", "SEIR", "SEIQHR", "SEIQHRF"), "r", "s")
-  hospState <- "h"
-  fatState <- "f"
   
   # ------------------------- progress from exposed to infectious --------------------------
   res <- update_status(rate = dat$param$prog.rate,
diff --git a/man/departures.FUN.Rd b/man/departures.FUN.Rd
index 6175e9f..2231f95 100644
--- a/man/departures.FUN.Rd
+++ b/man/departures.FUN.Rd
@@ -1,15 +1,17 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/mod_vital.R
+% Please edit documentation in R/departure.FUN.R
 \name{departures.FUN}
 \alias{departures.FUN}
 \title{Departures function}
 \usage{
-departures.FUN(dat, at)
+departures.FUN(dat, at, seed = NULL)
 }
 \arguments{
 \item{dat}{Merged input parameters.}
 
 \item{at}{Step number}
+
+\item{seed}{random seed for checking consistency}
 }
 \value{
 Updated dat
diff --git a/man/recovery.FUN.Rd b/man/recovery.FUN.Rd
index 0f81dc3..47e6150 100644
--- a/man/recovery.FUN.Rd
+++ b/man/recovery.FUN.Rd
@@ -1,5 +1,5 @@
 % Generated by roxygen2: do not edit by hand
-% Please edit documentation in R/mod_status.R
+% Please edit documentation in R/recovery.FUN.R
 \name{recovery.FUN}
 \alias{recovery.FUN}
 \title{Progress icm}
diff --git a/tests/testthat/test-departures.R b/tests/testthat/test-departures.R
new file mode 100644
index 0000000..6aca443
--- /dev/null
+++ b/tests/testthat/test-departures.R
@@ -0,0 +1,21 @@
+test_that("Identical output as Churches' original function: departures.FUN", {
+    
+    at <- 2
+    dat <- do.call(initialize.FUN, set_param())
+    dat <- do.call(infection.FUN, list(dat, at))
+    dat <- do.call(recovery.FUN, list(dat, at))
+    
+    No_seeds <- 10
+    seed_list <- sample(1:1000, No_seeds)
+    comp <- rep(NA, No_seeds)
+    i <- 1
+    for(seed in seed_list){
+        dat1 <- do.call(departures.FUN, list(dat, at, seed))
+        dat2 <- do.call(departures.seiqhrf.icm, list(dat, at, seed))
+        comp[i] <- identical(dat1, dat2)
+        i <- i + 1
+        rm(.Random.seed)
+    }
+    
+    expect_equal(sum(comp), No_seeds)
+})
\ No newline at end of file
-- 
GitLab