Published April 17, 2026 | Version v6.0.0
Software Open

ReactiveMP.jl: a Julia package for automatic Bayesian inference on a factor graph with reactive message passing.

Authors/Creators

  • 1. Eindhoven University of Technology Eindhoven

Description

ReactiveMP v6.0.0

Diff since v5.6.6

This is a major change in ReactiveMP that includes breaking changes, improvements, new documentation sections and many more!

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)
  • 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) / getmarginalsget_stream_of_marginals(variable)
  • getprediction(variable) / getpredictionsget_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!

Merged pull requests:

  • 🤖 Auto-format Julia code (#583) (@github-actions[bot])
  • use TestItemRunner instead of ReTestItems (#584) (@bvdmitri)
  • 🤖 Auto-format Julia code (#585) (@github-actions[bot])
  • Implement event handler system for message passing and callbacks (#587) (@bvdmitri)
  • Trace ID to link before and after events (#589) (@fonsp)
  • gitignore agents md (#591) (@fonsp)
  • Run make format (#593) (@fonsp)
  • Use Base.sprint for rule_tests (#594) (@fonsp)
  • Better trace ids (#595) (@bvdmitri)
  • Refactor addon system to annotations (#596) (@bvdmitri)
  • 🤖 Auto-format Julia code (#597) (@github-actions[bot])
  • Release 6 (#600) (@bvdmitri)

Notes

Please cite this research as below.

Files

ReactiveBayes/ReactiveMP.jl-v6.0.0.zip

Files (737.2 kB)

Name Size Download all
md5:47b702b2e780ea6c32c2183c0e338e0b
737.2 kB Preview Download

Additional details

Related works