Skip to content

Commit f8edee3

Browse files
Add conductance in compute facade
1 parent 96ff0de commit f8edee3

File tree

4 files changed

+81
-12
lines changed

4 files changed

+81
-12
lines changed

algo/src/main/java/org/neo4j/gds/conductance/ConductanceResult.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,7 @@
2424
public record ConductanceResult(
2525
HugeSparseDoubleArray communityConductances,
2626
double globalAverageConductance
27-
) {}
27+
) {
28+
29+
public static ConductanceResult EMPTY = new ConductanceResult(HugeSparseDoubleArray.builder(0).build(),0d);
30+
}

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

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@
2929
import org.neo4j.gds.cliqueCounting.CliqueCounting;
3030
import org.neo4j.gds.cliqueCounting.CliqueCountingResult;
3131
import org.neo4j.gds.cliquecounting.CliqueCountingParameters;
32+
import org.neo4j.gds.conductance.Conductance;
33+
import org.neo4j.gds.conductance.ConductanceParameters;
34+
import org.neo4j.gds.conductance.ConductanceResult;
3235
import org.neo4j.gds.core.concurrency.DefaultPool;
3336
import org.neo4j.gds.core.utils.progress.JobId;
3437
import org.neo4j.gds.result.TimedAlgorithmResult;
@@ -123,7 +126,40 @@ CompletableFuture<TimedAlgorithmResult<CliqueCountingResult>> cliqueCounting(
123126
algorithm::compute,
124127
jobId
125128
);
129+
}
130+
131+
CompletableFuture<TimedAlgorithmResult<ConductanceResult>> conductance(
132+
Graph graph,
133+
ConductanceParameters parameters,
134+
JobId jobId,
135+
boolean logProgress
136+
) {
137+
138+
if (graph.isEmpty()) {
139+
return CompletableFuture.completedFuture(TimedAlgorithmResult.empty(ConductanceResult.EMPTY));
140+
}
141+
142+
var progressTracker = progressTrackerFactory.create(
143+
tasks.conductance(graph),
144+
jobId,
145+
parameters.concurrency(),
146+
logProgress
147+
);
148+
149+
var algorithm = new Conductance(
150+
graph,
151+
parameters.concurrency(),
152+
parameters.minBatchSize(),
153+
parameters.hasRelationshipWeightProperty(),
154+
parameters.communityProperty(),
155+
DefaultPool.INSTANCE,
156+
progressTracker
157+
);
126158

159+
return algorithmCaller.run(
160+
algorithm::compute,
161+
jobId
162+
);
127163
}
128164

129165
}

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

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,12 @@
3030
import org.neo4j.gds.approxmaxkcut.ApproxMaxKCutResult;
3131
import org.neo4j.gds.async.AsyncAlgorithmCaller;
3232
import org.neo4j.gds.cliqueCounting.CliqueCountingResult;
33-
import org.neo4j.gds.cliquecounting.CliqueCountingMode;
3433
import org.neo4j.gds.cliquecounting.CliqueCountingParameters;
35-
import org.neo4j.gds.core.concurrency.Concurrency;
34+
import org.neo4j.gds.conductance.ConductanceParameters;
35+
import org.neo4j.gds.conductance.ConductanceResult;
3636
import org.neo4j.gds.core.utils.progress.JobId;
3737
import org.neo4j.gds.termination.TerminationFlag;
3838

39-
import java.util.List;
40-
4139
import static org.assertj.core.api.Assertions.assertThat;
4240
import static org.mockito.Mockito.mock;
4341
import static org.mockito.Mockito.verifyNoInteractions;
@@ -88,11 +86,7 @@ void maxKCut() {
8886
void cliqueCounting(){
8987
var future = facade.cliqueCounting(
9088
graph,
91-
new CliqueCountingParameters(
92-
CliqueCountingMode.GloballyOnly,
93-
List.of(),
94-
new Concurrency(4)
95-
),
89+
mock(CliqueCountingParameters.class),
9690
jobIdMock,
9791
false
9892
);
@@ -104,5 +98,20 @@ void cliqueCounting(){
10498
verifyNoInteractions(algorithmCallerMock);
10599
}
106100

101+
@Test
102+
void conductance(){
103+
var future = facade.conductance(
104+
graph,
105+
mock(ConductanceParameters.class),
106+
jobIdMock,
107+
false
108+
);
109+
110+
var results = future.join();
111+
112+
assertThat(results.result()).isEqualTo(ConductanceResult.EMPTY);
113+
verifyNoInteractions(progressTrackerFactoryMock);
114+
verifyNoInteractions(algorithmCallerMock);
115+
}
107116

108117
}

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

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.neo4j.gds.async.AsyncAlgorithmCaller;
3131
import org.neo4j.gds.cliquecounting.CliqueCountingMode;
3232
import org.neo4j.gds.cliquecounting.CliqueCountingParameters;
33+
import org.neo4j.gds.conductance.ConductanceParameters;
3334
import org.neo4j.gds.core.concurrency.Concurrency;
3435
import org.neo4j.gds.core.utils.progress.JobId;
3536
import org.neo4j.gds.core.utils.progress.tasks.ProgressTracker;
@@ -67,8 +68,8 @@ class CommunityComputeFacadeTest {
6768

6869
@GdlGraph(orientation = Orientation.UNDIRECTED)
6970
private static final String GDL = """
70-
(a:Node { prize: 1.0 })-[:REL]->(b:Node { prize: 2.0 }),
71-
(b)-[:REL]->(c:Node { prize: 3.0 }),
71+
(a:Node { prop: 1, prop2: [1.0] })-[:REL]->(b:Node { prop: 1,prop2: [2.0] }),
72+
(b)-[:REL]->(c:Node { prop: 3 ,prop2: [3.0]}),
7273
(a)-[:REL]->(c)
7374
""";
7475

@@ -137,4 +138,24 @@ void cliqueCounting(){
137138
assertThat(results.result().globalCount()).containsExactly(1);
138139
assertThat(results.computeMillis()).isNotNegative();
139140
}
141+
142+
@Test
143+
void conductance(){
144+
var future = facade.conductance(
145+
graph,
146+
new ConductanceParameters(
147+
new Concurrency(4),
148+
10_000,
149+
false,
150+
"prop"
151+
),
152+
jobIdMock,
153+
false
154+
);
155+
156+
var results = future.join();
157+
158+
assertThat(results.result().globalAverageConductance()).isGreaterThan(0d);
159+
assertThat(results.computeMillis()).isNotNegative();
160+
}
140161
}

0 commit comments

Comments
 (0)