### internal function

set_param <- function(type = "SEIQHRF",
                      nsteps = 366,
                      nsims = 8,
                      ncores = 4,
                      prog.rand = FALSE,
                      quar.rand = TRUE,
                      hosp.rand = TRUE,
                      disch.rand = TRUE,
                      rec.rand = TRUE,
                      arec.rand = TRUE,
                      fat.rand = TRUE,
                      infection.FUN = 'infection.FUN',  # infection.seiqhrf.icm,
                      recovery.FUN = 'recovery.FUN', # progress.seiqhrf.icm,
                      departures.FUN = 'departures.FUN', # departures.seiqhrf.icm,
                      arrivals.FUN = 'arrivals.FUN', # arrivals.seiqhrf.icm,
                      get_prev.FUN =  'get_prev.FUN', # get_prev.seiqhrf.icm,
                      # init.icm params
                      s.num = 9997,
                      e.num=0,
                      i.num = 3,
                      q.num=0,
                      h.num=0,
                      r.num = 0,
                      f.num = 0,
                      # param.icm params
                      inf.prob.e = 0.02,
                      act.rate.e = 10,
                      inf.prob.i = 0.05,
                      act.rate.i = 10,
                      inf.prob.q = 0.02,
                      act.rate.q = 2.5,
                      prog.rate = 1/10,
                      quar.rate = 1/30,
                      hosp.rate = 1/100,
                      disch.rate = 1/15,
                      rec.rate = 0.071,  
                      arec.rate = 0.05,
                      prog.dist.scale = 5,
                      prog.dist.shape = 1.5,
                      quar.dist.scale = 1,
                      quar.dist.shape = 1,
                      hosp.dist.scale = 1,
                      hosp.dist.shape = 1,
                      disch.dist.scale = 1,
                      disch.dist.shape = 1,
                      rec.dist.scale = 35,
                      rec.dist.shape = 1.5,
                      arec.dist.scale = 35,
                      arec.dist.shape = 1.5,
                      fat.rate.base = 1/50,
                      hosp.cap = 40,
                      fat.rate.overcap = 1/25,
                      fat.tcoeff = 0.5,
                      vital = TRUE,
                      a.rate = (10.5/365)/1000,
                      a.prop.e = 0.01,
                      a.prop.i = 0.001,
                      a.prop.q = 0.01,
                      ds.rate = (7/365)/1000,
                      de.rate = (7/365)/1000,
                      di.rate = (7/365)/1000,
                      dq.rate = (7/365)/1000,
                      dh.rate = (20/365)/1000,
                      dr.rate = (7/365)/1000,
                      out="mean"
) {
    
    control <- control.icm(type = type,
                           nsteps = nsteps,
                           nsims = nsims,
                           ncores = ncores,
                           prog.rand = prog.rand,
                           quar.rand = quar.rand, 
                           hosp.ramd = hosp.rand, 
                           disch.rand = disch.rand, 
                           rec.rand = rec.rand,
                           arec.rand = arec.rand, 
                           infection.FUN = infection.FUN,
                           recovery.FUN = recovery.FUN,
                           arrivals.FUN = arrivals.FUN,
                           departures.FUN = departures.FUN,
                           get_prev.FUN = get_prev.FUN)
    
    init <- EpiModel::init.icm(s.num = s.num,
                               e.num = e.num,
                               i.num = i.num,
                               q.num = q.num,
                               h.num = h.num,
                               r.num = r.num,
                               f.num = f.num)
    
    param <- EpiModel::param.icm(inf.prob.e = inf.prob.e,
                                 act.rate.e = act.rate.e,
                                 inf.prob.i = inf.prob.i,
                                 act.rate.i = act.rate.i,
                                 inf.prob.q = inf.prob.q,
                                 act.rate.q = act.rate.q,
                                 prog.rate = prog.rate,
                                 quar.rate = quar.rate,
                                 hosp.rate = hosp.rate,
                                 disch.rate = disch.rate,
                                 rec.rate = rec.rate,
                                 arec.rate = arec.rate,
                                 prog.dist.scale = prog.dist.scale,
                                 prog.dist.shape = prog.dist.shape,
                                 quar.dist.scale = quar.dist.scale,
                                 quar.dist.shape = quar.dist.shape,
                                 hosp.dist.scale = hosp.dist.scale,
                                 hosp.dist.shape = hosp.dist.shape,
                                 disch.dist.scale = disch.dist.scale,
                                 disch.dist.shape = disch.dist.shape,
                                 rec.dist.scale = rec.dist.scale,
                                 rec.dist.shape = rec.dist.shape,
                                 arec.dist.scale = arec.dist.scale,
                                 arec.dist.shape = arec.dist.shape,
                                 fat.rate.base = fat.rate.base,
                                 hosp.cap = hosp.cap,
                                 fat.rate.overcap = fat.rate.overcap,
                                 fat.tcoeff = fat.tcoeff,
                                 vital = vital,
                                 a.rate = a.rate,
                                 a.prop.e = a.prop.e,
                                 a.prop.i = a.prop.i,
                                 a.prop.q = a.prop.q,
                                 ds.rate = ds.rate,
                                 de.rate = de.rate,
                                 di.rate = di.rate,
                                 dq.rate = dq.rate,
                                 dh.rate = dh.rate,
                                 dr.rate = dr.rate)
    
    return(list(control = control, param = param, init = init))
}