@@ -84,10 +84,12 @@ public class PrepareContractionHierarchies extends AbstractAlgoPreparation imple
84
84
private double periodTime ;
85
85
private double lazyTime ;
86
86
private double neighborTime ;
87
+ private final int maxEdgesCount ;
87
88
88
89
public PrepareContractionHierarchies ( Directory dir , LevelGraph g , FlagEncoder encoder , Weighting weighting , TraversalMode traversalMode )
89
90
{
90
91
this .prepareGraph = g ;
92
+ maxEdgesCount = g .getAllEdges ().getCount ();
91
93
this .traversalMode = traversalMode ;
92
94
this .prepareFlagEncoder = encoder ;
93
95
long scFwdDir = encoder .setAccess (0 , true , false );
@@ -197,27 +199,12 @@ public void doWork()
197
199
super .doWork ();
198
200
199
201
initFromGraph ();
200
- if (!prepareEdges ())
201
- return ;
202
-
203
202
if (!prepareNodes ())
204
203
return ;
205
204
206
205
contractNodes ();
207
206
}
208
207
209
- boolean prepareEdges ()
210
- {
211
- EdgeIterator iter = prepareGraph .getAllEdges ();
212
- int c = 0 ;
213
- while (iter .next ())
214
- {
215
- c ++;
216
- setOrigEdgeCount (iter .getEdge (), 1 );
217
- }
218
- return c > 0 ;
219
- }
220
-
221
208
boolean prepareNodes ()
222
209
{
223
210
int nodes = prepareGraph .getNodes ();
@@ -793,17 +780,30 @@ public final boolean accept( EdgeIteratorState iter )
793
780
}
794
781
}
795
782
796
- private void setOrigEdgeCount ( int index , int value )
783
+ private void setOrigEdgeCount ( int edgeId , int value )
797
784
{
798
- long tmp = (long ) index * 4 ;
785
+ edgeId -= maxEdgesCount ;
786
+ if (edgeId < 0 )
787
+ {
788
+ if (value != 1 )
789
+ throw new IllegalStateException ("Trying to set original edge count for normal edge to a value != 1" );
790
+
791
+ // ignore setting as every normal edge has original edge count of 1
792
+ return ;
793
+ }
794
+
795
+ long tmp = (long ) edgeId * 4 ;
799
796
originalEdges .ensureCapacity (tmp + 4 );
800
797
originalEdges .setInt (tmp , value );
801
798
}
802
799
803
- private int getOrigEdgeCount ( int index )
800
+ private int getOrigEdgeCount ( int edgeId )
804
801
{
805
- // TODO possible memory usage improvement: avoid storing the value 1 for normal edges (does not change)!
806
- long tmp = (long ) index * 4 ;
802
+ edgeId -= maxEdgesCount ;
803
+ if (edgeId < 0 )
804
+ return 1 ;
805
+
806
+ long tmp = (long ) edgeId * 4 ;
807
807
originalEdges .ensureCapacity (tmp + 4 );
808
808
return originalEdges .getInt (tmp );
809
809
}
0 commit comments