optimal_pbil/
until_probabilities_converged.rs1use derive_getters::Getters;
2use optimal_core::prelude::*;
3
4use crate::{types::*, Pbil};
5
6#[cfg(feature = "serde")]
7use serde::{Deserialize, Serialize};
8
9pub trait Probabilities {
11 fn probabilities(&self) -> &[Probability];
13}
14
15impl<B, F> Probabilities for Pbil<B, F> {
16 fn probabilities(&self) -> &[Probability] {
17 self.state().probabilities()
18 }
19}
20
21#[derive(Clone, Debug, Getters)]
24#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
25pub struct UntilProbabilitiesConverged<I> {
26 config: UntilProbabilitiesConvergedConfig,
27 it: I,
28}
29
30#[derive(Clone, Debug, Default, PartialEq)]
33#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
34pub struct UntilProbabilitiesConvergedConfig {
35 pub threshold: ProbabilityThreshold,
37}
38
39impl UntilProbabilitiesConvergedConfig {
40 pub fn start<I>(self, it: I) -> UntilProbabilitiesConverged<I> {
43 UntilProbabilitiesConverged { config: self, it }
44 }
45}
46
47impl<I> UntilProbabilitiesConverged<I> {
48 pub fn into_inner(self) -> (UntilProbabilitiesConvergedConfig, I) {
50 (self.config, self.it)
51 }
52}
53
54impl<I> StreamingIterator for UntilProbabilitiesConverged<I>
55where
56 I: StreamingIterator + Probabilities,
57{
58 type Item = I::Item;
59
60 fn advance(&mut self) {
61 self.it.advance()
62 }
63
64 fn get(&self) -> Option<&Self::Item> {
65 self.it.get()
66 }
67
68 fn is_done(&self) -> bool {
69 self.it.is_done()
70 || self.it.probabilities().iter().all(|p| {
71 p > &self.config.threshold.upper_bound() || p < &self.config.threshold.lower_bound()
72 })
73 }
74}