## ----include = FALSE----------------------------------------------------------
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  eval = FALSE  # requires funz-fz Python package and a configured calculator
)

## ----setup--------------------------------------------------------------------
#  library(fz)

## ----install------------------------------------------------------------------
#  # Install the funz-fz Python package into the active reticulate environment
#  fz_install()
#  
#  # Verify
#  fz_available()

## ----model_dict---------------------------------------------------------------
#  model <- list(
#    varprefix    = "$",
#    delim        = "{}",
#    formulaprefix = "@",
#    commentline  = "#",
#    output = list(
#      pressure = "grep 'pressure =' output.txt | cut -d= -f2"
#    )
#  )

## ----model_alias--------------------------------------------------------------
#  fzl()$models  # lists installed aliases, e.g. "PerfectGas"

## ----fzi----------------------------------------------------------------------
#  vars <- fzi("input.txt", model)
#  # $P [1] 1.013
#  # $V [1] 22.4
#  # $n [1] 1.0

## ----fzc_single---------------------------------------------------------------
#  # Single case
#  fzc("input.txt", list(P = 2.0, V = 11.2), model, output_dir = "compiled")
#  # writes: compiled/P=2,V=11.2/input.txt  (placeholder replaced with 2.0 / 11.2)

## ----fzc_grid-----------------------------------------------------------------
#  # 2 x 3 = 6 cases
#  fzc("input.txt",
#      list(P = c(1.0, 2.0), V = c(10.0, 20.0, 30.0)),
#      model,
#      output_dir = "compiled")

## ----fzr----------------------------------------------------------------------
#  results <- fzr(
#    "input.txt",
#    list(P = c(1.0, 2.0, 3.0), V = 22.4),   # 3 cases (V fixed)
#    model,
#    results_dir = "results",
#    calculators = "sh://bash run.sh"           # run.sh executes the simulator
#  )
#  
#  # results is a data frame:
#  #     P    V  pressure
#  # 1  1.0  22.4   ...
#  # 2  2.0  22.4   ...
#  # 3  3.0  22.4   ...

## ----fzo----------------------------------------------------------------------
#  values <- fzo("results/P=2,V=22.4", model)
#  # $pressure [1] "2.026"
#  
#  # Glob to read all cases at once:
#  all_values <- fzo("results/*", model)

## ----fzd----------------------------------------------------------------------
#  result <- fzd(
#    "input.txt",
#    list(P = "[1;5]", V = "[10;30]"),
#    model,
#    output_expression = "pressure",
#    algorithm         = "algorithms/montecarlo_uniform.py",
#    algorithm_options = "batch_sample_size=10;max_iterations=5;seed=42"
#  )

## ----fzl----------------------------------------------------------------------
#  info <- fzl()
#  names(info$models)       # e.g. c("PerfectGas", "Moret")
#  names(info$calculators)  # e.g. c("sh://")
#  
#  # Filter by pattern
#  fzl(models = "Perfect*")
#  
#  # Probe calculators to verify they are reachable
#  fzl(check = TRUE)

## ----save_results-------------------------------------------------------------
#  saveRDS(results, "fz_results.rds")
#  write.csv(results, "fz_results.csv", row.names = FALSE)

## ----troubleshoot_install-----------------------------------------------------
#  fz_install()         # install funz-fz into the reticulate environment
#  fz_available()       # should return TRUE afterwards

## ----session_info-------------------------------------------------------------
#  sessionInfo()

