Skip to content

Commit e487648

Browse files
Add modularity in compute facade
1 parent 71d53ac commit e487648

File tree

4 files changed

+71
-1
lines changed

4 files changed

+71
-1
lines changed

algo/src/main/java/org/neo4j/gds/modularity/ModularityResult.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,13 @@ public record ModularityResult(
2727
double totalModularity,
2828
long communityCount,
2929
HugeObjectArray<CommunityModularity> modularityScores
30-
) { }
30+
) {
31+
32+
public static ModularityResult EMPTY = new ModularityResult(
33+
0,
34+
0,
35+
0,
36+
0,
37+
HugeObjectArray.newArray(CommunityModularity.class,0)
38+
);
39+
}

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@
5757
import org.neo4j.gds.louvain.Louvain;
5858
import org.neo4j.gds.louvain.LouvainParameters;
5959
import org.neo4j.gds.louvain.LouvainResult;
60+
import org.neo4j.gds.modularity.ModularityCalculator;
61+
import org.neo4j.gds.modularity.ModularityParameters;
62+
import org.neo4j.gds.modularity.ModularityResult;
6063
import org.neo4j.gds.result.TimedAlgorithmResult;
6164
import org.neo4j.gds.termination.TerminationFlag;
6265
import org.neo4j.gds.triangle.LocalClusteringCoefficient;
@@ -448,4 +451,26 @@ CompletableFuture<TimedAlgorithmResult<LouvainResult>> louvain(
448451
);
449452
}
450453

454+
CompletableFuture<TimedAlgorithmResult<ModularityResult>> modularity(
455+
Graph graph,
456+
ModularityParameters parameters,
457+
JobId jobId
458+
) {
459+
460+
if (graph.isEmpty()) {
461+
return CompletableFuture.completedFuture(TimedAlgorithmResult.empty(ModularityResult.EMPTY));
462+
}
463+
464+
var algorithm = ModularityCalculator.create(
465+
graph,
466+
graph.nodeProperties(parameters.communityProperty())::longValue,
467+
parameters.concurrency()
468+
);
469+
470+
return algorithmCaller.run(
471+
algorithm::compute,
472+
jobId
473+
);
474+
}
475+
451476
}

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@
4747
import org.neo4j.gds.leiden.LeidenResult;
4848
import org.neo4j.gds.louvain.LouvainParameters;
4949
import org.neo4j.gds.louvain.LouvainResult;
50+
import org.neo4j.gds.modularity.ModularityParameters;
51+
import org.neo4j.gds.modularity.ModularityResult;
5052
import org.neo4j.gds.termination.TerminationFlag;
5153
import org.neo4j.gds.triangle.LocalClusteringCoefficientParameters;
5254
import org.neo4j.gds.triangle.LocalClusteringCoefficientResult;
@@ -268,4 +270,20 @@ void louvain(){
268270
verifyNoInteractions(progressTrackerFactoryMock);
269271
verifyNoInteractions(algorithmCallerMock);
270272
}
273+
274+
@Test
275+
void modularity(){
276+
277+
var future = facade.modularity(
278+
graph,
279+
mock(ModularityParameters.class),
280+
jobIdMock
281+
);
282+
283+
var results = future.join();
284+
285+
assertThat(results.result()).isEqualTo(ModularityResult.EMPTY);
286+
verifyNoInteractions(progressTrackerFactoryMock);
287+
verifyNoInteractions(algorithmCallerMock);
288+
}
271289
}

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import org.neo4j.gds.leiden.LeidenParameters;
4949
import org.neo4j.gds.logging.Log;
5050
import org.neo4j.gds.louvain.LouvainParameters;
51+
import org.neo4j.gds.modularity.ModularityParameters;
5152
import org.neo4j.gds.termination.TerminationFlag;
5253
import org.neo4j.gds.triangle.LocalClusteringCoefficientParameters;
5354

@@ -336,4 +337,21 @@ void louvain(){
336337
assertThat(results.computeMillis()).isNotNegative();
337338
}
338339

340+
@Test
341+
void modularity(){
342+
var future = facade.modularity(
343+
graph,
344+
new ModularityParameters(
345+
"prop",
346+
new Concurrency(4)
347+
),
348+
jobIdMock
349+
);
350+
351+
var results = future.join();
352+
353+
assertThat(results.result().nodeCount()).isEqualTo(3);
354+
assertThat(results.computeMillis()).isNotNegative();
355+
}
356+
339357
}

0 commit comments

Comments
 (0)