Skip to content

Commit 4ef1d6a

Browse files
Add leiden in compute facade
1 parent 9e1c695 commit 4ef1d6a

File tree

4 files changed

+93
-5
lines changed

4 files changed

+93
-5
lines changed

algo/src/main/java/org/neo4j/gds/leiden/LeidenResult.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@
2222
import org.jetbrains.annotations.Nullable;
2323
import org.neo4j.gds.collections.ha.HugeLongArray;
2424

25-
import java.util.function.LongUnaryOperator;
26-
2725
public record LeidenResult(
2826
HugeLongArray communities,
2927
int ranLevels,
@@ -50,8 +48,13 @@ public long[] intermediateCommunities(long nodeId) {
5048

5149
}
5250

53-
public LongUnaryOperator communitiesFunction() {
54-
return communities::get;
55-
}
51+
public static LeidenResult EMPTY = new LeidenResult(
52+
HugeLongArray.newArray(0),
53+
0,
54+
false,
55+
null,
56+
new double[0],
57+
0
58+
);
5659

5760
}

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

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import org.neo4j.gds.CommunityAlgorithmTasks;
2323
import org.neo4j.gds.ProgressTrackerFactory;
24+
import org.neo4j.gds.algorithms.community.CommunityCompanion;
2425
import org.neo4j.gds.api.Graph;
2526
import org.neo4j.gds.approxmaxkcut.ApproxMaxKCut;
2627
import org.neo4j.gds.approxmaxkcut.ApproxMaxKCutParameters;
@@ -50,12 +51,16 @@
5051
import org.neo4j.gds.labelpropagation.LabelPropagation;
5152
import org.neo4j.gds.labelpropagation.LabelPropagationParameters;
5253
import org.neo4j.gds.labelpropagation.LabelPropagationResult;
54+
import org.neo4j.gds.leiden.Leiden;
55+
import org.neo4j.gds.leiden.LeidenParameters;
56+
import org.neo4j.gds.leiden.LeidenResult;
5357
import org.neo4j.gds.result.TimedAlgorithmResult;
5458
import org.neo4j.gds.termination.TerminationFlag;
5559
import org.neo4j.gds.triangle.LocalClusteringCoefficient;
5660
import org.neo4j.gds.triangle.LocalClusteringCoefficientParameters;
5761
import org.neo4j.gds.triangle.LocalClusteringCoefficientResult;
5862

63+
import java.util.Optional;
5964
import java.util.concurrent.CompletableFuture;
6065

6166
public class CommunityComputeFacade {
@@ -372,5 +377,41 @@ CompletableFuture<TimedAlgorithmResult<LocalClusteringCoefficientResult>> lcc(
372377
);
373378
}
374379

380+
CompletableFuture<TimedAlgorithmResult<LeidenResult>> leiden(
381+
Graph graph,
382+
LeidenParameters parameters,
383+
JobId jobId,
384+
boolean logProgress
385+
) {
386+
387+
if (graph.isEmpty()) {
388+
return CompletableFuture.completedFuture(TimedAlgorithmResult.empty(LeidenResult.EMPTY));
389+
}
390+
391+
var progressTracker = progressTrackerFactory.create(
392+
tasks.leiden(graph,parameters),
393+
jobId,
394+
parameters.concurrency(),
395+
logProgress
396+
);
397+
398+
var seedValues = Optional.ofNullable(parameters.seedProperty())
399+
.map(seedParameter -> CommunityCompanion.extractSeedingNodePropertyValues(graph, seedParameter))
400+
.orElse(null);
401+
402+
var algorithm = new Leiden(
403+
graph,
404+
parameters,
405+
seedValues,
406+
progressTracker,
407+
terminationFlag
408+
);
409+
410+
return algorithmCaller.run(
411+
algorithm::compute,
412+
jobId
413+
);
414+
}
415+
375416

376417
}

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
@@ -43,6 +43,8 @@
4343
import org.neo4j.gds.kmeans.KmeansParameters;
4444
import org.neo4j.gds.labelpropagation.LabelPropagationParameters;
4545
import org.neo4j.gds.labelpropagation.LabelPropagationResult;
46+
import org.neo4j.gds.leiden.LeidenParameters;
47+
import org.neo4j.gds.leiden.LeidenResult;
4648
import org.neo4j.gds.termination.TerminationFlag;
4749
import org.neo4j.gds.triangle.LocalClusteringCoefficientParameters;
4850
import org.neo4j.gds.triangle.LocalClusteringCoefficientResult;
@@ -230,4 +232,21 @@ void lcc(){
230232
verifyNoInteractions(progressTrackerFactoryMock);
231233
verifyNoInteractions(algorithmCallerMock);
232234
}
235+
236+
@Test
237+
void leiden(){
238+
239+
var future = facade.leiden(
240+
graph,
241+
mock(LeidenParameters.class),
242+
jobIdMock,
243+
false
244+
);
245+
246+
var results = future.join();
247+
248+
assertThat(results.result()).isEqualTo(LeidenResult.EMPTY);
249+
verifyNoInteractions(progressTrackerFactoryMock);
250+
verifyNoInteractions(algorithmCallerMock);
251+
}
233252
}

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import org.neo4j.gds.kmeans.KmeansParameters;
4646
import org.neo4j.gds.kmeans.SamplerType;
4747
import org.neo4j.gds.labelpropagation.LabelPropagationParameters;
48+
import org.neo4j.gds.leiden.LeidenParameters;
4849
import org.neo4j.gds.logging.Log;
4950
import org.neo4j.gds.termination.TerminationFlag;
5051
import org.neo4j.gds.triangle.LocalClusteringCoefficientParameters;
@@ -288,4 +289,28 @@ void lcc(){
288289
assertThat(results.computeMillis()).isNotNegative();
289290
}
290291

292+
@Test
293+
void leiden(){
294+
var future = facade.leiden(
295+
graph,
296+
new LeidenParameters(
297+
new Concurrency(4),
298+
0,
299+
null,
300+
10,
301+
1,
302+
1,
303+
false,
304+
Optional.empty()
305+
),
306+
jobIdMock,
307+
false
308+
);
309+
310+
var results = future.join();
311+
312+
assertThat(results.result().ranLevels()).isGreaterThan(0);
313+
assertThat(results.computeMillis()).isNotNegative();
314+
}
315+
291316
}

0 commit comments

Comments
 (0)