示例#1
0
        public ChoiceProbabilityCalculator.Alternative RunNested(TourWrapper tour, IParcelWrapper destinationParcel)
        {
            if (tour == null)
            {
                throw new ArgumentNullException("tour");
            }

            var choiceProbabilityCalculator = _helpers[ParallelUtility.GetBatchFromThreadId()].GetNestedChoiceProbabilityCalculator();

            var pathTypeModels =
                PathTypeModel.RunAll(
                    tour.Household.RandomUtility,
                    tour.OriginParcel,
                    destinationParcel,
                    tour.DestinationArrivalTime,
                    tour.DestinationDepartureTime,
                    tour.DestinationPurpose,
                    tour.CostCoefficient,
                    tour.TimeCoefficient,
                    tour.Person.IsDrivingAge,
                    tour.Household.VehiclesAvailable,
                    tour.Person.GetTransitFareDiscountFraction(),
                    false);

            RunModel(choiceProbabilityCalculator, tour, pathTypeModels, destinationParcel);

            return(choiceProbabilityCalculator.SimulateChoice(tour.Household.RandomUtility));
        }
示例#2
0
        public static void SignalShutdown()
        {
            if (ThreadQueue == null)
            {
                return;
            }

            ThreadQueue.Shutdown();

            HouseholdWrapper.Close();
            PersonWrapper.Close();
            HouseholdDayWrapper.Close();
            PersonDayWrapper.Close();
            TourWrapper.Close();
            TripWrapper.Close();
            if (!string.IsNullOrEmpty(Global.Configuration.OutputJointTourPath))
            {
                JointTourWrapper.Close();
            }
            if (!string.IsNullOrEmpty(Global.Configuration.OutputFullHalfTourPath))
            {
                FullHalfTourWrapper.Close();
            }
            if (!string.IsNullOrEmpty(Global.Configuration.OutputPartialHalfTourPath))
            {
                PartialHalfTourWrapper.Close();
            }
        }
示例#3
0
        public ChoiceProbabilityCalculator.Alternative RunNested(TourWrapper tour, IParcelWrapper destinationParcel)
        {
            if (tour == null)
            {
                throw new ArgumentNullException("tour");
            }

            var choiceProbabilityCalculator = _helpers[ParallelUtility.threadLocalAssignedIndex.Value].GetNestedChoiceProbabilityCalculator();

            var pathTypeModels =
                PathTypeModel.Run(
                    tour.Household.RandomUtility,
                    tour.OriginParcel,
                    destinationParcel,
                    tour.DestinationArrivalTime,
                    tour.DestinationDepartureTime,
                    Global.Settings.Purposes.Escort,
                    tour.CostCoefficient,
                    tour.TimeCoefficient,
                    tour.Person.IsDrivingAge,
                    tour.Household.VehiclesAvailable,
                    tour.Person.GetTransitFareDiscountFraction(),
                    false,
                    Global.Settings.Modes.Walk, Global.Settings.Modes.Bike, Global.Settings.Modes.Sov, Global.Settings.Modes.Hov2, Global.Settings.Modes.Hov3);

            RunModel(choiceProbabilityCalculator, tour, pathTypeModels, destinationParcel);

            return(choiceProbabilityCalculator.SimulateChoice(tour.Household.RandomUtility));
        }
        public void Run(TourWrapper subtour)
        {
            if (subtour == null)
            {
                throw new ArgumentNullException("subtour");
            }

            TourTime.InitializeTourTimes();

            subtour.PersonDay.ResetRandom(50 + subtour.Sequence - 1);

            if (subtour == null)
            {
                throw new ArgumentNullException("subtour");
            }

            if (Global.Configuration.IsInEstimationMode)
            {
                if (Global.Configuration.EstimationModel != CHOICE_MODEL_NAME)
                {
                    return;
                }
            }

            var choiceProbabilityCalculator = _helpers[ParallelUtility.threadLocalAssignedIndex.Value].GetChoiceProbabilityCalculator(subtour.Id);

            if (_helpers[ParallelUtility.threadLocalAssignedIndex.Value].ModelIsInEstimationMode)
            {
                if (subtour.DestinationParcel == null || subtour.OriginParcel == null || subtour.Mode <= Global.Settings.Modes.None || subtour.Mode >= Global.Settings.Modes.ParkAndRide)
                {
                    return;
                }

                RunModel(choiceProbabilityCalculator, subtour, new TourTime(subtour.DestinationArrivalTime, subtour.DestinationDepartureTime));

                choiceProbabilityCalculator.WriteObservation();
            }
            else
            {
                RunModel(choiceProbabilityCalculator, subtour);

                var chosenAlternative = choiceProbabilityCalculator.SimulateChoice(subtour.Household.RandomUtility);

                if (chosenAlternative == null)
                {
                    Global.PrintFile.WriteNoAlternativesAvailableWarning(CHOICE_MODEL_NAME, "Run", subtour.PersonDay.Id);
                    if (!Global.Configuration.IsInEstimationMode)
                    {
                        subtour.PersonDay.IsValid = false;
                    }
                    return;
                }

                var choice           = (TourTime)chosenAlternative.Choice;
                var destinationTimes = choice.GetDestinationTimes(subtour);

                subtour.DestinationArrivalTime   = destinationTimes.Start;
                subtour.DestinationDepartureTime = destinationTimes.End;
            }
        }
示例#5
0
        public static TripWrapper GetTripWrapper(int id = 0)
        {
            TourWrapper tour = GetTourWrapper();

            return(new TripWrapper(new Trip()
            {
                Id = id
            }, tour, new TourWrapper.HalfTour(tour)));
        }
示例#6
0
        public IMinuteSpan GetRandomDestinationTimes(TimeWindow timeWindow, TourWrapper tour)
        {
            if (tour == null)
            {
                throw new ArgumentNullException("tour");
            }

            return(timeWindow.GetMinuteSpan(tour.Household.RandomUtility, ArrivalPeriod.Start, ArrivalPeriod.End, DeparturePeriod.Start, DeparturePeriod.End));
        }
示例#7
0
        public void Run(TourWrapper tour, int knownArrivalTime = 0, int knownDepartureTime = 0)
        {
            if (tour == null)
            {
                throw new ArgumentNullException("tour");
            }

            TourTime.InitializeTourTimes();

            tour.PersonDay.ResetRandom(50 + tour.Sequence - 1);

            if (Global.Configuration.IsInEstimationMode)
            {
                if (Global.Configuration.EstimationModel != CHOICE_MODEL_NAME)
                {
                    return;
                }
            }

            var choiceProbabilityCalculator = _helpers[ParallelUtility.GetBatchFromThreadId()].GetChoiceProbabilityCalculator(tour.Id);

            if (_helpers[ParallelUtility.GetBatchFromThreadId()].ModelIsInEstimationMode)
            {
                if (tour.DestinationParcel == null || tour.OriginParcel == null || tour.Mode <= Global.Settings.Modes.None || tour.Mode >= Global.Settings.Modes.SchoolBus)
                {
                    return;
                }

                RunModel(choiceProbabilityCalculator, tour, knownArrivalTime, knownDepartureTime, new TourTime(tour.DestinationArrivalTime, tour.DestinationDepartureTime));

                choiceProbabilityCalculator.WriteObservation();
            }
            else
            {
                RunModel(choiceProbabilityCalculator, tour, knownArrivalTime, knownDepartureTime);

                var chosenAlternative = choiceProbabilityCalculator.SimulateChoice(tour.Household.RandomUtility);

                if (chosenAlternative == null)
                {
                    Global.PrintFile.WriteNoAlternativesAvailableWarning(CHOICE_MODEL_NAME, "Run", tour.PersonDay.Id);
                    if (!Global.Configuration.IsInEstimationMode)
                    {
                        tour.PersonDay.IsValid = false;
                    }

                    return;
                }

                var choice           = (TourTime)chosenAlternative.Choice;
                var destinationTimes = choice.GetDestinationTimes(tour);

                tour.DestinationArrivalTime   = knownArrivalTime == 0 ? destinationTimes.Start : knownArrivalTime;
                tour.DestinationDepartureTime = knownDepartureTime == 0 ? destinationTimes.End : knownDepartureTime;
            }
        }
示例#8
0
 public TourDestinationUtilities(TourWrapper tour, int sampleSize, int secondaryFlag, int workOrSchoolPatternFlag, int otherPatternFlag, int fastestAvailableTimeOfDay, int maxAvailableMinutes)
 {
     _tour                      = tour;
     _secondaryFlag             = secondaryFlag;
     _workOrSchoolPatternFlag   = workOrSchoolPatternFlag;
     _otherPatternFlag          = otherPatternFlag;
     _fastestAvailableTimeOfDay = fastestAvailableTimeOfDay;
     _maxAvailableMinutes       = maxAvailableMinutes;
     _seedValues                = ChoiceModelUtility.GetRandomSampling(sampleSize, tour.Person.SeedValues[20 + tour.Sequence - 1]);
 }
示例#9
0
文件: TourTest.cs 项目: sfcta/DaySim
        public void TestTourWrapper2()
        {
            Global.Configuration = new Configuration {
                HouseholdSamplingRateOneInX = 1
            };

            PersonWrapper    person            = TestHelper.GetPersonWrapper();
            PersonDayWrapper personDay         = TestHelper.GetPersonDayWrapper(personWrapper: person, income: -1);
            CondensedParcel  originParcel      = new CondensedParcel();
            CondensedParcel  destinationParcel = new CondensedParcel();
            int destinationDepartureTime       = 1;
            int destinationPurpose             = Constants.Purpose.BUSINESS;
            int destinationArrivalTime         = 3;

            Global.Configuration.Coefficients_BaseCostCoefficientIncomeLevel     = 25000;
            Global.Configuration.Coefficients_StdDeviationTimeCoefficient_Other  = .75;
            Global.Configuration.Coefficients_MeanTimeCoefficient_Other          = .45;
            Global.Configuration.Coefficients_BaseCostCoefficientPerMonetaryUnit = 5;
            Tour        subtour = new Tour();
            TourWrapper tour    = new TourWrapper(person, personDay, originParcel, destinationParcel, destinationArrivalTime,
                                                  destinationDepartureTime, destinationPurpose);
            TourWrapper wrapper = new TourWrapper(subtour, tour);

            Assert.Equal(tour, wrapper.ParentTour);
            Assert.Equal(1261, wrapper.DestinationDepartureTime);
            Assert.Equal(1261, wrapper.DestinationArrivalTime);
            Assert.Equal(0, wrapper.DestinationPurpose);
            Assert.Equal(null, wrapper.DestinationParcel);
            Assert.Equal(null, wrapper.OriginParcel);
            Assert.Equal(person, wrapper.Person);
            Assert.Equal(personDay, wrapper.PersonDay);

            Assert.Equal(0, wrapper.DestinationAddressType);
            Assert.Equal(null, wrapper.DestinationArrivalBigPeriod);
            Assert.Equal(false, wrapper.DestinationModeAndTimeHaveBeenSimulated);
            Assert.Equal(0, wrapper.DestinationParcelId);
            Assert.Equal(0, wrapper.DestinationZoneKey);
            Assert.Equal(0, wrapper.EarliestOriginDepartureTime);
            Assert.Equal(0, wrapper.FullHalfTour1Sequence);
            Assert.Equal(0, wrapper.FullHalfTour2Sequence);
            Assert.Equal(null, wrapper.GetHalfTour(Constants.TourDirection.DESTINATION_TO_ORIGIN));
            Assert.Equal(null, wrapper.GetHalfTour(Constants.TourDirection.ORIGIN_TO_DESTINATION));
            Assert.Equal(false, wrapper.HalfTour1HasBeenSimulated);
            Assert.Equal(0, wrapper.HalfTour1Trips);
            Assert.Equal(false, wrapper.HalfTour2HasBeenSimulated);
            Assert.Equal(0, wrapper.HalfTour2Trips);
//			Assert.Equal(false, wrapper.HasSubtours);
            Assert.Equal(0, wrapper.IndicatedTravelTimeFromDestination);
            Assert.Equal(0, wrapper.IndicatedTravelTimeToDestination);


            Assert.Equal(false, wrapper.IsHomeBasedTour);
            Assert.Equal(false, wrapper.IsMissingData);
            Assert.Equal(false, wrapper.IsParkAndRideMode);
        }
示例#10
0
        public bool SubtourIsWithinTour(TourWrapper subtour)
        {
            if (subtour == null)
            {
                throw new ArgumentNullException("subtour");
            }

            var tour = subtour.ParentTour;

            return(ArrivalPeriod.Start >= tour.DestinationArrivalTime && DeparturePeriod.End <= tour.DestinationDepartureTime);
        }
示例#11
0
        //MBADD runnested
        public ChoiceProbabilityCalculator.Alternative RunNested(PersonWrapper person, IParcelWrapper originParcel, IParcelWrapper destinationParcel, int destinationArrivalTime, int destinationDepartureTime, int householdCars, double transitDiscountFraction, int purpose)
        {
            if (person == null)
            {
                throw new ArgumentNullException("person");
            }

            TourWrapper tour = (TourWrapper)_creator.CreateWrapper(person, null, originParcel, destinationParcel, destinationArrivalTime, destinationDepartureTime, purpose);

            return(RunNested(tour, destinationParcel, householdCars, transitDiscountFraction));
        }
示例#12
0
文件: TourTest.cs 项目: sfcta/DaySim
        public void TestTourWrapperTimeCoefficient()
        {
            Global.Configuration = new Configuration {
                HouseholdSamplingRateOneInX = 1
            };
            PersonWrapper    person            = TestHelper.GetPersonWrapper();
            PersonDayWrapper personDay         = TestHelper.GetPersonDayWrapper(personWrapper: person, income: -1);
            CondensedParcel  originParcel      = new CondensedParcel();
            CondensedParcel  destinationParcel = new CondensedParcel();
            int destinationDepartureTime       = 1;
            int destinationPurpose             = Constants.Purpose.SCHOOL;
            int destinationArrivalTime         = 3;

            Global.Configuration.Coefficients_BaseCostCoefficientIncomeLevel    = 25000;
            Global.Configuration.Coefficients_StdDeviationTimeCoefficient_Other = .75;
            Global.Configuration.Coefficients_MeanTimeCoefficient_Other         = .45;

            Global.Configuration.Coefficients_StdDeviationTimeCoefficient_Work   = .76;
            Global.Configuration.Coefficients_MeanTimeCoefficient_Work           = .46;
            Global.Configuration.Coefficients_BaseCostCoefficientPerMonetaryUnit = 5;
            TourWrapper wrapper = new TourWrapper(person, personDay, originParcel, destinationParcel, destinationArrivalTime,
                                                  destinationDepartureTime, destinationPurpose);

            Assert.Equal(.45, wrapper.TimeCoefficient);

            destinationPurpose = Constants.Purpose.WORK;
            wrapper            = new TourWrapper(person, personDay, originParcel, destinationParcel, destinationArrivalTime,
                                                 destinationDepartureTime, destinationPurpose);
            Assert.Equal(.46, wrapper.TimeCoefficient);

            Global.Configuration.UseRandomVotDistribution = true;
            wrapper = new TourWrapper(person, personDay, originParcel, destinationParcel, destinationArrivalTime,
                                      destinationDepartureTime, destinationPurpose);
            Assert.Equal(.46, wrapper.TimeCoefficient);            //This constructor suppresses randomVOT


            person             = TestHelper.GetPersonWrapper();
            personDay          = TestHelper.GetPersonDayWrapper(personWrapper: person, income: -1);
            destinationPurpose = Constants.Purpose.BUSINESS;
            Tour tour = new Tour();

            wrapper = new TourWrapper(tour, personDay, destinationPurpose, false);
            Assert.Equal(-.001, wrapper.TimeCoefficient);            //This constructor does not suppress randomVOT

            Global.Configuration.Coefficients_StdDeviationTimeCoefficient_Work = .8;
            Global.Configuration.Coefficients_MeanTimeCoefficient_Work         = -.03;
            person             = TestHelper.GetPersonWrapper();
            personDay          = TestHelper.GetPersonDayWrapper(personWrapper: person, income: -1);
            destinationPurpose = Constants.Purpose.WORK;
            tour    = new Tour();
            wrapper = new TourWrapper(tour, personDay, destinationPurpose, false);
            Assert.Equal(-.0303002, Math.Round(wrapper.TimeCoefficient, 7));            //This constructor does not suppress randomVOT
        }
示例#13
0
文件: TripTest.cs 项目: sfcta/DaySim
        public void TestTripWrapperByOriginDestination()
        {
            Global.Configuration = new Configuration {
                HouseholdSamplingRateOneInX = 256
            };
            Trip trip = new Trip {
                HalfTour = 1, OriginPurpose = Constants.Purpose.ESCORT, DestinationPurpose = Constants.Purpose.NONE_OR_HOME
            };
            TourWrapper tour = TestHelper.GetTourWrapper();

            TourWrapper.HalfTour halfTour = new TourWrapper.HalfTour(tour);
            TripWrapper          wrapper  = new TripWrapper(trip, tour, halfTour);

            Assert.Equal(true, wrapper.IsEscortPurposeByDestination);
            Assert.Equal(false, wrapper.IsNoneOrHomePurposeByDestination);
            Assert.Equal(false, wrapper.IsWorkPurposeByDestination);
            Assert.Equal(false, wrapper.IsEscortPurposeByOrigin);
            Assert.Equal(true, wrapper.IsNoneOrHomePurposeByOrigin);
            Assert.Equal(false, wrapper.IsWorkPurposeByOrigin);

            trip = new Trip {
                HalfTour = 1, OriginPurpose = Constants.Purpose.NONE_OR_HOME, DestinationPurpose = Constants.Purpose.WORK
            };
            wrapper = new TripWrapper(trip, tour, halfTour);
            Assert.Equal(false, wrapper.IsEscortPurposeByDestination);
            Assert.Equal(true, wrapper.IsNoneOrHomePurposeByDestination);
            Assert.Equal(false, wrapper.IsWorkPurposeByDestination);
            Assert.Equal(false, wrapper.IsEscortPurposeByOrigin);
            Assert.Equal(false, wrapper.IsNoneOrHomePurposeByOrigin);
            Assert.Equal(true, wrapper.IsWorkPurposeByOrigin);

            trip = new Trip {
                HalfTour = 1, OriginPurpose = Constants.Purpose.WORK, DestinationPurpose = Constants.Purpose.ESCORT
            };
            wrapper = new TripWrapper(trip, tour, halfTour);
            Assert.Equal(false, wrapper.IsEscortPurposeByDestination);
            Assert.Equal(false, wrapper.IsNoneOrHomePurposeByDestination);
            Assert.Equal(true, wrapper.IsWorkPurposeByDestination);
            Assert.Equal(true, wrapper.IsEscortPurposeByOrigin);
            Assert.Equal(false, wrapper.IsNoneOrHomePurposeByOrigin);
            Assert.Equal(false, wrapper.IsWorkPurposeByOrigin);

            trip = new Trip {
                HalfTour = 1, OriginPurpose = Constants.Purpose.BUSINESS, DestinationPurpose = Constants.Purpose.BUSINESS
            };
            wrapper = new TripWrapper(trip, tour, halfTour);
            Assert.Equal(false, wrapper.IsEscortPurposeByDestination);
            Assert.Equal(false, wrapper.IsNoneOrHomePurposeByDestination);
            Assert.Equal(false, wrapper.IsWorkPurposeByDestination);
            Assert.Equal(false, wrapper.IsEscortPurposeByOrigin);
            Assert.Equal(false, wrapper.IsNoneOrHomePurposeByOrigin);
            Assert.Equal(false, wrapper.IsWorkPurposeByOrigin);
        }
示例#14
0
        public ChoiceProbabilityCalculator.Alternative RunNested(PersonDayWrapper personDay, IParcelWrapper originParcel, IParcelWrapper destinationParcel, int destinationArrivalTime, int destinationDepartureTime, int householdCars, int purpose)
        {
            if (personDay == null)
            {
                throw new ArgumentNullException("personDay");
            }

            //var tour = (TourWrapper)_creator.CreateWrapper(personDay.Person, personDay, originParcel, destinationParcel, destinationArrivalTime, destinationDepartureTime, Global.Settings.Purposes.Work);
            TourWrapper tour = (TourWrapper)_creator.CreateWrapper(personDay.Person, personDay, originParcel, destinationParcel, destinationArrivalTime, destinationDepartureTime, purpose);

            return(RunNested(tour, destinationParcel, householdCars, personDay.Person.GetTransitFareDiscountFraction()));
        }
示例#15
0
        public int Run(TourWrapper tour, HouseholdDayWrapper householdDay, int nCallsForTour, int choice)
        {
            if (tour == null)
            {
                throw new ArgumentNullException("tour");
            }

            tour.PersonDay.Person.ResetRandom(908 + (tour.Sequence - 1) * 3 + nCallsForTour);

            if (Global.Configuration.IsInEstimationMode)
            {
                if (!(choice == Global.Settings.Purposes.NoneOrHome)) // simplifying choice.  TODO:  will need to deal with personal business subtours distinctly from home based in tour models
                {
                    choice = Global.Settings.Purposes.PersonalBusiness;
                }
                if (Global.Configuration.EstimationModel != CHOICE_MODEL_NAME)
                {
                    return(choice);
                }
            }

            ChoiceProbabilityCalculator choiceProbabilityCalculator = _helpers[ParallelUtility.threadLocalAssignedIndex.Value].GetChoiceProbabilityCalculator((tour.Id * 397) ^ nCallsForTour);

            if (_helpers[ParallelUtility.threadLocalAssignedIndex.Value].ModelIsInEstimationMode)
            {
                if (tour.PersonDay.GetTotalStops() > 0)
                {
                    RunModel(choiceProbabilityCalculator, tour, householdDay, nCallsForTour, choice);

                    choiceProbabilityCalculator.WriteObservation();
                }
            }
            else
            {
                if (tour.PersonDay.GetTotalStops() > 0)
                {
                    RunModel(choiceProbabilityCalculator, tour, householdDay, nCallsForTour);

                    ChoiceProbabilityCalculator.Alternative chosenAlternative = choiceProbabilityCalculator.SimulateChoice(tour.Household.RandomUtility);
                    choice = (int)chosenAlternative.Choice;
                }
                else
                {
                    choice = Global.Settings.Purposes.NoneOrHome;
                }
            }

            return(choice);
        }
示例#16
0
        public int Run(TourWrapper tour, int nCallsForTour, HouseholdDayWrapper householdDay, int choice)
        {
            if (tour == null)
            {
                throw new ArgumentNullException("tour");
            }

            tour.PersonDay.Person.ResetRandom(908 + (tour.Sequence - 1) * 3 + nCallsForTour);

            if (Global.Configuration.IsInEstimationMode)
            {
                if (Global.Configuration.EstimationModel != CHOICE_MODEL_NAME)
                {
                    return(choice);
                }
            }

            var choiceProbabilityCalculator = _helpers[ParallelUtility.threadLocalAssignedIndex.Value].GetChoiceProbabilityCalculator((tour.Id * 397) ^ nCallsForTour);

            if (_helpers[ParallelUtility.threadLocalAssignedIndex.Value].ModelIsInEstimationMode)
            {
                if (tour.PersonDay.GetTotalStops() > 0)
                {
                    RunModel(choiceProbabilityCalculator, tour, nCallsForTour, householdDay, choice);

                    choiceProbabilityCalculator.WriteObservation();
                }
            }
            else
            {
                if (tour.PersonDay.GetTotalStops() > 0)
                {
                    RunModel(choiceProbabilityCalculator, tour, nCallsForTour, householdDay);

                    var chosenAlternative = choiceProbabilityCalculator.SimulateChoice(tour.Household.RandomUtility);
                    choice = (int)chosenAlternative.Choice;
                }
                else
                {
                    choice = Global.Settings.Purposes.NoneOrHome;
                }
            }

            return(choice);
        }
示例#17
0
        public static TourWrapper GetTourWrapper()
        {
            PersonWrapper    person            = TestHelper.GetPersonWrapper();
            PersonDayWrapper personDay         = TestHelper.GetPersonDayWrapper(personWrapper: person, income: -1);
            CondensedParcel  originParcel      = new CondensedParcel();
            CondensedParcel  destinationParcel = new CondensedParcel();
            int destinationDepartureTime       = 1;
            int destinationPurpose             = Constants.Purpose.BUSINESS;
            int destinationArrivalTime         = 3;

            Global.Configuration.Coefficients_BaseCostCoefficientIncomeLevel     = 25000;
            Global.Configuration.Coefficients_StdDeviationTimeCoefficient_Other  = .75;
            Global.Configuration.Coefficients_MeanTimeCoefficient_Other          = .45;
            Global.Configuration.Coefficients_BaseCostCoefficientPerMonetaryUnit = 5;
            TourWrapper wrapper = new TourWrapper(person, personDay, originParcel, destinationParcel, destinationArrivalTime,
                                                  destinationDepartureTime, destinationPurpose);

            return(wrapper);
        }
示例#18
0
        public ChoiceProbabilityCalculator.Alternative RunNested(TourWrapper tour, IParcelWrapper destinationParcel, int householdCars, double transitDiscountFraction)
        {
            if (Global.Configuration.AvoidDisaggregateModeChoiceLogsums)
            {
                return(null);
            }
            ChoiceProbabilityCalculator choiceProbabilityCalculator = _helpers[ParallelUtility.threadLocalAssignedIndex.Value].GetNestedChoiceProbabilityCalculator();

            HouseholdDayWrapper householdDay = (tour.PersonDay == null) ? null : (HouseholdDayWrapper)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, householdCars, transitDiscountFraction);

            RunModel(choiceProbabilityCalculator, householdDay, tour, destinationParcel, householdCars, constrainedMode, constrainedArrivalTime, constrainedDepartureTime);

            return(choiceProbabilityCalculator.SimulateChoice(tour.Household.RandomUtility));
        }
示例#19
0
文件: TourTest.cs 项目: sfcta/DaySim
        public void TestTourWrapperCostCoefficient()
        {
            Global.Configuration = new Configuration {
                HouseholdSamplingRateOneInX = 1
            };
            PersonWrapper    person            = TestHelper.GetPersonWrapper();
            PersonDayWrapper personDay         = TestHelper.GetPersonDayWrapper(personWrapper: person, income: -1);
            CondensedParcel  originParcel      = new CondensedParcel();
            CondensedParcel  destinationParcel = new CondensedParcel();
            int destinationDepartureTime       = 1;
            int destinationPurpose             = Constants.Purpose.BUSINESS;
            int destinationArrivalTime         = 3;

            Global.Configuration.Coefficients_BaseCostCoefficientIncomeLevel     = 25000;
            Global.Configuration.Coefficients_StdDeviationTimeCoefficient_Other  = .75;
            Global.Configuration.Coefficients_MeanTimeCoefficient_Other          = .45;
            Global.Configuration.Coefficients_BaseCostCoefficientPerMonetaryUnit = 5;
            TourWrapper wrapper = new TourWrapper(person, personDay, originParcel, destinationParcel, destinationArrivalTime,
                                                  destinationDepartureTime, destinationPurpose);

            Assert.Equal(5, wrapper.CostCoefficient);

            Global.Configuration.Coefficients_CostCoefficientIncomePower_Other = 2;
            wrapper = new TourWrapper(person, personDay, originParcel, destinationParcel, destinationArrivalTime,
                                      destinationDepartureTime, destinationPurpose);
            Assert.Equal(5, wrapper.CostCoefficient);

            person    = TestHelper.GetPersonWrapper(income: 50000);
            personDay = TestHelper.GetPersonDayWrapper(income: 50000);
            wrapper   = new TourWrapper(person, personDay, originParcel, destinationParcel, destinationArrivalTime,
                                        destinationDepartureTime, destinationPurpose);
            Assert.Equal(1.25, wrapper.CostCoefficient);


            Global.Configuration.Coefficients_CostCoefficientIncomePower_Other = 8;
            wrapper = new TourWrapper(person, personDay, originParcel, destinationParcel, destinationArrivalTime,
                                      destinationDepartureTime, destinationPurpose);
            Assert.Equal(5.0 / 256.0, wrapper.CostCoefficient);
        }
示例#20
0
文件: TripTest.cs 项目: sfcta/DaySim
        public void TestTripWrapperIsBeforeMandatoryDestination()
        {
            Global.Configuration = new Configuration {
                HouseholdSamplingRateOneInX = 256
            };
            Trip        trip = new Trip();
            TourWrapper tour = TestHelper.GetTourWrapper();

            TourWrapper.HalfTour halfTour = new TourWrapper.HalfTour(tour);
            TripWrapper          wrapper  = new TripWrapper(trip, tour, halfTour);

            Assert.Equal(false, wrapper.IsBeforeMandatoryDestination);

            trip = new Trip {
                HalfTour = 1
            };
            wrapper = new TripWrapper(trip, tour, halfTour);
            tour.DestinationPurpose = Constants.Purpose.MEDICAL;
            Assert.Equal(false, wrapper.IsBeforeMandatoryDestination);

            tour.DestinationPurpose = Constants.Purpose.WORK;
            Assert.Equal(true, wrapper.IsBeforeMandatoryDestination);

            tour.DestinationPurpose = Constants.Purpose.PERSONAL_BUSINESS;
            Assert.Equal(false, wrapper.IsBeforeMandatoryDestination);

            tour.DestinationPurpose = Constants.Purpose.SCHOOL;
            Assert.Equal(true, wrapper.IsBeforeMandatoryDestination);

            trip = new Trip {
                HalfTour = 0
            };
            wrapper = new TripWrapper(trip, tour, halfTour);
            Assert.Equal(false, wrapper.IsBeforeMandatoryDestination);

            tour.DestinationPurpose = Constants.Purpose.WORK;
            Assert.Equal(false, wrapper.IsBeforeMandatoryDestination);
        }
示例#21
0
        private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, TourWrapper tour, int knownArrivalTime = 0, int knownDepartureTime = 0, TourTime choice = null)
        {
            var household = tour.Household;
            var person    = tour.Person;
            var personDay = tour.PersonDay;

            // household inputs
            var income0To25KFlag   = household.Has0To25KIncome.ToFlag();
            var income100KPlusFlag = household.Has100KPlusIncome.ToFlag();

            // person inputs
            var partTimeWorkerFlag     = person.IsPartTimeWorker.ToFlag();
            var nonworkingAdultFlag    = person.IsNonworkingAdult.ToFlag();
            var universityStudentFlag  = person.IsUniversityStudent.ToFlag();
            var retiredAdultFlag       = person.IsRetiredAdult.ToFlag();
            var drivingAgeStudentFlag  = person.IsDrivingAgeStudent.ToFlag();
            var fulltimeWorkerFlag     = person.IsFulltimeWorker.ToFlag();
            var childAge5Through15Flag = person.IsChildAge5Through15.ToFlag();
            var childUnder5Flag        = person.IsChildUnder5.ToFlag();

            // person-day inputs
            var homeBasedToursOnlyFlag          = personDay.OnlyHomeBasedToursExist().ToFlag();
            var firstSimulatedHomeBasedTourFlag = personDay.IsFirstSimulatedHomeBasedTour().ToFlag();
            var laterSimulatedHomeBasedTourFlag = personDay.IsLaterSimulatedHomeBasedTour().ToFlag();
            var totalStops              = personDay.GetTotalStops();
            var totalSimulatedStops     = personDay.GetTotalSimulatedStops();
            var escortStops             = personDay.EscortStops;
            var homeBasedTours          = personDay.HomeBasedTours;
            var simulatedHomeBasedTours = personDay.SimulatedHomeBasedTours;

            // tour inputs
            var escortTourFlag           = tour.IsEscortPurpose().ToFlag();
            var shoppingTourFlag         = tour.IsShoppingPurpose().ToFlag();
            var mealTourFlag             = tour.IsMealPurpose().ToFlag();
            var socialTourFlag           = tour.IsSocialPurpose().ToFlag();
            var personalBusinessTourFlag = tour.IsPersonalBusinessPurpose().ToFlag();

            var sovOrHovTourFlag = tour.IsAnAutoMode().ToFlag();
            var transitTourFlag  = tour.UsesTransitModes().ToFlag();

            // remaining inputs
            // Higher priority tour of 2+ tours for the same purpose
            var highPrioritySameFlag = (tour.GetTotalToursByPurpose() > tour.GetTotalSimulatedToursByPurpose() && tour.GetTotalSimulatedToursByPurpose() == 1).ToFlag();

            // Lower priority tour(s) of 2+ tours for the same purpose
            var lowPrioritySameFlag = (tour.GetTotalSimulatedToursByPurpose() > 1).ToFlag();

            // Higher priority tour of 2+ tours for different purposes
            var highPriorityDifferentFlag = (personDay.IsFirstSimulatedHomeBasedTour() && personDay.HomeBasedToursExist()).ToFlag() * (1 - highPrioritySameFlag);

            // Lower priority tour of 2+ tours for different purposes
            var lowPriorityDifferentFlag = (personDay.IsLaterSimulatedHomeBasedTour() && personDay.HomeBasedToursExist()).ToFlag() * (1 - lowPrioritySameFlag);

            var timeWindow       = tour.ParentTour == null ? personDay.TimeWindow : tour.ParentTour.TimeWindow;
            var impedances       = tour.GetTourModeImpedances();
            var period1Middle    = 15;
            var smallPeriodCount = DayPeriod.SmallDayPeriods.Count();

            for (var periodIndex = 0; periodIndex < smallPeriodCount; periodIndex++)
            {
                // set arrival period component
                var arrivalPeriodIndex            = periodIndex;
                var arrivalPeriodShift            = arrivalPeriodIndex * (48.0 / DayPeriod.SMALL_DAY_PERIOD_TOTAL_TRIP_TIMES);      //adjust shift amount if period lengths change
                var arrivalPeriod                 = DayPeriod.SmallDayPeriods[arrivalPeriodIndex];
                var earlyArriveFlag               = arrivalPeriod.Middle.IsBetween(Global.Settings.Times.ThreeAM, Global.Settings.Times.SevenAM).ToFlag();
                var arrivalImpedance              = impedances[arrivalPeriodIndex];
                var arrivalPeriodAvailableMinutes = timeWindow.TotalAvailableMinutes(arrivalPeriod.Start, arrivalPeriod.End);

                choiceProbabilityCalculator.CreateUtilityComponent(3 * periodIndex + 0);
                var arrivalComponent = choiceProbabilityCalculator.GetUtilityComponent(3 * periodIndex + 0);

                if (arrivalPeriodAvailableMinutes > 0)
                {
                    arrivalComponent.AddUtilityTerm(11, arrivalPeriod.Middle.IsBetween(Global.Settings.Times.ThreeAM, Global.Settings.Times.SixAM).ToFlag());
                    arrivalComponent.AddUtilityTerm(12, arrivalPeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.SixAM, Global.Settings.Times.SevenAM).ToFlag());
                    arrivalComponent.AddUtilityTerm(13, arrivalPeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.SevenAM, Global.Settings.Times.EightAM).ToFlag());
                    arrivalComponent.AddUtilityTerm(14, arrivalPeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.EightAM, Global.Settings.Times.NineAM).ToFlag());
                    arrivalComponent.AddUtilityTerm(15, arrivalPeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.NineAM, Global.Settings.Times.TenAM).ToFlag());
                    arrivalComponent.AddUtilityTerm(16, arrivalPeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.TenAM, Global.Settings.Times.OnePM).ToFlag());
                    arrivalComponent.AddUtilityTerm(17, arrivalPeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.OnePM, Global.Settings.Times.FourPM).ToFlag());
                    arrivalComponent.AddUtilityTerm(18, arrivalPeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.FourPM, Global.Settings.Times.SevenPM).ToFlag());
                    arrivalComponent.AddUtilityTerm(19, arrivalPeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.SevenPM, Global.Settings.Times.TenPM).ToFlag());
                    arrivalComponent.AddUtilityTerm(20, arrivalPeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.TenPM, Global.Settings.Times.MinutesInADay).ToFlag());
                    arrivalComponent.AddUtilityTerm(41, partTimeWorkerFlag * arrivalPeriodShift);
                    arrivalComponent.AddUtilityTerm(43, nonworkingAdultFlag * arrivalPeriodShift);
                    arrivalComponent.AddUtilityTerm(45, universityStudentFlag * arrivalPeriodShift);
                    arrivalComponent.AddUtilityTerm(47, retiredAdultFlag * arrivalPeriodShift);
                    arrivalComponent.AddUtilityTerm(49, drivingAgeStudentFlag * arrivalPeriodShift);
                    arrivalComponent.AddUtilityTerm(139, fulltimeWorkerFlag * arrivalPeriodShift);
                    arrivalComponent.AddUtilityTerm(141, childAge5Through15Flag * arrivalPeriodShift);
                    arrivalComponent.AddUtilityTerm(143, childUnder5Flag * arrivalPeriodShift);
                    arrivalComponent.AddUtilityTerm(145, escortTourFlag * arrivalPeriodShift);
                    arrivalComponent.AddUtilityTerm(147, shoppingTourFlag * arrivalPeriodShift);
                    arrivalComponent.AddUtilityTerm(149, mealTourFlag * arrivalPeriodShift);
                    arrivalComponent.AddUtilityTerm(151, socialTourFlag * arrivalPeriodShift);
                    arrivalComponent.AddUtilityTerm(153, personalBusinessTourFlag * arrivalPeriodShift);
                    arrivalComponent.AddUtilityTerm(51, income0To25KFlag * arrivalPeriodShift);
                    arrivalComponent.AddUtilityTerm(53, income100KPlusFlag * arrivalPeriodShift);
                    arrivalComponent.AddUtilityTerm(55, highPrioritySameFlag * arrivalPeriodShift);
                    arrivalComponent.AddUtilityTerm(57, lowPrioritySameFlag * arrivalPeriodShift);
                    arrivalComponent.AddUtilityTerm(155, highPriorityDifferentFlag * arrivalPeriodShift);
                    arrivalComponent.AddUtilityTerm(157, lowPriorityDifferentFlag * arrivalPeriodShift);
                    arrivalComponent.AddUtilityTerm(59, homeBasedToursOnlyFlag * arrivalPeriodShift);
                    arrivalComponent.AddUtilityTerm(61, totalStops * homeBasedToursOnlyFlag * arrivalPeriodShift);
                    arrivalComponent.AddUtilityTerm(63, totalStops * (1 - homeBasedToursOnlyFlag) * arrivalPeriodShift);
                    arrivalComponent.AddUtilityTerm(65, (totalStops - totalSimulatedStops) * (1 - homeBasedToursOnlyFlag) * arrivalPeriodShift);
                    arrivalComponent.AddUtilityTerm(67, escortStops * arrivalPeriodShift);
                    arrivalComponent.AddUtilityTerm(69, tour.TotalSubtours * arrivalPeriodShift);
                    arrivalComponent.AddUtilityTerm(72, income100KPlusFlag * earlyArriveFlag);
                    arrivalComponent.AddUtilityTerm(175, escortTourFlag * earlyArriveFlag);
                    arrivalComponent.AddUtilityTerm(176, shoppingTourFlag * earlyArriveFlag);
                    arrivalComponent.AddUtilityTerm(177, mealTourFlag * earlyArriveFlag);
                    arrivalComponent.AddUtilityTerm(85, sovOrHovTourFlag * arrivalImpedance.GeneralizedTimeFromOrigin * tour.TimeCoefficient);
                    arrivalComponent.AddUtilityTerm(87, transitTourFlag * Math.Max(0, arrivalImpedance.GeneralizedTimeFromOrigin) * tour.TimeCoefficient);
                    arrivalComponent.AddUtilityTerm(89, transitTourFlag * (arrivalImpedance.GeneralizedTimeFromOrigin < 0).ToFlag());
                    arrivalComponent.AddUtilityTerm(91, Math.Log(arrivalPeriodAvailableMinutes));
                    arrivalComponent.AddUtilityTerm(93, arrivalImpedance.AdjacentMinutesBefore * firstSimulatedHomeBasedTourFlag);
                    arrivalComponent.AddUtilityTerm(95, arrivalImpedance.AdjacentMinutesBefore * laterSimulatedHomeBasedTourFlag);
                    arrivalComponent.AddUtilityTerm(99, (totalStops - totalSimulatedStops) / (1D + arrivalImpedance.AdjacentMinutesBefore));
                }

                // set departure period component
                var departurePeriodIndex            = periodIndex;
                var departurePeriod                 = DayPeriod.SmallDayPeriods[departurePeriodIndex];
                var lateDepartFlag                  = departurePeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.NinePM, Global.Settings.Times.MinutesInADay).ToFlag();
                var departureImpedance              = impedances[departurePeriodIndex];
                var departurePeriodAvailableMinutes = timeWindow.TotalAvailableMinutes(departurePeriod.Start, departurePeriod.End);

                choiceProbabilityCalculator.CreateUtilityComponent(3 * periodIndex + 1);
                var departureComponent = choiceProbabilityCalculator.GetUtilityComponent(3 * periodIndex + 1);

                if (departurePeriodAvailableMinutes > 0)
                {
                    departureComponent.AddUtilityTerm(21, departurePeriod.Middle.IsBetween(Global.Settings.Times.ThreeAM, Global.Settings.Times.SevenAM).ToFlag());
                    departureComponent.AddUtilityTerm(22, departurePeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.SevenAM, Global.Settings.Times.TenAM).ToFlag());
                    departureComponent.AddUtilityTerm(23, departurePeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.TenAM, Global.Settings.Times.OnePM).ToFlag());
                    departureComponent.AddUtilityTerm(24, departurePeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.OnePM, Global.Settings.Times.ThreePM).ToFlag());
                    departureComponent.AddUtilityTerm(124, departurePeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.ThreePM, Global.Settings.Times.FourPM).ToFlag());
                    departureComponent.AddUtilityTerm(25, departurePeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.FourPM, Global.Settings.Times.FivePM).ToFlag());
                    departureComponent.AddUtilityTerm(26, departurePeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.FivePM, Global.Settings.Times.SixPM).ToFlag());
                    departureComponent.AddUtilityTerm(27, departurePeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.SixPM, Global.Settings.Times.SevenPM).ToFlag());
                    departureComponent.AddUtilityTerm(28, departurePeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.SevenPM, Global.Settings.Times.NinePM).ToFlag());
                    departureComponent.AddUtilityTerm(29, departurePeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.NinePM, Global.Settings.Times.Midnight).ToFlag());
                    departureComponent.AddUtilityTerm(30, departurePeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.Midnight, Global.Settings.Times.MinutesInADay).ToFlag());
                    departureComponent.AddUtilityTerm(73, income100KPlusFlag * lateDepartFlag);
                    departureComponent.AddUtilityTerm(178, escortTourFlag * lateDepartFlag);
                    departureComponent.AddUtilityTerm(179, shoppingTourFlag * lateDepartFlag);
                    departureComponent.AddUtilityTerm(180, mealTourFlag * lateDepartFlag);
                    departureComponent.AddUtilityTerm(86, sovOrHovTourFlag * departureImpedance.GeneralizedTimeFromDestination * tour.TimeCoefficient);
                    departureComponent.AddUtilityTerm(88, transitTourFlag * Math.Max(0, departureImpedance.GeneralizedTimeFromDestination) * tour.TimeCoefficient);
                    departureComponent.AddUtilityTerm(89, transitTourFlag * (departureImpedance.GeneralizedTimeFromDestination < 0).ToFlag());
                    departureComponent.AddUtilityTerm(92, Math.Log(departurePeriodAvailableMinutes));
                    departureComponent.AddUtilityTerm(94, departureImpedance.AdjacentMinutesAfter * firstSimulatedHomeBasedTourFlag);
                    departureComponent.AddUtilityTerm(96, departureImpedance.AdjacentMinutesAfter * laterSimulatedHomeBasedTourFlag);
                    departureComponent.AddUtilityTerm(100, (totalStops - totalSimulatedStops) / (1D + departureImpedance.AdjacentMinutesAfter));
                }

                // set duration component (relative to period 1)
                var periodSpan = periodIndex * (48.0 / DayPeriod.SMALL_DAY_PERIOD_TOTAL_TRIP_TIMES);                 //adjust shift amount if period lengths change;
                if (arrivalPeriodIndex == 0)
                {
                    period1Middle = arrivalPeriod.Middle;
                }
                var duration = departurePeriod.Middle - period1Middle;
                var durationUnder1HourFlag  = ChoiceModelUtility.GetDurationUnder1HourFlag(duration);
                var duration1To2HoursFlag   = ChoiceModelUtility.GetDuration1To2HoursFlag(duration);
                var durationUnder4HoursFlag = ChoiceModelUtility.GetDurationUnder4HoursFlag(duration);
                var durationUnder8HoursFlag = ChoiceModelUtility.GetDurationUnder8HoursFlag(duration);
                var durationUnder9HoursFlag = ChoiceModelUtility.GetDurationUnder9HoursFlag(duration);

                choiceProbabilityCalculator.CreateUtilityComponent(3 * periodIndex + 2);
                var durationComponent = choiceProbabilityCalculator.GetUtilityComponent(3 * periodIndex + 2);

                if (tour.IsWorkPurpose() || tour.IsSchoolPurpose())
                {
                    durationComponent.AddUtilityTerm(31, duration.IsRightExclusiveBetween(Global.Settings.Times.ZeroHours, Global.Settings.Times.ThreeHours).ToFlag());
                    durationComponent.AddUtilityTerm(32, duration.IsRightExclusiveBetween(Global.Settings.Times.ThreeHours, Global.Settings.Times.FiveHours).ToFlag());
                    durationComponent.AddUtilityTerm(33, duration.IsRightExclusiveBetween(Global.Settings.Times.FiveHours, Global.Settings.Times.SevenHours).ToFlag());
                    durationComponent.AddUtilityTerm(34, duration.IsRightExclusiveBetween(Global.Settings.Times.SevenHours, Global.Settings.Times.NineHours).ToFlag());
                    durationComponent.AddUtilityTerm(35, duration.IsRightExclusiveBetween(Global.Settings.Times.NineHours, Global.Settings.Times.TenHours).ToFlag());
                    durationComponent.AddUtilityTerm(36, duration.IsRightExclusiveBetween(Global.Settings.Times.TenHours, Global.Settings.Times.ElevenHours).ToFlag());
                    durationComponent.AddUtilityTerm(37, duration.IsRightExclusiveBetween(Global.Settings.Times.ElevenHours, Global.Settings.Times.TwelveHours).ToFlag());
                    durationComponent.AddUtilityTerm(38, duration.IsRightExclusiveBetween(Global.Settings.Times.TwelveHours, Global.Settings.Times.FourteenHours).ToFlag());
                    durationComponent.AddUtilityTerm(39, duration.IsRightExclusiveBetween(Global.Settings.Times.FourteenHours, Global.Settings.Times.EighteenHours).ToFlag());
                    durationComponent.AddUtilityTerm(40, (duration >= Global.Settings.Times.EighteenHours).ToFlag());
                }
                else
                {
                    durationComponent.AddUtilityTerm(31, duration.IsRightExclusiveBetween(Global.Settings.Times.ZeroHours, Global.Settings.Times.OneHour).ToFlag());
                    durationComponent.AddUtilityTerm(32, duration.IsRightExclusiveBetween(Global.Settings.Times.OneHour, Global.Settings.Times.TwoHours).ToFlag());
                    durationComponent.AddUtilityTerm(33, duration.IsRightExclusiveBetween(Global.Settings.Times.TwoHours, Global.Settings.Times.ThreeHours).ToFlag());
                    durationComponent.AddUtilityTerm(34, duration.IsRightExclusiveBetween(Global.Settings.Times.ThreeHours, Global.Settings.Times.FiveHours).ToFlag());
                    durationComponent.AddUtilityTerm(35, duration.IsRightExclusiveBetween(Global.Settings.Times.FiveHours, Global.Settings.Times.SevenHours).ToFlag());
                    durationComponent.AddUtilityTerm(36, duration.IsRightExclusiveBetween(Global.Settings.Times.SevenHours, Global.Settings.Times.NineHours).ToFlag());
                    durationComponent.AddUtilityTerm(37, duration.IsRightExclusiveBetween(Global.Settings.Times.NineHours, Global.Settings.Times.TwelveHours).ToFlag());
                    durationComponent.AddUtilityTerm(38, duration.IsRightExclusiveBetween(Global.Settings.Times.TwelveHours, Global.Settings.Times.FourteenHours).ToFlag());
                    durationComponent.AddUtilityTerm(39, duration.IsRightExclusiveBetween(Global.Settings.Times.FourteenHours, Global.Settings.Times.EighteenHours).ToFlag());
                    durationComponent.AddUtilityTerm(40, (duration >= Global.Settings.Times.EighteenHours).ToFlag());
                }

                durationComponent.AddUtilityTerm(42, partTimeWorkerFlag * periodSpan);
                durationComponent.AddUtilityTerm(44, nonworkingAdultFlag * periodSpan);
                durationComponent.AddUtilityTerm(46, universityStudentFlag * periodSpan);
                durationComponent.AddUtilityTerm(48, retiredAdultFlag * periodSpan);
                durationComponent.AddUtilityTerm(50, drivingAgeStudentFlag * periodSpan);
                durationComponent.AddUtilityTerm(140, fulltimeWorkerFlag * periodSpan);
                durationComponent.AddUtilityTerm(142, childAge5Through15Flag * periodSpan);
                durationComponent.AddUtilityTerm(144, childUnder5Flag * periodSpan);
                durationComponent.AddUtilityTerm(146, escortTourFlag * periodSpan);
                durationComponent.AddUtilityTerm(148, shoppingTourFlag * periodSpan);
                durationComponent.AddUtilityTerm(150, mealTourFlag * periodSpan);
                durationComponent.AddUtilityTerm(152, socialTourFlag * periodSpan);
                durationComponent.AddUtilityTerm(154, personalBusinessTourFlag * periodSpan);
                durationComponent.AddUtilityTerm(52, income0To25KFlag * periodSpan);
                durationComponent.AddUtilityTerm(54, income100KPlusFlag * periodSpan);
                durationComponent.AddUtilityTerm(56, highPrioritySameFlag * periodSpan);
                durationComponent.AddUtilityTerm(58, lowPrioritySameFlag * periodSpan);
                durationComponent.AddUtilityTerm(156, highPriorityDifferentFlag * periodSpan);
                durationComponent.AddUtilityTerm(158, lowPriorityDifferentFlag * periodSpan);
                durationComponent.AddUtilityTerm(60, homeBasedToursOnlyFlag * periodSpan);
                durationComponent.AddUtilityTerm(62, totalStops * homeBasedToursOnlyFlag * periodSpan);
                durationComponent.AddUtilityTerm(64, totalStops * (1 - homeBasedToursOnlyFlag) * periodSpan);
                durationComponent.AddUtilityTerm(66, (totalStops - totalSimulatedStops) * (1 - homeBasedToursOnlyFlag) * periodSpan);
                durationComponent.AddUtilityTerm(68, escortStops * periodSpan);
                durationComponent.AddUtilityTerm(70, tour.TotalSubtours * periodSpan);
                durationComponent.AddUtilityTerm(71, fulltimeWorkerFlag * durationUnder9HoursFlag);
                durationComponent.AddUtilityTerm(169, escortTourFlag * durationUnder1HourFlag);
                durationComponent.AddUtilityTerm(170, shoppingTourFlag * durationUnder1HourFlag);
                durationComponent.AddUtilityTerm(171, mealTourFlag * durationUnder1HourFlag);
                durationComponent.AddUtilityTerm(172, escortTourFlag * duration1To2HoursFlag);
                durationComponent.AddUtilityTerm(173, shoppingTourFlag * duration1To2HoursFlag);
                durationComponent.AddUtilityTerm(174, mealTourFlag * duration1To2HoursFlag);
                durationComponent.AddUtilityTerm(81, highPrioritySameFlag * durationUnder8HoursFlag);
                durationComponent.AddUtilityTerm(82, lowPrioritySameFlag * durationUnder8HoursFlag);
                durationComponent.AddUtilityTerm(83, highPriorityDifferentFlag * durationUnder8HoursFlag);
                durationComponent.AddUtilityTerm(84, lowPriorityDifferentFlag * durationUnder4HoursFlag);
            }

            foreach (var time in TourTime.Times)
            {
                var available =
                    ((time.ArrivalPeriod.Index < time.DeparturePeriod.Index &&
                      timeWindow.EntireSpanIsAvailable(time.ArrivalPeriod.End, time.DeparturePeriod.Start)) ||
                     (time.ArrivalPeriod.Index == time.DeparturePeriod.Index &&
                      timeWindow.TotalAvailableMinutes(time.ArrivalPeriod.Start, time.ArrivalPeriod.End) > 1)) &&
                    (knownArrivalTime == 0 || (time.ArrivalPeriod.Start <= knownArrivalTime && time.ArrivalPeriod.End >= knownArrivalTime)) &&
                    (knownDepartureTime == 0 || (time.DeparturePeriod.Start <= knownDepartureTime && time.DeparturePeriod.End >= knownDepartureTime));

                var alternative = choiceProbabilityCalculator.GetAlternative(time.Index, available, choice != null && choice.Equals(time));

                if (!alternative.Available)
                {
                    continue;
                }

                var arrivalPeriodIndex   = time.ArrivalPeriod.Index;
                var arrivalImpedance     = impedances[arrivalPeriodIndex];
                var departurePeriodIndex = time.DeparturePeriod.Index;
                var departureImpedance   = impedances[departurePeriodIndex];

                alternative.Choice = time;

                // arrival period utility component
                alternative.AddUtilityComponent(choiceProbabilityCalculator.GetUtilityComponent(3 * time.ArrivalPeriod.Index + 0));

                // departure period utility component
                alternative.AddUtilityComponent(choiceProbabilityCalculator.GetUtilityComponent(3 * time.DeparturePeriod.Index + 1));

                // duration utility components
                alternative.AddUtilityComponent(choiceProbabilityCalculator.GetUtilityComponent(3 * (time.DeparturePeriod.Index - time.ArrivalPeriod.Index) + 2));

                alternative.AddUtilityTerm(97, Math.Min(0.3, (homeBasedTours - simulatedHomeBasedTours) / (1.0 + arrivalImpedance.TotalMinutesBefore + departureImpedance.TotalMinutesAfter)));
                alternative.AddUtilityTerm(98, Math.Min(0.3, (homeBasedTours - simulatedHomeBasedTours) / (1.0 + Math.Max(arrivalImpedance.MaxMinutesBefore, departureImpedance.MaxMinutesAfter))));
            }
        }
 public int Run(TourWrapper tour, int nCallsForTour, HouseholdDayWrapper householdDay)
 {
     return(Run(tour, nCallsForTour, householdDay, Global.Settings.Purposes.NoneOrHome));
 }
示例#23
0
文件: TripTest.cs 项目: sfcta/DaySim
        public void TestTripWrapper()
        {
            Global.Configuration = new Configuration();
            Global.Configuration.HouseholdSamplingRateOneInX = 256;

            int    id                     = 1;
            int    tourId                 = 2;
            int    householdId            = 3;
            int    personSequence         = 4;
            int    day                    = 5;
            int    tourSequence           = 6;
            int    halfTourId             = 7;
            int    sequence               = 8;
            int    surveyTripSequence     = 9;
            int    originPurpose          = 10;
            int    destinationPurpose     = 11;
            int    originAddressType      = 12;
            int    destinationAddressType = 13;
            int    originParcelId         = 14;
            int    originZoneKey          = 15;
            int    destinationParcelId    = 16;
            int    destinationZoneKey     = 17;
            int    mode                   = 18;
            int    pathType               = 19;
            int    driverType             = 20;
            int    departureTime          = 21;
            int    arrivalTime            = 22;
            int    activityEndTime        = 23;
            double travelTime             = 24.01;
            double travelCost             = 25.01;
            double travelDistance         = 26.01;
            double valueOfTime            = 27.01;
            double expansionFactor        = 28.01;

            Trip trip = new Trip
            {
                ActivityEndTime        = activityEndTime,
                ArrivalTime            = arrivalTime,
                Day                    = day,
                DepartureTime          = departureTime,
                DestinationAddressType = destinationAddressType,
                DestinationParcelId    = destinationParcelId,
                DestinationPurpose     = destinationPurpose,
                DestinationZoneKey     = destinationZoneKey,
                DriverType             = driverType,
                ExpansionFactor        = expansionFactor,
                HalfTour               = halfTourId,
                HouseholdId            = householdId,
                Id   = id,
                Mode = mode,
                OriginAddressType  = originAddressType,
                OriginParcelId     = originParcelId,
                OriginPurpose      = originPurpose,
                OriginZoneKey      = originZoneKey,
                PathType           = pathType,
                PersonSequence     = personSequence,
                Sequence           = sequence,
                SurveyTripSequence = surveyTripSequence,
                TourId             = tourId,
                TourSequence       = tourSequence,
                TravelCost         = travelCost,
                TravelDistance     = travelDistance,
                TravelTime         = travelTime,
                ValueOfTime        = valueOfTime,
            };

            TourWrapper tour = TestHelper.GetTourWrapper();

            TourWrapper.HalfTour halfTour = new TourWrapper.HalfTour(tour);
            TripWrapper          wrapper  = new TripWrapper(trip, tour, halfTour);

            Assert.Equal(id, wrapper.Id);
            Assert.Equal(tour, wrapper.Tour);
            Assert.Equal(tour.Household, wrapper.Household);
            Assert.Equal(tour.Person, wrapper.Person);
            Assert.Equal(day, wrapper.Day);
            Assert.Equal(halfTour, wrapper.HalfTour);
            Assert.Equal(sequence, wrapper.Sequence);
            Assert.Equal(originPurpose, wrapper.OriginPurpose);
            Assert.Equal(destinationPurpose, wrapper.DestinationPurpose);
            Assert.Equal(destinationAddressType, wrapper.DestinationAddressType);
            Assert.Equal(originParcelId, wrapper.OriginParcelId);
            Assert.Equal(originZoneKey, wrapper.OriginZoneKey);
            Assert.Equal(destinationParcelId, wrapper.DestinationParcelId);
            Assert.Equal(destinationZoneKey, wrapper.DestinationZoneKey);
            Assert.Equal(mode, wrapper.Mode);
            Assert.Equal(pathType, wrapper.PathType);
            Assert.Equal(driverType, wrapper.DriverType);
            Assert.Equal(departureTime.ToMinutesAfter3AM(), wrapper.DepartureTime);
            Assert.Equal(arrivalTime.ToMinutesAfter3AM(), wrapper.ArrivalTime);
            Assert.Equal(activityEndTime.ToMinutesAfter3AM(), wrapper.ActivityEndTime);
            Assert.Equal(valueOfTime, wrapper.ValueOfTime);

            int newDepartureTime = 100;

            wrapper.DepartureTime = newDepartureTime;
            Assert.Equal(newDepartureTime.ToMinutesAfterMidnight().ToMinutesAfter3AM(), wrapper.DepartureTime);

            Assert.Equal(0, wrapper.ArrivalTimeLimit);

            wrapper.ArrivalTimeLimit = 2;
            Assert.Equal(2, wrapper.ArrivalTimeLimit);

            Assert.Equal(0, wrapper.EarliestDepartureTime);
            wrapper.EarliestDepartureTime = 2;
            Assert.Equal(2, wrapper.EarliestDepartureTime);

            Assert.Equal(0, wrapper.LatestDepartureTime);
            wrapper.LatestDepartureTime = 2;
            Assert.Equal(2, wrapper.LatestDepartureTime);


            Assert.Equal(null, wrapper.DestinationParcel);
            CondensedParcel destinationParcel = new CondensedParcel();

            wrapper.DestinationParcel = destinationParcel;
            Assert.Equal(destinationParcel, wrapper.DestinationParcel);


            Assert.Equal(false, wrapper.IsMissingData);
            wrapper.IsMissingData = true;
            Assert.Equal(true, wrapper.IsMissingData);

            /*TripModeImpedance[] impedances = wrapper.GetTripModeImpedances();
             * wrapper.HUpdateTripValues();
             * wrapper.SetActivityEndTime();
             * wrapper.SetDriverOrPassenger();
             * wrapper.SetOriginAddressType();
             * wrapper.SetTourSequence();
             * wrapper.SetTripValueOfTime();
             * wrapper.Invert();
             */
        }
示例#24
0
        public void Run(TourWrapper tour)
        {
            if (tour == null)
            {
                throw new ArgumentNullException("tour");
            }

            tour.PersonDay.ResetRandom(40 + tour.Sequence - 1);

            if (Global.Configuration.IsInEstimationMode)
            {
                if (Global.Configuration.EstimationModel != CHOICE_MODEL_NAME)
                {
                    return;
                }
            }

            var choiceProbabilityCalculator = _helpers[ParallelUtility.threadLocalAssignedIndex.Value].GetChoiceProbabilityCalculator(tour.Id);

            if (_helpers[ParallelUtility.threadLocalAssignedIndex.Value].ModelIsInEstimationMode)
            {
                if (tour.DestinationParcel == null || (tour.Mode > Global.Settings.Modes.Hov3 || tour.Mode < Global.Settings.Modes.Walk))
                {
                    return;
                }

                var pathTypeModels =
                    PathTypeModel.Run(
                        tour.Household.RandomUtility,
                        tour.OriginParcel,
                        tour.DestinationParcel,
                        tour.DestinationArrivalTime,
                        tour.DestinationDepartureTime,
                        tour.DestinationPurpose,
                        tour.CostCoefficient,
                        tour.TimeCoefficient,
                        tour.Person.IsDrivingAge,
                        tour.Household.VehiclesAvailable,
                        tour.Person.GetTransitFareDiscountFraction(),
                        false,
                        Global.Settings.Modes.Walk, Global.Settings.Modes.Bike, Global.Settings.Modes.Sov, Global.Settings.Modes.Hov2, Global.Settings.Modes.Hov3);

                var pathTypeModel = pathTypeModels.First(x => x.Mode == tour.Mode);

                if (!pathTypeModel.Available)
                {
                    return;
                }

                RunModel(choiceProbabilityCalculator, tour, pathTypeModels, tour.DestinationParcel, tour.Mode);

                choiceProbabilityCalculator.WriteObservation();
            }
            else
            {
                var pathTypeModels =
                    PathTypeModel.Run(
                        tour.Household.RandomUtility,
                        tour.OriginParcel,
                        tour.DestinationParcel,
                        tour.DestinationArrivalTime,
                        tour.DestinationDepartureTime,
                        tour.DestinationPurpose,
                        tour.CostCoefficient,
                        tour.TimeCoefficient,
                        tour.Person.IsDrivingAge,
                        tour.Household.VehiclesAvailable,
                        tour.Person.GetTransitFareDiscountFraction(),
                        false,
                        Global.Settings.Modes.Walk, Global.Settings.Modes.Bike, Global.Settings.Modes.Sov, Global.Settings.Modes.Hov2, Global.Settings.Modes.Hov3);

                RunModel(choiceProbabilityCalculator, tour, pathTypeModels, tour.DestinationParcel);

                var chosenAlternative = choiceProbabilityCalculator.SimulateChoice(tour.Household.RandomUtility);

                if (chosenAlternative == null)
                {
                    Global.PrintFile.WriteNoAlternativesAvailableWarning(CHOICE_MODEL_NAME, "Run", tour.PersonDay.Id);
                    tour.Mode = Global.Settings.Modes.Hov3;
                    if (!Global.Configuration.IsInEstimationMode)
                    {
                        tour.PersonDay.IsValid = false;
                    }
                    return;
                }

                var choice = (int)chosenAlternative.Choice;

                tour.Mode = choice;
                var chosenPathType = pathTypeModels.First(x => x.Mode == choice);
                tour.PathType          = chosenPathType.PathType;
                tour.ParkAndRideNodeId = choice == Global.Settings.Modes.ParkAndRide ? chosenPathType.PathParkAndRideNodeId : 0;
            }
        }
示例#25
0
文件: TripTest.cs 项目: sfcta/DaySim
        public void TestTripWrapperIsOther()
        {
            Global.Configuration = new Configuration {
                HouseholdSamplingRateOneInX = 256
            };
            Trip trip = new Trip {
                Mode = Constants.Mode.BIKE
            };
            TourWrapper tour = TestHelper.GetTourWrapper();

            TourWrapper.HalfTour halfTour = new TourWrapper.HalfTour(tour);
            TripWrapper          wrapper  = new TripWrapper(trip, tour, halfTour);

            Assert.Equal(false, wrapper.IsTransitMode);
            Assert.Equal(false, wrapper.UsesSovOrHovModes);

            trip = new Trip {
                Mode = Constants.Mode.HOV2
            };
            wrapper = new TripWrapper(trip, tour, halfTour);
            Assert.Equal(false, wrapper.IsTransitMode);
            Assert.Equal(true, wrapper.UsesSovOrHovModes);

            trip = new Trip {
                Mode = Constants.Mode.HOV3
            };
            wrapper = new TripWrapper(trip, tour, halfTour);
            Assert.Equal(false, wrapper.IsTransitMode);
            Assert.Equal(true, wrapper.UsesSovOrHovModes);

            trip = new Trip {
                Mode = Constants.Mode.HOVDRIVER
            };
            wrapper = new TripWrapper(trip, tour, halfTour);
            Assert.Equal(false, wrapper.IsTransitMode);
            Assert.Equal(true, wrapper.UsesSovOrHovModes);

            trip = new Trip {
                Mode = Constants.Mode.HOVPASSENGER
            };
            wrapper = new TripWrapper(trip, tour, halfTour);
            Assert.Equal(false, wrapper.IsTransitMode);
            Assert.Equal(true, wrapper.UsesSovOrHovModes);

            trip = new Trip {
                Mode = Constants.Mode.NONE
            };
            wrapper = new TripWrapper(trip, tour, halfTour);
            Assert.Equal(false, wrapper.IsTransitMode);
            Assert.Equal(false, wrapper.UsesSovOrHovModes);

            trip = new Trip {
                Mode = Constants.Mode.OTHER
            };
            wrapper = new TripWrapper(trip, tour, halfTour);
            Assert.Equal(false, wrapper.IsTransitMode);
            Assert.Equal(false, wrapper.UsesSovOrHovModes);

            trip = new Trip {
                Mode = Constants.Mode.PARK_AND_RIDE
            };
            wrapper = new TripWrapper(trip, tour, halfTour);
            Assert.Equal(false, wrapper.IsTransitMode);
            Assert.Equal(false, wrapper.UsesSovOrHovModes);

            trip = new Trip {
                Mode = Constants.Mode.SCHOOL_BUS
            };
            wrapper = new TripWrapper(trip, tour, halfTour);
            Assert.Equal(false, wrapper.IsTransitMode);
            Assert.Equal(false, wrapper.UsesSovOrHovModes);

            trip = new Trip {
                Mode = Constants.Mode.SOV
            };
            wrapper = new TripWrapper(trip, tour, halfTour);
            Assert.Equal(false, wrapper.IsTransitMode);
            Assert.Equal(true, wrapper.UsesSovOrHovModes);

            trip = new Trip {
                Mode = Constants.Mode.TRANSIT
            };
            wrapper = new TripWrapper(trip, tour, halfTour);
            Assert.Equal(true, wrapper.IsTransitMode);
            Assert.Equal(false, wrapper.UsesSovOrHovModes);

            trip = new Trip {
                Mode = Constants.Mode.WALK
            };
            wrapper = new TripWrapper(trip, tour, halfTour);
            Assert.Equal(false, wrapper.IsTransitMode);
            Assert.Equal(false, wrapper.UsesSovOrHovModes);
        }
示例#26
0
        private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, TourWrapper tour, HouseholdDayWrapper householdDay, int nCallsForTour, int choice = Constants.DEFAULT_VALUE)
        {
            PersonWrapper    person    = (PersonWrapper)tour.Person;
            PersonDayWrapper personDay = (PersonDayWrapper)tour.PersonDay;

            //			var foodRetailServiceMedicalQtrMileLog = tour.DestinationParcel.FoodRetailServiceMedicalQtrMileLogBuffer1();
            //			var mixedUseIndex = tour.DestinationParcel.MixedUse4Index1();
            double k8HighSchoolQtrMileLog = tour.DestinationParcel.K8HighSchoolQtrMileLogBuffer1();
            //var carOwnership = person.CarOwnershipSegment;
            int carOwnership = 0;

            int noCarsFlag         = FlagUtility.GetNoCarsFlag(carOwnership);
            int carCompetitionFlag = FlagUtility.GetCarCompetitionFlag(carOwnership);
            //			var notUsualWorkParcelFlag = tour.DestinationParcel.NotUsualWorkParcelFlag(person.UsualWorkParcelId);

            int votALSegment = tour.GetVotALSegment();

            int    workTaSegment       = tour.DestinationParcel.TransitAccessSegment();
            double workAggregateLogsum = Global.AggregateLogsums[tour.DestinationParcel.ZoneId][Global.Settings.Purposes.WorkBased][carOwnership][votALSegment][workTaSegment];

            //var compositeLogsum = Global.AggregateLogsums[household.ResidenceZoneId][Global.Settings.Purposes.HomeBasedComposite][carOwnership][votALSegment][transitAccessSegment];
            //var compositeLogsum = Global.AggregateLogsums[household.ResidenceZoneId][Global.Settings.Purposes.HomeBasedComposite][Global.Settings.CarOwnerships.NoCars][votALSegment][transitAccessSegment];


            // NONE_OR_HOME

            ChoiceProbabilityCalculator.Alternative alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.NoneOrHome, true, choice == Global.Settings.Purposes.NoneOrHome);

            alternative.Choice = Global.Settings.Purposes.NoneOrHome;

            alternative.AddUtilityTerm(1, (nCallsForTour > 1).ToFlag());

            //alternative.AddUtilityTerm(2, Math.Log(personDay.HomeBasedTours));

            //alternative.AddUtilityTerm(3, personDay.HasTwoOrMoreWorkTours.ToFlag());
            //alternative.AddUtility(4, notUsualWorkParcelFlag);

            //alternative.AddUtilityTerm(5, noCarsFlag);
            //alternative.AddUtilityTerm(6, carCompetitionFlag);

            //alternative.AddUtilityTerm(7, householdDay.PrimaryPriorityTimeFlag);

            //alternative.AddUtilityTerm(9, householdDay.Household.HasChildrenUnder5.ToFlag());
            //alternative.AddUtilityTerm(10, householdDay.Household.HasChildrenAge5Through15.ToFlag());

            //alternative.AddUtilityTerm(11, (householdDay.Household.Size == 2).ToFlag());
            //alternative.AddUtilityTerm(12, (householdDay.Household.Size == 2 && householdDay.AdultsInSharedHomeStay == 2).ToFlag());

            //alternative.AddUtilityTerm(14, personDay.Person.WorksAtHome().ToFlag());
            //alternative.AddUtilityTerm(15, personDay.Person.IsNonworkingAdult.ToFlag());

            //alternative.AddUtilityTerm(15, (person.IsNonworkingAdult).ToFlag()); //out of scope, non available

            //alternative.AddUtilityTerm(32, workAggregateLogsum);
            //alternative.AddUtility(32, mixedUseIndex);

            // WORK-BASED

            alternative = choiceProbabilityCalculator.GetAlternative(1, true, choice == Global.Settings.Purposes.PersonalBusiness);

            alternative.Choice = Global.Settings.Purposes.PersonalBusiness;

            alternative.AddUtilityTerm(21, 1);

            //alternative.AddUtilityTerm(30, (person.IsWorker).ToFlag());

            //alternative.AddUtilityTerm(22, (person.FlexibleWorkHours == 1).ToFlag());
            //alternative.AddUtilityTerm(23, (person.EducationLevel >= 12).ToFlag());

            //alternative.AddUtilityTerm(24, personDay.Person.IsPartTimeWorker.ToFlag());

            //GV, 16. june 2016 - cannot be estimated
            //alternative.AddUtilityTerm(24, (person.WorksAtHome).ToFlag());
            ////alternative.AddUtilityTerm(25, personDay.Person.IsFulltimeWorker.ToFlag());
            //alternative.AddUtilityTerm(26, (person.MainOccupation == 50).ToFlag()); // self employed

            alternative.AddUtilityTerm(27, (personDay.Person.Gender == 1).ToFlag());
            //alternative.AddUtilityTerm(44, (hasAdultEducLevel12 == 1).ToFlag());

            //GV. 16. june 2016 - not signif.
            //alternative.AddUtilityTerm(28, (householdDay.Household.VehiclesAvailable == 1 && householdDay.Household.Has2Drivers).ToFlag());
            //alternative.AddUtilityTerm(29, (householdDay.Household.VehiclesAvailable >= 2 && householdDay.Household.Has2Drivers).ToFlag());

            alternative.AddUtilityTerm(30, householdDay.PrimaryPriorityTimeFlag);

            //GV. 16. june 2016 - not signif.
            //alternative.AddUtilityTerm(31, (householdDay.Household.Income >= 300000 && householdDay.Household.Income < 600000).ToFlag());
            //alternative.AddUtilityTerm(32, (householdDay.Household.Income >= 600000 && householdDay.Household.Income < 900000).ToFlag());
            //alternative.AddUtilityTerm(33, (householdDay.Household.Income >= 900000).ToFlag());

            alternative.AddUtilityTerm(41, workAggregateLogsum);

            //alternative.AddUtilityTerm(36, (householdDay.Household.Size == 2).ToFlag());
            //alternative.AddUtilityTerm(37, (householdDay.Household.Size == 3).ToFlag());
            //alternative.AddUtilityTerm(38, (householdDay.Household.Size >= 4).ToFlag());
        }
        private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, TripWrapper trip, HouseholdDayWrapper householdDay, int choice = Constants.DEFAULT_VALUE)
        {
            HouseholdWrapper household = (HouseholdWrapper)trip.Household;
            PersonWrapper    person    = (PersonWrapper)trip.Person;
            PersonDayWrapper personDay = (PersonDayWrapper)trip.PersonDay;
            TourWrapper      tour      = (TourWrapper)trip.Tour;

            TourWrapper.HalfTour halfTour = (TourWrapper.HalfTour)trip.HalfTour;
            List <Framework.DomainModels.Wrappers.IPersonDayWrapper> personDays = householdDay.PersonDays;

            int isJointTour      = tour.JointTourSequence > 0 ? 1 : 0;
            int isIndividualTour = isJointTour == 1 ? 0 : 1;

            Framework.DomainModels.Wrappers.IParcelWrapper destinationParcel = tour.DestinationParcel;
            int jointHalfOfFullJointHalfTour = ((trip.Direction == Global.Settings.TourDirections.OriginToDestination && tour.FullHalfTour1Sequence > 0) ||
                                                (trip.Direction == Global.Settings.TourDirections.DestinationToOrigin && tour.FullHalfTour2Sequence > 0)).ToFlag();
            int individualHalfOfFullJointHalfTour =
                ((trip.Direction == Global.Settings.TourDirections.OriginToDestination &&
                  tour.FullHalfTour1Sequence == 0 &&
                  tour.FullHalfTour2Sequence > 0) ||
                 (trip.Direction == Global.Settings.TourDirections.DestinationToOrigin &&
                  tour.FullHalfTour2Sequence == 0 &&
                  tour.FullHalfTour1Sequence > 0)).ToFlag();
            int individualHalfTour = (isIndividualTour == 1 || individualHalfOfFullJointHalfTour == 1) ? 1 : 0;
            int jointHalfTour      = 1 - individualHalfTour;

            //destination parcel variables
            double foodBuffer2   = 0.0;
            double totEmpBuffer2 = 0.0;
            double retailBuffer2 = 0.0;

            if (destinationParcel != null)
            {
                foodBuffer2   = Math.Log(1 + destinationParcel.EmploymentFoodBuffer2);
                totEmpBuffer2 = Math.Log(1 + destinationParcel.EmploymentTotalBuffer2);
                retailBuffer2 = Math.Log(1 + destinationParcel.EmploymentRetailBuffer2);
            }

            int carOwnership = person.GetCarOwnershipSegment();

            // household inputs
            int onePersonHouseholdFlag = household.IsOnePersonHousehold.ToFlag();
            //var householdInc75KP = household.Has75KPlusIncome;

            int votALSegment         = tour.GetVotALSegment();
            int transitAccessSegment = household.ResidenceParcel.TransitAccessSegment();

            double totalAggregateLogsum = Global.AggregateLogsums[household.ResidenceParcel.ZoneId]
                                          [Global.Settings.Purposes.HomeBasedComposite][carOwnership][votALSegment][transitAccessSegment];

            double homeFoodBuffer2   = Math.Log(1 + household.ResidenceParcel.EmploymentFoodBuffer2);
            double homeTotEmpBuffer2 = Math.Log(1 + household.ResidenceParcel.EmploymentTotalBuffer2);
            double homeRetailBuffer2 = Math.Log(1 + household.ResidenceParcel.EmploymentRetailBuffer2);

            // person-day inputs
            int homeBasedTours                 = personDay.HomeBasedTours;
            int simulatedToursFlag             = personDay.SimulatedToursExist().ToFlag();
            int simulatedBusinessStops         = personDay.SimulatedBusinessStops;
            int simulatedBusinessStopsFlag     = simulatedBusinessStops > 0 ? 1 : 0;
            int simulatedSchoolStops           = personDay.SimulatedSchoolStops;
            int simulatedEscortStops           = personDay.SimulatedEscortStops;
            int simulatedPersonalBusinessStops = personDay.SimulatedPersonalBusinessStops;
            int simulatedShoppingStops         = personDay.SimulatedShoppingStops;
            int simulatedMealStops             = personDay.SimulatedMealStops;
            int simulatedSocialStops           = personDay.SimulatedSocialStops;
            int simulatedRecreationStops       = personDay.SimulatedRecreationStops;
            int simulatedMedicalStops          = personDay.SimulatedMedicalStops;
            int primaryFamilyTimeFlag          = householdDay.PrimaryPriorityTimeFlag;

            // tour inputs
            int hovDriverTourFlag          = tour.IsHovDriverMode().ToFlag();
            int hovPassengerTourFlag       = tour.IsHovPassengerMode().ToFlag();
            int transitTourFlag            = tour.IsTransitMode().ToFlag();
            int walkTourFlag               = tour.IsWalkMode().ToFlag();
            int bikeTourFlag               = tour.IsBikeMode().ToFlag();
            int autoTourFlag               = tour.IsAnAutoMode().ToFlag();
            int notHomeBasedTourFlag       = (!tour.IsHomeBasedTour).ToFlag();
            int workTourFlag               = tour.IsWorkPurpose().ToFlag();
            int businessTourFlag           = tour.IsBusinessPurpose().ToFlag();
            int personalBusinessTourFlag   = tour.IsPersonalBusinessPurpose().ToFlag();
            int socialTourFlag             = tour.IsSocialPurpose().ToFlag();
            int socialOrRecreationTourFlag = tour.IsSocialOrRecreationPurpose().ToFlag();
            int schoolTourFlag             = tour.IsSchoolPurpose().ToFlag();
            int escortTourFlag             = tour.IsEscortPurpose().ToFlag();
            int shoppingTourFlag           = tour.IsShoppingPurpose().ToFlag();

            // trip inputs
            int oneSimulatedTripFlag           = halfTour.OneSimulatedTripFlag;
            int twoSimulatedTripsFlag          = halfTour.TwoSimulatedTripsFlag;
            int threeSimulatedTripsFlag        = halfTour.ThreeSimulatedTripsFlag;
            int fourSimulatedTripsFlag         = halfTour.FourSimulatedTripsFlag;
            int fivePlusSimulatedTripsFlag     = halfTour.FivePlusSimulatedTripsFlag;
            int twoPlusSimulatedTripsFlag      = twoSimulatedTripsFlag + threeSimulatedTripsFlag + fourSimulatedTripsFlag + fivePlusSimulatedTripsFlag;
            int halfTourFromOriginFlag         = trip.IsHalfTourFromOrigin.ToFlag();
            int halfTourFromDestinationFlag    = (!trip.IsHalfTourFromOrigin).ToFlag();
            int beforeMandatoryDestinationFlag = trip.IsBeforeMandatoryDestination().ToFlag();

            // remaining inputs, including joint tour variables

            int remainingToursCount = personDay.HomeBasedTours - personDay.GetTotalSimulatedTours();

            int destinationDepartureTime =
                trip.IsHalfTourFromOrigin // first trip in half tour, use tour destination time
                ? trip.Sequence == 1
                      ? tour.DestinationArrivalTime
                      : trip.GetPreviousTrip().ArrivalTime
                : trip.Sequence == 1
                      ? tour.DestinationDepartureTime
                      : trip.GetPreviousTrip().ArrivalTime;

            //var time = trip.IsHalfTourFromOrigin ? tour.DestinationArrivalTime : tour.DestinationDepartureTime;
            int time = destinationDepartureTime;

            bool timeIsAvailableForAnotherTrip = true;

            if ((trip.IsHalfTourFromOrigin && time < Global.Settings.Times.FourAM) ||
                (!trip.IsHalfTourFromOrigin && time > Global.Settings.Times.TwoAM))
            {
                timeIsAvailableForAnotherTrip = false;
            }

            bool stopsNeeded = false;

            //if ((halfTour.SimulatedTrips <= 5)
            //	&& (timeIsAvailableForAnotherTrip)
            //	&& (trip.Direction == 2)
            //	&&((trip.Tour.Sequence == trip.PersonDay.TotalCreatedTours)
            //	&& ((simulatedSchoolStops == 0 && personDay.SchoolStops > 0)
            //	||(simulatedBusinessStops == 0 && personDay.BusinessStops > 0)
            //	||(simulatedEscortStops == 0 && personDay.EscortStops > 0)
            //	||(simulatedPersonalBusinessStops == 0 && personDay.PersonalBusinessStops > 0)
            //	||(simulatedShoppingStops == 0 && personDay.ShoppingStops > 0)
            //	||(simulatedSocialStops == 0 && personDay.SocialStops > 0)))) {
            //		stopsNeeded = true;
            //}


            int from7AMto9AMFlag  = (time >= Global.Settings.Times.SevenAM && time < Global.Settings.Times.NineAM).ToFlag();
            int from9AMto3PMFlag  = (time >= Global.Settings.Times.NineAM && time < Global.Settings.Times.ThreePM).ToFlag();
            int from3PMto6PMFlag  = (time >= Global.Settings.Times.ThreePM && time < Global.Settings.Times.SixPM).ToFlag();
            int from6PMto10PMFlag = (time >= Global.Settings.Times.SixPM && time < Global.Settings.Times.TenPM).ToFlag();
            int from10PMto7AMFlag = (time >= Global.Settings.Times.TenPM).ToFlag();


            int from9AMto11AMFlag = (time >= Global.Settings.Times.NineAM && time < Global.Settings.Times.ElevenAM).ToFlag();
            int from11AMto1PMFlag = (time >= Global.Settings.Times.ElevenAM && time < Global.Settings.Times.OnePM).ToFlag();
            int from1PMto3PMFlag  = (time >= Global.Settings.Times.OnePM && time < Global.Settings.Times.ThreePM).ToFlag();
            int from3PMto5PMFlag  = (time >= Global.Settings.Times.ThreePM && time < Global.Settings.Times.FivePM).ToFlag();
            int from7PMto9PMFlag  = (time >= Global.Settings.Times.SevenPM && time < Global.Settings.Times.NinePM).ToFlag();
            int from9PMto11PMFlag = (time >= Global.Settings.Times.NinePM && time < Global.Settings.Times.ElevenPM).ToFlag();
            int from11PMto7AMFlag = (time >= Global.Settings.Times.ElevenPM).ToFlag();



            IEnumerable <PersonDayWrapper> orderedPersonDays = householdDay.PersonDays.OrderBy(p => p.GetJointTourParticipationPriority()).ToList().Cast <PersonDayWrapper>();
            int numChildrenOnJointTour = 0;
            int numAdultsOnJointTour   = 0;
            int totHHToursJT           = 0;
            //int totHHStopsJT=0;

            TimeWindow timeWindow = new TimeWindow();

            if (tour.JointTourSequence > 0)
            {
                foreach (PersonDayWrapper pDay in householdDay.PersonDays)
                {
                    TourWrapper tInJoint = (TourWrapper)pDay.Tours.Find(t => t.JointTourSequence == tour.JointTourSequence);
                    if (!(tInJoint == null))
                    {
                        // set jointTour time window
                        timeWindow.IncorporateAnotherTimeWindow(tInJoint.PersonDay.TimeWindow);
                        totHHToursJT = personDay.HomeBasedTours + totHHToursJT;

                        if (pDay.Person.Age < 18)
                        {
                            numChildrenOnJointTour++;
                        }

                        if (pDay.Person.Age >= 18)
                        {
                            numAdultsOnJointTour++;
                        }
                    }
                }
            }
            else if (trip.Direction == Global.Settings.TourDirections.OriginToDestination && tour.FullHalfTour1Sequence > 0)
            {
                foreach (PersonDayWrapper pDay in householdDay.PersonDays)
                {
                    TourWrapper tInJoint = (TourWrapper)pDay.Tours.Find(t => t.FullHalfTour1Sequence == tour.FullHalfTour1Sequence);
                    if (!(tInJoint == null))
                    {
                        // set jointTour time window
                        timeWindow.IncorporateAnotherTimeWindow(tInJoint.PersonDay.TimeWindow);

                        timeWindow.IncorporateAnotherTimeWindow(tInJoint.PersonDay.TimeWindow);
                        totHHToursJT = personDay.HomeBasedTours + totHHToursJT;

                        if (pDay.Person.Age < 18)
                        {
                            numChildrenOnJointTour++;
                        }

                        if (pDay.Person.Age >= 18)
                        {
                            numAdultsOnJointTour++;
                        }
                    }
                }
            }
            else if (trip.Direction == Global.Settings.TourDirections.DestinationToOrigin && tour.FullHalfTour2Sequence > 0)
            {
                foreach (PersonDayWrapper pDay in householdDay.PersonDays)
                {
                    TourWrapper tInJoint = (TourWrapper)pDay.Tours.Find(t => t.FullHalfTour2Sequence == tour.FullHalfTour2Sequence);
                    if (!(tInJoint == null))
                    {
                        // set jointTour time window
                        timeWindow.IncorporateAnotherTimeWindow(tInJoint.PersonDay.TimeWindow);
                        timeWindow.IncorporateAnotherTimeWindow(tInJoint.PersonDay.TimeWindow);
                        totHHToursJT = personDay.HomeBasedTours + totHHToursJT;

                        if (pDay.Person.Age < 18)
                        {
                            numChildrenOnJointTour++;
                        }

                        if (pDay.Person.Age >= 18)
                        {
                            numAdultsOnJointTour++;
                        }
                    }
                }
            }
            else if (tour.ParentTour == null)
            {
                timeWindow.IncorporateAnotherTimeWindow(personDay.TimeWindow);
            }
            else
            {
                timeWindow.IncorporateAnotherTimeWindow(tour.ParentTour.TimeWindow);
            }

            timeWindow.SetBusyMinutes(Global.Settings.Times.EndOfRelevantWindow, Global.Settings.Times.MinutesInADay + 1);

            // time window in minutes for yet unmodeled portion of halftour, only consider persons on this trip
            int    availableWindow = timeWindow.AvailableWindow(destinationDepartureTime, Global.Settings.TimeDirections.Both);
            double timePressure    = 1000 * remainingToursCount / (Math.Max(1D, availableWindow));
            //alternative.AddUtilityTerm(98, 1000 * remainingToursCount / (Math.Max(1D, maxWindowRemaining)));


            //var duration = availableWindow / 60D;

            // connectivity attributes
            //var c34Ratio = trip.OriginParcel.C34RatioBuffer1();

            double adis    = 0.0;
            double logDist = 0.0;
            int    minute  = DayPeriod.BigDayPeriods[DayPeriod.MIDDAY].Start;

            //distance from origin to destination
            if (tour.OriginParcel != null && tour.DestinationParcel != null)
            {
                if (trip.Direction == Global.Settings.TourDirections.OriginToDestination)
                {
                    adis = ImpedanceRoster.GetValue("distance", Global.Settings.Modes.Sov, Global.Settings.PathTypes.FullNetwork, Global.Settings.ValueOfTimes.DefaultVot, minute, tour.OriginParcel, destinationParcel).Variable;
                }
                else
                {
                    adis = ImpedanceRoster.GetValue("distance", Global.Settings.Modes.Sov, Global.Settings.PathTypes.FullNetwork, Global.Settings.ValueOfTimes.DefaultVot, minute, destinationParcel, tour.OriginParcel).Variable;
                }
                logDist = Math.Log(1 + adis);
            }

            // 0 - NO MORE STOPS

            ChoiceProbabilityCalculator.Alternative alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.NoneOrHome, !stopsNeeded, choice == Global.Settings.Purposes.NoneOrHome);

            alternative.Choice = Global.Settings.Purposes.NoneOrHome;
            //alternative.AddNestedAlternative(_nestedAlternativeIds[0], _nestedAlternativeIndexes[0], THETA_PARAMETER);

            alternative.AddUtilityTerm(1, oneSimulatedTripFlag);
            alternative.AddUtilityTerm(2, twoSimulatedTripsFlag);
            alternative.AddUtilityTerm(2, threeSimulatedTripsFlag);
            alternative.AddUtilityTerm(2, fourSimulatedTripsFlag);
            alternative.AddUtilityTerm(2, fivePlusSimulatedTripsFlag);

            //GV: 21. june 2016, not sign.
            //alternative.AddUtilityTerm(6, transitTourFlag);

            alternative.AddUtilityTerm(7, bikeTourFlag);
            alternative.AddUtilityTerm(8, walkTourFlag);
            alternative.AddUtilityTerm(9, jointHalfTour);
            alternative.AddUtilityTerm(10, halfTourFromOriginFlag);

            //GV: june 2016 - not sign
            //alternative.AddUtilityTerm(11, totalAggregateLogsum);

            alternative.AddUtilityTerm(12, businessTourFlag);
            alternative.AddUtilityTerm(13, personalBusinessTourFlag);
            alternative.AddUtilityTerm(14, socialTourFlag);
            //alternative.AddUtilityTerm(15, schoolTourFlag);
            alternative.AddUtilityTerm(16, escortTourFlag);
            alternative.AddUtilityTerm(17, shoppingTourFlag);
            alternative.AddUtilityTerm(18, timePressure);

            //GV: 21. june 2016, try to estimate again
            alternative.AddUtilityTerm(19, primaryFamilyTimeFlag);

            alternative.AddUtilityTerm(20, person.IsChildUnder5.ToFlag());

            //alternative.AddUtilityTerm(15, from11PMto7AMFlag);

            //alternative.AddUtilityTerm(1, twoSimulatedTripsFlag * halfTourFromOriginFlag * isIndividualTour);
            //alternative.AddUtilityTerm(2, threeSimulatedTripsFlag * halfTourFromOriginFlag * isIndividualTour);
            //alternative.AddUtilityTerm(3, fourSimulatedTripsFlag * halfTourFromOriginFlag * isIndividualTour);
            //alternative.AddUtilityTerm(4, fivePlusSimulatedTripsFlag * halfTourFromOriginFlag * isIndividualTour);
            //alternative.AddUtilityTerm(5, twoSimulatedTripsFlag * halfTourFromDestinationFlag * isIndividualTour);
            //alternative.AddUtilityTerm(6, threeSimulatedTripsFlag * halfTourFromDestinationFlag * isIndividualTour);
            //alternative.AddUtilityTerm(7, fourSimulatedTripsFlag * halfTourFromDestinationFlag * isIndividualTour);
            //alternative.AddUtilityTerm(8, fivePlusSimulatedTripsFlag * halfTourFromDestinationFlag * isIndividualTour);
            //alternative.AddUtilityTerm(9, homeBasedTours * isIndividualTour);
            //alternative.AddUtilityTerm(10, homeBasedTours * isJointTour);
            //alternative.AddUtilityTerm(11, notHomeBasedTourFlag);
            //alternative.AddUtilityTerm(12, beforeMandatoryDestinationFlag*isJointTour);
            //alternative.AddUtilityTerm(13, beforeMandatoryDestinationFlag);
            //alternative.AddUtilityTerm(14, numAdultsOnJointTour);
            //alternative.AddUtilityTerm(15, numChildrenOnJointTour);
            //alternative.AddUtilityTerm(16, totHHToursJT);
            //	alternative.AddUtilityTerm(17, totHHStopsJT);
            //alternative.AddUtilityTerm(22, (threeSimulatedTripsFlag + fourSimulatedTripsFlag + fivePlusSimulatedTripsFlag) * halfTourFromOriginFlag * isJointTour);
            //alternative.AddUtilityTerm(26, threeSimulatedTripsFlag * halfTourFromDestinationFlag * isJointTour);
            //alternative.AddUtilityTerm(27, fourSimulatedTripsFlag * halfTourFromDestinationFlag * isJointTour);
            //alternative.AddUtilityTerm(28, fivePlusSimulatedTripsFlag * halfTourFromDestinationFlag * isJointTour);

            // 1 - BUSINESS STOP

            //if (personDay.BusinessStops > 0 && (tour.DestinationPurpose <= Global.Settings.Purposes.School || tour.DestinationPurpose == Global.Settings.Purposes.Business)) {
            // JLB 20130704 business stops are allowed on escort tours per data prep
            alternative = choiceProbabilityCalculator.GetAlternative(1,
                                                                     (personDay.BusinessStops > 0 &&
                                                                      (tour.DestinationPurpose <= Global.Settings.Purposes.Escort || tour.DestinationPurpose == Global.Settings.Purposes.Business) &&
                                                                      (halfTour.SimulatedTrips <= 5) &&
                                                                      timeIsAvailableForAnotherTrip),
                                                                     choice == Global.Settings.Purposes.Business);

            alternative.Choice = Global.Settings.Purposes.Business;
            //alternative.AddNestedAlternative(_nestedAlternativeIds[1], _nestedAlternativeIndexes[1], THETA_PARAMETER);

            //alternative.AddUtilityTerm(32, isIndividualTour);
            alternative.AddUtilityTerm(32, 1.0);

            //GV: june 2016 - not sign
            //alternative.AddUtilityTerm(33, businessTourFlag);


            //alternative.AddUtilityTerm(34, schoolTourFlag);
            //alternative.AddUtilityTerm(35, halfTourFromOriginFlag);
            //alternative.AddUtilityTerm(36, simulatedBusinessStops);
            //alternative.AddUtilityTerm(37, simulatedBusinessStopsFlag);
            //alternative.AddUtilityTerm(39, duration);

            //alternative.AddUtilityTerm(40, from9AMto11AMFlag + from11AMto1PMFlag + from1PMto3PMFlag + from3PMto5PMFlag);
            alternative.AddUtilityTerm(40, from9AMto3PMFlag + from3PMto6PMFlag);


            //alternative.AddUtilityTerm(42, logDist);
            //alternative.AddUtilityTerm(43, transitTourFlag);
            //alternative.AddUtilityTerm(44, (person.IsPartTimeWorker).ToFlag());

            //GV: 21. aug - I commented out as it is the only logsum in the model
            //alternative.AddUtilityTerm(46, totalAggregateLogsum);

            //alternative.AddUtilityTerm(47,totEmpBuffer2);
            //alternative.AddUtilityTerm(48, hovDriverTourFlag + hovPassengerTourFlag);


            // 2 - SCHOOL STOP

            alternative = choiceProbabilityCalculator.GetAlternative(2,
                                                                     (((personDay.SchoolStops > 0 && tour.DestinationPurpose <= Global.Settings.Purposes.School) || (isJointTour == 1)) &&
                                                                      halfTour.SimulatedTrips <= 5 &&
                                                                      timeIsAvailableForAnotherTrip),
                                                                     choice == Global.Settings.Purposes.School);

            alternative.Choice = Global.Settings.Purposes.School;
            //alternative.AddNestedAlternative(_nestedAlternativeIds[2], _nestedAlternativeIndexes[2], THETA_PARAMETER);

            //alternative.AddUtilityTerm(51, workTourFlag);
            alternative.AddUtilityTerm(51, 1.0);
            //alternative.AddUtilityTerm(52, schoolTourFlag);
            //alternative.AddUtilityTerm(53, halfTourFromOriginFlag);
            //alternative.AddUtilityTerm(54, simulatedSchoolStops);
            //alternative.AddUtilityTerm(55, remainingToursCount);
            //alternative.AddUtilityTerm(56, duration);

            //alternative.AddUtilityTerm(57, from7AMto9AMFlag + from7PMto9PMFlag + from9PMto11PMFlag + from11PMto7AMFlag);
            alternative.AddUtilityTerm(57, from7AMto9AMFlag + from9AMto3PMFlag + from10PMto7AMFlag);

            //alternative.AddUtilityTerm(58, oneSimulatedTripFlag);
            //alternative.AddUtilityTerm(59, logDist);
            alternative.AddUtilityTerm(61, jointHalfOfFullJointHalfTour * numChildrenOnJointTour);
            //alternative.AddUtilityTerm(65, (person.Age < 12).ToFlag());
            //alternative.AddUtilityTerm(66,  (person.IsUniversityStudent).ToFlag());



            // 3 - ESCORT STOP

            //if ((personDay.EscortStops > 0 && (tour.DestinationPurpose <= Global.Settings.Purposes.Escort || tour.DestinationPurpose == Global.Settings.Purposes.Business)) || (isJointTour==1)) {
            // JLB 20130704 no escort stops allowed on business tours per data prep
            alternative = choiceProbabilityCalculator.GetAlternative(3,
                                                                     (((personDay.EscortStops > 0 && tour.DestinationPurpose <= Global.Settings.Purposes.Escort) || (isJointTour == 1)) &&
                                                                      halfTour.SimulatedTrips <= 5 &&
                                                                      timeIsAvailableForAnotherTrip),
                                                                     choice == Global.Settings.Purposes.Escort);

            alternative.Choice = Global.Settings.Purposes.Escort;
            //alternative.AddNestedAlternative(_nestedAlternativeIds[3], _nestedAlternativeIndexes[3], THETA_PARAMETER);

            alternative.AddUtilityTerm(71, 1.0);
            //alternative.AddUtilityTerm(72, workTourFlag + schoolTourFlag);
            //alternative.AddUtilityTerm(72, isJointTour);
            //alternative.AddUtilityTerm(74, escortTourFlag);
            //alternative.AddUtilityTerm(75, socialOrRecreationTourFlag);
            //alternative.AddUtilityTerm(76, remainingToursCount);
            //alternative.AddUtilityTerm(77, duration);
            alternative.AddUtilityTerm(78, from7AMto9AMFlag);
            //alternative.AddUtilityTerm(79, from9AMto11AMFlag + from11AMto1PMFlag + from1PMto3PMFlag + from3PMto5PMFlag);
            //alternative.AddUtilityTerm(81, hovDriverTourFlag);
            //alternative.AddUtilityTerm(82, hovPassengerTourFlag);
            //alternative.AddUtilityTerm(83, simulatedEscortStops * isJointTour);
            //alternative.AddUtilityTerm(84, simulatedEscortStops * isIndividualTour);
            //alternative.AddUtilityTerm(85, totalAggregateLogsum);
            //alternative.AddUtilityTerm(86, jointHalfOfFullJointHalfTour);
            //alternative.AddUtilityTerm(88, enrollmentK8Buffer2);
            //alternative.AddUtilityTerm(89, numChildrenOnJointTour);
            //alternative.AddUtilityTerm(90, halfTourFromOriginFlag);



            // 4 - PERSONAL BUSINESS STOP


            alternative = choiceProbabilityCalculator.GetAlternative(4,
                                                                     ((personDay.PersonalBusinessStops > 0 || isJointTour == 1) &&
                                                                      halfTour.SimulatedTrips <= 5 &&
                                                                      timeIsAvailableForAnotherTrip),
                                                                     choice == Global.Settings.Purposes.PersonalBusiness);

            alternative.Choice = Global.Settings.Purposes.PersonalBusiness;
            //alternative.AddNestedAlternative(_nestedAlternativeIds[4], _nestedAlternativeIndexes[4], THETA_PARAMETER);

            alternative.AddUtilityTerm(91, 1.0);
            //alternative.AddUtilityTerm(92, (workTourFlag + schoolTourFlag + businessTourFlag));
            //alternative.AddUtilityTerm(92, isJointTour);
            //alternative.AddUtilityTerm(93, escortTourFlag);
            //alternative.AddUtilityTerm(94, personalBusinessOrMedicalTourFlag * isIndividualTour);
            //alternative.AddUtilityTerm(95, shoppingTourFlag);
            //alternative.AddUtilityTerm(96, mealTourFlag);
            //alternative.AddUtilityTerm(97, socialOrRecreationTourFlag);
            //alternative.AddUtilityTerm(98, halfTourFromOriginFlag);
            //alternative.AddUtilityTerm(99, simulatedPersonalBusinessStops * isIndividualTour);
            //alternative.AddUtilityTerm(100, simulatedPersonalBusinessStops * isJointTour);
            //alternative.AddUtilityTerm(101, duration);
            //alternative.AddUtilityTerm(102, (from7AMto9AMFlag + from7PMto9PMFlag + from9PMto11PMFlag + from11PMto7AMFlag));

            //alternative.AddUtilityTerm(103, from9AMto11AMFlag + from11AMto1PMFlag + from1PMto3PMFlag + from3PMto5PMFlag);
            alternative.AddUtilityTerm(103, from9AMto3PMFlag + from3PMto6PMFlag);

            //alternative.AddUtilityTerm(105, hovDriverTourFlag);
            //alternative.AddUtilityTerm(106, hovPassengerTourFlag);
            //alternative.AddUtilityTerm(109, jointHalfOfFullJointHalfTour);
            //alternative.AddUtilityTerm(110, totEmpBuffer2);
            //alternative.AddUtilityTerm(111, totalAggregateLogsum);
            //alternative.AddUtilityTerm(112, personalBusinessOrMedicalTourFlag * isJointTour);



            // 5 - SHOPPING STOP

            alternative = choiceProbabilityCalculator.GetAlternative(5,
                                                                     ((personDay.ShoppingStops > 0 || isJointTour == 1) &&
                                                                      halfTour.SimulatedTrips <= 5 &&
                                                                      timeIsAvailableForAnotherTrip),
                                                                     choice == Global.Settings.Purposes.Shopping);

            alternative.Choice = Global.Settings.Purposes.Shopping;
            //alternative.AddNestedAlternative(_nestedAlternativeIds[5], _nestedAlternativeIndexes[5], THETA_PARAMETER);

            alternative.AddUtilityTerm(121, 1.0);
            //alternative.AddUtilityTerm(122, workTourFlag + schoolTourFlag + businessTourFlag);
            //alternative.AddUtilityTerm(122, isJointTour);
            //alternative.AddUtilityTerm(123, escortTourFlag);
            //alternative.AddUtilityTerm(124, personalBusinessOrMedicalTourFlag);
            //alternative.AddUtilityTerm(125, shoppingTourFlag * isIndividualTour);
            //alternative.AddUtilityTerm(125, shoppingTourFlag);
            //alternative.AddUtilityTerm(126, mealTourFlag);
            //alternative.AddUtilityTerm(127, socialOrRecreationTourFlag);
            //alternative.AddUtilityTerm(128, halfTourFromOriginFlag);
            //alternative.AddUtilityTerm(129, simulatedShoppingStops * isIndividualTour);
            //alternative.AddUtilityTerm(130, simulatedShoppingStops * isJointTour);
            //alternative.AddUtilityTerm(131, duration);

            //alternative.AddUtilityTerm(132, from7AMto9AMFlag + from9PMto11PMFlag + from11PMto7AMFlag);
            //alternative.AddUtilityTerm(133, (from11AMto1PMFlag + from1PMto3PMFlag + from3PMto5PMFlag));

            //alternative.AddUtilityTerm(132, from7AMto9AMFlag + from6PMto10PMFlag);
            alternative.AddUtilityTerm(133, (from9AMto3PMFlag + from3PMto6PMFlag + from6PMto10PMFlag));

            //alternative.AddUtilityTerm(134, adultFemaleOnJointTour);
            //alternative.AddUtilityTerm(135, hovDriverTourFlag);
            //alternative.AddUtilityTerm(136, hovPassengerTourFlag);
            //alternative.AddUtilityTerm(137, Math.Log(1 + adis));
            //alternative.AddUtilityTerm(138, shoppingTourFlag * isJointTour);
            //alternative.AddUtilityTerm(140, shoppingAggregateLogsum);
            //alternative.AddUtilityTerm(141, retailBuffer2);
            //alternative.AddUtilityTerm(142, numChildrenOnJointTour);
            //alternative.AddUtilityTerm(143, (household.Has100KPlusIncome).ToFlag());

            //GV: 21. june 2016, not sign.
            //alternative.AddUtilityTerm(134, primaryFamilyTimeFlag);



            // 6 - MEAL STOP

            //alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Meal, false, choice == Global.Settings.Purposes.Meal);
            //alternative.Choice = Global.Settings.Purposes.Meal;
            //alternative.AddNestedAlternative(12, 2, THETA_PARAMETER);


            // 6 - SOCIAL (OR RECREATION) STOP

            alternative = choiceProbabilityCalculator.GetAlternative(6,
                                                                     ((personDay.SocialStops > 0 || isJointTour == 1) &&
                                                                      halfTour.SimulatedTrips <= 5 &&
                                                                      timeIsAvailableForAnotherTrip),
                                                                     choice == Global.Settings.Purposes.Social);

            alternative.Choice = Global.Settings.Purposes.Social;
            //alternative.AddNestedAlternative(_nestedAlternativeIds[6], _nestedAlternativeIndexes[6], THETA_PARAMETER);

            alternative.AddUtilityTerm(181, 1.0);
            //alternative.AddUtilityTerm(182, workTourFlag + schoolTourFlag + businessTourFlag);
            //alternative.AddUtilityTerm(182, isJointTour);
            //alternative.AddUtilityTerm(183, escortTourFlag);
            //alternative.AddUtilityTerm(184, personalBusinessOrMedicalTourFlag);
            //alternative.AddUtilityTerm(185, shoppingTourFlag);
            //alternative.AddUtilityTerm(186, mealTourFlag);
            //alternative.AddUtilityTerm(187, socialOrRecreationTourFlag);
            //alternative.AddUtilityTerm(188, halfTourFromOriginFlag);
            //alternative.AddUtilityTerm(189, simulatedSocialStops * isIndividualTour);
            //alternative.AddUtilityTerm(197, simulatedSocialStops * isJointTour);
            //alternative.AddUtilityTerm(190, remainingToursCount);
            //alternative.AddUtilityTerm(191, duration);

            //alternative.AddUtilityTerm(192, from7AMto9AMFlag + from11PMto7AMFlag);
            //alternative.AddUtilityTerm(192, from7AMto9AMFlag);
            alternative.AddUtilityTerm(192, from9AMto3PMFlag + from3PMto6PMFlag + from6PMto10PMFlag);

            //alternative.AddUtilityTerm(194, hovDriverTourFlag);
            //alternative.AddUtilityTerm(195, hovPassengerTourFlag);
            //alternative.AddUtilityTerm(196, logDist);
            //alternative.AddUtilityTerm(200, numAdultsOnJointTour);


            // 8 - RECREATION STOP

            //alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Recreation, false, choice == Global.Settings.Purposes.Recreation);
            //alternative.Choice = Global.Settings.Purposes.Recreation;
            //alternative.AddNestedAlternative(12, 2, THETA_PARAMETER);

            // 9 - MEDICAL STOP

            //alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Medical, false, choice == Global.Settings.Purposes.Medical);
            //alternative.Choice = Global.Settings.Purposes.Medical;
            //alternative.AddNestedAlternative(12, 2, THETA_PARAMETER);
        }
示例#28
0
        public void TestFullHalfTourSetParticipantTourSequence()
        {
            Global.Configuration = new Configuration();
            Global.Configuration.HouseholdSamplingRateOneInX = 256;


            const int id              = 1;
            const int householdDayId  = 2;
            const int householdId     = 3;
            const int day             = 4;
            const int sequence        = 5;
            const int direction       = 6;
            const int participants    = 7;
            const int personSequence1 = 8;
            const int tourSequence1   = 9;
            const int personSequence2 = 10;
            const int tourSequence2   = 11;
            const int personSequence3 = 12;
            const int tourSequence3   = 13;
            const int personSequence4 = 14;
            const int tourSequence4   = 15;
            const int personSequence5 = 16;
            const int tourSequence5   = 17;
            const int personSequence6 = 18;
            const int tourSequence6   = 19;
            const int personSequence7 = 20;
            const int tourSequence7   = 21;
            const int personSequence8 = 22;
            const int tourSequence8   = 23;

            FullHalfTour tour = new FullHalfTour
            {
                Day             = day,
                Direction       = direction,
                HouseholdDayId  = householdDayId,
                HouseholdId     = householdId,
                Id              = id,
                Participants    = participants,
                PersonSequence1 = personSequence1,
                TourSequence1   = tourSequence1,
                PersonSequence2 = personSequence2,
                TourSequence2   = tourSequence2,
                PersonSequence3 = personSequence3,
                TourSequence3   = tourSequence3,
                PersonSequence4 = personSequence4,
                TourSequence4   = tourSequence4,
                PersonSequence5 = personSequence5,
                TourSequence5   = tourSequence5,
                PersonSequence6 = personSequence6,
                TourSequence6   = tourSequence6,
                PersonSequence7 = personSequence7,
                TourSequence7   = tourSequence7,
                PersonSequence8 = personSequence8,
                TourSequence8   = tourSequence8,
                Sequence        = sequence
            };

            List <IPerson> persons = new List <IPerson> {
                new Person()
            };

            HouseholdWrapper householdWrapper = TestHelper.GetHouseholdWrapper(persons);

            householdWrapper.Init();
            //HouseholdDayWrapper householdDayWrapper = new HouseholdDayWrapper(new HouseholdDay(), householdWrapper, new PersonDayWrapperFactory());

            HouseholdDayWrapper householdDayWrapper = TestHelper.GetHouseholdDayWrapper(householdWrapper);

            FullHalfTourWrapper.SetPersister(new PersisterWithHDF5 <FullHalfTour>(new TestFullHalfTourExporter()));
            FullHalfTourWrapper wrapper = new FullHalfTourWrapper(tour, householdDayWrapper);

            int[] sequences  = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };
            int[] pSequences = new[] { personSequence1, personSequence2, personSequence3, personSequence4, personSequence5, personSequence6, personSequence7, personSequence8 };

            for (int x = 0; x < 8; x++)
            {
                PersonWrapper    person             = TestHelper.GetPersonWrapper(sequence: pSequences[x]);
                PersonDayWrapper personDay          = TestHelper.GetPersonDayWrapper(personWrapper: person, income: -1);
                const int        destinationPurpose = Constants.Purpose.BUSINESS;

                Global.Configuration.Coefficients_BaseCostCoefficientIncomeLevel     = 25000;
                Global.Configuration.Coefficients_StdDeviationTimeCoefficient_Other  = .75;
                Global.Configuration.Coefficients_MeanTimeCoefficient_Other          = .45;
                Global.Configuration.Coefficients_BaseCostCoefficientPerMonetaryUnit = 5;
                Tour        ptour       = new Tour();
                TourWrapper tourWrapper = new TourWrapper(ptour, personDay, destinationPurpose, false)
                {
                    Sequence = sequences[x]
                };
                wrapper.SetParticipantTourSequence(tourWrapper);

                Assert.Equal(sequences[x], GetWrapperTourSequence(wrapper, x));
            }
        }
        private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, TourWrapper tour, int nCallsForTour, HouseholdDayWrapper householdDay, int choice = Constants.DEFAULT_VALUE)
        {
            IEnumerable <PersonDayWrapper> orderedPersonDays = householdDay.PersonDays.OrderBy(p => p.GetJointTourParticipationPriority()).ToList().Cast <PersonDayWrapper>();

            Framework.DomainModels.Wrappers.IPersonWrapper    person    = tour.Person;
            Framework.DomainModels.Wrappers.IPersonDayWrapper personDay = tour.PersonDay;

            int adultFemaleFlag    = person.IsAdultFemale.ToFlag();
            int partTimeWorkerFlag = person.IsPartTimeWorker.ToFlag();

            double foodBuffer2      = tour.DestinationParcel.EmploymentFoodBuffer2;
            double medBuffer2       = tour.DestinationParcel.EmploymentMedicalBuffer2;
            double intDensBuffer2   = tour.DestinationParcel.IntersectionDensity34Buffer2();
            double serviceBuffer2   = tour.DestinationParcel.EmploymentServiceBuffer2;
            double totEmpBuffer2    = tour.DestinationParcel.EmploymentTotalBuffer2;
            double totHHBuffer2     = tour.DestinationParcel.HouseholdsBuffer2;
            double openSpaceBuffer2 = tour.DestinationParcel.OpenSpaceType1Buffer2;
            double mixedUse         = tour.DestinationParcel.MixedUse2Index2();
            //var retailBuffer2 = tour.DestinationParcel.EmploymentRetailBuffer2;
            //var retailBuffer1 = tour.DestinationParcel.EmploymentRetailBuffer1;

            int carOwnership = person.GetCarOwnershipSegment();
            int noCarsFlag   = FlagUtility.GetNoCarsFlag(carOwnership);
            //var carCompetitionFlag = AggregateLogsumsCalculator.GetCarCompetitionFlag(carOwnership);

            int votALSegment = tour.GetVotALSegment();

            int    workTaSegment       = tour.DestinationParcel.TransitAccessSegment();
            double workAggregateLogsum = Global.AggregateLogsums[tour.DestinationParcel.ZoneId]
                                         [Global.Settings.Purposes.WorkBased][carOwnership][votALSegment][workTaSegment];
            double shopAggregateLogsum = Global.AggregateLogsums[tour.DestinationParcel.ZoneId]
                                         [Global.Settings.Purposes.Shopping][carOwnership][votALSegment][workTaSegment];
            //var mealAggregateLogsum = Global.AggregateLogsums[tour.DestinationParcel.ZoneId]
            //[Global.Settings.Purposes.Meal][carOwnership][votALSegment][workTaSegment];
            //var persBusAggregateLogsum = Global.AggregateLogsums[tour.DestinationParcel.ZoneId]
            //[Global.Settings.Purposes.PersonalBusiness][carOwnership][votALSegment][workTaSegment];
            //var socialAggregateLogsum = Global.AggregateLogsums[tour.DestinationParcel.ZoneId]
            //[Global.Settings.Purposes.Social][carOwnership][votALSegment][workTaSegment];

            int numStopPurposes = (personDay.SimulatedEscortStops > 1).ToFlag() + (personDay.SimulatedShoppingStops > 1).ToFlag() + (personDay.SimulatedMealStops > 1).ToFlag() +
                                  (personDay.SimulatedPersonalBusinessStops > 1).ToFlag() + (personDay.SimulatedSocialStops > 1).ToFlag() +
                                  (personDay.SimulatedRecreationStops > 1).ToFlag() + (personDay.SimulatedMedicalStops > 1).ToFlag();

            int    workDestinationArrivalTime   = ChoiceModelUtility.GetDestinationArrivalTime(Global.Settings.Models.WorkTourModeModel);
            int    workDestinationDepartureTime = ChoiceModelUtility.GetDestinationDepartureTime(Global.Settings.Models.WorkTourModeModel);
            double workLogsum = 0;

            ChoiceProbabilityCalculator.Alternative nestedAlternative = Global.ChoiceModelSession.Get <WorkTourModeTimeModel>().RunNested(personDay, person.Household.ResidenceParcel, person.UsualWorkParcel, workDestinationArrivalTime, workDestinationDepartureTime, person.Household.VehiclesAvailable);
            workLogsum = nestedAlternative == null ? 0 : nestedAlternative.ComputeLogsum();

            //double logTimeAtWork = Math.Log(1 + (workDestinationDepartureTime - workDestinationArrivalTime) / 60);

            //int countMandatoryKids = (from personDayHH in orderedPersonDays where personDayHH.PatternType == 1 && personDayHH.Person.Age < 12 select personDayHH.PatternType).Count();
            //int countNonMandatory = (from personDayHH in orderedPersonDays where personDayHH.PatternType == 2 select personDayHH.PatternType).Count();
            //int countAtHome = (from personDayHH in orderedPersonDays where personDayHH.PatternType == 3 select personDayHH.PatternType).Count();
            int countNonMandatoryKids = (from personDayHH in orderedPersonDays where personDayHH.PatternType == 2 && personDayHH.Person.Age < 12 select personDayHH.PatternType).Count();

            // NONE_OR_HOME

            ChoiceProbabilityCalculator.Alternative alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.NoneOrHome, true, choice == Global.Settings.Purposes.NoneOrHome);

            alternative.Choice = Global.Settings.Purposes.NoneOrHome;

            alternative.AddUtilityTerm(1, (nCallsForTour > 1).ToFlag());
            alternative.AddUtilityTerm(3, personDay.TwoOrMoreWorkToursExist().ToFlag());
            alternative.AddUtilityTerm(4, noCarsFlag);
            //alternative.AddUtilityTerm(5, carCompetitionFlag);
            alternative.AddUtilityTerm(6, partTimeWorkerFlag);
            //alternative.AddUtilityTerm(8, (person.UsualModeToWork != Global.Settings.Modes.Sov).ToFlag());
            alternative.AddUtilityTerm(10, person.TransitPassOwnership);
            //alternative.AddUtilityTerm(15, logTimeAtWork);
            alternative.AddUtilityTerm(17, numStopPurposes);
            alternative.AddUtilityTerm(18, Math.Log(personDay.GetTotalCreatedTours() + 1));

            // WORK

            alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Work, personDay.WorkStops > 0, choice == Global.Settings.Purposes.Work);

            alternative.Choice = Global.Settings.Purposes.Work;

            alternative.AddUtilityTerm(21, 1);
            alternative.AddUtilityTerm(22, Math.Log(1 + totEmpBuffer2));
            //alternative.AddUtilityTerm(23, (person.Household.Income<30000).ToFlag());
            alternative.AddUtilityTerm(24, (person.Household.Has100KPlusIncome).ToFlag());
            alternative.AddUtilityTerm(25, workLogsum);

            // SCHOOL
            //no observations in the PSRC dataset
            alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.School, false, choice == Global.Settings.Purposes.School);

            alternative.Choice = Global.Settings.Purposes.School;

            //alternative.AddUtilityTerm(3, 1);

            // ESCORT

            alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Escort, personDay.EscortStops > 0, choice == Global.Settings.Purposes.Escort);

            alternative.Choice = Global.Settings.Purposes.Escort;

            alternative.AddUtilityTerm(31, 1);
            //alternative.AddUtilityTerm(33, k8HighSchoolQtrMileLog);
            alternative.AddUtilityTerm(36, countNonMandatoryKids);
            alternative.AddUtilityTerm(37, adultFemaleFlag);
            //alternative.AddUtilityTerm(38, person.Household.Size);
            //alternative.AddUtilityTerm(39, householdDay.Household.HouseholdTotals.ChildrenAge5Through15);
            //alternative.AddUtilityTerm(40, partTimeWorkerFlag);
            alternative.AddUtilityTerm(39, workLogsum);

            // PERSONAL_BUSINESS

            alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.PersonalBusiness, personDay.PersonalBusinessStops > 0, choice == Global.Settings.Purposes.PersonalBusiness);

            alternative.Choice = Global.Settings.Purposes.PersonalBusiness;

            alternative.AddUtilityTerm(41, 1);
            //alternative.AddUtilityTerm(43, persBusAggregateLogsum);
            alternative.AddUtilityTerm(45, Math.Log(1 + totEmpBuffer2));
            //alternative.AddUtilityTerm(48, (person.Household.Income>90000).ToFlag());
            alternative.AddUtilityTerm(49, (person.Household.HouseholdTotals.ChildrenUnder16));


            // SHOPPING

            alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Shopping, personDay.ShoppingStops > 0, choice == Global.Settings.Purposes.Shopping);

            alternative.Choice = Global.Settings.Purposes.Shopping;

            alternative.AddUtilityTerm(51, 1);
            //alternative.AddUtilityTerm(53, retailBuffer1);
            //alternative.AddUtilityTerm(54, partTimeWorkerFlag);
            alternative.AddUtilityTerm(55, (person.Household.Has100KPlusIncome).ToFlag());
            alternative.AddUtilityTerm(57, person.Household.HouseholdTotals.ChildrenUnder16);
            alternative.AddUtilityTerm(58, shopAggregateLogsum);
            //alternative.AddUtilityTerm(59, person.Household.Size);
            //alternative.AddUtilityTerm(59, (person.Household.Income<30000).ToFlag());


            // MEAL

            alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Meal, personDay.MealStops > 0, choice == Global.Settings.Purposes.Meal);

            alternative.Choice = Global.Settings.Purposes.Meal;

            alternative.AddUtilityTerm(71, 1);
            alternative.AddUtilityTerm(73, Math.Log(1 + foodBuffer2));
            alternative.AddUtilityTerm(74, mixedUse);
            alternative.AddUtilityTerm(75, intDensBuffer2);
            //alternative.AddUtilityTerm(76, (person.Household.Income<30000).ToFlag());
            //alternative.AddUtilityTerm(77, person.Household.HouseholdTotals.ChildrenUnder16);

            // SOCIAL

            alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Social, personDay.SocialStops > 0, choice == Global.Settings.Purposes.Social);

            alternative.Choice = Global.Settings.Purposes.Social;

            alternative.AddUtilityTerm(91, 1);
            alternative.AddUtilityTerm(93, person.Household.HouseholdTotals.ChildrenUnder16);
            alternative.AddUtilityTerm(94, (person.Age < 35).ToFlag());
            //alternative.AddUtilityTerm(115, workAggregateLogsum);
            alternative.AddUtilityTerm(96, Math.Log(1 + totHHBuffer2 + totEmpBuffer2));
            alternative.AddUtilityTerm(97, (person.Household.Income < 30000).ToFlag());
            //alternative.AddUtilityTerm(118, person.Household.Has100KPlusIncome.ToFlag());

            // RECREATION

            alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Recreation, personDay.RecreationStops > 0, choice == Global.Settings.Purposes.Recreation);

            alternative.Choice = Global.Settings.Purposes.Recreation;

            alternative.AddUtilityTerm(111, 1);
            alternative.AddUtilityTerm(113, person.Household.HouseholdTotals.ChildrenUnder16);
            alternative.AddUtilityTerm(114, (person.Age < 35).ToFlag());
            alternative.AddUtilityTerm(116, Math.Log(1 + totHHBuffer2 + totEmpBuffer2));
            alternative.AddUtilityTerm(117, (person.Household.Income < 30000).ToFlag());
            alternative.AddUtilityTerm(118, (person.Household.Income > 100000).ToFlag());
            alternative.AddUtilityTerm(119, Math.Log(1 + openSpaceBuffer2));

            // MEDICAL

            alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Medical, personDay.MedicalStops > 0, choice == Global.Settings.Purposes.Medical);

            alternative.Choice = Global.Settings.Purposes.Medical;

            alternative.AddUtilityTerm(121, 1);
            alternative.AddUtilityTerm(123, adultFemaleFlag);
            alternative.AddUtilityTerm(124, (person.Age > 65).ToFlag());
            alternative.AddUtilityTerm(125, Math.Log(1 + medBuffer2));
            //alternative.AddUtilityTerm(126, workAggregateLogsum);

            //alternative.AddNestedAlternative(12, 1, 60);
        }
示例#30
0
文件: TripTest.cs 项目: sfcta/DaySim
        public void TestTripWrapperIsDestination()
        {
            Global.Configuration = new Configuration {
                HouseholdSamplingRateOneInX = 256
            };
            Trip        trip = new Trip();
            TourWrapper tour = TestHelper.GetTourWrapper();

            TourWrapper.HalfTour halfTour = new TourWrapper.HalfTour(tour);
            TripWrapper          wrapper  = new TripWrapper(trip, tour, halfTour);

            Assert.Equal(false, wrapper.IsEscortDestinationPurpose);
            Assert.Equal(false, wrapper.IsEscortPurposeByDestination);
            Assert.Equal(false, wrapper.IsMealDestinationPurpose);
            Assert.Equal(false, wrapper.IsMedicalDestinationPurpose);
            Assert.Equal(true, wrapper.IsNoneOrHomePurposeByDestination);
            Assert.Equal(false, wrapper.IsPersonalBusinessDestinationPurpose);
            Assert.Equal(false, wrapper.IsPersonalBusinessOrMedicalDestinationPurpose);
            Assert.Equal(false, wrapper.IsPersonalReasonsDestinationPurpose);
            Assert.Equal(false, wrapper.IsRecreationDestinationPurpose);
            Assert.Equal(false, wrapper.IsSchoolDestinationPurpose);
            Assert.Equal(false, wrapper.IsShoppingDestinationPurpose);
            Assert.Equal(false, wrapper.IsSocialDestinationPurpose);
            Assert.Equal(false, wrapper.IsWorkDestinationPurpose);
            Assert.Equal(false, wrapper.IsWorkOrSchoolDestinationPurpose);
            Assert.Equal(false, wrapper.IsWorkPurposeByDestination);

            trip = new Trip {
                DestinationPurpose = Constants.Purpose.BUSINESS
            };
            wrapper = new TripWrapper(trip, tour, halfTour);

            Assert.Equal(false, wrapper.IsEscortDestinationPurpose);
            Assert.Equal(false, wrapper.IsEscortPurposeByDestination);
            Assert.Equal(false, wrapper.IsMealDestinationPurpose);
            Assert.Equal(false, wrapper.IsMedicalDestinationPurpose);
            Assert.Equal(false, wrapper.IsNoneOrHomePurposeByDestination);
            Assert.Equal(false, wrapper.IsPersonalBusinessDestinationPurpose);
            Assert.Equal(false, wrapper.IsPersonalBusinessOrMedicalDestinationPurpose);
            Assert.Equal(false, wrapper.IsPersonalReasonsDestinationPurpose);
            Assert.Equal(false, wrapper.IsRecreationDestinationPurpose);
            Assert.Equal(false, wrapper.IsSchoolDestinationPurpose);
            Assert.Equal(false, wrapper.IsShoppingDestinationPurpose);
            Assert.Equal(false, wrapper.IsSocialDestinationPurpose);
            Assert.Equal(false, wrapper.IsWorkDestinationPurpose);
            Assert.Equal(false, wrapper.IsWorkOrSchoolDestinationPurpose);
            Assert.Equal(false, wrapper.IsWorkPurposeByDestination);

            trip = new Trip {
                DestinationPurpose = Constants.Purpose.ESCORT
            };
            wrapper = new TripWrapper(trip, tour, halfTour);

            Assert.Equal(true, wrapper.IsEscortDestinationPurpose);
            Assert.Equal(true, wrapper.IsEscortPurposeByDestination);
            Assert.Equal(false, wrapper.IsMealDestinationPurpose);
            Assert.Equal(false, wrapper.IsMedicalDestinationPurpose);
            Assert.Equal(false, wrapper.IsNoneOrHomePurposeByDestination);
            Assert.Equal(false, wrapper.IsPersonalBusinessDestinationPurpose);
            Assert.Equal(false, wrapper.IsPersonalBusinessOrMedicalDestinationPurpose);
            Assert.Equal(false, wrapper.IsPersonalReasonsDestinationPurpose);
            Assert.Equal(false, wrapper.IsRecreationDestinationPurpose);
            Assert.Equal(false, wrapper.IsSchoolDestinationPurpose);
            Assert.Equal(false, wrapper.IsShoppingDestinationPurpose);
            Assert.Equal(false, wrapper.IsSocialDestinationPurpose);
            Assert.Equal(false, wrapper.IsWorkDestinationPurpose);
            Assert.Equal(false, wrapper.IsWorkOrSchoolDestinationPurpose);
            Assert.Equal(false, wrapper.IsWorkPurposeByDestination);

            trip = new Trip {
                DestinationPurpose = Constants.Purpose.MEAL
            };
            wrapper = new TripWrapper(trip, tour, halfTour);

            Assert.Equal(false, wrapper.IsEscortDestinationPurpose);
            Assert.Equal(false, wrapper.IsEscortPurposeByDestination);
            Assert.Equal(true, wrapper.IsMealDestinationPurpose);
            Assert.Equal(false, wrapper.IsMedicalDestinationPurpose);
            Assert.Equal(false, wrapper.IsNoneOrHomePurposeByDestination);
            Assert.Equal(false, wrapper.IsPersonalBusinessDestinationPurpose);
            Assert.Equal(false, wrapper.IsPersonalBusinessOrMedicalDestinationPurpose);
            Assert.Equal(true, wrapper.IsPersonalReasonsDestinationPurpose);
            Assert.Equal(false, wrapper.IsRecreationDestinationPurpose);
            Assert.Equal(false, wrapper.IsSchoolDestinationPurpose);
            Assert.Equal(false, wrapper.IsShoppingDestinationPurpose);
            Assert.Equal(false, wrapper.IsSocialDestinationPurpose);
            Assert.Equal(false, wrapper.IsWorkDestinationPurpose);
            Assert.Equal(false, wrapper.IsWorkOrSchoolDestinationPurpose);
            Assert.Equal(false, wrapper.IsWorkPurposeByDestination);

            trip = new Trip {
                DestinationPurpose = Constants.Purpose.MEDICAL
            };
            wrapper = new TripWrapper(trip, tour, halfTour);

            Assert.Equal(false, wrapper.IsEscortDestinationPurpose);
            Assert.Equal(false, wrapper.IsEscortPurposeByDestination);
            Assert.Equal(false, wrapper.IsMealDestinationPurpose);
            Assert.Equal(true, wrapper.IsMedicalDestinationPurpose);
            Assert.Equal(false, wrapper.IsNoneOrHomePurposeByDestination);
            Assert.Equal(false, wrapper.IsPersonalBusinessDestinationPurpose);
            Assert.Equal(true, wrapper.IsPersonalBusinessOrMedicalDestinationPurpose);
            Assert.Equal(false, wrapper.IsPersonalReasonsDestinationPurpose);
            Assert.Equal(false, wrapper.IsRecreationDestinationPurpose);
            Assert.Equal(false, wrapper.IsSchoolDestinationPurpose);
            Assert.Equal(false, wrapper.IsShoppingDestinationPurpose);
            Assert.Equal(false, wrapper.IsSocialDestinationPurpose);
            Assert.Equal(false, wrapper.IsWorkDestinationPurpose);
            Assert.Equal(false, wrapper.IsWorkOrSchoolDestinationPurpose);
            Assert.Equal(false, wrapper.IsWorkPurposeByDestination);

            trip = new Trip {
                DestinationPurpose = Constants.Purpose.PERSONAL_BUSINESS
            };
            wrapper = new TripWrapper(trip, tour, halfTour);

            Assert.Equal(false, wrapper.IsEscortDestinationPurpose);
            Assert.Equal(false, wrapper.IsEscortPurposeByDestination);
            Assert.Equal(false, wrapper.IsMealDestinationPurpose);
            Assert.Equal(false, wrapper.IsMedicalDestinationPurpose);
            Assert.Equal(false, wrapper.IsNoneOrHomePurposeByDestination);
            Assert.Equal(true, wrapper.IsPersonalBusinessDestinationPurpose);
            Assert.Equal(true, wrapper.IsPersonalBusinessOrMedicalDestinationPurpose);
            Assert.Equal(true, wrapper.IsPersonalReasonsDestinationPurpose);
            Assert.Equal(false, wrapper.IsRecreationDestinationPurpose);
            Assert.Equal(false, wrapper.IsSchoolDestinationPurpose);
            Assert.Equal(false, wrapper.IsShoppingDestinationPurpose);
            Assert.Equal(false, wrapper.IsSocialDestinationPurpose);
            Assert.Equal(false, wrapper.IsWorkDestinationPurpose);
            Assert.Equal(false, wrapper.IsWorkOrSchoolDestinationPurpose);
            Assert.Equal(false, wrapper.IsWorkPurposeByDestination);

            trip = new Trip {
                DestinationPurpose = Constants.Purpose.RECREATION
            };
            wrapper = new TripWrapper(trip, tour, halfTour);

            Assert.Equal(false, wrapper.IsEscortDestinationPurpose);
            Assert.Equal(false, wrapper.IsEscortPurposeByDestination);
            Assert.Equal(false, wrapper.IsMealDestinationPurpose);
            Assert.Equal(false, wrapper.IsMedicalDestinationPurpose);
            Assert.Equal(false, wrapper.IsNoneOrHomePurposeByDestination);
            Assert.Equal(false, wrapper.IsPersonalBusinessDestinationPurpose);
            Assert.Equal(false, wrapper.IsPersonalBusinessOrMedicalDestinationPurpose);
            Assert.Equal(false, wrapper.IsPersonalReasonsDestinationPurpose);
            Assert.Equal(true, wrapper.IsRecreationDestinationPurpose);
            Assert.Equal(false, wrapper.IsSchoolDestinationPurpose);
            Assert.Equal(false, wrapper.IsShoppingDestinationPurpose);
            Assert.Equal(false, wrapper.IsSocialDestinationPurpose);
            Assert.Equal(false, wrapper.IsWorkDestinationPurpose);
            Assert.Equal(false, wrapper.IsWorkOrSchoolDestinationPurpose);
            Assert.Equal(false, wrapper.IsWorkPurposeByDestination);

            trip = new Trip {
                DestinationPurpose = Constants.Purpose.SCHOOL
            };
            wrapper = new TripWrapper(trip, tour, halfTour);

            Assert.Equal(false, wrapper.IsEscortDestinationPurpose);
            Assert.Equal(false, wrapper.IsEscortPurposeByDestination);
            Assert.Equal(false, wrapper.IsMealDestinationPurpose);
            Assert.Equal(false, wrapper.IsMedicalDestinationPurpose);
            Assert.Equal(false, wrapper.IsNoneOrHomePurposeByDestination);
            Assert.Equal(false, wrapper.IsPersonalBusinessDestinationPurpose);
            Assert.Equal(false, wrapper.IsPersonalBusinessOrMedicalDestinationPurpose);
            Assert.Equal(false, wrapper.IsPersonalReasonsDestinationPurpose);
            Assert.Equal(false, wrapper.IsRecreationDestinationPurpose);
            Assert.Equal(true, wrapper.IsSchoolDestinationPurpose);
            Assert.Equal(false, wrapper.IsShoppingDestinationPurpose);
            Assert.Equal(false, wrapper.IsSocialDestinationPurpose);
            Assert.Equal(false, wrapper.IsWorkDestinationPurpose);
            Assert.Equal(true, wrapper.IsWorkOrSchoolDestinationPurpose);
            Assert.Equal(false, wrapper.IsWorkPurposeByDestination);

            trip = new Trip {
                DestinationPurpose = Constants.Purpose.SHOPPING
            };
            wrapper = new TripWrapper(trip, tour, halfTour);

            Assert.Equal(false, wrapper.IsEscortDestinationPurpose);
            Assert.Equal(false, wrapper.IsEscortPurposeByDestination);
            Assert.Equal(false, wrapper.IsMealDestinationPurpose);
            Assert.Equal(false, wrapper.IsMedicalDestinationPurpose);
            Assert.Equal(false, wrapper.IsNoneOrHomePurposeByDestination);
            Assert.Equal(false, wrapper.IsPersonalBusinessDestinationPurpose);
            Assert.Equal(false, wrapper.IsPersonalBusinessOrMedicalDestinationPurpose);
            Assert.Equal(true, wrapper.IsPersonalReasonsDestinationPurpose);
            Assert.Equal(false, wrapper.IsRecreationDestinationPurpose);
            Assert.Equal(false, wrapper.IsSchoolDestinationPurpose);
            Assert.Equal(true, wrapper.IsShoppingDestinationPurpose);
            Assert.Equal(false, wrapper.IsSocialDestinationPurpose);
            Assert.Equal(false, wrapper.IsWorkDestinationPurpose);
            Assert.Equal(false, wrapper.IsWorkOrSchoolDestinationPurpose);
            Assert.Equal(false, wrapper.IsWorkPurposeByDestination);

            trip = new Trip {
                DestinationPurpose = Constants.Purpose.SOCIAL
            };
            wrapper = new TripWrapper(trip, tour, halfTour);

            Assert.Equal(false, wrapper.IsEscortDestinationPurpose);
            Assert.Equal(false, wrapper.IsEscortPurposeByDestination);
            Assert.Equal(false, wrapper.IsMealDestinationPurpose);
            Assert.Equal(false, wrapper.IsMedicalDestinationPurpose);
            Assert.Equal(false, wrapper.IsNoneOrHomePurposeByDestination);
            Assert.Equal(false, wrapper.IsPersonalBusinessDestinationPurpose);
            Assert.Equal(false, wrapper.IsPersonalBusinessOrMedicalDestinationPurpose);
            Assert.Equal(true, wrapper.IsPersonalReasonsDestinationPurpose);
            Assert.Equal(false, wrapper.IsRecreationDestinationPurpose);
            Assert.Equal(false, wrapper.IsSchoolDestinationPurpose);
            Assert.Equal(false, wrapper.IsShoppingDestinationPurpose);
            Assert.Equal(true, wrapper.IsSocialDestinationPurpose);
            Assert.Equal(false, wrapper.IsWorkDestinationPurpose);
            Assert.Equal(false, wrapper.IsWorkOrSchoolDestinationPurpose);
            Assert.Equal(false, wrapper.IsWorkPurposeByDestination);

            trip = new Trip {
                DestinationPurpose = Constants.Purpose.WORK
            };
            wrapper = new TripWrapper(trip, tour, halfTour);

            Assert.Equal(false, wrapper.IsEscortDestinationPurpose);
            Assert.Equal(false, wrapper.IsEscortPurposeByDestination);
            Assert.Equal(false, wrapper.IsMealDestinationPurpose);
            Assert.Equal(false, wrapper.IsMedicalDestinationPurpose);
            Assert.Equal(false, wrapper.IsNoneOrHomePurposeByDestination);
            Assert.Equal(false, wrapper.IsPersonalBusinessDestinationPurpose);
            Assert.Equal(false, wrapper.IsPersonalBusinessOrMedicalDestinationPurpose);
            Assert.Equal(false, wrapper.IsPersonalReasonsDestinationPurpose);
            Assert.Equal(false, wrapper.IsRecreationDestinationPurpose);
            Assert.Equal(false, wrapper.IsSchoolDestinationPurpose);
            Assert.Equal(false, wrapper.IsShoppingDestinationPurpose);
            Assert.Equal(false, wrapper.IsSocialDestinationPurpose);
            Assert.Equal(true, wrapper.IsWorkDestinationPurpose);
            Assert.Equal(true, wrapper.IsWorkOrSchoolDestinationPurpose);
            Assert.Equal(true, wrapper.IsWorkPurposeByDestination);
        }