Skip to content

Commit 96ff0de

Browse files
Add clique counting in compute facade
1 parent 2ee0301 commit 96ff0de

File tree

4 files changed

+85
-1
lines changed

4 files changed

+85
-1
lines changed

algo/src/main/java/org/neo4j/gds/cliqueCounting/CliqueCountingResult.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,7 @@ public record CliqueCountingResult(
2525
long[] globalCount,
2626
HugeObjectArray<long[]> perNodeCount,
2727
long[][] perSubcliqueCount
28-
){}
28+
){
29+
30+
public static CliqueCountingResult EMPTY = new CliqueCountingResult(new long[0], HugeObjectArray.newArray(long[].class,0), new long[0][0]);
31+
}

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
@@ -26,6 +26,9 @@
2626
import org.neo4j.gds.approxmaxkcut.ApproxMaxKCutParameters;
2727
import org.neo4j.gds.approxmaxkcut.ApproxMaxKCutResult;
2828
import org.neo4j.gds.async.AsyncAlgorithmCaller;
29+
import org.neo4j.gds.cliqueCounting.CliqueCounting;
30+
import org.neo4j.gds.cliqueCounting.CliqueCountingResult;
31+
import org.neo4j.gds.cliquecounting.CliqueCountingParameters;
2932
import org.neo4j.gds.core.concurrency.DefaultPool;
3033
import org.neo4j.gds.core.utils.progress.JobId;
3134
import org.neo4j.gds.result.TimedAlgorithmResult;
@@ -90,6 +93,37 @@ public CompletableFuture<TimedAlgorithmResult<ApproxMaxKCutResult>> approxMaxKCu
9093
);
9194
}
9295

96+
CompletableFuture<TimedAlgorithmResult<CliqueCountingResult>> cliqueCounting(
97+
Graph graph,
98+
CliqueCountingParameters parameters,
99+
JobId jobId,
100+
boolean logProgress
101+
) {
102+
103+
if (graph.isEmpty()) {
104+
return CompletableFuture.completedFuture(TimedAlgorithmResult.empty(CliqueCountingResult.EMPTY));
105+
}
106+
107+
var progressTracker = progressTrackerFactory.create(
108+
tasks.cliqueCounting(graph, parameters),
109+
jobId,
110+
parameters.concurrency(),
111+
logProgress
112+
);
93113

114+
var algorithm = CliqueCounting.create(
115+
graph,
116+
parameters,
117+
DefaultPool.INSTANCE,
118+
progressTracker,
119+
terminationFlag
120+
);
121+
122+
return algorithmCaller.run(
123+
algorithm::compute,
124+
jobId
125+
);
126+
127+
}
94128

95129
}

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,15 @@
2929
import org.neo4j.gds.approxmaxkcut.ApproxMaxKCutParameters;
3030
import org.neo4j.gds.approxmaxkcut.ApproxMaxKCutResult;
3131
import org.neo4j.gds.async.AsyncAlgorithmCaller;
32+
import org.neo4j.gds.cliqueCounting.CliqueCountingResult;
33+
import org.neo4j.gds.cliquecounting.CliqueCountingMode;
34+
import org.neo4j.gds.cliquecounting.CliqueCountingParameters;
35+
import org.neo4j.gds.core.concurrency.Concurrency;
3236
import org.neo4j.gds.core.utils.progress.JobId;
3337
import org.neo4j.gds.termination.TerminationFlag;
3438

39+
import java.util.List;
40+
3541
import static org.assertj.core.api.Assertions.assertThat;
3642
import static org.mockito.Mockito.mock;
3743
import static org.mockito.Mockito.verifyNoInteractions;
@@ -78,5 +84,25 @@ void maxKCut() {
7884
verifyNoInteractions(algorithmCallerMock);
7985
}
8086

87+
@Test
88+
void cliqueCounting(){
89+
var future = facade.cliqueCounting(
90+
graph,
91+
new CliqueCountingParameters(
92+
CliqueCountingMode.GloballyOnly,
93+
List.of(),
94+
new Concurrency(4)
95+
),
96+
jobIdMock,
97+
false
98+
);
99+
100+
var results = future.join();
101+
102+
assertThat(results.result()).isEqualTo(CliqueCountingResult.EMPTY);
103+
verifyNoInteractions(progressTrackerFactoryMock);
104+
verifyNoInteractions(algorithmCallerMock);
105+
}
106+
81107

82108
}

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
import org.neo4j.gds.ProgressTrackerFactory;
2929
import org.neo4j.gds.approxmaxkcut.ApproxMaxKCutParameters;
3030
import org.neo4j.gds.async.AsyncAlgorithmCaller;
31+
import org.neo4j.gds.cliquecounting.CliqueCountingMode;
32+
import org.neo4j.gds.cliquecounting.CliqueCountingParameters;
3133
import org.neo4j.gds.core.concurrency.Concurrency;
3234
import org.neo4j.gds.core.utils.progress.JobId;
3335
import org.neo4j.gds.core.utils.progress.tasks.ProgressTracker;
@@ -116,4 +118,23 @@ void maxKCut() {
116118
assertThat(results.computeMillis()).isNotNegative();
117119

118120
}
121+
122+
@Test
123+
void cliqueCounting(){
124+
var future = facade.cliqueCounting(
125+
graph,
126+
new CliqueCountingParameters(
127+
CliqueCountingMode.GloballyOnly,
128+
List.of(),
129+
new Concurrency(4)
130+
),
131+
jobIdMock,
132+
false
133+
);
134+
135+
var results = future.join();
136+
137+
assertThat(results.result().globalCount()).containsExactly(1);
138+
assertThat(results.computeMillis()).isNotNegative();
139+
}
119140
}

0 commit comments

Comments
 (0)