@Override public Result getResult() { long triangleTripletCount = edgeMetricsHelper.getAccumulator(env, TRIANGLE_TRIPLET_COUNT); long rectangleTripletCount = edgeMetricsHelper.getAccumulator(env, RECTANGLE_TRIPLET_COUNT); long maximumTriangleTriplets = edgeMetricsHelper.getAccumulator(env, MAXIMUM_TRIANGLE_TRIPLETS); long maximumRectangleTriplets = edgeMetricsHelper.getAccumulator(env, MAXIMUM_RECTANGLE_TRIPLETS); return new Result(triangleTripletCount, rectangleTripletCount, maximumTriangleTriplets, maximumRectangleTriplets); }
@Override public Result getResult() { long vertexCount = vertexMetricsHelper.getAccumulator(env, VERTEX_COUNT); long edgeCount = vertexMetricsHelper.getAccumulator(env, EDGE_COUNT); long tripletCount = vertexMetricsHelper.getAccumulator(env, TRIPLET_COUNT); long maximumDegree = vertexMetricsHelper.getAccumulator(env, MAXIMUM_DEGREE); long maximumTriplets = vertexMetricsHelper.getAccumulator(env, MAXIMUM_TRIPLETS); // each edge is counted twice, once from each vertex, so must be halved return new Result(vertexCount, edgeCount / 2, tripletCount, maximumDegree, maximumTriplets); }
@Override public String toString() { return toPrintableString(); }
@Override public GlobalClusteringCoefficient<K, VV, EV> run(Graph<K, VV, EV> input) throws Exception { super.run(input); triangleCount = new Count<>(); DataSet<TriangleListing.Result<K>> triangles = input .run(new TriangleListing<K, VV, EV>() .setSortTriangleVertices(false) .setParallelism(parallelism)); triangleCount.run(triangles); vertexMetrics = new VertexMetrics<K, VV, EV>() .setParallelism(parallelism); input.run(vertexMetrics); return this; }
@Override public DataSet plan(Graph<K, VV, EV> graph) throws Exception { switch (order.getValue()) { case DIRECTED: vertexMetrics = graph .run(new org.apache.flink.graph.library.metric.directed.VertexMetrics<K, VV, EV>() .setParallelism(parallelism.getValue().intValue())); edgeMetrics = graph .run(new org.apache.flink.graph.library.metric.directed.EdgeMetrics<K, VV, EV>() .setParallelism(parallelism.getValue().intValue())); break; case UNDIRECTED: vertexMetrics = graph .run(new org.apache.flink.graph.library.metric.undirected.VertexMetrics<K, VV, EV>() .setParallelism(parallelism.getValue().intValue())); edgeMetrics = graph .run(new org.apache.flink.graph.library.metric.undirected.EdgeMetrics<K, VV, EV>() .setParallelism(parallelism.getValue().intValue())); break; } return null; }
@Override public Result getResult() { BigInteger bigVertexCount = BigInteger.valueOf(vertexMetrics.getResult().getNumberOfVertices()); BigInteger bigEdgeCount = BigInteger.valueOf(vertexMetrics.getResult().getNumberOfEdges()); BigInteger bigTripletCount = BigInteger.valueOf(vertexMetrics.getResult().getNumberOfTriplets());
@Override public EdgeMetrics<K, VV, EV> run(Graph<K, VV, EV> input) throws Exception { super.run(input); // s, t, (d(s), d(t)) DataSet<Edge<K, Tuple3<EV, LongValue, LongValue>>> edgeDegreePair = input .run(new EdgeDegreePair<K, VV, EV>() .setReduceOnTargetId(reduceOnTargetId) .setParallelism(parallelism)); // s, d(s), count of (u, v) where deg(u) < deg(v) or (deg(u) == deg(v) and u < v) DataSet<Tuple3<K, LongValue, LongValue>> edgeStats = edgeDegreePair .map(new EdgeStats<>()) .setParallelism(parallelism) .name("Edge stats") .groupBy(0) .reduce(new SumEdgeStats<>()) .setCombineHint(CombineHint.HASH) .setParallelism(parallelism) .name("Sum edge stats"); edgeMetricsHelper = new EdgeMetricsHelper<>(); edgeStats .output(edgeMetricsHelper) .setParallelism(parallelism) .name("Edge metrics"); return this; }
@Override public String toPrintableString() { NumberFormat nf = NumberFormat.getInstance(); // format for very small fractional numbers NumberFormat ff = NumberFormat.getInstance(); ff.setMaximumFractionDigits(8); return "vertex count: " + nf.format(vertexCount) + "; edge count: " + nf.format(edgeCount) + "; average degree: " + nf.format(getAverageDegree()) + "; density: " + ff.format(getDensity()) + "; triplet count: " + nf.format(tripletCount) + "; maximum degree: " + nf.format(maximumDegree) + "; maximum triplets: " + nf.format(maximumTriplets); }
@Override public void close() throws IOException { addAccumulator(VERTEX_COUNT, new LongCounter(vertexCount)); addAccumulator(EDGE_COUNT, new LongCounter(edgeCount)); addAccumulator(TRIPLET_COUNT, new LongCounter(tripletCount)); addAccumulator(MAXIMUM_DEGREE, new LongMaximum(maximumDegree)); addAccumulator(MAXIMUM_TRIPLETS, new LongMaximum(maximumTriplets)); } }
@Override public void close() throws IOException { addAccumulator(TRIANGLE_TRIPLET_COUNT, new LongCounter(triangleTripletCount)); addAccumulator(RECTANGLE_TRIPLET_COUNT, new LongCounter(rectangleTripletCount)); addAccumulator(MAXIMUM_TRIANGLE_TRIPLETS, new LongMaximum(maximumTriangleTriplets)); addAccumulator(MAXIMUM_RECTANGLE_TRIPLETS, new LongMaximum(maximumRectangleTriplets)); } }
@Override public Result getResult() { // each triangle is counted from each of the three vertices long numberOfTriangles = 3 * triangleCount.getResult(); return new Result(vertexMetrics.getResult().getNumberOfTriplets(), numberOfTriangles); }
@Override public VertexMetrics<K, VV, EV> run(Graph<K, VV, EV> input) throws Exception { super.run(input); DataSet<Vertex<K, LongValue>> vertexDegree = input .run(new VertexDegree<K, VV, EV>() .setIncludeZeroDegreeVertices(includeZeroDegreeVertices) .setReduceOnTargetId(reduceOnTargetId) .setParallelism(parallelism)); vertexMetricsHelper = new VertexMetricsHelper<>(); vertexDegree .output(vertexMetricsHelper) .name("Vertex metrics"); return this; }
@Override public String toString() { return toPrintableString(); }
@Override public Result getResult() { long triangleTripletCount = edgeMetricsHelper.getAccumulator(env, TRIANGLE_TRIPLET_COUNT); long rectangleTripletCount = edgeMetricsHelper.getAccumulator(env, RECTANGLE_TRIPLET_COUNT); long maximumTriangleTriplets = edgeMetricsHelper.getAccumulator(env, MAXIMUM_TRIANGLE_TRIPLETS); long maximumRectangleTriplets = edgeMetricsHelper.getAccumulator(env, MAXIMUM_RECTANGLE_TRIPLETS); return new Result(triangleTripletCount, rectangleTripletCount, maximumTriangleTriplets, maximumRectangleTriplets); }
@Override public Result getResult() { long vertexCount = vertexMetricsHelper.getAccumulator(env, VERTEX_COUNT); long edgeCount = vertexMetricsHelper.getAccumulator(env, EDGE_COUNT); long tripletCount = vertexMetricsHelper.getAccumulator(env, TRIPLET_COUNT); long maximumDegree = vertexMetricsHelper.getAccumulator(env, MAXIMUM_DEGREE); long maximumTriplets = vertexMetricsHelper.getAccumulator(env, MAXIMUM_TRIPLETS); // each edge is counted twice, once from each vertex, so must be halved return new Result(vertexCount, edgeCount / 2, tripletCount, maximumDegree, maximumTriplets); }
@Override public TriadicCensus<K, VV, EV> run(Graph<K, VV, EV> input) throws Exception { super.run(input); triangleCount = new Count<>(); DataSet<TriangleListing.Result<K>> triangles = input .run(new TriangleListing<K, VV, EV>() .setSortTriangleVertices(false) .setParallelism(parallelism)); triangleCount.run(triangles); vertexMetrics = new VertexMetrics<K, VV, EV>() .setParallelism(parallelism); input.run(vertexMetrics); return this; }
@Override public Result getResult() { long triangleTripletCount = edgeMetricsHelper.getAccumulator(env, TRIANGLE_TRIPLET_COUNT); long rectangleTripletCount = edgeMetricsHelper.getAccumulator(env, RECTANGLE_TRIPLET_COUNT); long maximumTriangleTriplets = edgeMetricsHelper.getAccumulator(env, MAXIMUM_TRIANGLE_TRIPLETS); long maximumRectangleTriplets = edgeMetricsHelper.getAccumulator(env, MAXIMUM_RECTANGLE_TRIPLETS); return new Result(triangleTripletCount, rectangleTripletCount, maximumTriangleTriplets, maximumRectangleTriplets); }
@Override public Result getResult() { long vertexCount = vertexMetricsHelper.getAccumulator(env, VERTEX_COUNT); long edgeCount = vertexMetricsHelper.getAccumulator(env, EDGE_COUNT); long tripletCount = vertexMetricsHelper.getAccumulator(env, TRIPLET_COUNT); long maximumDegree = vertexMetricsHelper.getAccumulator(env, MAXIMUM_DEGREE); long maximumTriplets = vertexMetricsHelper.getAccumulator(env, MAXIMUM_TRIPLETS); // each edge is counted twice, once from each vertex, so must be halved return new Result(vertexCount, edgeCount / 2, tripletCount, maximumDegree, maximumTriplets); }
@Override public Result getResult() { long triangleTripletCount = edgeMetricsHelper.getAccumulator(env, TRIANGLE_TRIPLET_COUNT); long rectangleTripletCount = edgeMetricsHelper.getAccumulator(env, RECTANGLE_TRIPLET_COUNT); long maximumTriangleTriplets = edgeMetricsHelper.getAccumulator(env, MAXIMUM_TRIANGLE_TRIPLETS); long maximumRectangleTriplets = edgeMetricsHelper.getAccumulator(env, MAXIMUM_RECTANGLE_TRIPLETS); return new Result(triangleTripletCount, rectangleTripletCount, maximumTriangleTriplets, maximumRectangleTriplets); }
@Override public Result getResult() { long vertexCount = vertexMetricsHelper.getAccumulator(env, VERTEX_COUNT); long edgeCount = vertexMetricsHelper.getAccumulator(env, EDGE_COUNT); long tripletCount = vertexMetricsHelper.getAccumulator(env, TRIPLET_COUNT); long maximumDegree = vertexMetricsHelper.getAccumulator(env, MAXIMUM_DEGREE); long maximumTriplets = vertexMetricsHelper.getAccumulator(env, MAXIMUM_TRIPLETS); // each edge is counted twice, once from each vertex, so must be halved return new Result(vertexCount, edgeCount / 2, tripletCount, maximumDegree, maximumTriplets); }