Skip to content

Commit 7255445

Browse files
Add modularity optimization in compute facade
1 parent e487648 commit 7255445

File tree

4 files changed

+92
-0
lines changed

4 files changed

+92
-0
lines changed

algo/src/main/java/org/neo4j/gds/modularityoptimization/ModularityOptimizationResult.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,12 @@ public long nodeCount() {
4848
}
4949
};
5050
}
51+
52+
public static ModularityOptimizationResult EMPTY = new ModularityOptimizationResult(
53+
i -> 0,
54+
0,
55+
0,
56+
false,
57+
0
58+
);
5159
}

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

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@
6060
import org.neo4j.gds.modularity.ModularityCalculator;
6161
import org.neo4j.gds.modularity.ModularityParameters;
6262
import org.neo4j.gds.modularity.ModularityResult;
63+
import org.neo4j.gds.modularityoptimization.ModularityOptimization;
64+
import org.neo4j.gds.modularityoptimization.ModularityOptimizationParameters;
65+
import org.neo4j.gds.modularityoptimization.ModularityOptimizationResult;
6366
import org.neo4j.gds.result.TimedAlgorithmResult;
6467
import org.neo4j.gds.termination.TerminationFlag;
6568
import org.neo4j.gds.triangle.LocalClusteringCoefficient;
@@ -473,4 +476,44 @@ CompletableFuture<TimedAlgorithmResult<ModularityResult>> modularity(
473476
);
474477
}
475478

479+
CompletableFuture<TimedAlgorithmResult<ModularityOptimizationResult>> modularityOptimization(
480+
Graph graph,
481+
ModularityOptimizationParameters parameters,
482+
JobId jobId,
483+
boolean logProgress
484+
) {
485+
486+
if (graph.isEmpty()) {
487+
return CompletableFuture.completedFuture(TimedAlgorithmResult.empty(ModularityOptimizationResult.EMPTY));
488+
}
489+
490+
var progressTracker = progressTrackerFactory.create(
491+
tasks.modularityOptimization(graph,parameters),
492+
jobId,
493+
parameters.concurrency(),
494+
logProgress
495+
);
496+
497+
var seedPropertyValues = parameters.seedProperty()
498+
.map(seedProperty -> CommunityCompanion.extractSeedingNodePropertyValues(graph, seedProperty))
499+
.orElse(null);
500+
501+
var algorithm = new ModularityOptimization(
502+
graph,
503+
parameters.maxIterations(),
504+
parameters.tolerance(),
505+
seedPropertyValues,
506+
parameters.concurrency(),
507+
parameters.batchSize(),
508+
DefaultPool.INSTANCE,
509+
progressTracker,
510+
terminationFlag
511+
);
512+
513+
return algorithmCaller.run(
514+
algorithm::compute,
515+
jobId
516+
);
517+
}
518+
476519
}

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
@@ -49,6 +49,8 @@
4949
import org.neo4j.gds.louvain.LouvainResult;
5050
import org.neo4j.gds.modularity.ModularityParameters;
5151
import org.neo4j.gds.modularity.ModularityResult;
52+
import org.neo4j.gds.modularityoptimization.ModularityOptimizationParameters;
53+
import org.neo4j.gds.modularityoptimization.ModularityOptimizationResult;
5254
import org.neo4j.gds.termination.TerminationFlag;
5355
import org.neo4j.gds.triangle.LocalClusteringCoefficientParameters;
5456
import org.neo4j.gds.triangle.LocalClusteringCoefficientResult;
@@ -286,4 +288,21 @@ void modularity(){
286288
verifyNoInteractions(progressTrackerFactoryMock);
287289
verifyNoInteractions(algorithmCallerMock);
288290
}
291+
292+
@Test
293+
void modularityOptimization(){
294+
295+
var future = facade.modularityOptimization(
296+
graph,
297+
mock(ModularityOptimizationParameters.class),
298+
jobIdMock,
299+
false
300+
);
301+
302+
var results = future.join();
303+
304+
assertThat(results.result()).isEqualTo(ModularityOptimizationResult.EMPTY);
305+
verifyNoInteractions(progressTrackerFactoryMock);
306+
verifyNoInteractions(algorithmCallerMock);
307+
}
289308
}

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import org.neo4j.gds.logging.Log;
5050
import org.neo4j.gds.louvain.LouvainParameters;
5151
import org.neo4j.gds.modularity.ModularityParameters;
52+
import org.neo4j.gds.modularityoptimization.ModularityOptimizationParameters;
5253
import org.neo4j.gds.termination.TerminationFlag;
5354
import org.neo4j.gds.triangle.LocalClusteringCoefficientParameters;
5455

@@ -354,4 +355,25 @@ void modularity(){
354355
assertThat(results.computeMillis()).isNotNegative();
355356
}
356357

358+
@Test
359+
void modularityOptimization(){
360+
var future = facade.modularityOptimization(
361+
graph,
362+
new ModularityOptimizationParameters(
363+
new Concurrency(4),
364+
10,
365+
10_000,
366+
0,
367+
Optional.empty()
368+
),
369+
jobIdMock,
370+
false
371+
);
372+
373+
var results = future.join();
374+
375+
assertThat(results.result().ranIterations()).isGreaterThan(0);
376+
assertThat(results.computeMillis()).isNotNegative();
377+
}
378+
357379
}

0 commit comments

Comments
 (0)