extern crate ndarray;
extern crate docopt;
#[macro_use]
extern crate serde;
extern crate itertools;
extern crate strsim;
extern crate fbleau;
use std::fs::File;
use docopt::Docopt;
use fbleau::estimates::*;
use fbleau::security_measures::*;
use fbleau::fbleau_estimation::{Logger,run_fbleau};
use fbleau::utils::load_data;
const USAGE: &str = "
Estimate k-NN error and convergence.
Usage: fbleau <estimate> [--knn-strategy=<strategy>] [options] <train> <eval>
fbleau (--help | --version)
Arguments:
estimate: nn Nearest Neighbor. Converges only if the
observation space is finite.
knn k-NN rule. Converges for finite/continuous
observation spaces.
frequentist Frequentist estimator. Converges only if the
observation space is finite.
knn-strategy: ln k-NN with k = ln(n).
log10 k-NN with k = log10(n).
train Training data (.csv file).
eval Evaluation data (.csv file).
Options:
--logfile=<fname> Log estimates at each step.
--logerrors=<fname> Log the individual error for each test object
for the smallest error estimate.
--delta=<d> Delta for delta covergence.
--qstop=<q> Number of examples to declare
delta-convergence. Default is 10% of
training data.
--absolute Use absolute convergence instead of relative
convergence.
--scale Scale features before running k-NN
(only makes sense for objects of 2 or more
dimensions).
--distance=<name> Distance metric in (\"euclidean\",
\"levenshtein\").
-h, --help Show help.
--version Show the version.
";
#[derive(Deserialize)]
struct Args {
arg_estimate: Estimate,
flag_knn_strategy: Option<KNNStrategy>,
flag_logfile: Option<String>,
flag_logerrors: Option<String>,
flag_delta: Option<f64>,
flag_qstop: Option<usize>,
flag_absolute: bool,
flag_scale: bool,
flag_distance: Option<String>,
arg_train: String,
arg_eval: String,
}
fn main() {
let args: Args = Docopt::new(USAGE)
.and_then(|d| d.version(Some(env!("CARGO_PKG_VERSION")
.to_string()))
.deserialize())
.unwrap_or_else(|e| e.exit());
let (train_x, train_y) = load_data::<f64>(&args.arg_train)
.expect("[!] failed to load training data");
let (eval_x, eval_y) = load_data::<f64>(&args.arg_eval)
.expect("[!] failed to load evaluation data");
let mut error_logger = match args.flag_logfile {
Some(fname) => Some(Logger::LogFile(File::create(&fname)
.expect("Couldn't open file for logging"))),
None => None,
};
let mut individual_error_logger = match args.flag_logerrors {
Some(fname) => Some(Logger::LogFile(File::create(&fname)
.expect("Couldn't open file for logging"))),
None => None,
};
let (min_error, _, random_guessing) =
run_fbleau(train_x, train_y, eval_x, eval_y, args.arg_estimate,
args.flag_knn_strategy, args.flag_distance,
&mut error_logger, &mut individual_error_logger,
args.flag_delta, args.flag_qstop,
args.flag_absolute, args.flag_scale);
println!();
println!("Minimum estimate: {}", min_error);
print_all_measures(min_error, random_guessing);
}