Changelog¶
All notable changes to the ROSE project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]¶
[0.3.0] - 2026-09-01¶
Added¶
IterationState.learner_id: New field (int | str | None, defaultNone) onIterationStateidentifying which parallel learner produced a given state. Integer index forParallelActiveLearnerandParallelReinforcementLearner; learner name string forParallelUQLearner.rose run --remote: spec-driven remote execution against an ORBIT broker, driven entirely by aremote:block in the workflow YAML (remote.target,remote.broker_url) — no separate manual endpoint-bootstrap step required.remote.embedded: host the ORBIT broker in-process instead of requiring a standalone broker deployment.rose setup: interactive first-time wizard that provisions broker TLS cert/token and IRI/SFAPI credentials, then verifies everything end-to-end by bringing up a real ORBIT endpoint — ending with a ready-to-pasteremote:block on success.- Configurable HPC wait timeout:
rose setup --wait-timeout SECONDSand the spec'sremote.target.endpoint_timeout_mincontrol how long ROSE waits on HPC job/endpoint registration; a warning is printed with the default used when neither is set. - CLI reference docs: a new Command-Line Interface page documenting
rose runandrose setupand their flags. - Two canonical example specs under
examples/spec/—sequential_python(Python tasks, sequential learner) andparallel_shell_learners(shell tasks, parallel learners) — each with a local (workflow.yaml) and a--remote(workflow-remote.yaml) variant, together covering Python/shell, local/remote, and sequential/parallel.
Changed¶
- Unified async-iterator API for parallel learners:
ParallelActiveLearner.start(),ParallelReinforcementLearner.start(), andParallelUQLearner.start()now returnAsyncIterator[IterationState]instead of blocking until all learners finish and returninglist[Any]. States stream in real time as each parallel learner completes an iteration, using the sameasync for state in learner.start():interface asSequentialActiveLearner. - Shared
_stream_parallelhelper: The internalasyncio.Queue-based fan-in pattern is extracted into a single module-level async generator inrose/learner.py, eliminating identical code that was previously duplicated across all three parallel learner classes. rose/bootstrap.pyandrose/remote.pyreorganized into arose/remote/package (rose/remote/bootstrap.py,rose/remote/execute.py), matching the existingactive_learning/reinforcement_learning/specsubpackage convention.from rose.remote import run_remote, run_setup_wizardcontinues to work unchanged via the package's re-export.- Default
--localexecution backend switched from the deprecatedDragonExecutionBackendV3/dragon_v3toDragonExecutionBackend/dragon(rhapsody deprecated the former). Also fixed--backend's help text, which incorrectly stated the default wasconcurrent. - PyPI distribution renamed from
ROSEtorose-surrogate-explorer(theROSEname was already taken on PyPI by an unrelated package).import roseand theroseCLI command are unaffected. Addedlicense/classifiersmetadata topyproject.tomlfor the first PyPI release. - Documentation site restyled to match RHAPSODY's mkdocs-material conventions (flat header/tabs, forced heading color, pill buttons,
pymdownx.highlight) while keeping ROSE's rose/pink brand palette.
Fixed¶
typeguard(used directly byrose/learner.py's@typeguard.typechecked) is now an explicit dependency instead of only being available transitively throughradical.asyncflow/rhapsody-py.- Several broken internal documentation anchor links in
spec-api.md/rose-aas.md(double-hyphen slugs that never matched mkdocs' actual generated anchors). - A broken inline
<figure>positioning hack on the docs homepage.
Deprecated¶
ParallelActiveLearner.teach(),ParallelReinforcementLearner.learn(), andParallelUQLearner.teach()still work but now internally iteratestart()and collect final states into a list. Migrate toasync for state in learner.start():.
[0.2.0] - 2026-02-27¶
Added¶
- RHAPSODY backend integration: Execution backends (
RadicalExecutionBackend,ConcurrentExecutionBackend) are now imported fromrhapsody-py(from rhapsody.backends import ...) instead ofradical.asyncflow.WorkflowEngineremains inradical.asyncflow. Updated all examples, tutorials, docs, and notebooks accordingly. - Pre-commit hooks: Added
.pre-commit-config.yamlwith docformatter, ruff, standard file checks, actionlint, GitHub workflow validation, and typos. Theexamples/use_cases/directory is excluded from linting. - CI pre-commit gate: The
tests.ymlworkflow now runs pre-commit as a required job before unit and integration tests, replacing the separatelintjob. - New tutorials: Added
03-highly-parallel-surrogatesand04-al-algorithm-selectortutorials with corresponding optional dependencies intutorials/pyproject.tomlandtutorials/README.md. - New
start()API: Replaced the blockingteach()method with an asynchronous iteratorstart(). This allows users to instrument the loop, log metrics in real-time (e.g., to MLflow), and implement custom early stopping or adaptive logic. - IterationState: Granular state reporting after each iteration, providing metrics, labeled/unlabeled counts, and statistics in a structured dataclass.
- Dynamic Configuration: Added ability to update learner configuration (batch sizes, task arguments, etc.) between iterations using
learner.set_next_config(). - MLflow integration:
rose.learner()is now compatible with MLflow tracking to support the diffusion model community's need to monitor the training process via ROSE.
Changed¶
- Dependency update:
rhapsody-py[radical_pilot]added as a core dependency; Dragon HPC backend (rhapsody-py[dragon]) auto-installed on Python ≤3.12 via PEP 508 environment marker.radical.asyncflowretained forWorkflowEngine. - Python support: Minimum Python version is 3.10; Python 3.9 dropped from all tooling, CI, and tox environments.
- Async-first execution: The core learner logic is now
asyncio-based, enabling better concurrency and integration with modern Python stacks. - Separation of concerns: Orchestration logic (ROSE) is more clearly separated from task execution (AsyncFlow/RHAPSODY).
- Package discovery: Explicitly scoped setuptools to the
rosepackage to prevent accidental inclusion oftutorials/andexamples/in the distribution. - Ruff configuration: Raised line length to 100, added ML naming convention rules to the ignore list (
N803,N806,N801,N812–N817), and scoped theB006exception to examplerun_me.pyfiles wheretask_description={"shell": True}is a required API pattern. - GitHub Actions: Fixed unquoted
$GITHUB_ENVshell variable intests.ymlandci.yml(shellcheck SC2086).
Deprecated¶
learner.teach(): This method is deprecated and will be removed in a future version. Users should migrate to theasync for state in learner.start()pattern.