extern crate fbas_analyzer;
use fbas_analyzer::simulation::Graph;
use std::path::PathBuf;
use quicli::prelude::*;
use structopt::StructOpt;
#[derive(Debug, StructOpt)]
struct Cli {
#[structopt(subcommand)]
algorithm_config: GraphGenerationAlgorithmConfig,
#[structopt(short = "o", long = "output")]
path: Option<PathBuf>,
#[structopt(long = "dont-shuffle")]
dont_shuffle: bool,
#[structopt(flatten)]
verbosity: Verbosity,
}
#[derive(Debug, StructOpt)]
pub enum GraphGenerationAlgorithmConfig {
BarabasiAlbert { n: usize, m0: usize, m: usize },
WattsStrogatz { n: usize, k: usize, beta: f64 },
}
pub fn apply_graph_gen_alg(algorithm_config: &GraphGenerationAlgorithmConfig) -> Graph {
use GraphGenerationAlgorithmConfig::*;
match algorithm_config {
BarabasiAlbert { n, m0, m } => Graph::new_random_scale_free(*n, *m0, *m),
WattsStrogatz { n, k, beta } => Graph::new_random_small_world(*n, *k, *beta),
}
}
fn main() -> CliResult {
let args = Cli::from_args();
args.verbosity.setup_env_logger("graph_generator")?;
let path = args.path;
let algorithm_config = args.algorithm_config;
let dont_shuffle = args.dont_shuffle;
let graph = if dont_shuffle {
apply_graph_gen_alg(&algorithm_config)
} else {
apply_graph_gen_alg(&algorithm_config).shuffled()
};
let head_comment = format!("Graph generated using {:?}", &algorithm_config);
if let Some(is_path) = &path {
Graph::to_as_rel_file(&graph, is_path, Some(&head_comment))?;
} else {
let graph_as_string = Graph::to_as_rel_string(&graph, Some(&head_comment)).unwrap();
eprintln!("Printing graph with {} nodes...", graph.number_of_nodes());
println!("{}", graph_as_string);
};
Ok(())
}