示例#1
0
        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));
        }
示例#2
0
        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;
                }
            }
        }
示例#4
0
        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;
                }
            }
        }