#   expo_growth_perc_increase_model <- function(starting, perc_increase, total_months_to_model, value_nm="linear_growth", value_only=FALSE) {
#     # x_0 * r ^ (t / T)
#   
#     perc_increase <- validPercentage(x=perc_increase, min=0, max=1)
#   
#     x_0 <- starting
#     r <- 1 + perc_increase
#     # T <- doubles_every
#   
#     t <- if (length(total_months_to_model) > 1) total_months_to_model else (seq.int(total_months_to_model) - 1)
#   
#     # starting * 2 ^ (total_months_to_model / doubles_every)
#     # ret <- data.table(months_out = t,  value=(t * perc_increase + starting), key="months_out")
#     ret <- data.table(months_out = t,  value=(x_0 * (r ^ t)), key="months_out")
#     setnames(ret, "value", value_nm)
#     if (value_only)
#       return(ret[[value_nm]])
#     return(ret)
#   }

expo_growth_doubling_model <- function(starting, doubles_every, total_months_to_model, value_nm="expo_growth", value_only=FALSE) {
  # x_0 * r ^ (t / T)

  x_0 <- starting
  r <- 2
  T <- doubles_every

  t <- if (length(total_months_to_model) > 1) total_months_to_model else (seq.int(total_months_to_model) - 1)

  # starting * 2 ^ (total_months_to_model / doubles_every)
  ret <- data.table(months_out = t,  value=(x_0 * (r ^ (t / T))), key="months_out")
  setnames(ret, "value", value_nm)
  if (value_only)
    return(ret[[value_nm]])
  return(ret)
}

linear_growth_model <- function(starting, perc_increase, total_months_to_model, decay_of_rate=1, value_nm="linear_growth", include_expo=FALSE, include_none_decay=FALSE, value_only=FALSE) {
  # x_0 * r ^ (t / T)

  perc_increase <- validPercentage(x=perc_increase, min=0, max=1)

  x_0 <- starting
  r.expo <- 1 + perc_increase
  r <- perc_increase * starting
  # r <- (perc_increase * (1-decay_of_rate) ^ seq.int(total_months_to_model)) * starting
  # T <- doubles_every

  t <- if (length(total_months_to_model) > 1) total_months_to_model else (seq.int(total_months_to_model) - 1)

  # starting * 2 ^ (total_months_to_model / doubles_every)
  # ret <- data.table(months_out = t,  value=(t * perc_increase + starting), key="months_out")
  ret <- 
  {
      data.table(  months_out = t,  
                      value            = (x_0 + (r * t * (1-decay_of_rate) ^ t)),
                      value_none_decay = (x_0 + (r * t)),  
                      value_expo       = (x_0 * (r.expo ^ t))
                  , key="months_out")
  }

  ## It's easier to calculate the expo growth then drop the column
  if (!include_expo)
    ret[, value_expo := NULL]
  if (!include_none_decay)
    ret[, value_none_decay := NULL]

  setnames(ret, "value", value_nm)
  if (value_only)
    return(ret[[value_nm]])
  return(ret)
}
