Skip to content

Commit 2261ddd

Browse files
Do not create cmp each time
1 parent 97d9128 commit 2261ddd

File tree

5 files changed

+99
-49
lines changed

5 files changed

+99
-49
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
* Copyright (c) "Neo4j"
3+
* Neo4j Sweden AB [http://neo4j.com]
4+
*
5+
* This file is part of Neo4j.
6+
*
7+
* Neo4j is free software: you can redistribute it and/or modify
8+
* it under the terms of the GNU General Public License as published by
9+
* the Free Software Foundation, either version 3 of the License, or
10+
* (at your option) any later version.
11+
*
12+
* This program is distributed in the hope that it will be useful,
13+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+
* GNU General Public License for more details.
16+
*
17+
* You should have received a copy of the GNU General Public License
18+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
19+
*/
20+
package org.neo4j.gds.pricesteiner;
21+
22+
class ClusterMoatPair {
23+
24+
private long cluster;
25+
private double totalMoat;
26+
27+
void assign(long cluster, double totalMoat){
28+
this.cluster = cluster;
29+
this.totalMoat = totalMoat;
30+
}
31+
32+
long cluster(){
33+
return cluster;
34+
}
35+
36+
double totalMoat(){
37+
return totalMoat;
38+
}
39+
}

algo/src/main/java/org/neo4j/gds/pricesteiner/ClusterStructure.java

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ void setClusterPrize(long clusterId, double prize){
8181
initialMoatLeft.set(clusterId, prize);
8282
}
8383

84-
double clusterPrize(long clusterId){
84+
double moatLeft(long clusterId){
8585
return initialMoatLeft.get(clusterId);
8686
}
8787

@@ -90,16 +90,16 @@ void setClusterPrize(long clusterId, double prize){
9090
return currentMoat + slack;
9191
}
9292

93-
ClusterMoatPair sumOnEdgePart(long node, double currentMoat){
93+
void sumOnEdgePart(long node, double currentMoat, ClusterMoatPair clusterMoatPair){
9494
double sum = 0;
95-
long currentNode =node;
95+
long currentNode = node;
9696

9797
while (true){
9898

9999
var parentNode = parent.get(currentNode);
100100
double currentValue = moatAt(currentNode,currentMoat);
101101

102-
sum+= currentValue;
102+
sum+= currentValue;
103103
if (parentNode== -1){
104104
break;
105105
}else{
@@ -113,24 +113,21 @@ ClusterMoatPair sumOnEdgePart(long node, double currentMoat){
113113
}
114114
sum += skippedParentSum.get(currentNode);
115115
currentNode = nextParent;
116-
117-
118116
}
119117

120118
}
121-
122-
return new ClusterMoatPair(currentNode,sum);
119+
clusterMoatPair.assign(currentNode,sum);
123120
}
124121

125122
BitSet activeOriginalNodesOfCluster(long clusterId){
126-
BitSet bitSet=new BitSet(originalNodeCount);
123+
BitSet bitSet = new BitSet(originalNodeCount);
127124

128125
if (clusterId < originalNodeCount){
129126
bitSet.set(clusterId);
130127
return bitSet;
131128
}
132129

133-
HugeLongArrayStack stack= HugeLongArrayStack.newStack(originalNodeCount);
130+
HugeLongArrayStack stack = HugeLongArrayStack.newStack(originalNodeCount);
134131
stack.push(clusterId);
135132

136133
while (!stack.isEmpty()){
@@ -183,7 +180,6 @@ long singleActiveCluster(){
183180

184181

185182
}
186-
record ClusterMoatPair(long cluster, double totalMoat){}
187183

188184

189185

algo/src/main/java/org/neo4j/gds/pricesteiner/GrowthPhase.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ GrowthResult grow() {
7070

7171
progressTracker.beginSubTask("Growing");
7272
double moat;
73+
74+
ClusterMoatPair clusterMoatPairOfu = new ClusterMoatPair();
75+
ClusterMoatPair clusterMoatPairOfv = new ClusterMoatPair();
76+
7377
while (clusterStructure.numberOfActiveClusters() > 1) {
7478
terminationFlag.assertRunning();
7579
double edgeEventTime = edgeEventsQueue.nextEventTime();
@@ -92,14 +96,14 @@ GrowthResult grow() {
9296
continue;
9397
}
9498

95-
ClusterMoatPair cmu = clusterStructure.sumOnEdgePart(u,moat);
96-
ClusterMoatPair cmv = clusterStructure.sumOnEdgePart(v,moat);
99+
clusterStructure.sumOnEdgePart(u,moat,clusterMoatPairOfu);
100+
clusterStructure.sumOnEdgePart(v,moat,clusterMoatPairOfv);
97101

98-
var uCluster = cmu.cluster();
99-
var uClusterSum = cmu.totalMoat();
102+
var uCluster = clusterMoatPairOfu.cluster();
103+
var uClusterSum = clusterMoatPairOfu.totalMoat();
100104

101-
var vCluster = cmv.cluster();
102-
var vClusterSum = cmv.totalMoat();
105+
var vCluster = clusterMoatPairOfv.cluster();
106+
var vClusterSum = clusterMoatPairOfv.totalMoat();
103107

104108

105109
if (vCluster == uCluster) {

algo/src/test/java/org/neo4j/gds/pricesteiner/ClusterStructureTest.java

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@ void shouldCreateNewClustersCorrectly() {
3333
assertThat(clusterStructure.merge(4, 5,0)).isEqualTo(6);
3434

3535
for (int i=0;i<6;++i) {
36-
assertThat(clusterStructure.sumOnEdgePart(i,10).cluster()).isEqualTo(6);
36+
ClusterMoatPair clusterMoatPair = new ClusterMoatPair();
37+
clusterStructure.sumOnEdgePart(i,10,clusterMoatPair);
38+
assertThat(clusterMoatPair.cluster()).isEqualTo(6);
3739
}
3840
}
3941

@@ -42,17 +44,23 @@ void shouldComputeMoatSumCorrectly(){
4244
var clusterStructure = new ClusterStructure(4);
4345

4446
clusterStructure.merge(0,1,3); //cluster 4
47+
ClusterMoatPair clusterMoatPair = new ClusterMoatPair();
4548

46-
assertThat(clusterStructure.sumOnEdgePart(0,3).totalMoat()).isEqualTo(3);
47-
assertThat(clusterStructure.sumOnEdgePart(0,9).totalMoat()).isEqualTo(9);
49+
clusterStructure.sumOnEdgePart(0,3,clusterMoatPair);
50+
assertThat(clusterMoatPair.totalMoat()).isEqualTo(3);
4851

52+
clusterStructure.sumOnEdgePart(0,9,clusterMoatPair);
53+
assertThat(clusterMoatPair.totalMoat()).isEqualTo(9);
4954

5055
clusterStructure.merge(2,3,0); //cluster 5
5156

5257
clusterStructure.merge(4,5,9);
5358

54-
assertThat(clusterStructure.sumOnEdgePart(0,100).totalMoat()).isEqualTo(100);
55-
assertThat(clusterStructure.sumOnEdgePart(3,100).totalMoat()).isEqualTo(100);
59+
clusterStructure.sumOnEdgePart(0,100,clusterMoatPair);
60+
assertThat(clusterMoatPair.totalMoat()).isEqualTo(100);
61+
62+
clusterStructure.sumOnEdgePart(3,100,clusterMoatPair);
63+
assertThat(clusterMoatPair.totalMoat()).isEqualTo(100);
5664

5765

5866
}
@@ -62,10 +70,10 @@ void shouldReturnCorrectlyClusterPrizes(){
6270
var clusterStructure = new ClusterStructure(4);
6371
clusterStructure.setClusterPrize(0,10);
6472
clusterStructure.setClusterPrize(1,20);
65-
assertThat(clusterStructure.clusterPrize(0)).isEqualTo(10);
66-
assertThat(clusterStructure.clusterPrize(1)).isEqualTo(20);
73+
assertThat(clusterStructure.moatLeft(0)).isEqualTo(10);
74+
assertThat(clusterStructure.moatLeft(1)).isEqualTo(20);
6775
clusterStructure.merge(0,1,0);
68-
assertThat(clusterStructure.clusterPrize(4)).isEqualTo(30);
76+
assertThat(clusterStructure.moatLeft(4)).isEqualTo(30);
6977
}
7078

7179
@Test
@@ -108,24 +116,18 @@ void shouldEnsurePathFindingWork(){
108116
clusterStructure.merge(8,4,11110);
109117
clusterStructure.merge(9,5,111110);
110118

119+
ClusterMoatPair clusterMoatPair = new ClusterMoatPair();
111120

112121
double expected = 10+100 + 1000 + 10_000 + 100_000 + 1_000_000;
113-
assertThat(clusterStructure.sumOnEdgePart(0,1_111_110).totalMoat()).isEqualTo(expected);
114-
assertThat(clusterStructure.sumOnEdgePart(0,1_111_110).totalMoat()).isEqualTo(expected);
115-
assertThat(clusterStructure.sumOnEdgePart(0,1_111_110).totalMoat()).isEqualTo(expected);
116-
assertThat(clusterStructure.sumOnEdgePart(0,1_111_110).totalMoat()).isEqualTo(expected);
117-
assertThat(clusterStructure.sumOnEdgePart(0,1_111_110).totalMoat()).isEqualTo(expected);
118-
assertThat(clusterStructure.sumOnEdgePart(0,1_111_110).totalMoat()).isEqualTo(expected);
119-
assertThat(clusterStructure.sumOnEdgePart(0,1_111_110).totalMoat()).isEqualTo(expected);
120-
121-
assertThat(clusterStructure.sumOnEdgePart(6,1_111_110).totalMoat()).isEqualTo(expected - 10 );
122-
assertThat(clusterStructure.sumOnEdgePart(6,1_111_110).totalMoat()).isEqualTo(expected - 10 );
123-
assertThat(clusterStructure.sumOnEdgePart(6,1_111_110).totalMoat()).isEqualTo(expected - 10 );
124-
assertThat(clusterStructure.sumOnEdgePart(6,1_111_110).totalMoat()).isEqualTo(expected - 10 );
125-
assertThat(clusterStructure.sumOnEdgePart(6,1_111_110).totalMoat()).isEqualTo(expected - 10 );
126-
assertThat(clusterStructure.sumOnEdgePart(6,1_111_110).totalMoat()).isEqualTo(expected - 10 );
127-
122+
for (int i=0;i<7;++i){
123+
clusterStructure.sumOnEdgePart(0,1_111_110,clusterMoatPair);
124+
assertThat(clusterMoatPair.totalMoat()).isEqualTo(expected);
125+
}
128126

127+
for (int i=0;i<7;++i){
128+
clusterStructure.sumOnEdgePart(6,1_111_110,clusterMoatPair);
129+
assertThat(clusterMoatPair.totalMoat()).isEqualTo(expected- 10);
130+
}
129131

130132

131133

algo/src/test/java/org/neo4j/gds/pricesteiner/GrowthPhaseTest.java

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -140,12 +140,19 @@ void shouldExecuteGrowthPhaseCorrectly() {
140140

141141
assertThat(clusterStructure.moatAt(7,31)).isEqualTo(0);
142142

143-
assertThat(clusterStructure.sumOnEdgePart(0,31).cluster()).isEqualTo(7);
144-
assertThat(clusterStructure.sumOnEdgePart(1,31).cluster()).isEqualTo(7);
145-
assertThat(clusterStructure.sumOnEdgePart(2,31).cluster()).isEqualTo(7);
146-
assertThat(clusterStructure.sumOnEdgePart(3,31).cluster()).isEqualTo(7);
143+
ClusterMoatPair clusterMoatPair=new ClusterMoatPair();
144+
clusterStructure.sumOnEdgePart(0,31,clusterMoatPair);
145+
assertThat(clusterMoatPair.cluster()).isEqualTo(7);
147146

148-
assertThat(clusterStructure.sumOnEdgePart(4,31).cluster()).isEqualTo(4);
147+
clusterStructure.sumOnEdgePart(1,31,clusterMoatPair);
148+
assertThat(clusterMoatPair.cluster()).isEqualTo(7);
149+
clusterStructure.sumOnEdgePart(2,31,clusterMoatPair);
150+
assertThat(clusterMoatPair.cluster()).isEqualTo(7);
151+
clusterStructure.sumOnEdgePart(3,31,clusterMoatPair);
152+
assertThat(clusterMoatPair.cluster()).isEqualTo(7);
153+
154+
clusterStructure.sumOnEdgePart(4,31,clusterMoatPair);
155+
assertThat(clusterMoatPair.cluster()).isEqualTo(4);
149156

150157
BitSet activeNodes = growthResult.activeOriginalNodes();
151158
assertThat(activeNodes.cardinality()).isEqualTo(4L);
@@ -205,10 +212,12 @@ void shouldExecuteGrowthPhaseCorrectlyWithUniqueWeights() {
205212

206213

207214
for (long u=0;u< graph.nodeCount();++u){
208-
assertThat(clusterStructure.sumOnEdgePart(u,31))
209-
.satisfies( clusterMoatPair->{
210-
assertThat(clusterMoatPair.totalMoat()).isEqualTo(31);
211-
assertThat(clusterMoatPair.cluster()).isEqualTo(8);
215+
ClusterMoatPair clusterMoatPair=new ClusterMoatPair();
216+
clusterStructure.sumOnEdgePart(u,31,clusterMoatPair);
217+
assertThat(clusterMoatPair)
218+
.satisfies( cmp->{
219+
assertThat(cmp.totalMoat()).isEqualTo(31);
220+
assertThat(cmp.cluster()).isEqualTo(8);
212221
});
213222
}
214223

0 commit comments

Comments
 (0)