[−][src]Struct believer::decoders::belief_propagation::BPDecoder
A BPDecoder
can decode a message received from a given channel
using a given
parity_check
matrix.
Example
// A bsc with error prob 0.2. let channel = channel::BinarySymmetricChannel::new(0.2); // A 5 bits repetition code. let parity_check = ParityCheckMatrix::new(vec![ vec![0, 1], vec![1, 2], vec![2, 3], vec![3, 4], ]); let decoder = BPDecoder::new(&channel, &parity_check, 10); // A message with 2 errors. let received_message = vec![GF2::B1, GF2::B1, GF2::B0, GF2::B0, GF2::B0]; // Should be decoded to the all zero codeword. let decoded_message = decoder.decode(&received_message); assert_eq!(decoded_message, BPResult::Codeword(vec![GF2::B0; 5]));
Methods
impl<'a, C: BinaryChannel> BPDecoder<'a, C>
[src]
pub fn n_bits(&self) -> usize
[src]
Returns the number of bits in self
.
Example
let channel = channel::BinarySymmetricChannel::new(0.2); let parity_check = ParityCheckMatrix::new(vec![ vec![0, 1], vec![1, 2], vec![2, 3], vec![3, 4], ]); let decoder = BPDecoder::new(&channel, &parity_check, 3); assert_eq!(decoder.n_bits(), 5);
pub fn n_checks(&self) -> usize
[src]
Returns the number of checks in self
.
Example
let channel = channel::BinarySymmetricChannel::new(0.2); let parity_check = ParityCheckMatrix::new(vec![ vec![0, 1], vec![1, 2], vec![2, 3], vec![3, 4], ]); let decoder = BPDecoder::new(&channel, &parity_check, 3); assert_eq!(decoder.n_checks(), 4);
pub fn new(
channel: &'a C,
parity_check: &'a ParityCheckMatrix,
max_iters: usize
) -> Self
[src]
channel: &'a C,
parity_check: &'a ParityCheckMatrix,
max_iters: usize
) -> Self
Creates a new decoder from references to a channel
and a parity_check
matrix.
Example
// A bsc with error prob 0.2. let channel = channel::BinarySymmetricChannel::new(0.2); // A 5 bits repetition code. let parity_check = ParityCheckMatrix::new(vec![ vec![0, 1], vec![1, 2], vec![2, 3], vec![3, 4], ]); let max_iters = 10; // The decoder let decoder = BPDecoder::new(&channel, &parity_check, max_iters);
Trait Implementations
impl<'a, C> Decoder for BPDecoder<'a, C> where
C: BinaryChannel,
[src]
C: BinaryChannel,
type Error = Vec<GF2>
type Result = BPResult
fn decode(&self, message: &Self::Error) -> Self::Result
[src]
Decodes a given message
doing at most max_iters
iterations. Returns
Some(codeword)
if the decoder converge to a solution of None
if
it didn't find a solution in the given the number of iterations.
Panic
Panics if message
lenght doesn't correspond to self.n_bits()
.
Example
let channel = channel::BinarySymmetricChannel::new(0.2); let parity_check = ParityCheckMatrix::new(vec![ vec![0, 1], vec![1, 2], vec![2, 3], ]); let decoder = BPDecoder::new(&channel, &parity_check, 10); // Should be able to decode this message to the 1 codeword. let easy_message = vec![GF2::B0, GF2::B1, GF2::B1, GF2::B1]; let easy_decoded = decoder.decode(&easy_message); assert_eq!(easy_decoded, BPResult::Codeword(vec![GF2::B1; 4])); // Should get stuck while decoding this message. let impossible_message = vec![GF2::B0, GF2::B0, GF2::B1, GF2::B1]; let impossible_decoded = decoder.decode(&impossible_message); assert_eq!(impossible_decoded, BPResult::GotStuck);
fn random_error(&self) -> Self::Error
[src]
Auto Trait Implementations
impl<'a, C> Unpin for BPDecoder<'a, C>
impl<'a, C> Sync for BPDecoder<'a, C>
impl<'a, C> Send for BPDecoder<'a, C>
impl<'a, C> UnwindSafe for BPDecoder<'a, C> where
C: RefUnwindSafe,
C: RefUnwindSafe,
impl<'a, C> RefUnwindSafe for BPDecoder<'a, C> where
C: RefUnwindSafe,
C: RefUnwindSafe,
Blanket Implementations
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<T> From<T> for T
[src]
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
The type returned in the event of a conversion error.
fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>
[src]
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
[src]
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,
impl<V, T> VZip<V> for T where
V: MultiLane<T>,
V: MultiLane<T>,