#![feature(use_extern_macros)]
#![allow(non_camel_case_types)]
#[macro_use] extern crate finite_fields;
extern crate daggy;
extern crate rand;
finite_fields::binary_type! { b3, 3 }
pub enum CodeType {
FIRCode,
IIRCode
}
pub struct Code {
pub start_state: Vec<b1>, pub polys: Vec<b3>, pub code_type: CodeType
}
impl Code {
pub fn state_adjacency(&self) -> Vec<Vec<b1>> {
match self.code_type {
CodeType::FIRCode => {
let state_dim = 2usize.pow(self.start_state.len() as u32);
(0..state_dim).map(|col_ind| {
zero_padded_vec(state_dim, vec![ONE, ONE], col_ind * 2)
}).collect()
},
CodeType::IIRCode => vec![vec![ZERO]] }
}
pub fn next_states(&self, state_ind: usize) -> Vec<usize> {
match self.code_type {
CodeType::FIRCode => {
let state_count = 2usize.pow(self.start_state.len() as u32);
let first_next = (state_ind * 2) % state_count; vec![first_next, &first_next + 1]
}, CodeType::IIRCode => vec![0] }
}
}
pub mod encoders;
pub mod viterbi;
fn zero_padded_vec(vec_len: usize, vals: Vec<b1>, offset: usize) -> Vec<b1> {
let mut out_vec = vec![ZERO; offset % vec_len];
for val in vals { out_vec.push(val); }
for _ in 0..(vec_len - out_vec.len()) { out_vec.push(ZERO); }
out_vec
}