extern crate datafrog;
use datafrog::Iteration;
fn main() {
let timer = ::std::time::Instant::now();
let mut nodes = Vec::new();
let mut edges = Vec::new();
use std::fs::File;
use std::io::{BufRead, BufReader};
let filename = std::env::args().nth(1).unwrap();
let file = BufReader::new(File::open(filename).unwrap());
for readline in file.lines() {
let line = readline.expect("read error");
if !line.is_empty() && !line.starts_with('#') {
let mut elts = line[..].split_whitespace();
let src: u32 = elts.next().unwrap().parse().expect("malformed src");
let dst: u32 = elts.next().unwrap().parse().expect("malformed dst");
let typ: &str = elts.next().unwrap();
match typ {
"n" => {
nodes.push((dst, src));
}
"e" => {
edges.push((src, dst));
}
unk => panic!("unknown type: {}", unk),
}
}
}
println!("{:?}\tData loaded", timer.elapsed());
let mut iteration = Iteration::new();
let variable1 = iteration.variable::<(u32, u32)>("nodes");
let variable2 = iteration.variable::<(u32, u32)>("edges");
variable1.insert(nodes.into());
variable2.insert(edges.into());
while iteration.changed() {
variable1.from_join(&variable1, &variable2, |_b, &a, &c| (c, a));
}
let reachable = variable1.complete();
println!(
"{:?}\tComputation complete (nodes_final: {})",
timer.elapsed(),
reachable.len()
);
}