Skip to content

Commit

Permalink
Merge pull request #69 from TheTransitClock/tc_issue_68
Browse files Browse the repository at this point in the history
Use Kalman to predict partial stop paths.
  • Loading branch information
scrudden committed Jun 30, 2018
2 parents b201fcc + 8d5479b commit 0a801c7
Showing 1 changed file with 38 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,12 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.transitclock.applications.Core;
import org.transitclock.config.BooleanConfigValue;
import org.transitclock.config.DoubleConfigValue;
import org.transitclock.config.IntegerConfigValue;
import org.transitclock.core.Indices;
import org.transitclock.core.PredictionGeneratorDefaultImpl;
import org.transitclock.core.SpatialMatch;
import org.transitclock.core.TravelTimeDetails;
import org.transitclock.core.VehicleState;
import org.transitclock.core.dataCache.ArrivalDepartureComparator;
Expand Down Expand Up @@ -44,11 +46,11 @@ public class KalmanPredictionGeneratorImpl extends PredictionGeneratorDefaultImp
* historical value.
*/
private static final IntegerConfigValue minKalmanDays = new IntegerConfigValue(
"transitclock.prediction.data.kalman.mindays", new Integer(3),
"transitclock.prediction.data.kalman.mindays", new Integer(2),
"Min number of days trip data that needs to be available before Kalman prediciton is used instead of default transiTime prediction.");

private static final IntegerConfigValue maxKalmanDays = new IntegerConfigValue(
"transitclock.prediction.data.kalman.maxdays", new Integer(3),
"transitclock.prediction.data.kalman.maxdays", new Integer(2),
"Max number of historical days trips to include in Kalman prediction calculation.");

private static final IntegerConfigValue maxKalmanDaysToSearch = new IntegerConfigValue(
Expand All @@ -58,6 +60,13 @@ public class KalmanPredictionGeneratorImpl extends PredictionGeneratorDefaultImp
private static final DoubleConfigValue initialErrorValue = new DoubleConfigValue(
"transitclock.prediction.data.kalman.initialerrorvalue", new Double(100),
"Initial Kalman error value to use to start filter.");

/* May be better to use the default implementation as it splits things down into segments. */
private static final BooleanConfigValue useKalmanForPartialStopPaths = new BooleanConfigValue (
"transitclock.prediction.data.kalman.usekalmanforpartialstoppaths", new Boolean(true),
"Will use Kalman prediction to get to first stop of prediction."
);


private static final Logger logger = LoggerFactory.getLogger(KalmanPredictionGeneratorImpl.class);

Expand Down Expand Up @@ -171,6 +180,33 @@ public long getTravelTimeForPath(Indices indices, AvlReport avlReport, VehicleSt
return super.getTravelTimeForPath(indices, avlReport, vehicleState);
}

@Override
public long expectedTravelTimeFromMatchToEndOfStopPath(AvlReport avlReport, SpatialMatch match) {

if(useKalmanForPartialStopPaths.getValue().booleanValue())
{
VehicleStateManager vehicleStateManager = VehicleStateManager.getInstance();

VehicleState currentVehicleState = vehicleStateManager.getVehicleState(avlReport.getVehicleId());

long fulltime = this.getTravelTimeForPath(match.getIndices(), avlReport, currentVehicleState);

double distanceAlongStopPath = match.getDistanceAlongStopPath();

double stopPathLength =
match.getStopPath().getLength();

long remainingtime = (long) (fulltime * ((stopPathLength-distanceAlongStopPath)/stopPathLength));

logger.debug("Using Kalman for first stop path {} with value {} instead of {}.", match.getIndices(), remainingtime, super.expectedTravelTimeFromMatchToEndOfStopPath(avlReport, match));

return remainingtime;
}else
{
return super.expectedTravelTimeFromMatchToEndOfStopPath(avlReport, match);
}
}

private Double lastVehiclePredictionError(KalmanErrorCache cache, Indices indices) {
Double result = cache.getErrorValue(indices);
if(result!=null)
Expand Down

0 comments on commit 0a801c7

Please sign in to comment.