source("ols_lfn.R")
source("simulated_setup.R")

cat("Kick the tyres --\n")
atheta <- c(3,4,5)
res <- c(ols.lf1(atheta, y, X),
         ols.lf1.inlogs(c(log(atheta[1]), 4, 5), y, X),
         ols.lf2(atheta, y, X),
         ols.lf3(atheta, y, X))

atheta <- theta.true
res <- rbind(res,
             c(ols.lf1(atheta, y, X),
               ols.lf1.inlogs(c(log(atheta[1]), atheta[-1]), y, X),
               ols.lf2(atheta, y, X),
               ols.lf3(atheta, y, X)))

atheta <- theta.ols
res <- rbind(res,
             c(ols.lf1(atheta, y, X),
               ols.lf1.inlogs(c(log(atheta[1]), atheta[-1]), y, X),
               ols.lf2(atheta, y, X),
               ols.lf3(atheta, y, X)))

measurement <- function(f) {
  N <- 200
  cost <- system.time(
                      for (i in 1:N) {
                        j <- f(atheta, y, X)
                      }
                      )
  return(cost[1]*1000/N)                # cost per lf in milliseconds
}

# Make a row in the table for cost (in milliseconds)
cost <- numeric(4)
cost[1] <- measurement(ols.lf1)
cost[2] <- measurement(ols.lf1.inlogs)
cost[3] <- measurement(ols.lf2)
cost[4] <- measurement(ols.lf3)

res <- rbind(res, t(cost))
rownames(res) <- c("A weird theta", "True theta", "OLS theta", "Cost (ms)")
colnames(res) <- c("lf1()", "lf1() in logs", "lf2()", "lf3()")
print(res)

cat("\nDerivatives -- first let me do numerically --\n")
atheta <- c(2.1,4,6)                         # A point at which to play.
base.value <- ols.lf1(atheta, y, X)
h <- 1e-5
cat("  Derivative in sigma     -- ",
    (ols.lf1(atheta+c(h,0,0), y, X)-base.value)/h, "\n")
cat("  Derivative in intercept --",
    (ols.lf1(atheta+c(0,h,0), y, X)-base.value)/h, "\n")
cat("  Derivative in slope     --",
    (ols.lf1(atheta+c(0,0,h), y, X)-base.value)/h, "\n")

g <- ols.gradient(atheta, y, X)
cat("  Analytical derivative in sigma --", g[1], "\n")
cat("  Analytical derivative in beta  --", g[-1], "\n")