Advertisement
Guest User

Untitled

a guest
Jul 25th, 2016
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.78 KB | None | 0 0
  1. object PageRank {
  2.  
  3. def main(args: Array[String]): Unit = {
  4. val graph = Map(
  5. "A" -> List("B", "C"),
  6. "B" -> List("C"),
  7. "C" -> List("A")
  8. )
  9.  
  10. val init = Map(
  11. "A" -> 1.0,
  12. "B" -> 1.0,
  13. "C" -> 1.0
  14. )
  15.  
  16. val d = 0.5
  17.  
  18. println(init)
  19.  
  20. val result: Map[String, Double] = pageRank(graph, init, d)
  21.  
  22. println(result)
  23. }
  24.  
  25. def pageRank(graph: Map[String, List[String]], initPageRanks: Map[String, Double], damping: Double): Map[String, Double] = {
  26. val pageRanks: Stream[Map[String, Double]] =
  27. Stream.continually(1)
  28. .scanLeft(initPageRanks) {
  29. case (currentPageRanks, _) =>
  30. val newPageRanks =
  31. for {currentNode <- graph.keys}
  32. yield currentNode -> ((1 - damping) + damping * computeNewRank(graph, currentNode, currentPageRanks))
  33.  
  34. newPageRanks.toMap
  35. }
  36.  
  37. val result =
  38. pageRanks
  39. .zip(pageRanks.tail)
  40. .takeWhile {
  41. case (pr1, pr2) =>
  42. pageRanksEqual(pr1, pr2)
  43. }
  44. .last._1
  45.  
  46. result
  47. }
  48.  
  49. def computeNewRank(graph: Map[String, List[String]],
  50. currentNode: String,
  51. currentPageRanks: Map[String, Double]): Double =
  52. referringNodes(graph, currentNode)
  53. .map(node => currentPageRanks(node) / graph(node).size)
  54. .sum
  55.  
  56. def referringNodes(graph: Map[String, List[String]],
  57. currentNode: String): Iterable[String] =
  58. for {
  59. (node, neighboors) <- graph
  60. if (currentNode != node) && (neighboors contains currentNode)
  61. }
  62. yield node
  63.  
  64. def pageRanksEqual(pr1: Map[String, Double], pr2: Map[String, Double]): Boolean = {
  65. val r =
  66. for {key <- pr1.keys.toList}
  67. yield (pr1(key) - pr2(key)).abs < 1e-7
  68.  
  69. !r.forall(identity)
  70. }
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement