Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
ec85921
add Changelog
bvdmitri Mar 20, 2026
a40573e
Implement event handler system for message passing and callbacks (#587)
bvdmitri Mar 20, 2026
b28dc95
Merge branch 'main' into release-6
fonsp Mar 26, 2026
d8459de
Trace ID to link before and after events (#589)
fonsp Mar 26, 2026
b8397a7
Better trace ids (#595)
bvdmitri Apr 7, 2026
e47a371
Refactor addon system to annotations (#596)
bvdmitri Apr 7, 2026
71d3007
checkpoint
bvdmitri Apr 10, 2026
903001f
checkpoint
bvdmitri Apr 10, 2026
580d79c
checkpoint
bvdmitri Apr 10, 2026
e1104a2
make format
bvdmitri Apr 10, 2026
f820d5b
fix some tests by hand
bvdmitri Apr 10, 2026
38d0c91
fix more tests by hand
bvdmitri Apr 10, 2026
ddaca45
local update
bvdmitri Apr 10, 2026
4cd17ea
fix more tests
bvdmitri Apr 10, 2026
311defc
rename vague messagein/messageout
bvdmitri Apr 10, 2026
467f63a
make format
bvdmitri Apr 10, 2026
ef4ddb4
major documentation upgrade
bvdmitri Apr 10, 2026
cc865d6
update the CHANGELOG and migration guide
bvdmitri Apr 10, 2026
4242854
structural documentation update, add concepts
bvdmitri Apr 10, 2026
bfd5c77
improve documentation for existing pages about specific nodes
bvdmitri Apr 10, 2026
b530fe2
update helpers documentation
bvdmitri Apr 10, 2026
2c59c7e
add concepts pages
bvdmitri Apr 10, 2026
5f60d73
finish the documentation overhaul
bvdmitri Apr 10, 2026
a03aec6
update the docs
bvdmitri Apr 15, 2026
77cc567
update the version to 6.0.0
bvdmitri Apr 16, 2026
99b4ee7
rename pipeline to stream postprocessors
bvdmitri Apr 16, 2026
891cafa
update the scheduler to use stream postprocessors instead
bvdmitri Apr 16, 2026
fb87870
add postprocess marginal stream
bvdmitri Apr 16, 2026
fb974e7
simplify API even further
bvdmitri Apr 16, 2026
e074a47
update docs
bvdmitri Apr 16, 2026
3ffe666
make format
bvdmitri Apr 16, 2026
3313222
fix typo in mixture nodes
bvdmitri Apr 16, 2026
40122ad
update
bvdmitri Apr 16, 2026
2e766e7
add pre_rule_annotations
bvdmitri Apr 17, 2026
d3aaacf
add logo, update README.md
bvdmitri Apr 17, 2026
1397d29
make logo half the size in README
bvdmitri Apr 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions .github/workflows/Changelog.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
name: Check CHANGELOG.md
on:
pull_request:
types: [assigned, opened, synchronize, reopened, labeled, unlabeled]
branches:
- main
jobs:
check-changelog:
name: Check Changelog Action
runs-on: ubuntu-latest
steps:
- uses: tarides/changelog-check-action@v2
with:
changelog: CHANGELOG.md
228 changes: 228 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,228 @@
# Changelog

All notable changes to ReactiveMP.jl will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

## [6.0.0]

### Added
- `AbstractStreamPostprocessor` abstraction unifying the old pipeline stages and the per-node `scheduler` argument under a single concept that postprocesses outbound message streams, marginal streams, and score streams uniformly
- `postprocess_stream_of_outbound_messages`, `postprocess_stream_of_marginals`, `postprocess_stream_of_scores` entry points with `::Nothing` pass-through fallbacks
- `CompositeStreamPostprocessor` for chaining multiple postprocessors
- `ScheduleOnStreamPostprocessor` — direct successor of `ScheduleOnPipelineStage` plus the per-node scheduler, applies a Rocket.jl scheduler to all three stream kinds
- Marginal streams and score streams now go through stream postprocessors (previously only outbound message streams did)
- Documentation page for stream postprocessors
- Callback/event system for hooking into message passing steps (rule calls, message products, form constraints, marginal computation)
- `MessageProductContext` struct to bundle product computation settings and callbacks
- Labels for variables (`RandomVariable`, `ConstVariable`, `DataVariable`)
- Docstrings for variable types, form constraints, and related functions
- Documentation page for callbacks
- `MethodError` hint for mismatched `handle_event` signatures
- New annotations system: `AnnotationDict`, `AbstractAnnotations`, `LogScaleAnnotations`, `InputArgumentsAnnotations`
- `post_rule_annotations!` and `post_product_annotations!` callbacks for annotation processors
- `@logscale value` macro for setting log-scale annotations inside `@rule` bodies
- `getannotations` function for `Message` and `Marginal`
- Migration guide for v5 to v6
- `skip_initial()`, `skip_clamped()`, `skip_clamped_and_initial()` filter operators replacing the `MarginalSkipStrategy` type hierarchy
- `new_observation!(datavar, value)` for pushing observed values into a `DataVariable`
- `get_stream_of_inbound_messages`, `get_stream_of_outbound_messages` accessors on `NodeInterface` and `IndexedNodeInterface`
- `get_stream_of_marginals`, `set_stream_of_marginals!` accessors on variables
- `get_stream_of_predictions`, `set_stream_of_predictions!` accessors on variables
- `set_initial_marginal!`, `set_initial_message!` for seeding variables before inference
- `create_new_stream_of_inbound_messages!` for allocating per-connection message streams
- Docstrings for `MessageObservable`, `MarginalObservable`, `FunctionalDependencies`, `collect_functional_dependencies`, `RandomVariableActivationOptions`, `DataVariableActivationOptions`, `FactorNodeActivationOptions`, and `activate!` methods
- Expanded documentation for variables (stream creation lifecycle per variable type), nodes (interfaces, activation), messages, and marginals

### Changed
- `FactorNodeActivationOptions` lost its `pipeline` and `scheduler` positional fields and gained a single `postprocessor` field
- `RandomVariableActivationOptions` renamed its `scheduler` field to `stream_postprocessor`; the default is now `nothing` (no-op) instead of `AsapScheduler()`
- `getpipeline(options)` and `getscheduler(options)` replaced by `getpostprocessor(options)`
- `EqualityChain` renamed its `pipeline` field to `postprocessor`
- Switched from `ReTestItems` to `TestItemRunner` for tests ([#584](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/584))
- Made formatting checks stricter
- Removed `variables/generic.jl`; generic variable interface moved into `variable.jl`
- Replaced hardcoded `DefaultMessageProdFn`/`DefaultMarginalProdFn` with `MessageProductContext`
- `Message{D, A}` → `Message{D}` (type parameter `A` removed)
- `Marginal{D, A}` → `Marginal{D}` (type parameter `A` removed)
- `Message` and `Marginal` now carry an `AnnotationDict` instead of a typed addons tuple
- Rules no longer return `(result, addons)` tuples — just the result
- `@call_rule` no longer supports `return_addons` option; use `annotations` keyword with `AnnotationDict`
- `MessageMapping.addons` field → `MessageMapping.annotations`
- `MessageProductContext` gained `annotations` field for product-time annotation processors
- `messagein(interface)` → `get_stream_of_inbound_messages(interface)`
- `messageout(interface)` → `get_stream_of_outbound_messages(interface)`
- `getmarginal(variable)` / `getmarginals` → `get_stream_of_marginals(variable)`
- `getprediction(variable)` / `getpredictions` → `get_stream_of_predictions(variable)`
- `setmarginal!(variable, value)` → `set_initial_marginal!(variable, value)`
- `setmessage!(variable, value)` → `set_initial_message!(variable, value)`
- `update!(datavar, value)` → `new_observation!(datavar, value)`

### Removed
- `AbstractPipelineStage`, `EmptyPipelineStage`, `CompositePipelineStage`, `ScheduleOnPipelineStage`, `apply_pipeline_stage`, `collect_pipeline`, `+` composition — replaced by the `AbstractStreamPostprocessor` abstraction (see migration guide)
- `LoggerPipelineStage` — equivalent behaviour can be implemented via callbacks
- `AsyncPipelineStage` — use `ScheduleOnStreamPostprocessor(AsyncScheduler())` instead
- `DiscontinuePipelineStage` — was unused; implement a custom `AbstractStreamPostprocessor` if needed
- `schedule_updates(vars; pipeline_stage = ...)` — construct a `ScheduleOnStreamPostprocessor` and pass it through the activation options instead
- `getaddons` — use `getannotations` instead
- `getlogscale(::Message)`, `getlogscale(::Marginal)` — use `getlogscale(getannotations(...))` instead
- `getmemory`, `getmemoryaddon` — use `get_rule_input_arguments(getannotations(...))` instead
- `AddonLogScale` — replaced by `LogScaleAnnotations` (calling `AddonLogScale()` throws a descriptive error)
- `AddonMemory` — replaced by `InputArgumentsAnnotations` (calling `AddonMemory()` throws a descriptive error)
- `AddonDebug` — use callbacks instead
- `AbstractAddon`, `multiply_addons`, `@invokeaddon`
- `message_mapping_addons`, `message_mapping_addon` helper functions
- `MarginalSkipStrategy` abstract type and `SkipClamped`, `SkipInitial`, `SkipClampedAndInitial`, `IncludeAll` subtypes — use `skip_clamped()`, `skip_initial()`, `skip_clamped_and_initial()` filter operators instead
- `apply_skip_filter`, `as_marginal_observable` — no longer part of the public API
- `messagein`, `messageout` — use `get_stream_of_inbound_messages`, `get_stream_of_outbound_messages`
- `getmarginal`, `getmarginals`, `getprediction`, `getpredictions` — use `get_stream_of_marginals`, `get_stream_of_predictions`
- `setmarginal!`, `setmarginals!`, `setmessage!`, `setmessages!` — use `set_initial_marginal!`, `set_initial_message!`
- `update!` — use `new_observation!`
- `create_messagein!` — use `create_new_stream_of_inbound_messages!`

## [5.6.6] - 2026-03-13

### Fixed
- Implemented effective rules with specialized dispatch for `MvNormalMeanScalePrecision` ([#579](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/579))

### Tests
- Added performance test for structured rule specialized for `MvNormalMeanScalePrecision`

## [5.6.5] - 2026-02-02

### Added
- Implemented `MvNormalWishart` node and `out` rule ([#565](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/565))
- Issue templates ([#558](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/558))
- Rule interface name checking for `@rule`, `@marginalrule`, and `@average_energy` macros ([#545](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/545))

### Changed
- Removed `Requires` dependency (used for Julia <1.9, no longer supported) ([#564](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/564))
- Removed vibe coded required fields from issue template ([#562](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/562))
- Bumped compat for Optim to 2 ([#574](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/574))
- Removed `Zygote` extension requirement for compatibility

### Fixed
- Fixed documentation build ([#567](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/567))

### Performance
- Pre-computed double loops in CT model ([#571](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/571))

## [5.6.4] - 2025-11-18

### Fixed
- Fixed bug in average energy of `Uninformative` type ([#553](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/553))
- Improved robustness of inverse precision matrix computation in `MvNormalMeanPrecision` rule ([#540](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/540))

### Documentation
- Added `MessageMapping` documentation ([#550](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/550))

## [5.6.3] - 2025-11-04

### Added
- Added `IntegrationTest.yml` workflow ([#525](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/525))
- Implemented missing marginal rule for multiplication node ([#531](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/531))

### Changed
- Changed dispatch to `AbstractVector` to allow other vector implementations ([#536](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/536))

### Fixed
- Renamed softdot marginal rules test file to include it in test runs ([#535](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/535))
- Avoided `Vararg` deprecation warnings ([#537](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/537))
- Defined `AverageEnergy` for `Mixture` node with warning ([#546](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/546))
- Allowed different numeric types for `GammaShapeLikelihood` constructor ([#544](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/544))

### Tests
- Improved code coverage with tests for BIFM, Autoregressive, Mixture, GammaMixture, Wishart, InverseWishart, DotProduct, Multiplication, and Uniform nodes ([#539](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/539))

## [5.6.2] - 2025-10-21

### Fixed
- Fixed `isonehot` to use approximate comparison for categorical rules ([#527](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/527))

## [5.6.1] - 2025-10-21

### Added
- Categorical rules: check if probability vector of `q_out` is a one-hot encoded vector ([#510](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/510))
- Support for non-linear node (univariate -> multivariate) with Unscented transform ([#508](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/508))

### Changed
- Updated `ForwardDiff` to version 1 ([#521](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/521))
- Skip Aqua.jl checks during selective test runs ([#523](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/523))
- Makefile: fixed selective test runs with `test_args` argument ([#517](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/517))

### Fixed
- Updated documentation for `as_marginal` ([#516](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/516))
- Updated test cases for `GammaShapeScale`

## [5.6.0] - 2025-09-23

### Changed
- Use `MvNormalMeanScaleMatrixPrecision` from ExponentialFamily package ([#509](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/509))

## [5.5.12] - 2025-09-11

### Fixed
- Fixed `q_t1` dimensionality bug in delta node rules ([#504](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/504))

## [5.5.11] - 2025-09-10

### Added
- Implemented `MvNormalMeanScaleMatrixPrecision` rules ([#497](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/497))

## [5.5.10] - 2025-09-09

### Fixed
- Added new linearization method ([#500](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/500))

## [5.5.9] - 2025-08-14

### Changed
- Reverted "Don't check for proper in division of" ([#496](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/496))

## [5.5.8] - 2025-08-14

### Added
- Show meta suggestions in rule error printing ([#495](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/495))

### Changed
- Tightened dispatch for summation and other optimized rules ([#492](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/492), [#493](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/493))

### Fixed
- Don't check for proper in division of to accommodate inference ([#486](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/486))

## [5.5.7] - 2025-07-24

### Fixed
- Fixed infinite RxInfer documentation build by not using lazy string ([#490](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/490))

## [5.5.6] - 2025-07-23

### Fixed
- Fixed invalidations: removed bad `eltype` methods, `convert`, and `println` method ([#489](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/489))

## [5.5.5] - 2025-07-23

### Fixed
- Resolved Gaussian division with proper Multivariate vs Univariate handling ([#479](https://github.com/ReactiveBayes/ReactiveMP.jl/pull/479))

---

[Unreleased]: https://github.com/ReactiveBayes/ReactiveMP.jl/compare/v5.6.6...HEAD
[5.6.6]: https://github.com/ReactiveBayes/ReactiveMP.jl/compare/v5.6.5...v5.6.6
[5.6.5]: https://github.com/ReactiveBayes/ReactiveMP.jl/compare/v5.6.4...v5.6.5
[5.6.4]: https://github.com/ReactiveBayes/ReactiveMP.jl/compare/v5.6.3...v5.6.4
[5.6.3]: https://github.com/ReactiveBayes/ReactiveMP.jl/compare/v5.6.2...v5.6.3
[5.6.2]: https://github.com/ReactiveBayes/ReactiveMP.jl/compare/v5.6.1...v5.6.2
[5.6.1]: https://github.com/ReactiveBayes/ReactiveMP.jl/compare/v5.6.0...v5.6.1
[5.6.0]: https://github.com/ReactiveBayes/ReactiveMP.jl/compare/v5.5.12...v5.6.0
[5.5.12]: https://github.com/ReactiveBayes/ReactiveMP.jl/compare/v5.5.11...v5.5.12
[5.5.11]: https://github.com/ReactiveBayes/ReactiveMP.jl/compare/v5.5.10...v5.5.11
[5.5.10]: https://github.com/ReactiveBayes/ReactiveMP.jl/compare/v5.5.9...v5.5.10
[5.5.9]: https://github.com/ReactiveBayes/ReactiveMP.jl/compare/v5.5.8...v5.5.9
[5.5.8]: https://github.com/ReactiveBayes/ReactiveMP.jl/compare/v5.5.7...v5.5.8
[5.5.7]: https://github.com/ReactiveBayes/ReactiveMP.jl/compare/v5.5.6...v5.5.7
[5.5.6]: https://github.com/ReactiveBayes/ReactiveMP.jl/compare/v5.5.5...v5.5.6
[5.5.5]: https://github.com/ReactiveBayes/ReactiveMP.jl/compare/v5.5.4...v5.5.5
38 changes: 38 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# Contributing to ReactiveMP

**ReactiveMP.jl** is a community-driven reactive message passing engine and we welcome contributions of all kinds!

ReactiveMP is part of the [ReactiveBayes](https://github.com/ReactiveBayes) organization and the broader [RxInfer](https://github.com/ReactiveBayes/RxInfer.jl) ecosystem for reactive Bayesian inference in Julia.

## Getting Started

* Browse **beginner-friendly issues**: https://github.com/ReactiveBayes/ReactiveMP.jl/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22
* Check out the [RxInfer Contributing Guide](https://docs.rxinfer.com/stable/contributing/guide) for general conventions shared across the ecosystem

We welcome contributions such as:

* Bug reports and fixes
* New message passing rules and nodes
* Documentation improvements
* Tests and performance improvements
* Feature suggestions

## Development Workflow

1. Fork the repository and create a feature branch
2. Make your changes and ensure tests pass locally with `make test`
3. Run `make format` to ensure consistent code formatting
4. Open a pull request against `main` — the CI will check tests, formatting, and that `CHANGELOG.md` has been updated

## Contributing to the RxInfer Ecosystem

ReactiveMP is one of several packages in the RxInfer ecosystem. Contributions to any of these projects are very welcome:

- [RxInfer.jl](https://github.com/ReactiveBayes/RxInfer.jl) — the high-level inference package
- [GraphPPL.jl](https://github.com/ReactiveBayes/GraphPPL.jl) — probabilistic model specification
- [ExponentialFamily.jl](https://github.com/ReactiveBayes/ExponentialFamily.jl) — exponential family distributions
- Browse other packages at https://github.com/ReactiveBayes

If you're unsure where to start or where a contribution belongs, feel free to open an issue or start a discussion.

Thank you for helping improve ReactiveMP!
6 changes: 4 additions & 2 deletions Project.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name = "ReactiveMP"
uuid = "a194aa59-28ba-4574-a09c-4a745416d6e3"
version = "5.6.6"
authors = ["Dmitry Bagaev <d.v.bagaev@tue.nl>", "Albert Podusenko <a.podusenko@tue.nl>", "Bart van Erp <b.v.erp@tue.nl>", "Ismail Senoz <i.senoz@tue.nl>"]
version = "6.0.0"

[deps]
BayesBase = "b4ee3484-f114-42fe-b91c-797d54a0c67e"
Expand Down Expand Up @@ -30,6 +30,7 @@ StatsFuns = "4c63d2b9-4356-54db-8cca-17b64c39e42c"
TinyHugeNumbers = "783c9a47-75a3-44ac-a16b-f1ab7b3acf04"
Tullio = "bc48ee85-29a4-5162-ae0b-a64e1601d4bc"
TupleTools = "9d95972d-f1c8-5527-a6e0-b4b365fa01f6"
UUIDs = "cf7118a7-6976-5b1a-9a39-7adc72f591a4"

[weakdeps]
ExponentialFamilyProjection = "17f509fa-9a96-44ba-99b2-1c5f01f0931b"
Expand Down Expand Up @@ -68,6 +69,7 @@ StatsFuns = "1.3.0"
TinyHugeNumbers = "1.0.0"
Tullio = "0.3"
TupleTools = "1.2.0"
UUIDs = "1"
julia = "1.10"

[extras]
Expand All @@ -87,9 +89,9 @@ Optimisers = "3bd65402-5787-11e9-1adc-39752487f4e2"
Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f"
PkgBenchmark = "32113eaa-f34f-5b0d-bd6c-c81e245fc73d"
REPL = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb"
TestItemRunner = "f8b46487-2199-4994-9208-9a1283c18c0a"
StableRNGs = "860ef19b-820b-49d6-a774-d7a799459cd3"
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
TestItemRunner = "f8b46487-2199-4994-9208-9a1283c18c0a"

[targets]
test = ["Aqua", "TestItemRunner", "Test", "Pkg", "Logging", "InteractiveUtils", "Coverage", "Dates", "Distributed", "Documenter", "BenchmarkTools", "JET", "PkgBenchmark", "StableRNGs", "Optimisers", "DiffResults", "ExponentialFamilyProjection", "REPL", "Manopt"]
Loading
Loading