
if(FALSE)
{  
  library(fitdistrplus)
  
  
  
  #(1) beta distribution
  #
  
  n <- 100
  set.seed(12345)
  x <- rbeta(n, 3, 3/4)
  
  psi <- function(x) digamma(x)
  grbetalnl <- function(x, a, b)
    c(log(x)-psi(a)+psi(a+b), log(1-x)-psi(b)+psi(a+b))
  #grbetalnl(x, 3, 4)
  grlnL <- function(par, obs, ...) 
    -rowSums(sapply(obs, function(x) grbetalnl(x, a=par[1], b=par[2])))
  #rowSums(sapply(x, function(x) grbetalnl(x, 3, 4)))
  #grlnL(c(3, 4), x)
  #grlnL(c(3, 3/4), x)
  
  
  constrOptim2 <- function(par, fn, gr=NULL, ui, ci, ...)
    constrOptim(theta=unlist(par), f=fn, grad=gr, ui=ui, ci=ci, ...)
  
  
  
  #control parameters
  ctr <- list(trace=3, REPORT=1, maxit=1000)
  ctr <- list(trace=0, REPORT=1, maxit=1000)
  
  bfgs_gr$time <- system.time(bfgs_gr <- mledist(x, dist="beta", optim.method="BFGS", gr=grlnL, control=ctr))[3]
  bfgs <- mledist(x, dist="beta", optim.method="BFGS", control=ctr)
  
  lbfgs_gr <- mledist(x, dist="beta", optim.method="L-BFGS-B", gr=grlnL, control=ctr, lower=c(0,0))
  lbfgs <- mledist(x, dist="beta", optim.method="L-BFGS-B", control=ctr, lower=c(0,0))
  
  cg_gr <- mledist(x, dist="beta", optim.method="CG", gr=grlnL, control=ctr)
  cg <- mledist(x, dist="beta", optim.method="CG", control=ctr)
  
  nm_gr <- mledist(x, dist="beta", optim.method="Nelder", gr=grlnL, control=ctr)
  nm <- mledist(x, dist="beta", optim.method="Nelder", control=ctr)
  
  constr_nm_gr <- mledist(x, dist="beta", custom.optim=constrOptim2,
                          ui = diag(2), ci = c(0, 0), optim.method="Nelder", gr=grlnL, control=ctr)
  constr_nm <- mledist(x, dist="beta", custom.optim=constrOptim2,
                       ui = diag(2), ci = c(0, 0), optim.method="Nelder", control=ctr)
  
  constr_bfgs_gr <- mledist(x, dist="beta", custom.optim=constrOptim2,
                            ui = diag(2), ci = c(0, 0), optim.method="BFGS", gr=grlnL, control=ctr)
  constr_bfgs <- mledist(x, dist="beta", custom.optim=constrOptim2,
                         ui = diag(2), ci = c(0, 0), optim.method="BFGS", control=ctr)
  
  constr_cg_gr <- mledist(x, dist="beta", custom.optim=constrOptim2,
                          ui = diag(2), ci = c(0, 0), optim.method="CG", gr=grlnL, control=ctr)
  constr_cg <- mledist(x, dist="beta", custom.optim=constrOptim2,
                       ui = diag(2), ci = c(0, 0), optim.method="CG", control=ctr)
  
  lnL <- function(par, fix.arg, obs, ddistnam) 
  {
    fitdistrplus:::loglikelihood(par, fix.arg, obs, ddistnam, weights = rep(1, NROW(obs))) 
  }
  
  
  constrOptim2(c(shape1=1, shape2=1), lnL, obs=x, fix.arg=NULL, ddistnam="dbeta",
               ui = diag(2), ci = c(0, 0))
  
  
  #no log
  dbeta3 <- function(x, shape1, shape2)
    dbeta(x, shape1, shape2)
  
  #Ripley trick : param transform
  dbeta2 <- function(x, shape1, shape2, log)
    dbeta(x, exp(shape1), exp(shape2), log=log)
  pbeta2 <- function(q, shape1, shape2, log.p)
    pbeta(q, exp(shape1), exp(shape2), log.p=log.p)
  
  bfgs2 <- mledist(x, dist="beta2", optim.method="BFGS", control=ctr, 
                   start=list(shape1=0, shape2=0))
  bfgs3 <- mledist(x, dist="beta3", optim.method="BFGS", control=ctr, 
                   start=list(shape1=1, shape2=1))
  
  
  
  
  getval <- function(x)
    c(x$estimate, loglik=x$loglik, x$counts)
  getval2 <- function(x)
    c(exp(x$estimate), loglik=x$loglik, x$counts)
  
  cbind(trueval=c(3, 3/4, lnL(c(3, 3/4), NULL, x, "dbeta"), NA, NA),
        NM=getval(nm), NMgrad=getval(nm_gr), 
        constr_NM=getval(constr_nm), constr_NMgrad=getval(constr_nm_gr),
        CG=getval(cg), CGgrad=getval(cg_gr), 
        constr_CG=getval(constr_cg), constr_CGgrad=getval(constr_cg_gr),
        BFGS=getval(bfgs), BFGSgrad=getval(bfgs_gr),
        constr_BFGS=getval(constr_bfgs), constr_BFGSgrad=getval(constr_bfgs_gr),
        BFGS_exp=getval2(bfgs2), BFGS_nolog=getval(bfgs3))
  
  
  
  llsurface(min.arg=c(0.1, 0.1), max.arg=c(7, 3), plot.arg=c("shape1", "shape2"),
            lseq=50, data=x, distr="beta")
  points(bfgs$estimate[1], bfgs$estimate[2], pch="+", col="red")
  points(3, 3/4, pch="x", col="green")
  
}
