in cassovary-core/src/main/scala/com/twitter/cassovary/algorithms/TriangleCount.scala [116:149]
def update(iteration : Int, fromNode : Int, toNode : Int) : (Double, Long) = {
require(fromNode < toNode)
(0 until parameters.wedgeReservoirSize).foreach {
i =>
val wedge = wedgeReservoir(i)
if (wedge(0) == fromNode && wedge(2) == toNode) {
isClosed(i) = true
}
}
var updated = false
(0 until parameters.edgeReservoirSize).foreach {
i =>
if (rng.nextDouble <= 1.0 / iteration) {
edgeReservoir.set(i, List(fromNode, toNode))
updated = true
}
}
if (updated) {
totalWedges = computeWedgesInEdgeReservoir(edgeReservoir)
val newWedges = edgeReservoir.distinctIterator
.filter(edge => edge.contains(fromNode) ^ edge.contains(toNode)).toArray
if (newWedges.nonEmpty) {
(0 until parameters.wedgeReservoirSize).foreach {
wedgeNum =>
if (rng.nextDouble() < newWedges.size.toDouble / totalWedges) {
val randomNewWedge = createWedge(randomFromArray(newWedges), Seq(fromNode, toNode))
wedgeReservoir.set(wedgeNum, randomNewWedge)
isClosed(wedgeNum) = false
}
}
}
}
(isClosed.size.toDouble / parameters.wedgeReservoirSize, totalWedges)
}