use std::{cmp,env,mem,ops,iter,marker,hash};
use std::collections::HashMap;
use hadean::{Sender,Receiver,Connection,Process,ChannelType,Channel,pid,spawn,ProcessSendable};
use graph::{Graph,GraphInterpreter};
impl<V,E> Graph<V,E> where V: ProcessSendable, E: ProcessSendable {
pub fn pagerank(self, damping: f64, iterations: usize) -> Graph<(V,f64),E> where V: ProcessSendable, (V,f64): ProcessSendable, E: ProcessSendable {
let num_vertices = self.num_vertices();
let initial = 1.0/num_vertices as f64;
let mut graph: Graph<(V,f64),E> = self.map(move |vertex| (vertex,initial), move |edge| edge);
for _ in 0..iterations {
graph.step(
move |(_vertex,score), edges| {
let out = score / edges.len() as f64;
for mut edge in edges {
edge.send(out);
}
}, move |(vertex,score), messages| {
let mut sum = 0f64;
for val in messages {
sum += val;
}
(vertex,(1.0-damping) / num_vertices as f64 + damping * sum)
}
)
}
graph
}
}