---
title: "Getting started with gsDesignTune"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Getting started with gsDesignTune}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include=FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  dev = "svg",
  fig.ext = "svg",
  fig.width = 7.2916667,
  fig.asp = 0.618,
  fig.align = "center",
  out.width = "80%"
)
```

This vignette demonstrates dependency-aware grid search over group sequential
designs using gsDesignTune.

```{r}
library(gsDesign)
library(gsDesignTune)
```

## Basic designs with `gsDesignTune()`

`gsDesignTune()` wraps `gsDesign::gsDesign()` for tuning basic group sequential
designs.

```{r}
job <- gsDesignTune(
  k = 3,
  test.type = 2,
  alpha = 0.025,
  beta = 0.10,
  timing = tune_values(list(c(0.33, 0.67, 1), c(0.5, 0.75, 1))),
  upper = SpendingFamily$new(
    SpendingSpec$new(sfLDOF, par = tune_fixed(0)),
    SpendingSpec$new(sfHSD, par = tune_seq(-4, 4, length_out = 3))
  )
)

job$run(strategy = "grid", parallel = FALSE)
res <- job$results()
job$table(n = 6)
```

### Ranking and filtering

```{r}
best <- job$best("final_n", direction = "min")
job$table(best, n = 10)
```

### Plot

```{r}
job$plot(metric = "final_n", x = "upper_par", color = "upper_fun")
```

## Survival designs with `gsSurvTune()`

`gsSurvTune()` wraps `gsDesign::gsSurv()` for tuning time-to-event designs.

```{r}
job_surv <- gsSurvTune(
  k = 3,
  test.type = 4,
  alpha = 0.025,
  beta = 0.10,
  timing = tune_values(list(c(0.33, 0.67, 1), c(0.5, 0.75, 1))),
  hr = tune_seq(0.60, 0.75, length_out = 3),
  upper = SpendingFamily$new(
    SpendingSpec$new(sfLDOF, par = tune_fixed(0)),
    SpendingSpec$new(sfHSD, par = tune_seq(-4, 4, length_out = 3))
  ),
  lower = SpendingSpec$new(sfLDOF, par = tune_fixed(0)),
  lambdaC = log(2) / 6,
  eta = 0.01,
  gamma = c(2.5, 5, 7.5, 10),
  R = c(2, 2, 2, 6),
  T = 18,
  minfup = 6,
  ratio = 1
)

job_surv$run(strategy = "grid", parallel = FALSE)
res_surv <- job_surv$results()
job_surv$table(n = 6)
```

### Calendar-timed analyses with `gsSurvCalendarTune()`

`gsSurvCalendarTune()` is similar to `gsSurvTune()`, but you specify planned
calendar times of analyses via `calendarTime` instead of information timing.

```{r}
job_cal <- gsSurvCalendarTune(
  test.type = 4,
  alpha = 0.025,
  beta = 0.10,
  calendarTime = tune_values(list(c(12, 24, 36), c(9, 18, 27))),
  spending = tune_choice("information", "calendar"),
  hr = tune_seq(0.60, 0.75, length_out = 3),
  upper = SpendingFamily$new(
    SpendingSpec$new(sfLDOF, par = tune_fixed(0)),
    SpendingSpec$new(sfHSD, par = tune_seq(-4, 4, length_out = 3))
  ),
  lower = SpendingSpec$new(sfLDOF, par = tune_fixed(0)),
  lambdaC = log(2) / 6,
  eta = 0.01,
  gamma = c(2.5, 5, 7.5, 10),
  R = c(2, 2, 2, 6),
  minfup = 18,
  ratio = 1
)

job_cal$run(strategy = "grid", parallel = FALSE)
res_cal <- job_cal$results()
job_cal$table(n = 6)
```

### Multi-scenario exploration

```{r}
best_surv <- job_surv$best("final_events", direction = "min")
job_surv$table(best_surv, n = 10)
```

```{r}
job_surv$plot(metric = "final_events", x = "hr", color = "upper_fun")
```

## Export a report

```{r}
report_path <- tempfile(fileext = ".html")
job_surv$report(report_path)
report_path
```
