use crate::cli::*;
use crate::mackay_neal::{Config, FillPolicy};
use clap::Parser;
use std::error::Error;
#[derive(Debug, Parser)]
#[command(about = "Generates LDPC codes using the MacKay-Neal algorithm")]
pub struct Args {
pub num_rows: usize,
pub num_columns: usize,
pub wr: usize,
pub wc: usize,
pub seed: u64,
#[arg(long, default_value_t = 0)]
pub backtrack_cols: usize,
#[arg(long, default_value_t = 0)]
pub backtrack_trials: usize,
#[arg(long)]
pub min_girth: Option<usize>,
#[arg(long, default_value_t = 0)]
pub girth_trials: usize,
#[arg(long)]
pub uniform: bool,
#[arg(long, default_value_t = 1000)]
pub seed_trials: u64,
#[arg(long)]
pub search: bool,
}
impl Args {
fn config(&self) -> Config {
Config {
nrows: self.num_rows,
ncols: self.num_columns,
wr: self.wr,
wc: self.wc,
backtrack_cols: self.backtrack_cols,
backtrack_trials: self.backtrack_trials,
min_girth: self.min_girth,
girth_trials: self.girth_trials,
fill_policy: match self.uniform {
true => FillPolicy::Uniform,
false => FillPolicy::Random,
},
}
}
}
impl Run for Args {
fn run(&self) -> Result<(), Box<dyn Error>> {
let conf = self.config();
let h = if self.search {
let (seed, hh) = conf
.search(self.seed, self.seed_trials)
.ok_or("no solution found")?;
eprintln!("seed = {}", seed);
hh
} else {
conf.run(self.seed)?
};
println!("{}", h.alist());
Ok(())
}
}