diff --git a/src/drift.rs b/src/drift.rs index 57e684a..c751624 100644 --- a/src/drift.rs +++ b/src/drift.rs @@ -6,7 +6,7 @@ use crate::time::Time; /// /// Generic over `T: Time` so seasonal or calendar-aware drift is expressible /// without going through `i64`. -pub trait Drift: Copy + Debug { +pub trait Drift: Copy + Debug + Send + Sync { /// Variance added to the skill prior for elapsed time `from -> to`. /// /// Called with `from <= to`; returning zero means no drift accumulates. diff --git a/src/factor/mod.rs b/src/factor/mod.rs index da72dbd..01b39c4 100644 --- a/src/factor/mod.rs +++ b/src/factor/mod.rs @@ -56,7 +56,7 @@ impl VarStore { /// Factors hold their own outgoing messages and propagate them by reading /// connected variable marginals from a `VarStore` and writing back updated /// marginals. -pub trait Factor { +pub trait Factor: Send + Sync { /// Update outgoing messages and write back to the var store. /// /// Returns the max delta `(|Δmu|, |Δsigma|)` across writes this diff --git a/src/observer.rs b/src/observer.rs index 223948b..063ef6a 100644 --- a/src/observer.rs +++ b/src/observer.rs @@ -9,9 +9,8 @@ use crate::time::Time; /// Receives progress callbacks during `History::converge`. /// /// All methods have default no-op implementations; implement only what's -/// interesting. Send/Sync is NOT required in T2 (added in T3 along with -/// Rayon support). -pub trait Observer { +/// interesting. +pub trait Observer: Send + Sync { /// Called after each convergence iteration across the whole history. fn on_iteration_end(&self, _iter: usize, _max_step: (f64, f64)) {} diff --git a/src/schedule.rs b/src/schedule.rs index 2c98fc1..a08d20c 100644 --- a/src/schedule.rs +++ b/src/schedule.rs @@ -16,7 +16,7 @@ pub struct ScheduleReport { } /// Drives factor propagation to convergence. -pub trait Schedule { +pub trait Schedule: Send + Sync { fn run(&self, factors: &mut [BuiltinFactor], vars: &mut VarStore) -> ScheduleReport; } diff --git a/src/time.rs b/src/time.rs index 813ff39..efe0bc4 100644 --- a/src/time.rs +++ b/src/time.rs @@ -8,7 +8,7 @@ /// /// Must be `Ord + Copy` so slices can sort events, and `'static` so /// `History` can store it by value without lifetimes. -pub trait Time: Copy + Ord + 'static { +pub trait Time: Copy + Ord + Send + Sync + 'static { /// How much time elapsed between `self` and `later`. /// /// Used by `Drift::variance_delta` to compute skill drift. Returning