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)); }
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(); } }
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; } }
public static TripWrapper GetTripWrapper(int id = 0) { TourWrapper tour = GetTourWrapper(); return(new TripWrapper(new Trip() { Id = id }, tour, new TourWrapper.HalfTour(tour))); }
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)); }
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; } }
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]); }
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); }
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); }
//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)); }
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 }
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); }
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())); }
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); }
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); }
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); }
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)); }
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); }
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); }
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)); }
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(); */ }
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; } }
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); }
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); }
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); }
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); }