Skip to content

Commit 3b6af25

Browse files
Add kcore in compute facade
1 parent 82adf32 commit 3b6af25

File tree

4 files changed

+76
-1
lines changed

4 files changed

+76
-1
lines changed

algo/src/main/java/org/neo4j/gds/kcore/KCoreDecompositionResult.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,7 @@
2121

2222
import org.neo4j.gds.collections.ha.HugeIntArray;
2323

24-
public record KCoreDecompositionResult(HugeIntArray coreValues, int degeneracy){}
24+
public record KCoreDecompositionResult(HugeIntArray coreValues, int degeneracy){
25+
26+
public static KCoreDecompositionResult EMPTY = new KCoreDecompositionResult(HugeIntArray.newArray(0), 0);
27+
}

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
@@ -40,6 +40,9 @@
4040
import org.neo4j.gds.k1coloring.K1Coloring;
4141
import org.neo4j.gds.k1coloring.K1ColoringParameters;
4242
import org.neo4j.gds.k1coloring.K1ColoringResult;
43+
import org.neo4j.gds.kcore.KCoreDecomposition;
44+
import org.neo4j.gds.kcore.KCoreDecompositionParameters;
45+
import org.neo4j.gds.kcore.KCoreDecompositionResult;
4346
import org.neo4j.gds.result.TimedAlgorithmResult;
4447
import org.neo4j.gds.termination.TerminationFlag;
4548

@@ -231,4 +234,35 @@ CompletableFuture<TimedAlgorithmResult<K1ColoringResult>> k1Coloring(
231234
jobId
232235
);
233236
}
237+
238+
CompletableFuture<TimedAlgorithmResult<KCoreDecompositionResult>> kCore(
239+
Graph graph,
240+
KCoreDecompositionParameters parameters,
241+
JobId jobId,
242+
boolean logProgress
243+
) {
244+
245+
if (graph.isEmpty()) {
246+
return CompletableFuture.completedFuture(TimedAlgorithmResult.empty(KCoreDecompositionResult.EMPTY));
247+
}
248+
249+
var progressTracker = progressTrackerFactory.create(
250+
tasks.kCore(graph),
251+
jobId,
252+
parameters.concurrency(),
253+
logProgress
254+
);
255+
256+
var algorithm = new KCoreDecomposition(
257+
graph,
258+
parameters.concurrency(),
259+
progressTracker,
260+
terminationFlag
261+
);
262+
263+
return algorithmCaller.run(
264+
algorithm::compute,
265+
jobId
266+
);
267+
}
234268
}

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
@@ -38,6 +38,8 @@
3838
import org.neo4j.gds.hdbscan.Labels;
3939
import org.neo4j.gds.k1coloring.K1ColoringParameters;
4040
import org.neo4j.gds.k1coloring.K1ColoringResult;
41+
import org.neo4j.gds.kcore.KCoreDecompositionParameters;
42+
import org.neo4j.gds.kcore.KCoreDecompositionResult;
4143
import org.neo4j.gds.termination.TerminationFlag;
4244

4345
import static org.assertj.core.api.Assertions.assertThat;
@@ -152,4 +154,21 @@ void k1Coloring(){
152154
verifyNoInteractions(algorithmCallerMock);
153155
}
154156

157+
@Test
158+
void kCore(){
159+
160+
var future = facade.kCore(
161+
graph,
162+
mock(KCoreDecompositionParameters.class),
163+
jobIdMock,
164+
false
165+
);
166+
167+
var results = future.join();
168+
169+
assertThat(results.result()).isEqualTo(KCoreDecompositionResult.EMPTY);
170+
verifyNoInteractions(progressTrackerFactoryMock);
171+
verifyNoInteractions(algorithmCallerMock);
172+
}
173+
155174
}

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import org.neo4j.gds.extension.TestGraph;
4242
import org.neo4j.gds.hdbscan.HDBScanParameters;
4343
import org.neo4j.gds.k1coloring.K1ColoringParameters;
44+
import org.neo4j.gds.kcore.KCoreDecompositionParameters;
4445
import org.neo4j.gds.logging.Log;
4546
import org.neo4j.gds.termination.TerminationFlag;
4647

@@ -200,4 +201,22 @@ void k1Coloring(){
200201
assertThat(results.result().ranIterations()).isGreaterThan(0);
201202
assertThat(results.computeMillis()).isNotNegative();
202203
}
204+
205+
@Test
206+
void kCore(){
207+
var future = facade.kCore(
208+
graph,
209+
new KCoreDecompositionParameters(
210+
new Concurrency(4)
211+
),
212+
jobIdMock,
213+
false
214+
);
215+
216+
var results = future.join();
217+
218+
assertThat(results.result().degeneracy()).isGreaterThan(0);
219+
assertThat(results.computeMillis()).isNotNegative();
220+
}
221+
203222
}

0 commit comments

Comments
 (0)