Skip to content
Snippets Groups Projects
soft_bit.rs 1.04 KiB
Newer Older
Stephen D's avatar
Stephen D committed
use labrador_ldpc::decoder::DecodeFrom;

// Less than zero = 1 bit
// Greater than zero = 0 bit
pub trait SoftBit {
    fn from_hard_bit(bit: bool) -> Self;
    fn hard_bit(&self) -> bool;
}

impl<T: DecodeFrom> SoftBit for T {
    fn from_hard_bit(bit: bool) -> Self {
        if bit {
            -Self::one()
        } else {
            Self::one()
        }
    }

    fn hard_bit(&self) -> bool {
        self < &T::zero()
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn e2e() {
        assert!(f32::from_hard_bit(true).hard_bit());
        assert!(!f32::from_hard_bit(false).hard_bit());

        assert!(f64::from_hard_bit(true).hard_bit());
        assert!(!f64::from_hard_bit(false).hard_bit());

        assert!(i8::from_hard_bit(true).hard_bit());
        assert!(!i8::from_hard_bit(false).hard_bit());

        assert!(i16::from_hard_bit(true).hard_bit());
        assert!(!i16::from_hard_bit(false).hard_bit());

        assert!(i32::from_hard_bit(true).hard_bit());
        assert!(!i32::from_hard_bit(false).hard_bit());
    }
}