mirror of
https://git.proxmox.com/git/rustc
synced 2025-08-14 14:26:04 +00:00
63 lines
1.9 KiB
Rust
63 lines
1.9 KiB
Rust
extern crate datafrog;
|
|
use datafrog::Iteration;
|
|
|
|
fn main() {
|
|
let timer = ::std::time::Instant::now();
|
|
|
|
// Make space for input data.
|
|
let mut nodes = Vec::new();
|
|
let mut edges = Vec::new();
|
|
|
|
// Read input data from a handy file.
|
|
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());
|
|
|
|
// Create a new iteration context, ...
|
|
let mut iteration = Iteration::new();
|
|
|
|
// .. some variables, ..
|
|
let variable1 = iteration.variable::<(u32, u32)>("nodes");
|
|
let variable2 = iteration.variable::<(u32, u32)>("edges");
|
|
|
|
// .. load them with some initial values, ..
|
|
variable1.insert(nodes.into());
|
|
variable2.insert(edges.into());
|
|
|
|
// .. and then start iterating rules!
|
|
while iteration.changed() {
|
|
// N(a,c) <- N(a,b), E(b,c)
|
|
variable1.from_join(&variable1, &variable2, |_b, &a, &c| (c, a));
|
|
}
|
|
|
|
let reachable = variable1.complete();
|
|
|
|
println!(
|
|
"{:?}\tComputation complete (nodes_final: {})",
|
|
timer.elapsed(),
|
|
reachable.len()
|
|
);
|
|
}
|