public ChoiceProbabilityCalculator.Alternative RunNested(ITourWrapper tour, IParcelWrapper destinationParcel, int householdCars, double transitDiscountFraction) { if (Global.Configuration.AvoidDisaggregateModeChoiceLogsums) { return(null); } var choiceProbabilityCalculator = _helpers[ParallelUtility.GetBatchFromThreadId()].GetNestedChoiceProbabilityCalculator(); IHouseholdDayWrapper householdDay = (tour.PersonDay == null) ? null : tour.PersonDay.HouseholdDay; int constrainedMode = 0; int constrainedArrivalTime = (Global.Configuration.ConstrainTimesForModeChoiceLogsums) ? tour.DestinationArrivalTime : 0; int constrainedDepartureTime = (Global.Configuration.ConstrainTimesForModeChoiceLogsums) ? tour.DestinationDepartureTime : 0; tour.DestinationParcel = destinationParcel; HTourModeTime.SetModeTimeImpedances(householdDay, tour, constrainedMode, constrainedArrivalTime, constrainedDepartureTime, -1, -1.0); RunModel(choiceProbabilityCalculator, householdDay, tour, destinationParcel, householdCars, constrainedMode, constrainedArrivalTime, constrainedDepartureTime); return(choiceProbabilityCalculator.SimulateChoice(tour.Household.RandomUtility)); }
public ChoiceProbabilityCalculator.Alternative RunNested(ITourWrapper tour, IParcelWrapper destinationParcel, int householdCars, double transitDiscountFraction) { if (Global.Configuration.AvoidDisaggregateModeChoiceLogsums) { return(null); } ChoiceProbabilityCalculator choiceProbabilityCalculator = _helpers[ParallelUtility.threadLocalAssignedIndex.Value].GetNestedChoiceProbabilityCalculator(); IHouseholdDayWrapper householdDay = (tour.PersonDay == null) ? null : tour.PersonDay.HouseholdDay; int constrainedMode = 0; int constrainedArrivalTime = (Global.Configuration.ConstrainTimesForModeChoiceLogsums) ? tour.DestinationArrivalTime : 0; int constrainedDepartureTime = (Global.Configuration.ConstrainTimesForModeChoiceLogsums) ? tour.DestinationDepartureTime : 0; tour.DestinationParcel = destinationParcel; //using tour.DestinationParcel as a temporary value, may want to make destinationParcel another call parameter below instead HTourModeTime.SetModeTimeImpedances(householdDay, tour, constrainedMode, constrainedArrivalTime, constrainedDepartureTime, householdCars, transitDiscountFraction); RunModel(choiceProbabilityCalculator, householdDay, tour, destinationParcel, householdCars, constrainedMode, constrainedArrivalTime, constrainedDepartureTime); return(choiceProbabilityCalculator.SimulateChoice(tour.Household.RandomUtility)); }
public void Run(IHouseholdDayWrapper householdDay, ITourWrapper tour, int constrainedMode, int constrainedArrivalTime, int constrainedDepartureTime) { if (tour == null) { throw new ArgumentNullException("tour"); } //HTourModeTime.InitializeTourModeTimes(); tour.PersonDay.ResetRandom(50 + tour.Sequence - 1); if (Global.Configuration.IsInEstimationMode) { if (Global.Configuration.EstimationModel != CHOICE_MODEL_NAME) { return; } // JLB 20140421 add the following to keep from estimatign twice for the same tour if (tour.DestinationModeAndTimeHaveBeenSimulated) { return; } if (tour.DestinationParcel == null || tour.OriginParcel == null || tour.Mode < Global.Settings.Modes.Walk || tour.Mode > Global.Settings.Modes.SchoolBus) { return; } } // set remaining inputs HTourModeTime.SetModeTimeImpedances(householdDay, tour, constrainedMode, constrainedArrivalTime, constrainedDepartureTime, -1, -1.0); ChoiceProbabilityCalculator choiceProbabilityCalculator = _helpers[ParallelUtility.threadLocalAssignedIndex.Value].GetChoiceProbabilityCalculator(tour.Id); if (_helpers[ParallelUtility.threadLocalAssignedIndex.Value].ModelIsInEstimationMode) { HTourModeTime observedChoice = new HTourModeTime(tour.Mode, tour.DestinationArrivalTime, tour.DestinationDepartureTime); RunModel(choiceProbabilityCalculator, householdDay, tour, tour.DestinationParcel, tour.Household.VehiclesAvailable, constrainedMode, constrainedArrivalTime, constrainedDepartureTime, observedChoice); choiceProbabilityCalculator.WriteObservation(); } else if (Global.Configuration.TestEstimationModelInApplicationMode) { Global.Configuration.IsInEstimationMode = false; RunModel(choiceProbabilityCalculator, householdDay, tour, tour.DestinationParcel, tour.Household.VehiclesAvailable, constrainedMode, constrainedArrivalTime, constrainedDepartureTime); HTourModeTime observedChoice = new HTourModeTime(tour.Mode, tour.DestinationArrivalTime, tour.DestinationDepartureTime); ChoiceProbabilityCalculator.Alternative simulatedChoice = choiceProbabilityCalculator.SimulateChoice(tour.Household.RandomUtility, tour.Id, observedChoice.Index); Global.Configuration.IsInEstimationMode = true; } else { HTourModeTime choice; if (constrainedMode > 0 && constrainedArrivalTime > 0 && constrainedDepartureTime > 0) { choice = new HTourModeTime(constrainedMode, constrainedArrivalTime, constrainedDepartureTime); } else { RunModel(choiceProbabilityCalculator, householdDay, tour, tour.DestinationParcel, tour.Household.VehiclesAvailable, constrainedMode, constrainedArrivalTime, constrainedDepartureTime); ChoiceProbabilityCalculator.Alternative simulatedChoice = choiceProbabilityCalculator.SimulateChoice(tour.Household.RandomUtility); if (simulatedChoice == null) { Global.PrintFile.WriteNoAlternativesAvailableWarning(CHOICE_MODEL_NAME, "Run", tour.PersonDay.Id); if (!Global.Configuration.IsInEstimationMode) { tour.PersonDay.IsValid = false; tour.PersonDay.HouseholdDay.IsValid = false; } return; } choice = (HTourModeTime)simulatedChoice.Choice; } tour.Mode = choice.Mode; MinuteSpan arrivalPeriod = choice.ArrivalPeriod; MinuteSpan departurePeriod = choice.DeparturePeriod; //use constrained times to set temporary arrival and departure times with minimum duration of stay for time window calculations if (constrainedArrivalTime > 0 || constrainedDepartureTime > 0) { if (constrainedArrivalTime > 0) { tour.DestinationArrivalTime = constrainedArrivalTime; } else { tour.DestinationArrivalTime = Math.Min(arrivalPeriod.End, constrainedDepartureTime - Global.Settings.Times.MinimumActivityDuration); } if (constrainedDepartureTime > 0) { tour.DestinationDepartureTime = constrainedDepartureTime; } else { tour.DestinationDepartureTime = Math.Max(departurePeriod.Start, constrainedArrivalTime + Global.Settings.Times.MinimumActivityDuration); } } //or if times aren't constrained use periods to set temporary arrival and departure times with minimum duration of stay for time window calculations else if (arrivalPeriod == departurePeriod) { int departureTime = Math.Max(choice.GetRandomDepartureTime(householdDay, tour), departurePeriod.Start + Global.Settings.Times.MinimumActivityDuration); tour.DestinationArrivalTime = departureTime - Global.Settings.Times.MinimumActivityDuration; tour.DestinationDepartureTime = departureTime; } else if (arrivalPeriod.End == departurePeriod.Start - 1) { tour.DestinationArrivalTime = arrivalPeriod.End; tour.DestinationDepartureTime = arrivalPeriod.End + Global.Settings.Times.MinimumActivityDuration; } else { tour.DestinationArrivalTime = arrivalPeriod.End; tour.DestinationDepartureTime = departurePeriod.Start; } } }
public void Run(HouseholdDayWrapper householdDay, TourWrapper tour, int constrainedMode, int constrainedArrivalTime, int constrainedDepartureTime) { if (tour == null) { throw new ArgumentNullException("tour"); } //HTourModeTime.InitializeTourModeTimes(); tour.PersonDay.ResetRandom(50 + tour.Sequence - 1); if (Global.Configuration.IsInEstimationMode) { if (Global.Configuration.EstimationModel != CHOICE_MODEL_NAME) { return; } // JLB 20140421 add the following to keep from estimatign twice for the same tour if (tour.DestinationModeAndTimeHaveBeenSimulated) { return; } if (tour.DestinationParcel == null || tour.OriginParcel == null || tour.Mode < Global.Settings.Modes.Walk || tour.Mode > Global.Settings.Modes.WalkRideBike) { return; } } // set remaining inputs HTourModeTime.SetModeTimeImpedances(householdDay, tour, constrainedMode, constrainedArrivalTime, constrainedDepartureTime, -1, -1.0); var choiceProbabilityCalculator = _helpers[ParallelUtility.GetBatchFromThreadId()].GetChoiceProbabilityCalculator(tour.Id); if (_helpers[ParallelUtility.GetBatchFromThreadId()].ModelIsInEstimationMode) { var observedChoice = new HTourModeTime(tour.Mode, tour.DestinationArrivalTime, tour.DestinationDepartureTime); RunModel(choiceProbabilityCalculator, householdDay, tour, tour.DestinationParcel, tour.Household.VehiclesAvailable, constrainedMode, constrainedArrivalTime, constrainedDepartureTime, observedChoice); choiceProbabilityCalculator.WriteObservation(); } else if (Global.Configuration.TestEstimationModelInApplicationMode) { Global.Configuration.IsInEstimationMode = false; RunModel(choiceProbabilityCalculator, householdDay, tour, tour.DestinationParcel, tour.Household.VehiclesAvailable, constrainedMode, constrainedArrivalTime, constrainedDepartureTime); var observedChoice = new HTourModeTime(tour.Mode, tour.DestinationArrivalTime, tour.DestinationDepartureTime); var simulatedChoice = choiceProbabilityCalculator.SimulateChoice(tour.Household.RandomUtility, tour.Id, observedChoice.Index); Global.Configuration.IsInEstimationMode = true; } else { HTourModeTime choice; if (constrainedMode > 0 && constrainedArrivalTime > 0 && constrainedDepartureTime > 0) { choice = new HTourModeTime(constrainedMode, constrainedArrivalTime, constrainedDepartureTime); } else { RunModel(choiceProbabilityCalculator, householdDay, tour, tour.DestinationParcel, tour.Household.VehiclesAvailable, constrainedMode, constrainedArrivalTime, constrainedDepartureTime); var simulatedChoice = choiceProbabilityCalculator.SimulateChoice(tour.Household.RandomUtility); if (simulatedChoice == null) { Global.PrintFile.WriteNoAlternativesAvailableWarning(CHOICE_MODEL_NAME, "Run", tour.PersonDay.Id); if (!Global.Configuration.IsInEstimationMode) { tour.PersonDay.IsValid = false; tour.PersonDay.HouseholdDay.IsValid = false; } return; } choice = (HTourModeTime)simulatedChoice.Choice; } if (Global.Configuration.TraceModelResultValidity) { Global.PrintFile.WriteLine(" >> TourModeTimeModel HH/P/T/mode {0} {1} {2} {3}", tour.Household.Id, tour.Person.Sequence, tour.Sequence, choice.Mode); } tour.Mode = choice.Mode; tour.HalfTour1AccessCost = choice.OriginAccessCost / 2.0; tour.HalfTour1AccessDistance = choice.OriginAccessDistance / 2.0; tour.HalfTour1AccessMode = choice.OriginAccessMode; tour.HalfTour1AccessStopAreaKey = choice.ParkAndRideOriginStopAreaKey; tour.HalfTour1AccessTime = choice.OriginAccessTime / 2.0; tour.HalfTour1EgressCost = choice.DestinationAccessCost / 2.0; tour.HalfTour1EgressDistance = choice.DestinationAccessDistance / 2.0; tour.HalfTour1EgressMode = choice.DestinationAccessMode; tour.HalfTour1EgressStopAreaKey = choice.ParkAndRideDestinationStopAreaKey; tour.HalfTour1EgressTime = choice.DestinationAccessTime / 2.0; tour.HalfTour2AccessCost = choice.DestinationAccessCost / 2.0; tour.HalfTour2AccessDistance = choice.DestinationAccessDistance / 2.0; tour.HalfTour2AccessMode = choice.DestinationAccessMode; tour.HalfTour2AccessStopAreaKey = choice.ParkAndRideDestinationStopAreaKey; tour.HalfTour2AccessTime = choice.DestinationAccessTime / 2.0; tour.HalfTour2EgressCost = choice.OriginAccessCost / 2.0; tour.HalfTour2EgressDistance = choice.OriginAccessDistance / 2.0; tour.HalfTour2EgressMode = choice.OriginAccessMode; tour.HalfTour2EgressStopAreaKey = choice.ParkAndRideOriginStopAreaKey; tour.HalfTour2EgressTime = choice.OriginAccessTime / 2.0; tour.HalfTour1TravelTime = choice.TravelTimeToDestination; tour.HalfTour2TravelTime = choice.TravelTimeFromDestination; tour.TravelCostForPTBikeTour = choice.PathCost; tour.TravelDistanceForPTBikeTour = choice.PathDistance; var arrivalPeriod = choice.ArrivalPeriod; var departurePeriod = choice.DeparturePeriod; //use constrained times to set temporary arrival and departure times with minimum duration of stay for time window calculations if (constrainedArrivalTime > 0 || constrainedDepartureTime > 0) { if (constrainedArrivalTime > 0) { tour.DestinationArrivalTime = constrainedArrivalTime; } else { tour.DestinationArrivalTime = Math.Min(arrivalPeriod.End, constrainedDepartureTime - Global.Settings.Times.MinimumActivityDuration); } if (constrainedDepartureTime > 0) { tour.DestinationDepartureTime = constrainedDepartureTime; } else { tour.DestinationDepartureTime = Math.Max(departurePeriod.Start, constrainedArrivalTime + Global.Settings.Times.MinimumActivityDuration); } } //or if times aren't constrained use periods to set temporary arrival and departure times with minimum duration of stay for time window calculations else if (arrivalPeriod == departurePeriod) { var departureTime = Math.Max(choice.GetRandomDepartureTime(householdDay, tour), departurePeriod.Start + Global.Settings.Times.MinimumActivityDuration); tour.DestinationArrivalTime = departureTime - Global.Settings.Times.MinimumActivityDuration; tour.DestinationDepartureTime = departureTime; } else if (arrivalPeriod.End == departurePeriod.Start - 1) { tour.DestinationArrivalTime = arrivalPeriod.End; tour.DestinationDepartureTime = arrivalPeriod.End + Global.Settings.Times.MinimumActivityDuration; } else { tour.DestinationArrivalTime = arrivalPeriod.End; tour.DestinationDepartureTime = departurePeriod.Start; } } }