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 {
num_rows: usize,
num_columns: usize,
wr: usize,
wc: usize,
seed: u64,
#[structopt(long, default_value = "0")]
backtrack_cols: usize,
#[structopt(long, default_value = "0")]
backtrack_trials: usize,
#[structopt(long)]
min_girth: Option<usize>,
#[structopt(long, default_value = "0")]
girth_trials: usize,
#[structopt(long)]
uniform: bool,
#[structopt(long, default_value = "1000")]
seed_trials: u64,
#[structopt(long)]
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(())
}
}