package org.opentripplanner.profile;
import gnu.trove.iterator.TIntObjectIterator;
import gnu.trove.map.TIntObjectMap;
import gnu.trove.map.hash.TIntObjectHashMap;
import org.apache.commons.math3.random.MersenneTwister;
/**
* Stores random offsets for frequency trips.
* This is not in RaptorWorkerData as RaptorWorkerData may be shared between threads.
*/
public class FrequencyRandomOffsets {
public final TIntObjectMap<int[]> offsets = new TIntObjectHashMap<>();
public final RaptorWorkerData data;
/** The mersenne twister is a higher quality random number generator than the one included with Java */
private MersenneTwister mt = new MersenneTwister();
public FrequencyRandomOffsets(RaptorWorkerData data) {
this.data = data;
if (!data.hasFrequencies)
return;
data.timetablesForPattern.stream().filter(tt -> tt.hasFrequencyTrips())
.forEach(tt -> {
offsets.put(tt.dataIndex, new int[tt.getFrequencyTripCount()]);
});
}
public void randomize () {
for (TIntObjectIterator<int[]> it = offsets.iterator(); it.hasNext();) {
it.advance();
int[] newVal = new int[it.value().length];
RaptorWorkerTimetable tt = data.timetablesForPattern.get(it.key());
for (int i = 0; i < newVal.length; i++) {
newVal[i] = mt.nextInt(tt.headwaySecs[i]);
}
it.setValue(newVal);
}
}
}