code: func (self *Graph) Rank(α, ε float64, callback func(id uint32, rank float64)) {
  	Δ := float64(1.0)
  	inverse := 1 / float64(len(self.nodes))
  
  	// Normalize all the edge weights so that their sum amounts to 1.
  	for source := range self.edges {
  		if self.nodes[source].outbound > 0 {
  			for target := range self.edges[source] {
  				self.edges[source][target] /= self.nodes[source].outbound
  			}
  		}
  	}
  
  	for key := range self.nodes {
  		self.nodes[key].weight = inverse
  	}
  
  	for Δ > ε {
  		leak := float64(0)
  		nodes := map[uint32]float64{}
  
  		for key, value := range self.nodes {
  			nodes[key] = value.weight
  
  			if value.outbound == 0 {
  				leak += value.weight
  			}
  
  			self.nodes[key].weight = 0
  		}
  
  		leak *= α
  
  		for source := range self.nodes {
  			for target, weight := range self.edges[source] {
  				self.nodes[target].weight += α * nodes[source] * weight
  			}
  
  			self.nodes[source].weight += (1-α)*inverse + leak*inverse
  		}
  
  		Δ = 0
  
  		for key, value := range self.nodes {
  			Δ += math.Abs(value.weight - nodes[key])
  		}
  	}
  
  	for key, value := range self.nodes {
  		callback(key, value.weight)
  	}
  }
docs: // Rank computes the PageRank of every node in the directed graph.
  // α (alpha) is the damping factor, usually set to 0.85.
  // ε (epsilon) is the convergence criteria, usually set to a tiny value.
  //
  // This method will run as many iterations as needed, until the graph converges.