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-03-05¶
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.
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.
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.