Skip to content

Commit 71d53ac

Browse files
Add louvain in compute facade
1 parent 4ef1d6a commit 71d53ac

File tree

4 files changed

+84
-0
lines changed

4 files changed

+84
-0
lines changed

algo/src/main/java/org/neo4j/gds/louvain/LouvainResult.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,12 @@ public long size() {
5555
return communities.size();
5656
}
5757

58+
public static LouvainResult EMPTY = new LouvainResult(
59+
HugeLongArray.newArray(0),
60+
0,
61+
null,
62+
new double[0],
63+
0
64+
);
65+
5866
}

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

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@
5454
import org.neo4j.gds.leiden.Leiden;
5555
import org.neo4j.gds.leiden.LeidenParameters;
5656
import org.neo4j.gds.leiden.LeidenResult;
57+
import org.neo4j.gds.louvain.Louvain;
58+
import org.neo4j.gds.louvain.LouvainParameters;
59+
import org.neo4j.gds.louvain.LouvainResult;
5760
import org.neo4j.gds.result.TimedAlgorithmResult;
5861
import org.neo4j.gds.termination.TerminationFlag;
5962
import org.neo4j.gds.triangle.LocalClusteringCoefficient;
@@ -413,5 +416,36 @@ CompletableFuture<TimedAlgorithmResult<LeidenResult>> leiden(
413416
);
414417
}
415418

419+
CompletableFuture<TimedAlgorithmResult<LouvainResult>> louvain(
420+
Graph graph,
421+
LouvainParameters parameters,
422+
JobId jobId,
423+
boolean logProgress
424+
) {
425+
426+
if (graph.isEmpty()) {
427+
return CompletableFuture.completedFuture(TimedAlgorithmResult.empty(LouvainResult.EMPTY));
428+
}
429+
430+
var progressTracker = progressTrackerFactory.create(
431+
tasks.louvain(graph,parameters),
432+
jobId,
433+
parameters.concurrency(),
434+
logProgress
435+
);
436+
437+
var algorithm = new Louvain(
438+
graph,
439+
parameters,
440+
progressTracker,
441+
DefaultPool.INSTANCE,
442+
terminationFlag
443+
);
444+
445+
return algorithmCaller.run(
446+
algorithm::compute,
447+
jobId
448+
);
449+
}
416450

417451
}

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@
4545
import org.neo4j.gds.labelpropagation.LabelPropagationResult;
4646
import org.neo4j.gds.leiden.LeidenParameters;
4747
import org.neo4j.gds.leiden.LeidenResult;
48+
import org.neo4j.gds.louvain.LouvainParameters;
49+
import org.neo4j.gds.louvain.LouvainResult;
4850
import org.neo4j.gds.termination.TerminationFlag;
4951
import org.neo4j.gds.triangle.LocalClusteringCoefficientParameters;
5052
import org.neo4j.gds.triangle.LocalClusteringCoefficientResult;
@@ -249,4 +251,21 @@ void leiden(){
249251
verifyNoInteractions(progressTrackerFactoryMock);
250252
verifyNoInteractions(algorithmCallerMock);
251253
}
254+
255+
@Test
256+
void louvain(){
257+
258+
var future = facade.louvain(
259+
graph,
260+
mock(LouvainParameters.class),
261+
jobIdMock,
262+
false
263+
);
264+
265+
var results = future.join();
266+
267+
assertThat(results.result()).isEqualTo(LouvainResult.EMPTY);
268+
verifyNoInteractions(progressTrackerFactoryMock);
269+
verifyNoInteractions(algorithmCallerMock);
270+
}
252271
}

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import org.neo4j.gds.labelpropagation.LabelPropagationParameters;
4848
import org.neo4j.gds.leiden.LeidenParameters;
4949
import org.neo4j.gds.logging.Log;
50+
import org.neo4j.gds.louvain.LouvainParameters;
5051
import org.neo4j.gds.termination.TerminationFlag;
5152
import org.neo4j.gds.triangle.LocalClusteringCoefficientParameters;
5253

@@ -313,4 +314,26 @@ void leiden(){
313314
assertThat(results.computeMillis()).isNotNegative();
314315
}
315316

317+
@Test
318+
void louvain(){
319+
var future = facade.louvain(
320+
graph,
321+
new LouvainParameters(
322+
new Concurrency(4),
323+
10,
324+
0,
325+
10,
326+
false,
327+
null
328+
),
329+
jobIdMock,
330+
false
331+
);
332+
333+
var results = future.join();
334+
335+
assertThat(results.result().ranLevels()).isGreaterThan(0);
336+
assertThat(results.computeMillis()).isNotNegative();
337+
}
338+
316339
}

0 commit comments

Comments
 (0)