## ----setup, include=FALSE-----------------------------------------------------
knitr::opts_chunk$set(collapse = TRUE, comment = "#>")

## ----benchmark----------------------------------------------------------------
library(likelihood.contr)
library(likelihood.model)
set.seed(20261028)
deadline <- 2
latent <- rexp(1000, rate = 1)
requests <- data.frame(seconds = pmin(latent, deadline),
  status = ifelse(latent <= deadline, "exact", "right"))
model <- likelihood_contr("status",
  exact = contr_name("exp", "exact", "seconds"),
  right = contr_name("exp", "right", "seconds"))
rate <- sum(requests$status == "exact") / sum(requests$seconds)
fitted <- fit(model)(requests, c(rate = rate))
stopifnot(fitted$converged, abs(unname(coef(fitted)) - rate) < 1e-5)
data.frame(
  completed_only_p95 = unname(quantile(requests$seconds[requests$status == "exact"], .95)),
  model_p95 = qexp(.95, rate = coef(fitted)),
  simulation_truth_p95 = qexp(.95, rate = 1))

## ----slo----------------------------------------------------------------------
slo <- 1.5
met_slo <- requests$status == "exact" & requests$seconds <= slo
c(slo_seconds = slo, observed_fraction_meeting_slo = mean(met_slo),
  timeout_fraction = mean(requests$status == "right"))

## ----histogram----------------------------------------------------------------
bins <- data.frame(lo = c(0, .5, 1, 2), hi = c(.5, 1, 2, Inf),
                   count = c(390, 240, 230, 140), status = "interval")
grouped <- likelihood_contr("status",
  interval = contr_freq(contr_name("exp", "interval", "lo", "hi"), "count"))
ll <- loglik(grouped)
# Explicit positive-domain parameterization; no automatic domain guessing.
solution <- optimize(function(log_rate) ll(bins, c(rate = exp(log_rate))),
                     c(-5, 5), maximum = TRUE)
exp(solution$maximum)

