---
title: "Using Optuna Dashboard with rCISSVAE"
date: "`r format(Sys.Date(), '%Y-%m-%d')`"
output: 
  rmarkdown::html_vignette:
    toc: true
    toc_depth: 2
    fig_width: 7
    fig_height: 5
    dpi: 600
vignette: >
  %\VignetteIndexEntry{Using Optuna Dashboard with rCISSVAE}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

## What is Optuna Dashboard? 

[Optuna dashboard](https://optuna-dashboard.readthedocs.io/en/latest/getting-started.html) is a visualization tool that allows you to view the history and results of optuna hyperparameter optimization studies. To install it, activate your `rCISSVAE` virtual environment and use `pip install optuna-dashboard` from command line. 

If you are using [Positron](https://positron.posit.co/welcome.html) as your IDE, you can install the Optuna Dashboard Extension and easily open optuna database files. For others, the simplest way to use Optuna Dashboard is from the command line. Please note that the command line version of Optuna Dashboard has some features that are not in the Extension. 

## Creating an Optuna Dashboard with the Autotune Function

The `autotune_cissvae()` function has an option for creating an Optuna Dashboard database. 

**In R:**  
```{r run_autotune, eval=FALSE}
library(tidyverse)
library(reticulate)
library(rCISSVAE)
library(kableExtra)

## Set the virtual environment
# reticulate::use_virtualenv("./.venv", required = TRUE)

## Load the data
data(df_missing)
data(clusters)

aut <- autotune_cissvae(
  data = df_missing,
  index_col = "index",
  clusters = clusters$clusters,
  n_trials = 3, ## Using low number of trials for demo
  study_name = "ShowOptunaDB",
  device_preference = "cpu",
  optuna_dashboard_db = "sqlite:///optuna_study_demo.db",  # Save results to database
  load_if_exists = TRUE, ## Set true to load and continue study if it exists
  seed = 42, 
  verbose = FALSE,
  
  ## Hyperparameter search space
  num_hidden_layers = c(2, 5),     # Try 2-5 hidden layers
  hidden_dims = c(64, 512),        # Layer sizes from 64 to 512
  latent_dim = c(10, 100),         # Latent dimension range
  latent_shared = c(TRUE, FALSE),
  output_shared = c(TRUE, FALSE),
  lr = 0.01,  # Learning rate range
  decay_factor = 0.99,
  beta = 0.01,  # KL weight range
  num_epochs = 5,                # Fixed epochs for demo
  batch_size = c(1000, 4000),     # Batch size options
  num_shared_encode = c(0, 1, 2, 3),
  num_shared_decode = c(0, 1, 2, 3),
  
  # Layer placement strategies - try different arrangements
  encoder_shared_placement = c("at_end", "at_start", "alternating", "random"),
  decoder_shared_placement = c("at_start", "at_end", "alternating", "random"),
  
  refit_patience = 2,        # Early stopping patience
  refit_loops = 10,                # Fixed refit loops
  epochs_per_loop = 5,   # Epochs per refit loop
  reset_lr_refit = FALSE
)

# Analyze results
imputed <- aut$imputed
best_model <- aut$model
results <- aut$results

# View best hyperparameters
print("Trial results:")
results |> kable() |>
  kable_styling(font_size=12)

```

```{r showres, echo=FALSE}
library(tidyverse)
results = readRDS(system.file("extdata", "autotune.rds", package = "rCISSVAE"))


print("Trial results:")
results |> kableExtra::kable() |>
  kableExtra::kable_styling(font_size=12)

```

To view the dashboard:

**From Command Line**
```{.bash}
optuna-dashboard "sqlite:///optuna_study_demo.db"
```

For more information see the [optuna dashboard documentation](https://optuna-dashboard.readthedocs.io/en/latest/getting-started.html).