Aligned with the funz-fz 1.2 release
(Funz/fz, 2026-09-04).
The win-builder incoming pre-tests for this version flagged two problems,
both fixed here (see "Fixes" below): the --run-donttest
AttributeError: module 'fz' has no attribute 'fzc' and the invalid
LICENSE.md file URI in README.md.
fzr() gains case_naming ("path" default, "hash", or "index") to
name each case's result/temp subdirectory. "hash"/"index" sidestep
filesystem name-length limits when a study has many variables and write a
cases.csv manifest at the results root.fzr(), fzc(), fzi() and fzd() gain input_static: a character
vector of files identical across every case (a shared reference dataset, a
weather CSV, ...). They are never templated or scanned for variables, never
re-hashed per case, and — for relative paths — symlinked into each case
directory instead of duplicated (and transferred to ssh:///slurm:///
funz:// calculators).fzd()'s output_expression now also accepts a character vector of
length > 1 for multi-objective algorithms (e.g. NSGA-II): each case yields
one scalar per expression. Vector-valued outputs can be reduced to a scalar
objective with mean(), sum(), len(), median(), stdev(),
variance(), indexing/slicing, and zip().fzr()'s timeout default (NULL) now documents the funz-fz 1.2
resolution order: the model's own "timeout" entry, then FZ_RUN_TIMEOUT
(raised to 1 hour in 1.2). An explicit timeout still wins.inst/examples/perfectgas/ (perfectgas.txt template + perfectgas.py
ideal-gas solver). The README and vignette now show a complete fzr()
parametric run driven by a real external program
(calculators = "sh://python3 perfectgas.py",
input_static = "perfectgas.py"), instead of a placeholder run.sh.
tests/testthat/test-perfectgas-example.R runs it end to end.fzo() documents the shell-free output extraction prefixes: python://,
jq://, yq://, xpath:// (and the explicit bash://). These are
portable on Windows without a bash install and preserve list results as
vectors; a plain shell command still simplifies a single-element result to
a scalar.fzo()/fzr() outputs may now resolve to a vector (time series, spectrum,
per-node profile), stored per case unmodified.fzd() accepts an R function as model, letting adaptive
design-of-experiments algorithms drive an R function directly instead of a
file-based model (input_path = NULL, output_expression optional). This
is available in funz-fz >= 1.2; earlier releases do not support callable
models.reticulate, which is only safe to call from
the main thread, so the wrapper always forces calculators = 1 (strictly
sequential) for function models regardless of the value passed in
(Funz/fz#73). A value other than 1
emits a warning.fz_install() gains a packages argument (default "funz-fz") so a
development build can be installed from GitHub with
fz_install(packages = "git+https://github.com/Funz/fz.git").fz_available() now returns TRUE only when the imported fz module
actually exposes the funz-fz API (fzi/fzc/fzo/fzr), instead of
merely checking that some module named fz is importable. On a machine
where an unrelated PyPI package is importable as fz (as on the CRAN
check farm), the if (fz_available()) guards now skip cleanly rather than
letting examples fail with AttributeError: module 'fz' has no attribute 'fzc'.LICENSE.md) in README.md flagged by
R CMD check --as-cran; it now links to the file on GitHub.fzd()'s own algorithm_options example/documentation, which used
a "key=val;key2=val2" string that funz-fz has never actually accepted
(only a named list, JSON string, or path to a JSON file) — replaced with
a named list.LICENSE file (the templated file R's packaging convention
requires alongside License: BSD_3_clause + file LICENSE), which had been
mistakenly deleted, and fixed R-CMD-check CI to install funz-fz and
point reticulate at it via RETICULATE_PYTHON — without this,
reticulate's automatic environment provisioning was silently resolving
to an unrelated PyPI package literally named fz (not funz-fz).First release, aligned with funz-fz 1.1 on PyPI.
fzi(input_path, model) — parse variable names and defaults from a template filefzc(input_path, input_variables, model, output_dir) — compile template by substituting variable valuesfzo(output_path, model) — read and parse output filesfzr(input_path, input_variables, model, ...) — run full parametric studyfzl(models, calculators, check) — list installed models and calculatorsfzd(input_path, input_variables, model, output_expression, algorithm, ...) — iterative algorithm-driven design of experimentsinstall_model(source, global) / install_algorithm(source, global) — install from GitHub, URL, or local zipuninstall_model(model_name, global) / uninstall_algorithm(algorithm_name, global) — remove installed itemslist_installed_models(global) / list_installed_algorithms(global) — list what is installedlist_models() — alias for list_installed_models()install() / uninstall() — generic aliases for model install/uninstallget_interpreter() / set_interpreter(interpreter) — get or set the formula interpreter ("python" or "R")get_log_level() / set_log_level(level) — control logging verbosityget_config() / print_config() / reload_config() — inspect and reload FZ_* environment variable settingsfz_install() — install the funz-fz Python package via reticulatefz_available() — check whether the Python package is importable