1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
use rand::{thread_rng, Rng};
pub mod simulation_results;
pub use simulation_results::SimulationResult;
mod n_iterations_simulator;
use n_iterations_simulator::NIterationsSimulator;
mod n_events_simulator;
use n_events_simulator::NEventsSimulator;
pub mod erasure;
pub use erasure::*;
pub trait Decoder: Send + Sync + Sized {
type Code;
type Error;
type Result: DecodingResult;
fn for_code(&self, code: Self::Code) -> Self;
fn take_code(&mut self) -> Self::Code;
fn decode(&self, error: &Self::Error) -> Self::Result;
fn get_random_error_with_rng<R: Rng>(&self, rng: &mut R) -> Self::Error;
fn get_random_error(&self) -> Self::Error {
self.get_random_error_with_rng(&mut thread_rng())
}
fn decode_random_error_with_rng<R: Rng>(&self, rng: &mut R) -> Self::Result {
self.decode(&self.get_random_error_with_rng(rng))
}
fn decode_random_error(&self) -> Self::Result {
self.decode_random_error_with_rng(&mut thread_rng())
}
fn simulate_n_iterations_with_rng<R: Rng>(
&self,
n_iterations: usize,
rng: &mut R,
) -> SimulationResult {
NIterationsSimulator::from(self)
.simulate_n_iterations_with_rng(n_iterations, rng)
.get_result()
}
fn simulate_n_iterations(&self, n_iterations: usize) -> SimulationResult {
self.simulate_n_iterations_with_rng(n_iterations, &mut thread_rng())
}
fn simulate_until_n_events_are_found_with_rng<R: Rng>(
&self,
n_events: usize,
rng: &mut R,
) -> SimulationResult {
NEventsSimulator::from(self)
.simulate_until_n_events_are_found_with_rng(n_events, rng)
.get_result()
}
fn simulate_until_n_events_are_found(&self, n_events: usize) -> SimulationResult {
self.simulate_until_n_events_are_found_with_rng(n_events, &mut thread_rng())
}
}
pub trait DecodingResult: Send + Sync {
fn is_success(&self) -> bool;
fn is_failure(&self) -> bool {
!self.is_success()
}
}