###########################
# DEFINE HELPER FUNCTIONS #
###########################

# Helper for assignment of '.RDATA' files.
loadRData <- function(fileName) {
  load(fileName)
  get(ls()[ls() != "fileName"]) }

# Convert 'par$reftab' to appropriate format for upcoming merges.
refage_table <- function(tab, pint) {
  
  # Check if GO reference ages are provided.
  if (sum(tab$year == first(pint)) != 2) {
    print("Error: Uniquely specify all GO reference ages in parameter 'reftab'.")
    interrupt()
  }
  
  # Impute missing reference ages by year through LOCF method.
  tab %>% 
    mutate(year = factor(year, levels = pint)) %>% 
    complete(year, sex) %>%
    mutate(year = as.integer(as.character(year))) %>%
    group_by(sex) %>% 
    arrange(sex, year) %>% 
    impute_shd(refage ~ 1, backend = "VIM") %>% 
    mutate(type = "alt") %>% 
    group_by(sex) %>% 
    mutate(dage = refage - first(refage)) %>% 
    select(year, type, sex, dage) %>% 
    ungroup }

# Define function for extracting prediction errors from simple regression without 
# intercept.
psd <- function(fit, h) {
  
  return(glance(fit)$sigma * sqrt(1 + h^2 / sum(model.frame(fit)[, 2]^2)))
}

# Convenience function to produce differential effects between different 'par's.
compare_projections <- 
  function(par1, par2) {
    
    source("scripts/aux_fun.R", loc = TRUE)
    
    # Base run.
    print("Base run")
    par <- par1
    source("scripts/prepare_inputs.R", loc = TRUE)
    if (par1$cv)
      source("scripts/cv_out.R", loc = TRUE)
    source("scripts/proj_out.R", loc = TRUE)
    
    res_init <- 
      select(rtab, year, exp_init = ref)
    
    # Modified run.
    print("Modified run")
    par <- par2
    source("scripts/prepare_inputs.R", loc = TRUE)
    if (par2$cv)
      source("scripts/cv_out.R", loc = TRUE)
    source("scripts/proj_out.R", loc = TRUE)
    
    res_modi <- 
      select(rtab, year, exp_modi = ref)
    
    # Return comparison table ('par1' minus 'par2').
    return(
      left_join(res_init, res_modi, by = "year") %>% 
        mutate(cost_diff = exp_init - exp_modi) %>% 
        select(year, exp_init, exp_modi, cost_diff)
    )
  }