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