@Override public Result getResult() { long vertexCount = averageClusteringCoefficientHelper.getAccumulator(env, VERTEX_COUNT); double sumOfLocalClusteringCoefficient = averageClusteringCoefficientHelper.getAccumulator(env, SUM_OF_LOCAL_CLUSTERING_COEFFICIENT); return new Result(vertexCount, sumOfLocalClusteringCoefficient); }
@Override public String toString() { return "(" + getVertexId0() + "," + getVertexId1() + "," + getVertexId2() + ")"; }
@Override public String toString() { return "(" + getVertexId0() + "," + degree + "," + triangleCount + ")"; }
@Override public Result<T> map(Result<T> value) throws Exception { // by the triangle listing algorithm we know f1 < f2 if (value.getVertexId0().compareTo(value.getVertexId1()) > 0) { T tempVal = value.getVertexId0(); value.setVertexId0(value.getVertexId1()); if (tempVal.compareTo(value.getVertexId2()) <= 0) { value.setVertexId1(tempVal); } else { value.setVertexId1(value.getVertexId2()); value.setVertexId2(tempVal); } } return value; } }
@Override public String toPrintableString() { NumberFormat nf = NumberFormat.getInstance(); return "03: " + nf.format(getCount03()) + "; 12: " + nf.format(getCount12()) + "; 21: " + nf.format(getCount21()) + "; 30: " + nf.format(getCount30()); }
@Override public AverageClusteringCoefficient<K, VV, EV> run(Graph<K, VV, EV> input) throws Exception { super.run(input); DataSet<LocalClusteringCoefficient.Result<K>> localClusteringCoefficient = input .run(new LocalClusteringCoefficient<K, VV, EV>() .setParallelism(parallelism)); averageClusteringCoefficientHelper = new AverageClusteringCoefficientHelper<>(); localClusteringCoefficient .output(averageClusteringCoefficientHelper) .name("Average clustering coefficient"); return this; }
/** * Format values into a human-readable string. * * @return verbose string */ @Override public String toPrintableString() { return "Vertex ID: " + getVertexId0() + ", vertex degree: " + degree + ", triangle count: " + triangleCount + ", local clustering coefficient: " + getLocalClusteringCoefficientScore(); }
@Override public void writeRecord(LocalClusteringCoefficient.Result<T> record) throws IOException { vertexCount++; // local clustering coefficient is only defined on vertices with // at least two neighbors yielding at least one pair of neighbors if (record.getDegree().getValue() > 1) { sumOfLocalClusteringCoefficient += record.getLocalClusteringCoefficientScore(); } }
@Override public Result<T> join(Vertex<T, LongValue> vertexAndDegree, Tuple2<T, LongValue> vertexAndTriangleCount) throws Exception { output.setVertexId0(vertexAndDegree.f0); output.setDegree(vertexAndDegree.f1); output.setTriangleCount((vertexAndTriangleCount == null) ? zero : vertexAndTriangleCount.f1); return output; } }
@Override public Result<T> join(Tuple3<T, T, T> triplet, Tuple2<T, T> edge) throws Exception { output.setVertexId0(triplet.f0); output.setVertexId1(triplet.f1); output.setVertexId2(triplet.f2); return output; } }
/** * Get the local clustering coefficient score. This is computed as the * number of edges between neighbors, equal to the triangle count, * divided by the number of potential edges between neighbors. * * <p>A score of {@code Double.NaN} is returned for a vertex with degree 1 * for which both the triangle count and number of neighbors are zero. * * @return local clustering coefficient score */ public double getLocalClusteringCoefficientScore() { long degree = getDegree().getValue(); long neighborPairs = degree * (degree - 1) / 2; return (neighborPairs == 0) ? Double.NaN : getTriangleCount().getValue() / (double) neighborPairs; }
@Override public String toPrintableString() { return "triplet count: " + tripletCount + ", triangle count: " + triangleCount + ", global clustering coefficient: " + getGlobalClusteringCoefficientScore(); }
@Override public void close() throws IOException { addAccumulator(VERTEX_COUNT, new LongCounter(vertexCount)); addAccumulator(SUM_OF_LOCAL_CLUSTERING_COEFFICIENT, new DoubleCounter(sumOfLocalClusteringCoefficient)); } }
@Override public String toString() { return toPrintableString(); }
@Override public String toString() { return toPrintableString(); }
@Override public String toString() { return toPrintableString(); }
@Override public String toPrintableString() { return "1st vertex ID: " + getVertexId0() + ", 2nd vertex ID: " + getVertexId1() + ", 3rd vertex ID: " + getVertexId2(); }
@Override public int hashCode() { if (hasher == null) { hasher = new MurmurHash(HASH_SEED); } return hasher.reset() .hash(getVertexId0().hashCode()) .hash(degree.getValue()) .hash(triangleCount.getValue()) .hash(); } }
@Override public void flatMap(TriangleListing.Result<T> value, Collector<Tuple2<T, LongValue>> out) throws Exception { output.f0 = value.getVertexId0(); out.collect(output); output.f0 = value.getVertexId1(); out.collect(output); output.f0 = value.getVertexId2(); out.collect(output); } }
@Override public int hashCode() { if (hasher == null) { hasher = new MurmurHash(HASH_SEED); } return hasher.reset() .hash(getVertexId0().hashCode()) .hash(getVertexId1().hashCode()) .hash(getVertexId2().hashCode()) .hash(); } }