library(lifecontingencies)

data("soa08Act")

#test access functions
f <- function(x)
  soa08Act@lx[which(soa08Act@x == x)] 

g <- function(j)
  if(soa08Act@x[1] == 0)
    soa08Act@lx[soa08Act@x[j+2]]
if(all(g(1:10) == sapply(1:10, f)))
{
  system.time(replicate(1e3, sapply(0:139, f)))
  system.time(replicate(1e3, g(0:139) ))
}

#test accuraccy
pXt <- Vectorize(lifecontingencies:::pxtold, "x")
pxT <- Vectorize(lifecontingencies:::pxtold, "t")
pxtvect <- pxt

#non-integer age
compalldigit <- function(x, t, fractional)
  print(
    cbind(x=x,
          new=pxtvect(soa08Act, x=x, t=t, fractional=fractional),
          old=pXt(object=soa08Act, x=x, t=t, fractional=fractional))
    , digits=22)

compalldigit(80+0:6/4, t=1, "exp")
compalldigit(80+0:6/4, t=1, "lin")
compalldigit(80+0:6/4, t=1, "hyp")



cbind(x=10+0:6/6, lx=g(10+0:6/6), pxtvect(soa08Act, x=10+0:6/6, t=1), pXt(object=soa08Act, x=10+0:6/6, t=1))

#high-age
cbind(x=135:145, lx=g(135:145), pxtvect(soa08Act, x=135:145, t=1), pXt(object=soa08Act, x=135:145, t=1))


#non consecutive age
x <- rpois(10, 45)
cbind(x=x, pxtvect(soa08Act, x=x, t=1), pXt(object=soa08Act, x=x, t=1))


checkvalx <- function(fractional)
{
  allfracage <- seq(1, 100, by=1/4)
  new <- pxtvect(soa08Act, x=allfracage, t=1/3, fractional = fractional)
  old <- pXt(object=soa08Act, x=allfracage, t=1/3, fractional = fractional)
  cbind("equal on all digit"=all(old == new), "equal with round off"=  sum(abs(old - new)) < 1e-6)
}  
checkvalt <- function(fractional)
{
  allfractime <- seq(1, 30, by=1/4)
  new <- pxtvect(soa08Act, x=2, t=allfractime, fractional = fractional)
  old <- pxT(object=soa08Act, x=2, t=allfractime, fractional = fractional)
  cbind("equal on all digit"=all(old == new), "equal with round off"=  sum(abs(old - new)) < 1e-6)
}

rbind("lin"=checkvalx("linear"), "harm"=checkvalx("harm"), "exp"=checkvalx("exp"))

rbind("lin"=checkvalt("linear"), "harm"=checkvalt("harm"), "exp"=checkvalt("exp"))


nrep <- 10
T1 <- system.time(replicate(nrep, pxtvect(soa08Act, x=1:130, t=1/2) ))
T2 <- system.time(replicate(nrep, pXt(soa08Act, x=1:130, t=1/2) ))

T3 <- system.time(replicate(nrep, pxtvect(soa08Act, x=1, t=1:130/2) ))
T4 <- system.time(replicate(nrep, pxT(soa08Act, x=1, t=1:130/2) ))

alltime <- rbind(T1, T2, T3, T4)[, 1:3]
#library(xtable);xtable(alltime, digits=3)
