Skip to content

Commit 70b14d9

Browse files
Add triangle count in compute facade
1 parent e83fd4e commit 70b14d9

File tree

4 files changed

+83
-1
lines changed

4 files changed

+83
-1
lines changed

algo/src/main/java/org/neo4j/gds/triangle/TriangleCountResult.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,13 @@
2020
package org.neo4j.gds.triangle;
2121

2222
import org.neo4j.gds.collections.haa.HugeAtomicLongArray;
23+
import org.neo4j.gds.core.concurrency.Concurrency;
24+
import org.neo4j.gds.core.utils.paged.ParalleLongPageCreator;
2325

2426
public record TriangleCountResult(
2527
HugeAtomicLongArray localTriangles,
2628
long globalTriangles
27-
) {}
29+
) {
30+
31+
public static TriangleCountResult EMPTY = new TriangleCountResult(HugeAtomicLongArray.of(0, ParalleLongPageCreator.passThrough(new Concurrency(1))),0);
32+
}

algorithms-compute-facade/src/main/java/org/neo4j/gds/community/CommunityComputeFacade.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,12 @@
6868
import org.neo4j.gds.scc.Scc;
6969
import org.neo4j.gds.scc.SccParameters;
7070
import org.neo4j.gds.termination.TerminationFlag;
71+
import org.neo4j.gds.triangle.IntersectingTriangleCount;
7172
import org.neo4j.gds.triangle.LocalClusteringCoefficient;
7273
import org.neo4j.gds.triangle.LocalClusteringCoefficientParameters;
7374
import org.neo4j.gds.triangle.LocalClusteringCoefficientResult;
75+
import org.neo4j.gds.triangle.TriangleCountParameters;
76+
import org.neo4j.gds.triangle.TriangleCountResult;
7477

7578
import java.util.Optional;
7679
import java.util.concurrent.CompletableFuture;
@@ -549,4 +552,38 @@ CompletableFuture<TimedAlgorithmResult<HugeLongArray>> scc(
549552
);
550553
}
551554

555+
CompletableFuture<TimedAlgorithmResult<TriangleCountResult>> triangleCount(
556+
Graph graph,
557+
TriangleCountParameters parameters,
558+
JobId jobId,
559+
boolean logProgress
560+
) {
561+
562+
if (graph.isEmpty()) {
563+
return CompletableFuture.completedFuture(TimedAlgorithmResult.empty(TriangleCountResult.EMPTY));
564+
}
565+
566+
var progressTracker = progressTrackerFactory.create(
567+
tasks.triangleCount(graph),
568+
jobId,
569+
parameters.concurrency(),
570+
logProgress
571+
);
572+
573+
var algorithm = IntersectingTriangleCount.create(
574+
graph,
575+
parameters.concurrency(),
576+
parameters.maxDegree(),
577+
parameters.labelFilter(),
578+
DefaultPool.INSTANCE,
579+
progressTracker,
580+
terminationFlag
581+
);
582+
583+
return algorithmCaller.run(
584+
algorithm::compute,
585+
jobId
586+
);
587+
}
588+
552589
}

algorithms-compute-facade/src/test/java/org/neo4j/gds/community/CommunityComputeFacadeEmptyGraphTest.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@
5555
import org.neo4j.gds.termination.TerminationFlag;
5656
import org.neo4j.gds.triangle.LocalClusteringCoefficientParameters;
5757
import org.neo4j.gds.triangle.LocalClusteringCoefficientResult;
58+
import org.neo4j.gds.triangle.TriangleCountParameters;
59+
import org.neo4j.gds.triangle.TriangleCountResult;
5860

5961
import static org.assertj.core.api.Assertions.assertThat;
6062
import static org.mockito.Mockito.mock;
@@ -323,4 +325,22 @@ void scc(){
323325
verifyNoInteractions(progressTrackerFactoryMock);
324326
verifyNoInteractions(algorithmCallerMock);
325327
}
328+
329+
@Test
330+
void triangleCount(){
331+
332+
var future = facade.triangleCount(
333+
graph,
334+
mock(TriangleCountParameters.class),
335+
jobIdMock,
336+
false
337+
);
338+
339+
var results = future.join();
340+
341+
assertThat(results.result()).isEqualTo(TriangleCountResult.EMPTY);
342+
verifyNoInteractions(progressTrackerFactoryMock);
343+
verifyNoInteractions(algorithmCallerMock);
344+
}
345+
326346
}

algorithms-compute-facade/src/test/java/org/neo4j/gds/community/CommunityComputeFacadeTest.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
import org.neo4j.gds.scc.SccParameters;
5454
import org.neo4j.gds.termination.TerminationFlag;
5555
import org.neo4j.gds.triangle.LocalClusteringCoefficientParameters;
56+
import org.neo4j.gds.triangle.TriangleCountParameters;
5657

5758
import java.util.List;
5859
import java.util.Optional;
@@ -394,4 +395,23 @@ void scc(){
394395
assertThat(results.computeMillis()).isNotNegative();
395396
}
396397

398+
@Test
399+
void triangleCount(){
400+
var future = facade.triangleCount(
401+
graph,
402+
new TriangleCountParameters(
403+
new Concurrency(4),
404+
10,
405+
List.of()
406+
),
407+
jobIdMock,
408+
false
409+
);
410+
411+
var results = future.join();
412+
413+
assertThat(results.result().globalTriangles()).isEqualTo(1L);
414+
assertThat(results.computeMillis()).isNotNegative();
415+
}
416+
397417
}

0 commit comments

Comments
 (0)