private void computeCumulativeProbabilityForScheduledBlockLocations(
List<Record> records, BlockInstance blockInstance,
double minProbabilityForConsideration,
List<CurrentVehicleEstimateBean> beans) {
DoubleArrayList ps = new DoubleArrayList();
List<ScheduledBlockLocation> blockLocations = new ArrayList<ScheduledBlockLocation>();
Record firstRecord = records.get(0);
ScheduledBlockLocation firstLocation = _blockGeospatialService.getBestScheduledBlockLocationForLocation(
blockInstance, firstRecord.getLocation(), firstRecord.getTimestamp(),
0, Double.POSITIVE_INFINITY);
blockLocations.add(firstLocation);
ps.add(updateScheduledBlockLocationProbability(blockInstance, firstRecord,
firstLocation));
Record lastRecord = records.get(records.size() - 1);
ScheduledBlockLocation lastLocation = _blockGeospatialService.getBestScheduledBlockLocationForLocation(
blockInstance, lastRecord.getLocation(), lastRecord.getTimestamp(), 0,
Double.POSITIVE_INFINITY);
ps.add(updateScheduledBlockLocationProbability(blockInstance, lastRecord,
lastLocation));
if (Descriptive.mean(ps) < minProbabilityForConsideration)
return;
/**
* If the vehicle is traveling backwards in time, we kill the prediction
*/
int maxTravelBackwardsTime = computeMaxTravelBackwardsTime(lastRecord.getTimestamp()
- firstRecord.getTimestamp());
if (lastLocation.getScheduledTime() < firstLocation.getScheduledTime()
- maxTravelBackwardsTime)
return;
double minDistanceAlongBlock = Math.min(
firstLocation.getDistanceAlongBlock(),
lastLocation.getDistanceAlongBlock()) - 500;
double maxDistanceAlongBlock = Math.max(
firstLocation.getDistanceAlongBlock(),
lastLocation.getDistanceAlongBlock()) + 500;
for (int i = 1; i < records.size() - 1; i++) {
Record record = records.get(i);
ScheduledBlockLocation location = _blockGeospatialService.getBestScheduledBlockLocationForLocation(
blockInstance, record.getLocation(), record.getTimestamp(),
minDistanceAlongBlock, maxDistanceAlongBlock);
blockLocations.add(location);
ps.add(updateScheduledBlockLocationProbability(blockInstance, record,
location));
if (Descriptive.mean(ps) < minProbabilityForConsideration)
return;
}