in computer-algorithm/src/main/java/org/apache/hugegraph/computer/algorithm/community/kcore/Kcore.java [76:121]
public void compute(ComputationContext context, Vertex vertex,
Iterator<Id> messages) {
KcoreValue value = vertex.value();
if (!value.active()) {
// Ignore messages of deleted vertex
vertex.inactivate();
return;
}
int superstep = context.superstep();
if (superstep <= 2) {
int deleted = Iterators.size(messages);
assert value.active();
if (value.decreaseDegree(deleted) < this.k) {
// From active to inactive, delete self vertex
value.degree(0);
if (superstep == 1) {
context.sendMessageToAllEdges(vertex, vertex.id());
}
vertex.inactivate();
} else {
// From active to active, do wcc from superstep 2
if (superstep == 2) {
// Start wcc
context.sendMessageToAllEdgesIf(vertex, vertex.id(),
(source, target) -> {
return source.compareTo(target) < 0;
});
vertex.inactivate();
} else {
// Keep active at superstep 1 to continue superstep 2
assert superstep == 1;
assert vertex.active();
}
}
} else {
// Do wcc
assert superstep > 2;
Id message = Combiner.combineAll(context.combiner(), messages);
if (value.core().compareTo(message) > 0) {
value.core(message);
context.sendMessageToAllEdges(vertex, message);
}
vertex.inactivate();
}
}