extern crate env_logger;
extern crate graco;
extern crate num_cpus;
extern crate petgraph;
extern crate rand;
extern crate structopt;
extern crate threadpool;
#[macro_use]
extern crate log;
use graco::colony::{Colony, ColonyOpts};
use num_cpus::get as get_num_cpus;
use std::path::PathBuf;
use structopt::StructOpt;
#[derive(Debug, Clone, StructOpt)]
#[structopt(
name = "graco",
about = "Generalized Rust Min-Max Ant Colony Optimization"
)]
pub struct CmdOpt {
#[structopt(short = "v", long = "verbose")]
verbose: bool,
#[structopt(short = "p", long = "initphe", default_value = "1.0")]
initphe: f64,
#[structopt(short = "e", long = "evap", default_value = "0.95")]
evaporation: f64,
#[structopt(short = "i", long = "iterations", default_value = "100")]
iterations: u32,
#[structopt(short = "t", long = "threshold", default_value = "1.0")]
threshold: f64,
#[structopt(short = "d", long = "density", default_value = "1")]
density: f64,
#[structopt(long = "alpha", default_value = "1")]
alpha: i32,
#[structopt(long = "beta", default_value = "2")]
beta: i32,
#[structopt(long = "wander", default_value = "0.15")]
wander: f64,
#[structopt(long = "ants", default_value = "50")]
ants: usize,
#[structopt(long = "cpus", default_value = "0")]
cpus: usize,
#[structopt(long = "seed")]
seed: Option<u64>,
#[structopt(parse(from_os_str))]
input: PathBuf,
#[structopt(long = "obj-all", group = "obj")]
visit_all: bool,
#[structopt(long = "obj-node", group = "obj")]
visit_node: Option<String>,
#[structopt(long = "obj-count", group = "obj")]
visit_count: Option<usize>,
#[structopt(long = "obj-deadend", group = "obj")]
reach_dead_end: bool,
#[structopt(short = "s", long = "start")]
start_node: Option<String>,
}
fn main() {
env_logger::init();
let mut opt = CmdOpt::from_args();
let num_cpus = get_num_cpus();
if opt.cpus == 0 || opt.cpus > num_cpus {
opt.cpus = num_cpus;
info!("Running on {} CPUs", opt.cpus);
}
let colony_opt = ColonyOpts {
verbose: opt.verbose,
initphe: opt.initphe,
evaporation: opt.evaporation,
iterations: opt.iterations,
threshold: opt.threshold,
density: opt.density,
alpha: opt.alpha,
beta: opt.beta,
seed: opt.seed,
visit_node: opt.visit_node,
visit_count: opt.visit_count,
reach_dead_end: opt.reach_dead_end,
start_node: opt.start_node,
wander: opt.wander,
ants: opt.ants,
cpus: opt.cpus,
};
let mut colony = Colony::with_input_path(colony_opt, opt.input);
colony.explore();
}