[][src]Struct believer::decoders::belief_propagation::BPDecoder

pub struct BPDecoder<'a, C> where
    C: BinaryChannel
{ /* fields omitted */ }

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]

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]

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);

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

impl<'a, C> RefUnwindSafe for BPDecoder<'a, C> where
    C: RefUnwindSafe

Blanket Implementations

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> From<T> for T[src]

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<V, T> VZip<V> for T where
    V: MultiLane<T>,