private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, IPersonWrapper person, int sampleSize, IParcelWrapper choice = null, bool choseHome = false) { int segment = Global.ContainerDaySim.GetInstance <SamplingWeightsSettingsFactory>().SamplingWeightsSettings.GetTourDestinationSegment(Global.Settings.Purposes.School, Global.Settings.TourPriorities.UsualLocation, Global.Settings.Modes.Sov, person.PersonType); DestinationSampler destinationSampler = new DestinationSampler(choiceProbabilityCalculator, segment, sampleSize, choice, person.Household.ResidenceParcel); int destinationArrivalTime = ChoiceModelUtility.GetDestinationArrivalTime(Global.Settings.Models.SchoolTourModeModel); int destinationDepartureTime = ChoiceModelUtility.GetDestinationDepartureTime(Global.Settings.Models.SchoolTourModeModel); SchoolLocationUtilities schoolLocationUtilities = new SchoolLocationUtilities(person, sampleSize, destinationArrivalTime, destinationDepartureTime); destinationSampler.SampleTourDestinations(schoolLocationUtilities); // var alternative = choiceProbabilityCalculator.GetAlternative(countSampled, true); // JLB 20120403 added third call parameter to idenitfy whether this alt is chosen or not ChoiceProbabilityCalculator.Alternative alternative = choiceProbabilityCalculator.GetAlternative(sampleSize, true, choseHome); alternative.Choice = person.Household.ResidenceParcel; alternative.AddUtilityTerm(50, 1); alternative.AddUtilityTerm(51, (!person.IsStudentAge).ToFlag()); alternative.AddUtilityTerm(52, person.Household.Size); alternative.AddUtilityTerm(97, 1); //new dummy size variable for oddball alt alternative.AddUtilityTerm(98, 100); //old dummy size variable for oddball alt //make oddball alt unavailable and remove nesting for estimation of conditional MNL // alternative.Available = false; alternative.AddNestedAlternative(sampleSize + 3, 1, 99); }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, IPersonWrapper person, int sampleSize, IParcelWrapper choice = null, bool choseHome = false) { int segment = Global.ContainerDaySim.GetInstance <SamplingWeightsSettingsFactory>().SamplingWeightsSettings.GetTourDestinationSegment(Global.Settings.Purposes.Work, Global.Settings.TourPriorities.HomeBasedTour, Global.Settings.Modes.Sov, person.PersonType); DestinationSampler destinationSampler = new DestinationSampler(choiceProbabilityCalculator, segment, sampleSize, choice, person.Household.ResidenceParcel); int destinationArrivalTime = ChoiceModelUtility.GetDestinationArrivalTime(Global.Settings.Models.WorkTourModeModel); int destinationDepartureTime = ChoiceModelUtility.GetDestinationDepartureTime(Global.Settings.Models.WorkTourModeModel); WorkLocationUtilities workLocationUtilites = new WorkLocationUtilities(this, person, sampleSize, destinationArrivalTime, destinationDepartureTime); destinationSampler.SampleTourDestinations(workLocationUtilites); //var alternative = choiceProbabilityCalculator.GetAlternative(countSampled, true); // JLB 20120329 added third call parameter to idenitfy whether this alt is chosen or not ChoiceProbabilityCalculator.Alternative alternative = choiceProbabilityCalculator.GetAlternative(sampleSize, true, choseHome); alternative.Choice = person.Household.ResidenceParcel; alternative.AddUtilityTerm(41, 1); alternative.AddUtilityTerm(42, person.IsPartTimeWorker.ToFlag()); alternative.AddUtilityTerm(43, person.IsStudentAge.ToFlag()); alternative.AddUtilityTerm(44, person.IsFemale.ToFlag()); alternative.AddUtilityTerm(90, 100); //make oddball alt unavailable and remove nesting for estimation of conditional MNL // alternative.Available = false; alternative.AddNestedAlternative(sampleSize + 3, 1, 98); }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, IPersonWrapper person, int sampleSize, IParcelWrapper choice = null, bool choseHome = false) { int segment = Global.ContainerDaySim.GetInstance <SamplingWeightsSettingsFactory>().SamplingWeightsSettings.GetTourDestinationSegment(Global.Settings.Purposes.Work, Global.Settings.TourPriorities.HomeBasedTour, Global.Settings.Modes.Sov, person.PersonType); DestinationSampler destinationSampler = new DestinationSampler(choiceProbabilityCalculator, segment, sampleSize, choice, person.Household.ResidenceParcel); int destinationArrivalTime = ChoiceModelUtility.GetDestinationArrivalTime(Global.Settings.Models.WorkTourModeModel); int destinationDepartureTime = ChoiceModelUtility.GetDestinationDepartureTime(Global.Settings.Models.WorkTourModeModel); WorkLocationUtilities workLocationUtilites = new WorkLocationUtilities(this, person, sampleSize, destinationArrivalTime, destinationDepartureTime); destinationSampler.SampleTourDestinations(workLocationUtilites); //var alternative = choiceProbabilityCalculator.GetAlternative(countSampled, true); // JLB 20120329 added third call parameter to idenitfy whether this alt is chosen or not if (Global.Configuration.IsInEstimationMode && !ESTIMATE_NESTED_MODEL) { return; } ChoiceProbabilityCalculator.Alternative alternative = choiceProbabilityCalculator.GetAlternative(sampleSize, true, choseHome); alternative.Choice = person.Household.ResidenceParcel; alternative.AddUtilityTerm(41, 1); alternative.AddUtilityTerm(42, person.IsPartTimeWorker.ToFlag()); alternative.AddUtilityTerm(43, person.IsStudentAge.ToFlag()); alternative.AddUtilityTerm(44, person.IsFemale.ToFlag()); alternative.AddUtilityTerm(89, 1); //new dummy size variable for oddball alt alternative.AddUtilityTerm(90, 100); //old dummy size variable for oddball alt // OD shadow pricing - add for work at home if (Global.Configuration.ShouldUseODShadowPricing && Global.Configuration.UseODShadowPricingForWorkAtHomeAlternative) { int res = person.Household.ResidenceParcel.District; int des = person.Household.ResidenceParcel.District; //var first = res <= des? res : des; //var second = res <= des? des : res; double shadowPriceConfigurationParameter = res == des ? Global.Configuration.WorkLocationOOShadowPriceCoefficient : Global.Configuration.WorkLocationODShadowPriceCoefficient; int odShadowPriceF12Value = MAX_REGULAR_PARAMETER + Global.Configuration.NumberOfODShadowPricingDistricts * (res - 1) + des; alternative.AddUtilityTerm(odShadowPriceF12Value, shadowPriceConfigurationParameter); } // set shadow price depending on persontype and add it to utility // we are using the sampling adjustment factor assuming that it is 1 if (Global.Configuration.ShouldUseShadowPricing && Global.Configuration.UseWorkShadowPricingForWorkAtHomeAlternative) { alternative.AddUtilityTerm(1, person.Household.ResidenceParcel.ShadowPriceForEmployment); } //make oddball alt unavailable and remove nesting for estimation of conditional MNL alternative.AddNestedAlternative(sampleSize + 3, 1, THETA_PARAMETER); }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, ITourWrapper tour, IEnumerable <IPathTypeModel> pathTypeModels, IParcelWrapper destinationParcel, int householdCars, int choice = Constants.DEFAULT_VALUE) { IHouseholdWrapper household = tour.Household; IPersonWrapper person = tour.Person; IPersonDayWrapper personDay = tour.PersonDay; // household inputs int income0To25KFlag = household.Has0To25KIncome.ToFlag(); int income25To50KFlag = household.Has25To50KIncome.ToFlag(); int income75KPlusFlag = household.Has75KPlusIncome.ToFlag(); int incomeOver100Flag = household.Has100KPlusIncome.ToFlag(); int onePersonHouseholdFlag = household.IsOnePersonHousehold.ToFlag(); int twoPersonHouseholdFlag = household.IsTwoPersonHousehold.ToFlag(); int noCarsInHouseholdFlag = household.GetFlagForNoCarsInHousehold(householdCars); int carsLessThanDriversFlag = household.GetFlagForCarsLessThanDrivers(householdCars); int carsLessThanWorkersFlag = household.GetFlagForCarsLessThanWorkers(householdCars); // person inputs int childUnder5Flag = person.IsChildUnder5.ToFlag(); int adultFlag = person.IsAdult.ToFlag(); int drivingAgeStudentFlag = person.IsDrivingAgeStudent.ToFlag(); int maleFlag = person.IsMale.ToFlag(); // remaining inputs IParcelWrapper originParcel = tour.OriginParcel; double destinationParkingCost = destinationParcel.ParkingCostBuffer1(6); ChoiceModelUtility.SetEscortPercentages(personDay, out double escortPercentage, out double nonEscortPercentage); // school bus is a special case - use HOV3 impedance { IPathTypeModel pathTypeExtra = pathTypeModels.First(x => x.Mode == Global.Settings.Modes.Hov3); int modeExtra = Global.Settings.Modes.SchoolBus; bool availableExtra = pathTypeExtra.Available; double generalizedTimeLogsumExtra = pathTypeExtra.GeneralizedTimeLogsum; ChoiceProbabilityCalculator.Alternative alternative = choiceProbabilityCalculator.GetAlternative(modeExtra, availableExtra, choice == modeExtra); alternative.Choice = modeExtra; alternative.AddNestedAlternative(_nestedAlternativeIds[modeExtra], _nestedAlternativeIndexes[modeExtra], THETA_PARAMETER); if (availableExtra) { // case Global.Settings.Modes.SchoolBus: alternative.AddUtilityTerm(2, generalizedTimeLogsumExtra * tour.TimeCoefficient); alternative.AddUtilityTerm(10, 1); alternative.AddUtilityTerm(11, noCarsInHouseholdFlag); // for calibration alternative.AddUtilityTerm(13, carsLessThanDriversFlag); // for calibration alternative.AddUtilityTerm(17, childUnder5Flag); alternative.AddUtilityTerm(18, adultFlag); } } foreach (IPathTypeModel pathTypeModel in pathTypeModels) { int mode = pathTypeModel.Mode; bool available = (pathTypeModel.Mode != Global.Settings.Modes.ParkAndRide || Global.Configuration.IncludeParkAndRideInSchoolTourModeModel) && (pathTypeModel.Mode != Global.Settings.Modes.PaidRideShare || Global.Configuration.PaidRideShareModeIsAvailable) && pathTypeModel.Available; double generalizedTimeLogsum = pathTypeModel.GeneralizedTimeLogsum; ChoiceProbabilityCalculator.Alternative alternative = choiceProbabilityCalculator.GetAlternative(mode, available, choice == mode); alternative.Choice = mode; alternative.AddNestedAlternative(_nestedAlternativeIds[mode], _nestedAlternativeIndexes[mode], THETA_PARAMETER); if (!available) { continue; } double modeTimeCoefficient = (Global.Configuration.AV_IncludeAutoTypeChoice && household.OwnsAutomatedVehicles > 0 && mode >= Global.Settings.Modes.Sov && mode <= Global.Settings.Modes.Hov3) ? tour.TimeCoefficient * (1.0 - Global.Configuration.AV_InVehicleTimeCoefficientDiscountFactor) : (mode == Global.Settings.Modes.PaidRideShare && Global.Configuration.AV_PaidRideShareModeUsesAVs) ? tour.TimeCoefficient * (1.0 - Global.Configuration.AV_InVehicleTimeCoefficientDiscountFactor) : tour.TimeCoefficient; alternative.AddUtilityTerm(2, generalizedTimeLogsum * modeTimeCoefficient); if (mode == Global.Settings.Modes.ParkAndRide) { alternative.AddUtilityTerm(5, 1); alternative.AddUtilityTerm(6, noCarsInHouseholdFlag); alternative.AddUtilityTerm(7, carsLessThanWorkersFlag); alternative.AddUtilityTerm(129, destinationParcel.MixedUse2Index1()); } else if (mode == Global.Settings.Modes.Transit) { alternative.AddUtilityTerm(20, 1); alternative.AddUtilityTerm(21, noCarsInHouseholdFlag); alternative.AddUtilityTerm(22, carsLessThanDriversFlag); alternative.AddUtilityTerm(27, childUnder5Flag); alternative.AddUtilityTerm(28, adultFlag); alternative.AddUtilityTerm(29, drivingAgeStudentFlag); alternative.AddUtilityTerm(129, destinationParcel.MixedUse2Index1()); alternative.AddUtilityTerm(128, destinationParcel.TotalEmploymentDensity1()); alternative.AddUtilityTerm(123, (tour.OriginParcel.DistanceToFerry > 0 && tour.OriginParcel.DistanceToFerry <= 0.5).ToFlag()); alternative.AddUtilityTerm(124, (destinationParcel.DistanceToFerry > 0 && destinationParcel.DistanceToFerry <= 0.5).ToFlag()); //alternative.AddUtilityTerm(125, 0.001 * originParcel.NetIntersectionDensity1() // + 0.0001 * originParcel.HouseholdDensity1() // + 1.0 * originParcel.MixedUse4Index1()); //alternative.AddUtilityTerm(126, 1.0 * destinationParcel.MixedUse4Index1() // + 0.00001 * destinationParcel.TotalEmploymentDensity1() // + 0.001 * destinationParcel.NetIntersectionDensity1()); // alternative.AddUtilityTerm(127, destinationParcel.NetIntersectionDensity1()); // alternative.AddUtilityTerm(126, originParcel.NetIntersectionDensity1()); // alternative.AddUtilityTerm(125, originParcel.HouseholdDensity1()); // alternative.AddUtilityTerm(124, originParcel.MixedUse2Index1()); // alternative.AddUtilityTerm(123, Math.Log(destinationParcel.StopsTransitBuffer1+1)); alternative.AddUtilityTerm(122, Math.Log(originParcel.StopsTransitBuffer1 + 1)); } else if (mode == Global.Settings.Modes.Hov3) { alternative.AddUtilityTerm(1, (destinationParkingCost * tour.CostCoefficient / ChoiceModelUtility.CPFACT3)); alternative.AddUtilityTerm(30, 1); alternative.AddUtilityTerm(37, twoPersonHouseholdFlag); alternative.AddUtilityTerm(37, onePersonHouseholdFlag); alternative.AddUtilityTerm(36, noCarsInHouseholdFlag); // for calibration of hov3 vs hov2 alternative.AddUtilityTerm(35, carsLessThanDriversFlag); // for calibration of hov3 vs hov2 alternative.AddUtilityTerm(41, noCarsInHouseholdFlag); alternative.AddUtilityTerm(44, income0To25KFlag); alternative.AddUtilityTerm(45, income25To50KFlag); alternative.AddUtilityTerm(47, childUnder5Flag); alternative.AddUtilityTerm(133, escortPercentage); alternative.AddUtilityTerm(134, nonEscortPercentage); } else if (mode == Global.Settings.Modes.Hov2) { alternative.AddUtilityTerm(1, (destinationParkingCost * tour.CostCoefficient / ChoiceModelUtility.CPFACT2)); alternative.AddUtilityTerm(38, onePersonHouseholdFlag); alternative.AddUtilityTerm(40, 1); alternative.AddUtilityTerm(41, noCarsInHouseholdFlag); alternative.AddUtilityTerm(42, carsLessThanDriversFlag); // for calibration alternative.AddUtilityTerm(44, income0To25KFlag); alternative.AddUtilityTerm(45, income25To50KFlag); alternative.AddUtilityTerm(47, childUnder5Flag); alternative.AddUtilityTerm(133, escortPercentage); alternative.AddUtilityTerm(134, nonEscortPercentage); } else if (mode == Global.Settings.Modes.Sov) { alternative.AddUtilityTerm(1, (destinationParkingCost * tour.CostCoefficient)); alternative.AddUtilityTerm(50, 1); alternative.AddUtilityTerm(52, carsLessThanDriversFlag); alternative.AddUtilityTerm(54, income0To25KFlag); alternative.AddUtilityTerm(56, income75KPlusFlag); alternative.AddUtilityTerm(59, drivingAgeStudentFlag); alternative.AddUtilityTerm(131, escortPercentage); alternative.AddUtilityTerm(132, nonEscortPercentage); } else if (mode == Global.Settings.Modes.Bike) { double class1Dist = Global.Configuration.PathImpedance_BikeUseTypeSpecificDistanceFractions ? ImpedanceRoster.GetValue("class1distance", mode, Global.Settings.PathTypes.FullNetwork, Global.Settings.ValueOfTimes.DefaultVot, tour.DestinationArrivalTime, originParcel, destinationParcel).Variable : 0; double class2Dist = Global.Configuration.PathImpedance_BikeUseTypeSpecificDistanceFractions ? ImpedanceRoster.GetValue("class2distance", mode, Global.Settings.PathTypes.FullNetwork, Global.Settings.ValueOfTimes.DefaultVot, tour.DestinationArrivalTime, originParcel, destinationParcel).Variable : 0; double worstDist = Global.Configuration.PathImpedance_BikeUseTypeSpecificDistanceFractions ? ImpedanceRoster.GetValue("worstdistance", mode, Global.Settings.PathTypes.FullNetwork, Global.Settings.ValueOfTimes.DefaultVot, tour.DestinationArrivalTime, originParcel, destinationParcel).Variable : 0; alternative.AddUtilityTerm(60, 1); alternative.AddUtilityTerm(61, maleFlag); alternative.AddUtilityTerm(67, noCarsInHouseholdFlag); //for calibration alternative.AddUtilityTerm(68, carsLessThanDriversFlag); //for calibration alternative.AddUtilityTerm(69, adultFlag); alternative.AddUtilityTerm(169, destinationParcel.MixedUse4Index1()); alternative.AddUtilityTerm(168, destinationParcel.TotalEmploymentDensity1()); alternative.AddUtilityTerm(167, destinationParcel.NetIntersectionDensity1()); alternative.AddUtilityTerm(166, originParcel.NetIntersectionDensity1()); alternative.AddUtilityTerm(165, originParcel.HouseholdDensity1()); alternative.AddUtilityTerm(164, originParcel.MixedUse4Index1()); alternative.AddUtilityTerm(161, (class1Dist > 0).ToFlag()); alternative.AddUtilityTerm(162, (class2Dist > 0).ToFlag()); alternative.AddUtilityTerm(163, (worstDist > 0).ToFlag()); alternative.AddUtilityTerm(170, 1.0 * destinationParcel.MixedUse4Index1() + 0.00002 * destinationParcel.TotalEmploymentDensity1() + 0.001 * destinationParcel.NetIntersectionDensity1() + 0.001 * originParcel.NetIntersectionDensity1() + 0.0002 * originParcel.HouseholdDensity1() + 1.0 * originParcel.MixedUse4Index1()); } else if (mode == Global.Settings.Modes.Walk) { alternative.AddUtilityTerm(70, 1); alternative.AddUtilityTerm(77, noCarsInHouseholdFlag); //for calibration alternative.AddUtilityTerm(78, carsLessThanDriversFlag); //for calibration alternative.AddUtilityTerm(79, adultFlag); alternative.AddUtilityTerm(179, destinationParcel.MixedUse4Index1()); alternative.AddUtilityTerm(178, destinationParcel.TotalEmploymentDensity1()); alternative.AddUtilityTerm(177, destinationParcel.NetIntersectionDensity1()); alternative.AddUtilityTerm(176, originParcel.NetIntersectionDensity1()); alternative.AddUtilityTerm(175, originParcel.HouseholdDensity1()); alternative.AddUtilityTerm(179, originParcel.MixedUse4Index1()); alternative.AddUtilityTerm(181, 1.0 * destinationParcel.MixedUse4Index1() + 0.00001 * destinationParcel.TotalEmploymentDensity1() + 0.001 * destinationParcel.NetIntersectionDensity1() + 0.001 * originParcel.NetIntersectionDensity1() + 0.0001 * originParcel.HouseholdDensity1() + 1.0 * originParcel.MixedUse4Index1()); } else if (mode == Global.Settings.Modes.PaidRideShare) { if (Global.Configuration.PaidRideshare_UseEstimatedInsteadOfAssertedCoefficients) { alternative.AddUtilityTerm(80, 1.0); alternative.AddUtilityTerm(81, noCarsInHouseholdFlag); //for calibration alternative.AddUtilityTerm(82, carsLessThanDriversFlag); //for calibration alternative.AddUtilityTerm(83, tour.Person.AgeIsBetween26And35.ToFlag()); alternative.AddUtilityTerm(83, tour.Person.AgeIsBetween18And25.ToFlag()); alternative.AddUtilityTerm(84, (tour.Person.Age < 18).ToFlag()); //alternative.AddUtilityTerm(81, tour.Person.AgeIsBetween26And35.ToFlag()); alternative.AddUtilityTerm(85, originParcel.HouseholdsBuffer2 + originParcel.StudentsUniversityBuffer2 + originParcel.EmploymentTotalBuffer2); alternative.AddUtilityTerm(86, destinationParcel.HouseholdsBuffer2 + destinationParcel.StudentsUniversityBuffer2 + destinationParcel.EmploymentTotalBuffer2); alternative.AddUtilityTerm(87, income0To25KFlag); alternative.AddUtilityTerm(88, incomeOver100Flag); } else { double modeConstant = Global.Configuration.AV_PaidRideShareModeUsesAVs ? Global.Configuration.AV_PaidRideShare_ModeConstant + Global.Configuration.AV_PaidRideShare_DensityCoefficient * Math.Min(originParcel.HouseholdsBuffer2 + originParcel.StudentsUniversityBuffer2 + originParcel.EmploymentTotalBuffer2, (Global.Configuration.PaidRideShare_DensityMeasureCapValue > 0) ? Global.Configuration.PaidRideShare_DensityMeasureCapValue : 6000) + Global.Configuration.AV_PaidRideShare_AVOwnerCoefficient * (household.OwnsAutomatedVehicles > 0).ToFlag() : Global.Configuration.PaidRideShare_ModeConstant + Global.Configuration.PaidRideShare_DensityCoefficient * Math.Min(originParcel.HouseholdsBuffer2 + originParcel.StudentsUniversityBuffer2 + originParcel.EmploymentTotalBuffer2, (Global.Configuration.PaidRideShare_DensityMeasureCapValue > 0) ? Global.Configuration.PaidRideShare_DensityMeasureCapValue : 6000); alternative.AddUtilityTerm(90, modeConstant); alternative.AddUtilityTerm(90, Global.Configuration.PaidRideShare_Age26to35Coefficient * tour.Person.AgeIsBetween26And35.ToFlag()); alternative.AddUtilityTerm(90, Global.Configuration.PaidRideShare_Age18to25Coefficient * tour.Person.AgeIsBetween18And25.ToFlag()); alternative.AddUtilityTerm(90, Global.Configuration.PaidRideShare_AgeOver65Coefficient * (tour.Person.Age >= 65).ToFlag()); } } RegionSpecificCustomizations(alternative, tour, pathTypeModel.PathType, mode, destinationParcel); } }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, ITourWrapper tour, int nCallsForTour, int choice = Constants.DEFAULT_VALUE) { IPersonWrapper person = tour.Person; IPersonDayWrapper personDay = tour.PersonDay; // var foodRetailServiceMedicalQtrMileLog = tour.DestinationParcel.FoodRetailServiceMedicalQtrMileLogBuffer1(); // var mixedUseIndex = tour.DestinationParcel.MixedUse4Index1(); double k8HighSchoolQtrMileLog = tour.DestinationParcel.K8HighSchoolQtrMileLogBuffer1(); int carOwnership = person.GetCarOwnershipSegment(); 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]; // 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(15, (nCallsForTour > 1).ToFlag()); alternative.AddUtilityTerm(16, Math.Log(personDay.HomeBasedTours)); alternative.AddUtilityTerm(18, personDay.TwoOrMoreWorkToursExist().ToFlag()); // alternative.AddUtility(19, notUsualWorkParcelFlag); alternative.AddUtilityTerm(22, noCarsFlag); alternative.AddUtilityTerm(23, carCompetitionFlag); alternative.AddUtilityTerm(32, workAggregateLogsum); // alternative.AddUtility(32, mixedUseIndex); alternative.AddNestedAlternative(11, 0, 50); // WORK alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Work, personDay.WorkStops > 0, choice == Global.Settings.Purposes.Work); alternative.Choice = Global.Settings.Purposes.Work; alternative.AddUtilityTerm(1, 1); alternative.AddNestedAlternative(12, 1, 50); // SCHOOL alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.School, personDay.SchoolStops > 0, choice == Global.Settings.Purposes.School); alternative.Choice = Global.Settings.Purposes.School; alternative.AddUtilityTerm(3, 1); alternative.AddNestedAlternative(12, 1, 50); // ESCORT alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Escort, personDay.EscortStops > 0, choice == Global.Settings.Purposes.Escort); alternative.Choice = Global.Settings.Purposes.Escort; alternative.AddUtilityTerm(4, 1); alternative.AddUtilityTerm(39, k8HighSchoolQtrMileLog); alternative.AddNestedAlternative(12, 1, 50); // 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(6, 1); alternative.AddNestedAlternative(12, 1, 50); // SHOPPING alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Shopping, personDay.ShoppingStops > 0, choice == Global.Settings.Purposes.Shopping); alternative.Choice = Global.Settings.Purposes.Shopping; alternative.AddUtilityTerm(8, 1); alternative.AddNestedAlternative(12, 1, 50); // MEAL alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Meal, personDay.MealStops > 0, choice == Global.Settings.Purposes.Meal); alternative.Choice = Global.Settings.Purposes.Meal; alternative.AddUtilityTerm(10, 1); alternative.AddNestedAlternative(12, 1, 50); // SOCIAL alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Social, personDay.SocialStops > 0, choice == Global.Settings.Purposes.Social); alternative.Choice = Global.Settings.Purposes.Social; alternative.AddUtilityTerm(13, 1); alternative.AddNestedAlternative(12, 1, 50); }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, IHouseholdDayWrapper householdDay, ITourWrapper tour, IParcelWrapper destinationParcel, int householdCars, int constrainedMode, int constrainedArrivalTime, int constrainedDepartureTime, HTourModeTime choice = null) { IHouseholdWrapper household = tour.Household; IPersonWrapper person = tour.Person; IPersonDayWrapper personDay = tour.PersonDay; IHouseholdTotals householdTotals = household.HouseholdTotals; // household inputs int childrenUnder5 = householdTotals.ChildrenUnder5; int childrenAge5Through15 = householdTotals.ChildrenAge5Through15; int nonworkingAdults = householdTotals.NonworkingAdults; int retiredAdults = householdTotals.RetiredAdults; int onePersonHouseholdFlag = household.IsOnePersonHousehold.ToFlag(); int twoPersonHouseholdFlag = household.IsTwoPersonHousehold.ToFlag(); //var householdCars = household.VehiclesAvailable; MABADD now an input parameter int noCarsInHouseholdFlag = household.GetFlagForNoCarsInHousehold(householdCars); int carsLessThanDriversFlag = household.GetFlagForCarsLessThanDrivers(householdCars); int carsLessThanWorkersFlag = household.GetFlagForCarsLessThanWorkers(householdCars); int income0To25KFlag = household.Has0To25KIncome.ToFlag(); int income100KPlusFlag = household.Has100KPlusIncome.ToFlag(); // person inputs int partTimeWorkerFlag = person.IsPartTimeWorker.ToFlag(); int nonworkingAdultFlag = person.IsNonworkingAdult.ToFlag(); int universityStudentFlag = person.IsUniversityStudent.ToFlag(); int retiredAdultFlag = person.IsRetiredAdult.ToFlag(); int drivingAgeStudentFlag = person.IsDrivingAgeStudent.ToFlag(); int fulltimeWorkerFlag = person.IsFulltimeWorker.ToFlag(); int childAge5Through15Flag = person.IsChildAge5Through15.ToFlag(); int childUnder5Flag = person.IsChildUnder5.ToFlag(); int maleFlag = person.IsMale.ToFlag(); int ageUnder30Flag = person.AgeIsLessThan30.ToFlag(); int ageBetween51And98Flag = person.AgeIsBetween51And98.ToFlag(); int adultFlag = person.IsAdult.ToFlag(); // person-day inputs int homeBasedToursOnlyFlag = (personDay == null) ? 1 : personDay.OnlyHomeBasedToursExist().ToFlag(); int firstSimulatedHomeBasedTourFlag = (personDay == null) ? 1 : personDay.IsFirstSimulatedHomeBasedTour().ToFlag(); int laterSimulatedHomeBasedTourFlag = (personDay == null) ? 0 : personDay.IsLaterSimulatedHomeBasedTour().ToFlag(); int totalStops = (personDay == null) ? 0 : personDay.GetTotalStops(); int totalSimulatedStops = (personDay == null) ? 0 : personDay.GetTotalSimulatedStops(); int escortStops = (personDay == null) ? 0 : personDay.EscortStops; int homeBasedTours = (personDay == null) ? 1 : personDay.HomeBasedTours; int simulatedHomeBasedTours = (personDay == null) ? 0 : personDay.SimulatedHomeBasedTours; // tour inputs int escortTourFlag = tour.IsEscortPurpose().ToFlag(); int shoppingTourFlag = tour.IsShoppingPurpose().ToFlag(); int mealTourFlag = tour.IsMealPurpose().ToFlag(); int socialTourFlag = tour.IsSocialPurpose().ToFlag(); int personalBusinessTourFlag = tour.IsPersonalBusinessPurpose().ToFlag(); int recreationTourFlag = tour.IsRecreationPurpose().ToFlag(); int medicalTourFlag = tour.IsMedicalPurpose().ToFlag(); IParcelWrapper originParcel = tour.OriginParcel; //var destinationParcel = tour.DestinationParcel; MABADD now an input parameter int jointTourFlag = (tour.JointTourSequence > 0) ? 1 : 0; int partialHalfTour1Flag = (tour.PartialHalfTour1Sequence > 0) ? 1 : 0; int partialHalfTour2Flag = (tour.PartialHalfTour2Sequence > 0) ? 1 : 0; bool partialHalfTour = (tour.PartialHalfTour1Sequence > 0 || tour.PartialHalfTour2Sequence > 0); int fullHalfTour1Flag = (tour.FullHalfTour1Sequence > 0) ? 1 : 0; int fullHalfTour2Flag = (tour.FullHalfTour2Sequence > 0) ? 1 : 0; int parentTourMode = tour.ParentTour == null ? 0 : tour.ParentTour.Mode; // remaining inputs // Higher priority tour of 2+ tours for the same purpose int highPrioritySameFlag = (personDay == null) ? 1 : (tour.GetTotalToursByPurpose() > tour.GetTotalSimulatedToursByPurpose() && tour.GetTotalSimulatedToursByPurpose() == 1).ToFlag(); // Lower priority tour(s) of 2+ tours for the same purpose int lowPrioritySameFlag = (personDay == null) ? 0 : (tour.GetTotalSimulatedToursByPurpose() > 1).ToFlag(); // Higher priority tour of 2+ tours for different purposes int highPriorityDifferentFlag = (personDay == null) ? 0 : (personDay.IsFirstSimulatedHomeBasedTour() && personDay.HomeBasedToursExist()).ToFlag() * (1 - highPrioritySameFlag); // Lower priority tour of 2+ tours for different purposes int lowPriorityDifferentFlag = (personDay == null) ? 0 : (personDay.IsLaterSimulatedHomeBasedTour() && personDay.HomeBasedToursExist()).ToFlag() * (1 - lowPrioritySameFlag); ITimeWindow timeWindow = (householdDay == null) ? new TimeWindow() : tour.GetRelevantTimeWindow(householdDay); int totalMinutesAvailableInDay = timeWindow.TotalAvailableMinutes(1, 1440); int bigPeriodCount = DayPeriod.H_BIG_DAY_PERIOD_TOTAL_TOUR_TIMES; int nPeriodCombs = bigPeriodCount * (bigPeriodCount + 1) / 2; bool useTimeComponents = Global.Configuration.IsInEstimationMode || constrainedArrivalTime == 0 || constrainedDepartureTime == 0; int componentIndex = 0; int periodComb = -1; //set components if (useTimeComponents) { for (int arrivalPeriodIndex = 0; arrivalPeriodIndex < bigPeriodCount; arrivalPeriodIndex++) { MinuteSpan arrivalPeriod = DayPeriod.HBigDayPeriods[arrivalPeriodIndex]; int arrivalPeriodAvailableMinutes = timeWindow.TotalAvailableMinutes(arrivalPeriod.Start, arrivalPeriod.End); for (int departurePeriodIndex = arrivalPeriodIndex; departurePeriodIndex < bigPeriodCount; departurePeriodIndex++) { MinuteSpan departurePeriod = DayPeriod.HBigDayPeriods[departurePeriodIndex]; int departurePeriodAvailableMinutes = timeWindow.TotalAvailableMinutes(departurePeriod.Start, departurePeriod.End); if (arrivalPeriod == departurePeriod) { componentIndex = arrivalPeriodIndex; choiceProbabilityCalculator.CreateUtilityComponent(componentIndex); ChoiceProbabilityCalculator.Component arrivalComponent = choiceProbabilityCalculator.GetUtilityComponent(componentIndex); if (arrivalPeriodAvailableMinutes > 0) { double hoursArrival = arrivalPeriod.Middle / 60.0; int firstCoef = 300; arrivalComponent.AddUtilityTerm(300, Math.Log(arrivalPeriodAvailableMinutes)); //arrival shift variables arrivalComponent.AddUtilityTerm(firstCoef + 2, partTimeWorkerFlag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 3, nonworkingAdultFlag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 4, universityStudentFlag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 5, retiredAdultFlag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 6, drivingAgeStudentFlag * hoursArrival); // arrivalComponent.AddUtilityTerm(firstCoef + 7, childAge5Through15Flag * hoursArrival); // arrivalComponent.AddUtilityTerm(firstCoef + 8, childUnder5Flag * hoursArrival); // arrivalComponent.AddUtilityTerm(firstCoef + 9, escortTourFlag * hoursArrival); // arrivalComponent.AddUtilityTerm(firstCoef + 10, shoppingTourFlag * hoursArrival); // arrivalComponent.AddUtilityTerm(firstCoef + 11, mealTourFlag * hoursArrival); // arrivalComponent.AddUtilityTerm(firstCoef + 12, socialTourFlag * hoursArrival); // arrivalComponent.AddUtilityTerm(firstCoef + 13, personalBusinessTourFlag * hoursArrival); // arrivalComponent.AddUtilityTerm(firstCoef + 14, recreationTourFlag * hoursArrival); // arrivalComponent.AddUtilityTerm(firstCoef + 15, medicalTourFlag * hoursArrival); // arrivalComponent.AddUtilityTerm(firstCoef + 16, income0To25KFlag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 17, income100KPlusFlag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 18, highPrioritySameFlag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 19, lowPrioritySameFlag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 20, highPriorityDifferentFlag * hoursArrival); // arrivalComponent.AddUtilityTerm(firstCoef + 21, lowPriorityDifferentFlag * hoursArrival); // arrivalComponent.AddUtilityTerm(firstCoef + 22, jointTourFlag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 23, partialHalfTour1Flag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 24, fullHalfTour1Flag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 25, partialHalfTour2Flag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 26, fullHalfTour2Flag * hoursArrival); } componentIndex = bigPeriodCount + departurePeriodIndex; choiceProbabilityCalculator.CreateUtilityComponent(componentIndex); ChoiceProbabilityCalculator.Component departureComponent = choiceProbabilityCalculator.GetUtilityComponent(componentIndex); if (departurePeriodAvailableMinutes > 0) { departureComponent.AddUtilityTerm(300, Math.Log(departurePeriodAvailableMinutes)); } } // set period combination component periodComb++; componentIndex = 2 * bigPeriodCount + periodComb; choiceProbabilityCalculator.CreateUtilityComponent(componentIndex); ChoiceProbabilityCalculator.Component combinationComponent = choiceProbabilityCalculator.GetUtilityComponent(componentIndex); if (arrivalPeriodAvailableMinutes > 0 && departurePeriodAvailableMinutes > 0) { double hoursDuration = (departurePeriod.Middle - arrivalPeriod.Middle) / 60.0; int firstCoef = 700; //combination constants combinationComponent.AddUtilityTerm(firstCoef + periodComb, 1.0); // duration shift variables // combinationComponent.AddUtilityTerm(firstCoef + 31, escortTourFlag * hoursDuration); // combinationComponent.AddUtilityTerm(firstCoef + 32, shoppingTourFlag * hoursDuration); // combinationComponent.AddUtilityTerm(firstCoef + 33, mealTourFlag * hoursDuration); // combinationComponent.AddUtilityTerm(firstCoef + 34, socialTourFlag * hoursDuration); // combinationComponent.AddUtilityTerm(firstCoef + 35, personalBusinessTourFlag * hoursDuration); // combinationComponent.AddUtilityTerm(firstCoef + 36, recreationTourFlag * hoursDuration); // combinationComponent.AddUtilityTerm(firstCoef + 37, medicalTourFlag * hoursDuration); combinationComponent.AddUtilityTerm(firstCoef + 38, highPrioritySameFlag * hoursDuration); combinationComponent.AddUtilityTerm(firstCoef + 39, lowPrioritySameFlag * hoursDuration); combinationComponent.AddUtilityTerm(firstCoef + 40, highPriorityDifferentFlag * hoursDuration); // combinationComponent.AddUtilityTerm(firstCoef + 41, lowPriorityDifferentFlag * hoursDuration); combinationComponent.AddUtilityTerm(firstCoef + 42, partTimeWorkerFlag * hoursDuration); // combinationComponent.AddUtilityTerm(firstCoef + 43, jointTourFlag * hoursDuration); combinationComponent.AddUtilityTerm(firstCoef + 44, partialHalfTour1Flag * hoursDuration); combinationComponent.AddUtilityTerm(firstCoef + 45, fullHalfTour1Flag * hoursDuration); combinationComponent.AddUtilityTerm(firstCoef + 46, partialHalfTour2Flag * hoursDuration); combinationComponent.AddUtilityTerm(firstCoef + 47, fullHalfTour2Flag * hoursDuration); // peak-to-peak variables if (arrivalPeriod.Index == DayPeriod.AM_PEAK && departurePeriod.Index == DayPeriod.PM_PEAK) { combinationComponent.AddUtilityTerm(firstCoef + 48, fulltimeWorkerFlag); combinationComponent.AddUtilityTerm(firstCoef + 49, income0To25KFlag); combinationComponent.AddUtilityTerm(firstCoef + 50, income100KPlusFlag); } } } } } for (int mode = Global.Settings.Modes.Walk; mode <= Global.Settings.Modes.WalkRideBike; mode++) { componentIndex = 2 * bigPeriodCount + nPeriodCombs + mode - 1; choiceProbabilityCalculator.CreateUtilityComponent(componentIndex); ChoiceProbabilityCalculator.Component modeComponent = choiceProbabilityCalculator.GetUtilityComponent(componentIndex); if (mode == Global.Settings.Modes.Walk) { modeComponent.AddUtilityTerm(70, 1.0); modeComponent.AddUtilityTerm(71, maleFlag); // modeComponent.AddUtilityTerm(72, ageUnder30Flag); // modeComponent.AddUtilityTerm(73, ageBetween51And98Flag); // modeComponent.AddUtilityTerm(74, income0To25KFlag); modeComponent.AddUtilityTerm(75, income100KPlusFlag); // modeComponent.AddUtilityTerm(76, noCarsInHouseholdFlag); modeComponent.AddUtilityTerm(77, carsLessThanDriversFlag); modeComponent.AddUtilityTerm(179, destinationParcel.MixedUse4Index1()); modeComponent.AddUtilityTerm(179, destinationParcel.TotalEmploymentDensity1() / 5000.0); modeComponent.AddUtilityTerm(179, destinationParcel.NetIntersectionDensity1() / 50.0); modeComponent.AddUtilityTerm(179, originParcel.NetIntersectionDensity1() / 50.0); modeComponent.AddUtilityTerm(179, originParcel.HouseholdDensity1() / 1000.0); modeComponent.AddUtilityTerm(179, originParcel.MixedUse4Index1()); } else if (mode == Global.Settings.Modes.Bike) { modeComponent.AddUtilityTerm(60, 1); modeComponent.AddUtilityTerm(61, maleFlag); modeComponent.AddUtilityTerm(62, ageUnder30Flag); modeComponent.AddUtilityTerm(63, ageBetween51And98Flag); modeComponent.AddUtilityTerm(64, income0To25KFlag); // modeComponent.AddUtilityTerm(65, income100KPlusFlag); // modeComponent.AddUtilityTerm(66, noCarsInHouseholdFlag); modeComponent.AddUtilityTerm(67, carsLessThanDriversFlag); modeComponent.AddUtilityTerm(169, destinationParcel.MixedUse4Index2()); modeComponent.AddUtilityTerm(169, destinationParcel.TotalEmploymentDensity2() / 20000.0); modeComponent.AddUtilityTerm(169, destinationParcel.NetIntersectionDensity2() / 200.0); modeComponent.AddUtilityTerm(164, originParcel.NetIntersectionDensity2() / 200.0); modeComponent.AddUtilityTerm(164, originParcel.HouseholdDensity2() / 4000.0); modeComponent.AddUtilityTerm(164, originParcel.MixedUse4Index2()); } else if (mode == Global.Settings.Modes.Sov) { // modeComponent.AddUtilityTerm(50, 1); modeComponent.AddUtilityTerm(54, income0To25KFlag); // modeComponent.AddUtilityTerm(55, income100KPlusFlag); modeComponent.AddUtilityTerm(57, carsLessThanWorkersFlag); } else if (mode == Global.Settings.Modes.HovDriver) { modeComponent.AddUtilityTerm(31, childrenUnder5); modeComponent.AddUtilityTerm(32, childrenAge5Through15); modeComponent.AddUtilityTerm(34, nonworkingAdults + retiredAdults); modeComponent.AddUtilityTerm(36, noCarsInHouseholdFlag); modeComponent.AddUtilityTerm(37, carsLessThanDriversFlag); modeComponent.AddUtilityTerm(40, 1); modeComponent.AddUtilityTerm(41, onePersonHouseholdFlag); } else if (mode == Global.Settings.Modes.HovPassenger) { modeComponent.AddUtilityTerm(30, 1); modeComponent.AddUtilityTerm(31, childrenUnder5); modeComponent.AddUtilityTerm(32, childrenAge5Through15); modeComponent.AddUtilityTerm(34, nonworkingAdults + retiredAdults); modeComponent.AddUtilityTerm(38, onePersonHouseholdFlag); modeComponent.AddUtilityTerm(39, twoPersonHouseholdFlag); modeComponent.AddUtilityTerm(36, noCarsInHouseholdFlag); modeComponent.AddUtilityTerm(37, carsLessThanDriversFlag); } else if (mode == Global.Settings.Modes.Transit) { modeComponent.AddUtilityTerm(20, 1); modeComponent.AddUtilityTerm(21, maleFlag); modeComponent.AddUtilityTerm(22, ageUnder30Flag); // modeComponent.AddUtilityTerm(23, ageBetween51And98Flag); modeComponent.AddUtilityTerm(24, income0To25KFlag); modeComponent.AddUtilityTerm(25, income100KPlusFlag); modeComponent.AddUtilityTerm(26, noCarsInHouseholdFlag); modeComponent.AddUtilityTerm(27, carsLessThanDriversFlag); modeComponent.AddUtilityTerm(129, destinationParcel.MixedUse2Index1()); modeComponent.AddUtilityTerm(129, destinationParcel.TotalEmploymentDensity1() / 5000.0); modeComponent.AddUtilityTerm(129, destinationParcel.NetIntersectionDensity1() / 50.0); modeComponent.AddUtilityTerm(124, originParcel.NetIntersectionDensity1() / 50.0); modeComponent.AddUtilityTerm(124, originParcel.HouseholdDensity1() / 1000.0); modeComponent.AddUtilityTerm(124, originParcel.MixedUse2Index1()); modeComponent.AddUtilityTerm(123, Math.Log(destinationParcel.StopsTransitBuffer1 + 1)); modeComponent.AddUtilityTerm(122, Math.Log(originParcel.StopsTransitBuffer1 + 1)); } else if (mode == Global.Settings.Modes.CarParkRideWalk) { modeComponent.AddUtilityTerm(10, 1); modeComponent.AddUtilityTerm(16, noCarsInHouseholdFlag); modeComponent.AddUtilityTerm(17, carsLessThanWorkersFlag); modeComponent.AddUtilityTerm(129, destinationParcel.MixedUse2Index1()); modeComponent.AddUtilityTerm(129, destinationParcel.TotalEmploymentDensity1() / 5000.0); modeComponent.AddUtilityTerm(129, destinationParcel.NetIntersectionDensity1() / 50.0); modeComponent.AddUtilityTerm(123, Math.Log(destinationParcel.StopsTransitBuffer1 + 1)); } // JLB 201508 Need to provide mode-specific constants and add any other needed mode-specific terms else if (mode == Global.Settings.Modes.CarKissRideWalk) { modeComponent.AddUtilityTerm(10, 1); } else if (mode == Global.Settings.Modes.BikeParkRideWalk) { modeComponent.AddUtilityTerm(10, 1); } else if (mode == Global.Settings.Modes.BikeParkRideBike) { modeComponent.AddUtilityTerm(10, 1); } else if (mode == Global.Settings.Modes.BikeOnTransit) { modeComponent.AddUtilityTerm(10, 1); } else if (mode == Global.Settings.Modes.CarParkRideBike) { modeComponent.AddUtilityTerm(10, 1); } else if (mode == Global.Settings.Modes.WalkRideBike) { modeComponent.AddUtilityTerm(10, 1); } // JLB 201508 may need to enhance next block to accommodate new transit modes if (mode == Global.Settings.Modes.Walk || mode == Global.Settings.Modes.Bike || mode == Global.Settings.Modes.Hov2 || mode == Global.Settings.Modes.Hov3 || mode == Global.Settings.Modes.Transit) { int firstCoef = 200 + 10 * mode; // modeComponent.AddUtilityTerm(firstCoef + 0, escortTourFlag); // modeComponent.AddUtilityTerm(firstCoef + 1, shoppingTourFlag); // modeComponent.AddUtilityTerm(firstCoef + 2, mealTourFlag); // modeComponent.AddUtilityTerm(firstCoef + 3, socialTourFlag); // modeComponent.AddUtilityTerm(firstCoef + 4, personalBusinessTourFlag); // modeComponent.AddUtilityTerm(firstCoef + 5, recreationTourFlag); // modeComponent.AddUtilityTerm(firstCoef + 6, medicalTourFlag); // modeComponent.AddUtilityTerm(firstCoef + 7, jointTourFlag); modeComponent.AddUtilityTerm(firstCoef + 8, Math.Min(partialHalfTour1Flag + partialHalfTour2Flag, 1.0)); modeComponent.AddUtilityTerm(firstCoef + 9, Math.Min(fullHalfTour1Flag + fullHalfTour2Flag, 1.0)); // modeComponent.AddUtilityTerm(290+mode, mode == parentTourMode ? 1:0 ); } // modeComponent.AddUtilityTerm(298, mode>=Global.Settings.Modes.Sov && mode<=Global.Settings.Modes.Hov3 && parentTourMode==Global.Settings.Modes.Sov ? 1:0 ); // modeComponent.AddUtilityTerm(299, mode>=Global.Settings.Modes.Sov && mode<=Global.Settings.Modes.Hov3 && parentTourMode>=Global.Settings.Modes.Hov2 && parentTourMode<=Global.Settings.Modes.Hov3 ? 1:0 ); } //loop on all alternatives, using modeTimes objects { foreach (HTourModeTime modeTimes in HTourModeTime.ModeTimes[ParallelUtility.threadLocalAssignedIndex.Value]) { MinuteSpan arrivalPeriod = modeTimes.ArrivalPeriod; int arrivalPeriodAvailableMinutes = timeWindow.TotalAvailableMinutes(arrivalPeriod.Start, arrivalPeriod.End); MinuteSpan departurePeriod = modeTimes.DeparturePeriod; int departurePeriodAvailableMinutes = timeWindow.TotalAvailableMinutes(departurePeriod.Start, departurePeriod.End); periodComb = modeTimes.PeriodCombinationIndex; int mode = modeTimes.Mode; int altIndex = modeTimes.Index; //set availabillity based on time window variables and any constrained choices bool available = (modeTimes.LongestFeasibleWindow != null) && (mode > 0) //&& (mode <= Global.Settings.Modes.Transit) //JLB 201508 commented out to make transit combo modes available && (person.Age >= 18 || (modeTimes.Mode != Global.Settings.Modes.Sov && modeTimes.Mode != Global.Settings.Modes.HovDriver)) //TODO JLB 201508 may need to adjust the followign line to allow transit combo or other modes modes on partial half tour mode choice: line currently prohibits them as well as SOV and HOVPassenger && (constrainedMode > 0 || mode == Global.Settings.Modes.Walk || mode == Global.Settings.Modes.Bike || mode == Global.Settings.Modes.HovDriver || mode == Global.Settings.Modes.Transit || !partialHalfTour) && (constrainedMode <= 0 || constrainedMode == mode) && (constrainedArrivalTime <= 0 || (constrainedArrivalTime >= arrivalPeriod.Start && constrainedArrivalTime <= arrivalPeriod.End)) && (constrainedDepartureTime <= 0 || (constrainedDepartureTime >= departurePeriod.Start && constrainedDepartureTime <= departurePeriod.End)); ChoiceProbabilityCalculator.Alternative alternative = choiceProbabilityCalculator.GetAlternative(altIndex, available, choice != null && choice.Index == altIndex); alternative.Choice = modeTimes; // JLB added 20130420 alternative.AddNestedAlternative(HTourModeTime.TotalTourModeTimes + periodComb + 1, periodComb, THETA_PARAMETER); if (Global.Configuration.IsInEstimationMode && choice != null && altIndex == choice.Index) { Global.PrintFile.WriteLine("Aper Dper Mode {0} {1} {2} Travel Times {3} {4} Window {5} {6}", arrivalPeriod.Index, departurePeriod.Index, mode, modeTimes.ModeAvailableToDestination ? modeTimes.TravelTimeToDestination : -1, modeTimes.ModeAvailableFromDestination ? modeTimes.TravelTimeFromDestination : -1, modeTimes.LongestFeasibleWindow != null ? modeTimes.LongestFeasibleWindow.Start : -1, modeTimes.LongestFeasibleWindow != null ? modeTimes.LongestFeasibleWindow.End : -1); } /* if (altIndex == 0) * { * alternative.AddUtilityTerm(991, tour.Household.Id); * alternative.AddUtilityTerm(992, tour.Person.Id); * alternative.AddUtilityTerm(993, tour.PersonDay.Day); * alternative.AddUtilityTerm(994, tour.Sequence); * alternative.AddUtilityTerm(995, constrainedMode); * alternative.AddUtilityTerm(996, constrainedArrivalTime); * alternative.AddUtilityTerm(997, constrainedDepartureTime); * alternative.AddUtilityTerm(998, tour.DestinationPurpose); * alternative.AddUtilityTerm(999, (tour.ParentTour == null) ? 0 : 1); * } */ //if in application mode and combination is not available, can skip the rest if (!Global.Configuration.IsInEstimationMode && !alternative.Available) { continue; } if (useTimeComponents) { // arrival period utility component alternative.AddUtilityComponent(choiceProbabilityCalculator.GetUtilityComponent(arrivalPeriod.Index)); // departure period utility component alternative.AddUtilityComponent( choiceProbabilityCalculator.GetUtilityComponent(bigPeriodCount + departurePeriod.Index)); // period combination utility component alternative.AddUtilityComponent(choiceProbabilityCalculator.GetUtilityComponent(2 * bigPeriodCount + periodComb)); } // mode utility component alternative.AddUtilityComponent( choiceProbabilityCalculator.GetUtilityComponent(2 * bigPeriodCount + nPeriodCombs + mode - 1)); //even in estimation mode, do not need the rest of the code if not available if (!alternative.Available) { continue; } // set parking cost for period combination double parkingDuration = (departurePeriod == arrivalPeriod ? (arrivalPeriod.End - arrivalPeriod.Start) / 2.0 : departurePeriod.Middle - arrivalPeriod.Middle) / 60.0; // parking at work is free if no paid parking at work and tour goes to usual workplace //TODO JLB 20150827 Check to see if parkign cost is included in HTourModeTime impedance. If so, drop it here. otherwise fix this to use TOD-based parking cost. double destinationParkingCost = (!Global.Configuration.IsInEstimationMode && Global.Configuration.ShouldRunPayToParkAtWorkplaceModel && tour.Person.UsualWorkParcel != null && destinationParcel == tour.Person.UsualWorkParcel && person.PaidParkingAtWorkplace == 0) ? 0.0 : destinationParcel.ParkingCostBuffer1(parkingDuration); double parkingCostFraction = (mode == Global.Settings.Modes.Sov) ? 1.0 : (mode == Global.Settings.Modes.Hov2) ? 1.0 / Global.Configuration.Coefficients_HOV2CostDivisor_Work : (mode == Global.Settings.Modes.Hov3) ? 1.0 / Global.Configuration.Coefficients_HOV3CostDivisor_Work : 0.0; double minimumTimeNeeded = modeTimes.TravelTimeToDestination + modeTimes.TravelTimeFromDestination + Global.Settings.Times.MinimumActivityDuration; alternative.AddUtilityTerm(1, modeTimes.GeneralizedTimeToDestination + modeTimes.GeneralizedTimeFromDestination); alternative.AddUtilityTerm(2, destinationParkingCost * parkingCostFraction); //alternative.AddUtilityTerm(3, // Math.Log(Math.Min(1140, modeTimes.LongestFeasibleWindow.End - modeTimes.LongestFeasibleWindow.Start - // minimumTimeNeeded + 1.0))); // JLB 20140204 replaced coeff 3 with a different time window formulation: time pressure // instead of having positive utility for increasing time window, have negative utility for decreasing time window alternative.AddUtilityTerm(3, Math.Log(Math.Max(Constants.EPSILON, 1 - Math.Pow(minimumTimeNeeded / (Math.Min(1140, modeTimes.LongestFeasibleWindow.End - modeTimes.LongestFeasibleWindow.Start)), 0.4) ))); //alternative.AddUtilityTerm(4, Math.Log((totalMinutesAvailableInDay + 1.0)/(minimumTimeNeeded + 1.0))); //alternative.AddUtilityTerm(4, // Math.Log(Math.Max(Constants.EPSILON, 1 - minimumTimeNeeded/(Math.Min(1140, totalMinutesAvailableInDay))))); alternative.AddUtilityTerm(5, (maleFlag == 0 && mode == Global.Settings.Modes.Walk && arrivalPeriod.Index >= DayPeriod.EVENING) ? 1 : 0); alternative.AddUtilityTerm(5, (maleFlag == 0 && mode == Global.Settings.Modes.Walk && departurePeriod.Index >= DayPeriod.EVENING) ? 1 : 0); } } }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, PersonWrapper person, int sampleSize, IParcelWrapper choice = null, bool choseHome = false) { int segment = Global.ContainerDaySim.GetInstance <SamplingWeightsSettingsFactory>().SamplingWeightsSettings.GetTourDestinationSegment(Global.Settings.Purposes.Work, Global.Settings.TourPriorities.HomeBasedTour, Global.Settings.Modes.Sov, person.PersonType); DestinationSampler destinationSampler = new DestinationSampler(choiceProbabilityCalculator, segment, sampleSize, choice, person.Household.ResidenceParcel); int destinationArrivalTime = ChoiceModelUtility.GetDestinationArrivalTime(Global.Settings.Models.WorkTourModeModel); int destinationDepartureTime = ChoiceModelUtility.GetDestinationDepartureTime(Global.Settings.Models.WorkTourModeModel); WorkLocationUtilities workLocationUtilites = new WorkLocationUtilities(person, sampleSize, destinationArrivalTime, destinationDepartureTime); Dictionary <DestinationSampler.TourSampleItem, int> sampleItems = destinationSampler.SampleAndReturnTourDestinations(workLocationUtilites); int index = 0; foreach (KeyValuePair <DestinationSampler.TourSampleItem, int> sampleItem in sampleItems) { bool available = sampleItem.Key.Available; bool isChosen = sampleItem.Key.IsChosen; double adjustmentFactor = sampleItem.Key.AdjustmentFactor; IParcelWrapper destinationParcel = ChoiceModelFactory.Parcels[sampleItem.Key.ParcelId]; ChoiceProbabilityCalculator.Alternative alternative = choiceProbabilityCalculator.GetAlternative(index++, available, isChosen); if (!available) { continue; } alternative.Choice = destinationParcel; double workTourLogsum = 0D; //JLB 201602 //var nestedAlternative = Global.ChoiceModelSession.Get<WorkTourModeTimeModel>().RunNested(person, person.Household.ResidenceParcel, destinationParcel, destinationArrivalTime, destinationDepartureTime, person.Household.HouseholdTotals.DrivingAgeMembers, 0.0); ChoiceProbabilityCalculator.Alternative nestedAlternative = Global.ChoiceModelSession.Get <TourModeTimeModel>().RunNested(person, person.Household.ResidenceParcel, destinationParcel, destinationArrivalTime, destinationDepartureTime, person.Household.HouseholdTotals.DrivingAgeMembers, 0.0, Global.Settings.Purposes.Work); workTourLogsum = nestedAlternative == null ? 0 : nestedAlternative.ComputeLogsum(); int votSegment = person.Household.GetVotALSegment(); int taSegment = destinationParcel.TransitAccessSegment(); double aggregateLogsum = Global.AggregateLogsums[destinationParcel.ZoneId][Global.Settings.Purposes.HomeBasedComposite][Global.Settings.CarOwnerships.OneOrMoreCarsPerAdult][votSegment][taSegment]; double distanceFromOrigin = person.Household.ResidenceParcel.DistanceFromOrigin(destinationParcel, 1); double distance1 = Math.Min(distanceFromOrigin, .35); double distance2 = Math.Max(0, Math.Min(distanceFromOrigin - .35, 1 - .35)); double distance3 = Math.Max(0, distanceFromOrigin - 1); double distanceLog = Math.Log(1 + distanceFromOrigin); double distanceFromSchool = person.IsFullOrPartTimeWorker ? 0 : person.UsualSchoolParcel.DistanceFromSchoolLog(destinationParcel, 1); // parcel buffers double educationBuffer = Math.Log(destinationParcel.EmploymentEducationBuffer2 + 1); double governmentBuffer = Math.Log(destinationParcel.EmploymentGovernmentBuffer2 + 1); double officeBuffer = Math.Log(destinationParcel.EmploymentOfficeBuffer2 + 1); double serviceBuffer = Math.Log(destinationParcel.EmploymentServiceBuffer2 + 1); double householdsBuffer = Math.Log(destinationParcel.HouseholdsBuffer2 + 1); // var retailBuffer = Math.Log(destinationParcel.EmploymentRetailBuffer2 + 1); double industrialAgricultureConstructionBuffer = Math.Log(destinationParcel.EmploymentIndustrialBuffer2 + destinationParcel.EmploymentAgricultureConstructionBuffer2 + 1); double foodBuffer = Math.Log(destinationParcel.EmploymentFoodBuffer2 + 1); double medicalBuffer = Math.Log(destinationParcel.EmploymentMedicalBuffer2 + 1); double employmentTotalBuffer = Math.Log(destinationParcel.EmploymentTotalBuffer2 + 1); double studentsUniversityBuffer = Math.Log(destinationParcel.StudentsUniversityBuffer2 + 1); double studentsK12Buffer = Math.Log(destinationParcel.StudentsK8Buffer2 + destinationParcel.StudentsHighSchoolBuffer2 + 1); // var mixedUse4Index = destinationParcel.MixedUse4Index2(); //size attributes (derived) double employmentIndustrialAgricultureConstruction = destinationParcel.EmploymentIndustrial + destinationParcel.EmploymentAgricultureConstruction; // parking attributes double parcelParkingDensity = destinationParcel.ParcelParkingPerTotalEmployment(); // connectivity attributes double c34Ratio = destinationParcel.C34RatioBuffer1(); // Stefan bool isInCopenhagenMunicipality = true; //destinationParcel.Municipality == 101; Need to change this after Municipality property is added to Actum parcel file double employmentCommercial = destinationParcel.EmploymentRetail + destinationParcel.EmploymentService; double employmentCommercialBuffer1 = destinationParcel.EmploymentRetailBuffer1 + destinationParcel.EmploymentServiceBuffer1; double beta00002 = -2.53; double beta00003 = 2.65; double beta00004 = 1.57; double beta00005 = -0.18; double beta00006 = -0.43; double beta00007 = -0.19; double beta00008 = 0.33; double beta00009 = 0.007; double stefanUtility = beta00002 * destinationParcel.Households / destinationParcel.ThousandsSquareLengthUnits + beta00003 * (person.Household.Income < 300000).ToFlag() * destinationParcel.Households / destinationParcel.ThousandsSquareLengthUnits + beta00004 * person.IsFemale.ToFlag() * destinationParcel.Households / destinationParcel.ThousandsSquareLengthUnits + beta00005 * isInCopenhagenMunicipality.ToFlag() + beta00006 * (person.Household.HasValidIncome && person.Household.Income < 300000).ToFlag() * isInCopenhagenMunicipality.ToFlag() + beta00007 * (person.Household.HasValidIncome && person.Household.Income >= 300000 && person.Household.Income < 600000).ToFlag() * isInCopenhagenMunicipality.ToFlag() + beta00008 * (person.Household.HasValidIncome && person.Household.Income >= 900000).ToFlag() * isInCopenhagenMunicipality.ToFlag() + beta00009 * person.Age * isInCopenhagenMunicipality.ToFlag() + 0.0; // beta00010 * (person.Household.ResidenceParcel.Municipality == destination.Municipality).ToFlag(); //Stefan non-size terms. alternative.AddUtilityTerm(1, sampleItem.Key.AdjustmentFactor); //alternative.AddUtilityTerm(2, destinationParcel.Households / destinationParcel.ThousandsSquareLengthUnits); //alternative.AddUtilityTerm(3, (person.Household.Income < 300000).ToFlag() * destinationParcel.Households / destinationParcel.ThousandsSquareLengthUnits); //alternative.AddUtilityTerm(4, person.IsFemale.ToFlag() * destinationParcel.Households / destinationParcel.ThousandsSquareLengthUnits); //alternative.AddUtilityTerm(5, isInCopenhagenMunicipality.ToFlag()); //alternative.AddUtilityTerm(6, (person.Household.HasValidIncome && person.Household.Income < 300000).ToFlag() * isInCopenhagenMunicipality.ToFlag()); //alternative.AddUtilityTerm(7, (person.Household.HasValidIncome && person.Household.Income >= 300000 && person.Household.Income < 600000).ToFlag() * isInCopenhagenMunicipality.ToFlag()); //alternative.AddUtilityTerm(8, (person.Household.HasValidIncome && person.Household.Income >= 900000).ToFlag() * isInCopenhagenMunicipality.ToFlag()); //alternative.AddUtilityTerm(9, person.Age * isInCopenhagenMunicipality.ToFlag()); ////alternative.AddUtilityTerm(10, (person.Household.ResidenceParcel.Municipality == destination.Municipality).ToFlag()); // Acivate this after Municipality property is added to Actum parcel file //following logsums replace Stefan's car and public transport times alternative.AddUtilityTerm(11, (person.Household.HasValidIncome && person.Household.Income < 300000).ToFlag() * workTourLogsum); alternative.AddUtilityTerm(12, (person.Household.HasValidIncome && person.Household.Income >= 300000 && person.Household.Income < 600000).ToFlag() * workTourLogsum); alternative.AddUtilityTerm(13, (person.Household.HasValidIncome && person.Household.Income >= 900000).ToFlag() * workTourLogsum); alternative.AddUtilityTerm(14, person.Household.HasMissingIncome.ToFlag() * workTourLogsum); alternative.AddUtilityTerm(15, person.IsFemale.ToFlag() * workTourLogsum); alternative.AddUtilityTerm(16, person.Age * workTourLogsum); alternative.AddUtilityTerm(17, (person.MainOccupation == 50).ToFlag() * workTourLogsum); // self-employed //Stefan's composite term 18 replaces terms 2-10 above alternative.AddUtilityTerm(18, stefanUtility); // see above for this composite function of StefanMabitt's utility function //alternative.AddUtilityTerm(2, person.IsFulltimeWorker.ToFlag() * workTourLogsum); //alternative.AddUtilityTerm(3, person.IsPartTimeWorker.ToFlag() * workTourLogsum); //alternative.AddUtilityTerm(4, person.IsNotFullOrPartTimeWorker.ToFlag() * workTourLogsum); //alternative.AddUtilityTerm(5, distanceLog); // for distance calibration //alternative.AddUtilityTerm(6, person.IsFulltimeWorker.ToFlag() * distance1); //alternative.AddUtilityTerm(7, person.IsFulltimeWorker.ToFlag() * distance2); //alternative.AddUtilityTerm(8, person.IsFulltimeWorker.ToFlag() * distance3); //alternative.AddUtilityTerm(9, person.IsPartTimeWorker.ToFlag() * distanceLog); //alternative.AddUtilityTerm(10, person.IsNotFullOrPartTimeWorker.ToFlag() * distanceLog); //alternative.AddUtilityTerm(11, person.Household.Has0To15KIncome.ToFlag() * distanceLog); //alternative.AddUtilityTerm(12, person.Household.Has50To75KIncome.ToFlag() * distanceLog); //alternative.AddUtilityTerm(13, person.Household.Has75To100KIncome.ToFlag() * distanceLog); //alternative.AddUtilityTerm(14, person.IsFemale.ToFlag() * distanceLog); //alternative.AddUtilityTerm(15, person.IsStudentAge.ToFlag() * distanceFromSchool); //alternative.AddUtilityTerm(16, person.IsFulltimeWorker.ToFlag() * aggregateLogsum); //alternative.AddUtilityTerm(17, person.IsPartTimeWorker.ToFlag() * aggregateLogsum); //alternative.AddUtilityTerm(18, person.IsNotFullOrPartTimeWorker.ToFlag() * aggregateLogsum); //alternative.AddUtilityTerm(19, parcelParkingDensity); //alternative.AddUtilityTerm(20, c34Ratio); //Neighborhood //alternative.AddUtilityTerm(21, person.Household.HasValidIncome.ToFlag() * serviceBuffer); //alternative.AddUtilityTerm(22, person.Household.HasValidIncome.ToFlag() * educationBuffer); //alternative.AddUtilityTerm(23, person.Household.HasValidIncome.ToFlag() * foodBuffer); //alternative.AddUtilityTerm(24, person.Household.HasValidIncome.ToFlag() * governmentBuffer); //alternative.AddUtilityTerm(25, person.Household.HasValidIncome.ToFlag() * officeBuffer); //alternative.AddUtilityTerm(26, person.Household.HasValidIncome.ToFlag() * medicalBuffer); //alternative.AddUtilityTerm(27, person.Household.HasValidIncome.ToFlag() * householdsBuffer); //alternative.AddUtilityTerm(28, person.Household.HasValidIncome.ToFlag() * studentsUniversityBuffer); //alternative.AddUtilityTerm(29, person.Household.HasValidIncome.ToFlag() * person.IsFulltimeWorker.ToFlag() * studentsK12Buffer); //alternative.AddUtilityTerm(30, person.Household.HasValidIncome.ToFlag() * person.IsFulltimeWorker.ToFlag() * studentsUniversityBuffer); //alternative.AddUtilityTerm(31, person.Household.HasValidIncome.ToFlag() * person.IsPartTimeWorker.ToFlag() * industrialAgricultureConstructionBuffer); //alternative.AddUtilityTerm(32, person.Household.HasValidIncome.ToFlag() * person.IsNotFullOrPartTimeWorker.ToFlag() * foodBuffer); //alternative.AddUtilityTerm(33, person.Household.HasValidIncome.ToFlag() * person.IsNotFullOrPartTimeWorker.ToFlag() * medicalBuffer); //alternative.AddUtilityTerm(34, person.IsFulltimeWorker.ToFlag() * person.Household.Has75KPlusIncome.ToFlag() * employmentTotalBuffer); //alternative.AddUtilityTerm(35, person.IsNotFullOrPartTimeWorker.ToFlag() * person.Household.HasIncomeUnder50K.ToFlag() * governmentBuffer); //alternative.AddUtilityTerm(36, person.IsNotFullOrPartTimeWorker.ToFlag() * person.Household.HasIncomeUnder50K.ToFlag() * employmentTotalBuffer); //Size // Stefan size terms. // Note: the following assumes: (1) Stefan's size variables enter his utility function as a logsum, a la BAL; // (2) Jobs--commercial and Jobs--finance apply to hh w unknown incomes in Stefan's spec // If his size variables enter linearly, then if I want to replicate them I should not use alogit size functions. // If Jobs--commercial and Jobs--finance don't apply to missing incomes, then I need to change the size functions below alternative.AddUtilityTerm(51, (person.Household.HasValidIncome && person.Household.Income < 300000).ToFlag() * (destinationParcel.EmploymentTotal - employmentCommercial)); alternative.AddUtilityTerm(52, (person.Household.HasValidIncome && person.Household.Income >= 300000 && person.Household.Income < 600000).ToFlag() * (destinationParcel.EmploymentTotal - employmentCommercial)); alternative.AddUtilityTerm(53, (person.Household.HasValidIncome && person.Household.Income >= 600000 && person.Household.Income < 900000).ToFlag() * (destinationParcel.EmploymentTotal - employmentCommercial)); alternative.AddUtilityTerm(54, (person.Household.HasValidIncome && person.Household.Income >= 900000).ToFlag() * (destinationParcel.EmploymentTotal - employmentCommercial)); alternative.AddUtilityTerm(55, (person.Household.HasValidIncome && person.Household.Income >= 900000).ToFlag() * (destinationParcel.EmploymentTotal - employmentCommercial)); // second term allows first one to have base coef of 0 alternative.AddUtilityTerm(56, (person.Household.HasMissingIncome.ToFlag() * (destinationParcel.EmploymentTotal - employmentCommercial))); alternative.AddUtilityTerm(57, (person.Household.HasValidIncome && person.Household.Income < 300000).ToFlag() * employmentCommercial); alternative.AddUtilityTerm(58, (person.Household.HasValidIncome && person.Household.Income >= 300000 && person.Household.Income < 600000).ToFlag() * employmentCommercial); alternative.AddUtilityTerm(59, (person.Household.HasValidIncome && person.Household.Income >= 600000 && person.Household.Income < 900000).ToFlag() * employmentCommercial); alternative.AddUtilityTerm(60, (person.Household.HasValidIncome && person.Household.Income >= 900000).ToFlag() * employmentCommercial); alternative.AddUtilityTerm(61, person.Household.HasMissingIncome.ToFlag() * employmentCommercial); alternative.AddUtilityTerm(62, destinationParcel.EmploymentOffice); //The following combine with 51-55, 56-60 and 61 to include size of entire buffer region in main size variables alternative.AddUtilityTerm(63, (destinationParcel.EmploymentTotalBuffer1 - destinationParcel.EmploymentTotal) - (employmentCommercialBuffer1 - employmentCommercial)); alternative.AddUtilityTerm(64, employmentCommercialBuffer1 - employmentCommercial); alternative.AddUtilityTerm(65, destinationParcel.EmploymentOfficeBuffer1 - destinationParcel.EmploymentOffice); //alternative.AddUtilityTerm(51, person.Household.HasValidIncome.ToFlag() * destinationParcel.EmploymentService); //alternative.AddUtilityTerm(52, person.Household.HasValidIncome.ToFlag() * destinationParcel.EmploymentEducation); //alternative.AddUtilityTerm(53, person.Household.HasValidIncome.ToFlag() * destinationParcel.EmploymentFood); //alternative.AddUtilityTerm(54, person.Household.HasValidIncome.ToFlag() * destinationParcel.EmploymentGovernment); //alternative.AddUtilityTerm(55, person.Household.HasValidIncome.ToFlag() * destinationParcel.EmploymentOffice); //alternative.AddUtilityTerm(56, person.Household.HasValidIncome.ToFlag() * destinationParcel.EmploymentRetail); //alternative.AddUtilityTerm(57, person.Household.HasValidIncome.ToFlag() * destinationParcel.EmploymentMedical); //alternative.AddUtilityTerm(58, person.Household.HasValidIncome.ToFlag() * employmentIndustrialAgricultureConstruction); //alternative.AddUtilityTerm(59, person.Household.HasValidIncome.ToFlag() * destinationParcel.StudentsUniversity); //alternative.AddUtilityTerm(60, person.Household.HasValidIncome.ToFlag() * person.IsFulltimeWorker.ToFlag() * destinationParcel.EmploymentGovernment); //alternative.AddUtilityTerm(61, person.Household.HasValidIncome.ToFlag() * person.IsFulltimeWorker.ToFlag() * employmentIndustrialAgricultureConstruction); //alternative.AddUtilityTerm(62, person.Household.HasValidIncome.ToFlag() * person.IsPartTimeWorker.ToFlag() * employmentIndustrialAgricultureConstruction); //alternative.AddUtilityTerm(63, person.Household.HasValidIncome.ToFlag() * person.IsNotFullOrPartTimeWorker.ToFlag() * destinationParcel.EmploymentEducation); //alternative.AddUtilityTerm(64, person.Household.HasValidIncome.ToFlag() * person.IsNotFullOrPartTimeWorker.ToFlag() * destinationParcel.EmploymentFood); //alternative.AddUtilityTerm(65, person.Household.HasValidIncome.ToFlag() * person.IsNotFullOrPartTimeWorker.ToFlag() * destinationParcel.EmploymentRetail); //alternative.AddUtilityTerm(66, person.Household.HasIncomeUnder50K.ToFlag() * destinationParcel.EmploymentRetail); //alternative.AddUtilityTerm(67, person.Household.HasIncomeUnder50K.ToFlag() * destinationParcel.EmploymentService); //alternative.AddUtilityTerm(68, person.Household.Has50To75KIncome.ToFlag() * destinationParcel.EmploymentMedical); //alternative.AddUtilityTerm(69, person.Household.Has50To75KIncome.ToFlag() * destinationParcel.EmploymentOffice); //alternative.AddUtilityTerm(70, person.Household.Has75KPlusIncome.ToFlag() * destinationParcel.EmploymentEducation); //alternative.AddUtilityTerm(71, person.Household.Has75KPlusIncome.ToFlag() * destinationParcel.EmploymentGovernment); //alternative.AddUtilityTerm(72, person.Household.Has75KPlusIncome.ToFlag() * destinationParcel.EmploymentMedical); //alternative.AddUtilityTerm(73, person.Household.Has75KPlusIncome.ToFlag() * destinationParcel.EmploymentOffice); //alternative.AddUtilityTerm(74, person.IsFulltimeWorker.ToFlag() * person.Household.Has75KPlusIncome.ToFlag() * destinationParcel.EmploymentGovernment); //alternative.AddUtilityTerm(75, person.IsFulltimeWorker.ToFlag() * (!person.Household.Has75KPlusIncome).ToFlag() * employmentIndustrialAgricultureConstruction); //alternative.AddUtilityTerm(76, person.IsPartTimeWorker.ToFlag() * (!person.Household.HasIncomeUnder50K).ToFlag() * destinationParcel.EmploymentMedical); //alternative.AddUtilityTerm(77, (!person.IsFulltimeWorker).ToFlag() * person.Household.Has75KPlusIncome.ToFlag() * destinationParcel.EmploymentOffice); //alternative.AddUtilityTerm(78, person.IsNotFullOrPartTimeWorker.ToFlag() * (!person.Household.HasIncomeUnder50K).ToFlag() * destinationParcel.EmploymentRetail); //alternative.AddUtilityTerm(79, person.Household.HasMissingIncome.ToFlag() * destinationParcel.EmploymentTotal); //alternative.AddUtilityTerm(80, person.Household.HasMissingIncome.ToFlag() * destinationParcel.StudentsUniversity); // set shadow price depending on persontype and add it to utility // we are using the sampling adjustment factor assuming that it is 1 alternative.AddUtilityTerm(1, destinationParcel.ShadowPriceForEmployment); //remove nesting for estimation of conditional MNL alternative.AddNestedAlternative(sampleSize + 2, 0, 98); } // JLB 20120329 added third call parameter to idenitfy whether this alt is chosen or not ChoiceProbabilityCalculator.Alternative homeAlternative = choiceProbabilityCalculator.GetAlternative(sampleSize, true, choseHome); homeAlternative.Choice = person.Household.ResidenceParcel; homeAlternative.AddUtilityTerm(41, 1); homeAlternative.AddUtilityTerm(42, (person.MainOccupation == 50).ToFlag()); // self-employed //homeAlternative.AddUtilityTerm(42, person.IsPartTimeWorker.ToFlag()); //homeAlternative.AddUtilityTerm(43, person.IsStudentAge.ToFlag()); //homeAlternative.AddUtilityTerm(44, person.IsFemale.ToFlag()); homeAlternative.AddUtilityTerm(90, 1); //make oddball alt unavailable and remove nesting for estimation of conditional MNL // alternative.Available = false; homeAlternative.AddNestedAlternative(sampleSize + 3, 1, 98); }
public void SetUtilities(ISampleItem sampleItem, int sampleFrequency) { if (sampleItem == null) { throw new ArgumentNullException("sampleItem"); } ChoiceProbabilityCalculator.Alternative alternative = sampleItem.Alternative; //remove nesting for estimation of conditional MNL if (!Global.Configuration.IsInEstimationMode || ESTIMATE_NESTED_MODEL) { alternative.AddNestedAlternative(_sampleSize + 2, 0, THETA_PARAMETER); } if (!alternative.Available) { return; } IParcelWrapper destinationParcel = ChoiceModelFactory.Parcels[sampleItem.ParcelId]; // var destinationZoneTotals = ChoiceModelRunner.ZoneTotals[destinationParcel.ZoneId]; alternative.Choice = destinationParcel; ChoiceProbabilityCalculator.Alternative nestedAlternative = Global.ChoiceModelSession.Get <WorkTourModeModel>().RunNested(_person, _person.Household.ResidenceParcel, destinationParcel, _destinationArrivalTime, _destinationDepartureTime, _person.Household.HouseholdTotals.DrivingAgeMembers); double workTourLogsum = nestedAlternative == null ? 0 : nestedAlternative.ComputeLogsum(); int votSegment = _person.Household.GetVotALSegment(); int taSegment = destinationParcel.TransitAccessSegment(); double aggregateLogsum = Global.AggregateLogsums[destinationParcel.ZoneId][Global.Settings.Purposes.HomeBasedComposite][Global.Settings.CarOwnerships.OneOrMoreCarsPerAdult][votSegment][taSegment]; double distanceFromOrigin = _person.Household.ResidenceParcel.DistanceFromOrigin(destinationParcel, 1); double distance1 = Math.Min(distanceFromOrigin, .35); double distance2 = Math.Max(0, Math.Min(distanceFromOrigin - .35, 1 - .35)); double distance3 = Math.Max(0, distanceFromOrigin - 1); double distance20 = Math.Max(0, distanceFromOrigin - 2); double distance30 = Math.Max(0, distanceFromOrigin - 3); double distance40 = Math.Max(0, distanceFromOrigin - 4); double distanceLog = Math.Log(1 + distanceFromOrigin); double distanceFromSchool = _person.IsFullOrPartTimeWorker ? 0 : _person.UsualSchoolParcel.DistanceFromSchoolLog(destinationParcel, 1); // parcel buffers double educationBuffer = Math.Log(destinationParcel.EmploymentEducationBuffer2 + 1); double governmentBuffer = Math.Log(destinationParcel.EmploymentGovernmentBuffer2 + 1); double officeBuffer = Math.Log(destinationParcel.EmploymentOfficeBuffer2 + 1); double serviceBuffer = Math.Log(destinationParcel.EmploymentServiceBuffer2 + 1); double householdsBuffer = Math.Log(destinationParcel.HouseholdsBuffer2 + 1); // var retailBuffer = Math.Log(destinationParcel.EmploymentRetailBuffer2 + 1); double industrialAgricultureConstructionBuffer = Math.Log(destinationParcel.EmploymentIndustrialBuffer2 + destinationParcel.EmploymentAgricultureConstructionBuffer2 + 1); double foodBuffer = Math.Log(destinationParcel.EmploymentFoodBuffer2 + 1); double medicalBuffer = Math.Log(destinationParcel.EmploymentMedicalBuffer2 + 1); double employmentTotalBuffer = Math.Log(destinationParcel.EmploymentTotalBuffer2 + 1); double studentsUniversityBuffer = Math.Log(destinationParcel.StudentsUniversityBuffer2 + 1); double studentsK12Buffer = Math.Log(destinationParcel.StudentsK8Buffer2 + destinationParcel.StudentsHighSchoolBuffer2 + 1); // var mixedUse4Index = destinationParcel.MixedUse4Index2(); //size attributes (derived) double employmentIndustrialAgricultureConstruction = destinationParcel.EmploymentIndustrial + destinationParcel.EmploymentAgricultureConstruction; // parking attributes double parcelParkingDensity = destinationParcel.ParcelParkingPerTotalEmployment(); // connectivity attributes double c34Ratio = destinationParcel.C34RatioBuffer1(); alternative.AddUtilityTerm(1, sampleItem.AdjustmentFactor); //constrain coeff to 1 alternative.AddUtilityTerm(2, _person.IsFulltimeWorker.ToFlag() * workTourLogsum); alternative.AddUtilityTerm(3, _person.IsPartTimeWorker.ToFlag() * workTourLogsum); alternative.AddUtilityTerm(4, _person.IsNotFullOrPartTimeWorker.ToFlag() * workTourLogsum); alternative.AddUtilityTerm(5, distanceLog); // for distance calibration alternative.AddUtilityTerm(6, _person.IsFulltimeWorker.ToFlag() * distance1); alternative.AddUtilityTerm(7, _person.IsFulltimeWorker.ToFlag() * distance2); alternative.AddUtilityTerm(8, _person.IsFulltimeWorker.ToFlag() * distance3); alternative.AddUtilityTerm(9, _person.IsPartTimeWorker.ToFlag() * distanceLog); alternative.AddUtilityTerm(10, _person.IsNotFullOrPartTimeWorker.ToFlag() * distanceLog); alternative.AddUtilityTerm(11, _person.Household.Has0To15KIncome.ToFlag() * distanceLog); alternative.AddUtilityTerm(12, _person.Household.Has50To75KIncome.ToFlag() * distanceLog); alternative.AddUtilityTerm(13, _person.Household.Has75To100KIncome.ToFlag() * distanceLog); alternative.AddUtilityTerm(14, _person.IsFemale.ToFlag() * distanceLog); alternative.AddUtilityTerm(15, _person.IsStudentAge.ToFlag() * distanceFromSchool); alternative.AddUtilityTerm(16, _person.IsFulltimeWorker.ToFlag() * aggregateLogsum); alternative.AddUtilityTerm(17, _person.IsPartTimeWorker.ToFlag() * aggregateLogsum); alternative.AddUtilityTerm(18, _person.IsNotFullOrPartTimeWorker.ToFlag() * aggregateLogsum); alternative.AddUtilityTerm(19, parcelParkingDensity); alternative.AddUtilityTerm(20, c34Ratio); //extra additive distance terms for calibrating longer distances alternative.AddUtilityTerm(46, distance20); alternative.AddUtilityTerm(47, distance30); alternative.AddUtilityTerm(48, distance40); //Neighborhood alternative.AddUtilityTerm(21, _person.Household.HasValidIncome.ToFlag() * serviceBuffer); alternative.AddUtilityTerm(22, _person.Household.HasValidIncome.ToFlag() * educationBuffer); alternative.AddUtilityTerm(23, _person.Household.HasValidIncome.ToFlag() * foodBuffer); alternative.AddUtilityTerm(24, _person.Household.HasValidIncome.ToFlag() * governmentBuffer); alternative.AddUtilityTerm(25, _person.Household.HasValidIncome.ToFlag() * officeBuffer); alternative.AddUtilityTerm(26, _person.Household.HasValidIncome.ToFlag() * medicalBuffer); alternative.AddUtilityTerm(27, _person.Household.HasValidIncome.ToFlag() * householdsBuffer); alternative.AddUtilityTerm(28, _person.Household.HasValidIncome.ToFlag() * studentsUniversityBuffer); alternative.AddUtilityTerm(29, _person.Household.HasValidIncome.ToFlag() * _person.IsFulltimeWorker.ToFlag() * studentsK12Buffer); alternative.AddUtilityTerm(30, _person.Household.HasValidIncome.ToFlag() * _person.IsFulltimeWorker.ToFlag() * studentsUniversityBuffer); alternative.AddUtilityTerm(31, _person.Household.HasValidIncome.ToFlag() * _person.IsPartTimeWorker.ToFlag() * industrialAgricultureConstructionBuffer); alternative.AddUtilityTerm(32, _person.Household.HasValidIncome.ToFlag() * _person.IsNotFullOrPartTimeWorker.ToFlag() * foodBuffer); alternative.AddUtilityTerm(33, _person.Household.HasValidIncome.ToFlag() * _person.IsNotFullOrPartTimeWorker.ToFlag() * medicalBuffer); alternative.AddUtilityTerm(34, _person.IsFulltimeWorker.ToFlag() * _person.Household.Has75KPlusIncome.ToFlag() * employmentTotalBuffer); alternative.AddUtilityTerm(35, _person.IsNotFullOrPartTimeWorker.ToFlag() * _person.Household.HasIncomeUnder50K.ToFlag() * governmentBuffer); alternative.AddUtilityTerm(36, _person.IsNotFullOrPartTimeWorker.ToFlag() * _person.Household.HasIncomeUnder50K.ToFlag() * employmentTotalBuffer); //Size alternative.AddUtilityTerm(51, _person.Household.HasValidIncome.ToFlag() * destinationParcel.EmploymentService); alternative.AddUtilityTerm(52, _person.Household.HasValidIncome.ToFlag() * destinationParcel.EmploymentEducation); alternative.AddUtilityTerm(53, _person.Household.HasValidIncome.ToFlag() * destinationParcel.EmploymentFood); alternative.AddUtilityTerm(54, _person.Household.HasValidIncome.ToFlag() * destinationParcel.EmploymentGovernment); alternative.AddUtilityTerm(55, _person.Household.HasValidIncome.ToFlag() * destinationParcel.EmploymentOffice); alternative.AddUtilityTerm(56, _person.Household.HasValidIncome.ToFlag() * destinationParcel.EmploymentRetail); alternative.AddUtilityTerm(57, _person.Household.HasValidIncome.ToFlag() * destinationParcel.EmploymentMedical); alternative.AddUtilityTerm(58, _person.Household.HasValidIncome.ToFlag() * employmentIndustrialAgricultureConstruction); alternative.AddUtilityTerm(59, _person.Household.HasValidIncome.ToFlag() * destinationParcel.StudentsUniversity); alternative.AddUtilityTerm(60, _person.Household.HasValidIncome.ToFlag() * _person.IsFulltimeWorker.ToFlag() * destinationParcel.EmploymentGovernment); alternative.AddUtilityTerm(61, _person.Household.HasValidIncome.ToFlag() * _person.IsFulltimeWorker.ToFlag() * employmentIndustrialAgricultureConstruction); alternative.AddUtilityTerm(62, _person.Household.HasValidIncome.ToFlag() * _person.IsPartTimeWorker.ToFlag() * employmentIndustrialAgricultureConstruction); alternative.AddUtilityTerm(63, _person.Household.HasValidIncome.ToFlag() * _person.IsNotFullOrPartTimeWorker.ToFlag() * destinationParcel.EmploymentEducation); alternative.AddUtilityTerm(64, _person.Household.HasValidIncome.ToFlag() * _person.IsNotFullOrPartTimeWorker.ToFlag() * destinationParcel.EmploymentFood); alternative.AddUtilityTerm(65, _person.Household.HasValidIncome.ToFlag() * _person.IsNotFullOrPartTimeWorker.ToFlag() * destinationParcel.EmploymentRetail); alternative.AddUtilityTerm(66, _person.Household.HasIncomeUnder50K.ToFlag() * destinationParcel.EmploymentRetail); alternative.AddUtilityTerm(67, _person.Household.HasIncomeUnder50K.ToFlag() * destinationParcel.EmploymentService); alternative.AddUtilityTerm(68, _person.Household.Has50To75KIncome.ToFlag() * destinationParcel.EmploymentMedical); alternative.AddUtilityTerm(69, _person.Household.Has50To75KIncome.ToFlag() * destinationParcel.EmploymentOffice); alternative.AddUtilityTerm(70, _person.Household.Has75KPlusIncome.ToFlag() * destinationParcel.EmploymentEducation); alternative.AddUtilityTerm(71, _person.Household.Has75KPlusIncome.ToFlag() * destinationParcel.EmploymentGovernment); alternative.AddUtilityTerm(72, _person.Household.Has75KPlusIncome.ToFlag() * destinationParcel.EmploymentMedical); alternative.AddUtilityTerm(73, _person.Household.Has75KPlusIncome.ToFlag() * destinationParcel.EmploymentOffice); alternative.AddUtilityTerm(74, _person.IsFulltimeWorker.ToFlag() * _person.Household.Has75KPlusIncome.ToFlag() * destinationParcel.EmploymentGovernment); alternative.AddUtilityTerm(75, _person.IsFulltimeWorker.ToFlag() * (!_person.Household.Has75KPlusIncome).ToFlag() * employmentIndustrialAgricultureConstruction); alternative.AddUtilityTerm(76, _person.IsPartTimeWorker.ToFlag() * (!_person.Household.HasIncomeUnder50K).ToFlag() * destinationParcel.EmploymentMedical); alternative.AddUtilityTerm(77, (!_person.IsFulltimeWorker).ToFlag() * _person.Household.Has75KPlusIncome.ToFlag() * destinationParcel.EmploymentOffice); alternative.AddUtilityTerm(78, _person.IsNotFullOrPartTimeWorker.ToFlag() * (!_person.Household.HasIncomeUnder50K).ToFlag() * destinationParcel.EmploymentRetail); alternative.AddUtilityTerm(79, _person.Household.HasMissingIncome.ToFlag() * destinationParcel.EmploymentTotal); alternative.AddUtilityTerm(80, _person.Household.HasMissingIncome.ToFlag() * destinationParcel.StudentsUniversity); //add any region-specific new terms in region-specific class, using coefficient numbers 91-100 or other unused variable # _parentClass.RegionSpecificCustomizations(alternative, _person, destinationParcel); // OD shadow pricing if (Global.Configuration.ShouldUseODShadowPricing) { int res = _person.Household.ResidenceParcel.District; int des = destinationParcel.District; //var first = res <= des? res : des; //var second = res <= des? des : res; double shadowPriceConfigurationParameter = res == des ? Global.Configuration.WorkLocationOOShadowPriceCoefficient : Global.Configuration.WorkLocationODShadowPriceCoefficient; int odShadowPriceF12Value = MAX_REGULAR_PARAMETER + Global.Configuration.NumberOfODShadowPricingDistricts * (res - 1) + des; alternative.AddUtilityTerm(odShadowPriceF12Value, shadowPriceConfigurationParameter); } // set shadow price depending on persontype and add it to utility // we are using the sampling adjustment factor assuming that it is 1 if (Global.Configuration.ShouldUseShadowPricing) { alternative.AddUtilityTerm(1, destinationParcel.ShadowPriceForEmployment); } }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, ITourWrapper tour, IEnumerable <IPathTypeModel> pathTypeModels, IParcelWrapper destinationParcel, int choice = Constants.DEFAULT_VALUE) { IHouseholdWrapper household = tour.Household; Framework.DomainModels.Models.IHouseholdTotals householdTotals = household.HouseholdTotals; IPersonWrapper person = tour.Person; IPersonDayWrapper personDay = tour.PersonDay; // household inputs int income0To25KFlag = household.Has0To25KIncome.ToFlag(); int incomeOver100Flag = household.Has100KPlusIncome.ToFlag(); int childrenUnder5 = householdTotals.ChildrenUnder5; int childrenAge5Through15 = householdTotals.ChildrenAge5Through15; int nonworkingAdults = householdTotals.NonworkingAdults; int retiredAdults = householdTotals.RetiredAdults; int onePersonHouseholdFlag = household.IsOnePersonHousehold.ToFlag(); int twoPersonHouseholdFlag = household.IsTwoPersonHousehold.ToFlag(); int noCarsInHouseholdFlag = household.GetFlagForNoCarsInHousehold(household.VehiclesAvailable); int carsLessThanDriversFlag = household.GetFlagForCarsLessThanDrivers(household.VehiclesAvailable); int carsLessThanWorkersFlag = household.GetFlagForCarsLessThanWorkers(household.VehiclesAvailable); // person inputs int maleFlag = person.IsMale.ToFlag(); int ageBetween51And98Flag = person.AgeIsBetween51And98.ToFlag(); int univStudentFlag = person.IsUniversityStudent.ToFlag(); // tour inputs int shoppingTourFlag = (tour.DestinationPurpose == Global.Settings.Purposes.Shopping).ToFlag(); int mealTourFlag = (tour.DestinationPurpose == Global.Settings.Purposes.Meal).ToFlag(); int socialOrRecreationTourFlag = (tour.DestinationPurpose == Global.Settings.Purposes.Social).ToFlag(); // remaining inputs IParcelWrapper originParcel = tour.OriginParcel; int parkingDuration = ChoiceModelUtility.GetParkingDuration(person.IsFulltimeWorker); double destinationParkingCost = destinationParcel.ParkingCostBuffer1(parkingDuration); ChoiceModelUtility.SetEscortPercentages(personDay, out double escortPercentage, out double nonEscortPercentage, true); //foreach (var pathTypeModel in pathTypeModels) { foreach (IPathTypeModel pathTypeModel in pathTypeModels) { IPathTypeModel ipathTypeModel = pathTypeModel; int mode = pathTypeModel.Mode; bool available = (pathTypeModel.Mode != Global.Settings.Modes.ParkAndRide || Global.Configuration.IncludeParkAndRideInOtherHomeBasedTourModeModel) && (pathTypeModel.Mode != Global.Settings.Modes.PaidRideShare || Global.Configuration.PaidRideShareModeIsAvailable) && pathTypeModel.Available; double generalizedTimeLogsum = pathTypeModel.GeneralizedTimeLogsum; ChoiceProbabilityCalculator.Alternative alternative = choiceProbabilityCalculator.GetAlternative(mode, available, choice == mode); alternative.Choice = mode; alternative.AddNestedAlternative(_nestedAlternativeIds[pathTypeModel.Mode], _nestedAlternativeIndexes[pathTypeModel.Mode], THETA_PARAMETER); if (!available) { continue; } double modeTimeCoefficient = (Global.Configuration.AV_IncludeAutoTypeChoice && household.OwnsAutomatedVehicles > 0 && mode >= Global.Settings.Modes.Sov && mode <= Global.Settings.Modes.Hov3) ? tour.TimeCoefficient * (1.0 - Global.Configuration.AV_InVehicleTimeCoefficientDiscountFactor) : (mode == Global.Settings.Modes.PaidRideShare && Global.Configuration.AV_PaidRideShareModeUsesAVs) ? tour.TimeCoefficient * (1.0 - Global.Configuration.AV_InVehicleTimeCoefficientDiscountFactor) : tour.TimeCoefficient; alternative.AddUtilityTerm(2, generalizedTimeLogsum * modeTimeCoefficient); if (mode == Global.Settings.Modes.ParkAndRide) { alternative.AddUtilityTerm(5, 1); alternative.AddUtilityTerm(6, noCarsInHouseholdFlag); alternative.AddUtilityTerm(7, carsLessThanWorkersFlag); alternative.AddUtilityTerm(128, destinationParcel.TotalEmploymentDensity1()); } else if (mode == Global.Settings.Modes.Transit) { alternative.AddUtilityTerm(20, 1); alternative.AddUtilityTerm(21, noCarsInHouseholdFlag); alternative.AddUtilityTerm(22, carsLessThanDriversFlag); //for calibration alternative.AddUtilityTerm(120, shoppingTourFlag); alternative.AddUtilityTerm(121, mealTourFlag); // alternative.AddUtility(129, destinationParcel.MixedUse2Index1()); alternative.AddUtilityTerm(128, destinationParcel.TotalEmploymentDensity1()); // alternative.AddUtility(127, destinationParcel.NetIntersectionDensity1()); // alternative.AddUtility(126, originParcel.NetIntersectionDensity1()); // alternative.AddUtility(125, originParcel.HouseholdDensity1()); alternative.AddUtilityTerm(124, originParcel.MixedUse2Index1()); // alternative.AddUtility(123, Math.Log(destinationParcel.StopsTransitBuffer1+1)); // alternative.AddUtility(122, Math.Log(originParcel.StopsTransitBuffer1+1)); alternative.AddUtilityTerm(180, univStudentFlag); } else if (mode == Global.Settings.Modes.Hov3) { alternative.AddUtilityTerm(1, (destinationParkingCost * tour.CostCoefficient / ChoiceModelUtility.CPFACT3)); alternative.AddUtilityTerm(30, 1); alternative.AddUtilityTerm(31, childrenUnder5); alternative.AddUtilityTerm(32, childrenAge5Through15); alternative.AddUtilityTerm(34, nonworkingAdults + retiredAdults); alternative.AddUtilityTerm(35, pathTypeModel.PathDistance.AlmostEquals(0) ? 0 : Math.Log(pathTypeModel.PathDistance)); alternative.AddUtilityTerm(36, noCarsInHouseholdFlag); // for calibration of hov3 vs hov2 alternative.AddUtilityTerm(37, carsLessThanWorkersFlag); // for calibration of hov3 vs hov2 alternative.AddUtilityTerm(38, onePersonHouseholdFlag); alternative.AddUtilityTerm(39, twoPersonHouseholdFlag); alternative.AddUtilityTerm(41, noCarsInHouseholdFlag); alternative.AddUtilityTerm(43, carsLessThanWorkersFlag); alternative.AddUtilityTerm(133, escortPercentage); alternative.AddUtilityTerm(134, nonEscortPercentage); alternative.AddUtilityTerm(136, shoppingTourFlag); alternative.AddUtilityTerm(137, mealTourFlag); alternative.AddUtilityTerm(138, socialOrRecreationTourFlag); } else if (mode == Global.Settings.Modes.Hov2) { alternative.AddUtilityTerm(1, (destinationParkingCost * tour.CostCoefficient / ChoiceModelUtility.CPFACT2)); alternative.AddUtilityTerm(31, childrenUnder5); alternative.AddUtilityTerm(32, childrenAge5Through15); alternative.AddUtilityTerm(34, nonworkingAdults + retiredAdults); alternative.AddUtilityTerm(35, pathTypeModel.PathDistance.AlmostEquals(0) ? 0 : Math.Log(pathTypeModel.PathDistance)); alternative.AddUtilityTerm(40, 1); alternative.AddUtilityTerm(41, noCarsInHouseholdFlag); alternative.AddUtilityTerm(43, carsLessThanWorkersFlag); alternative.AddUtilityTerm(48, onePersonHouseholdFlag); alternative.AddUtilityTerm(133, escortPercentage); alternative.AddUtilityTerm(134, nonEscortPercentage); alternative.AddUtilityTerm(136, shoppingTourFlag); alternative.AddUtilityTerm(137, mealTourFlag); alternative.AddUtilityTerm(138, socialOrRecreationTourFlag); } else if (mode == Global.Settings.Modes.Sov) { alternative.AddUtilityTerm(1, (destinationParkingCost * tour.CostCoefficient)); alternative.AddUtilityTerm(50, 1); alternative.AddUtilityTerm(52, carsLessThanDriversFlag); alternative.AddUtilityTerm(54, income0To25KFlag); alternative.AddUtilityTerm(131, escortPercentage); alternative.AddUtilityTerm(132, nonEscortPercentage); } else if (mode == Global.Settings.Modes.Bike) { double class1Dist = Global.Configuration.PathImpedance_BikeUseTypeSpecificDistanceFractions ? ImpedanceRoster.GetValue("class1distance", mode, Global.Settings.PathTypes.FullNetwork, Global.Settings.ValueOfTimes.DefaultVot, tour.DestinationArrivalTime, originParcel, destinationParcel).Variable : 0; double class2Dist = Global.Configuration.PathImpedance_BikeUseTypeSpecificDistanceFractions ? ImpedanceRoster.GetValue("class2distance", mode, Global.Settings.PathTypes.FullNetwork, Global.Settings.ValueOfTimes.DefaultVot, tour.DestinationArrivalTime, originParcel, destinationParcel).Variable : 0; double worstDist = Global.Configuration.PathImpedance_BikeUseTypeSpecificDistanceFractions ? ImpedanceRoster.GetValue("worstdistance", mode, Global.Settings.PathTypes.FullNetwork, Global.Settings.ValueOfTimes.DefaultVot, tour.DestinationArrivalTime, originParcel, destinationParcel).Variable : 0; alternative.AddUtilityTerm(60, 1); alternative.AddUtilityTerm(61, maleFlag); alternative.AddUtilityTerm(63, ageBetween51And98Flag); alternative.AddUtilityTerm(67, noCarsInHouseholdFlag); //for calibration alternative.AddUtilityTerm(68, carsLessThanDriversFlag); //for calibration alternative.AddUtilityTerm(160, socialOrRecreationTourFlag); alternative.AddUtilityTerm(169, destinationParcel.MixedUse4Index1()); alternative.AddUtilityTerm(168, destinationParcel.TotalEmploymentDensity1()); alternative.AddUtilityTerm(167, destinationParcel.NetIntersectionDensity1()); alternative.AddUtilityTerm(166, originParcel.NetIntersectionDensity1()); alternative.AddUtilityTerm(165, originParcel.HouseholdDensity1()); alternative.AddUtilityTerm(164, originParcel.MixedUse4Index1()); alternative.AddUtilityTerm(161, (class1Dist > 0).ToFlag()); alternative.AddUtilityTerm(162, (class2Dist > 0).ToFlag()); alternative.AddUtilityTerm(163, (worstDist > 0).ToFlag()); alternative.AddUtilityTerm(170, 1.0 * destinationParcel.MixedUse4Index1() + 0.00002 * destinationParcel.TotalEmploymentDensity1() + 0.001 * destinationParcel.NetIntersectionDensity1() + 0.001 * originParcel.NetIntersectionDensity1() + 0.0002 * originParcel.HouseholdDensity1() + 1.0 * originParcel.MixedUse4Index1()); } else if (mode == Global.Settings.Modes.Walk) { alternative.AddUtilityTerm(70, 1); alternative.AddUtilityTerm(73, ageBetween51And98Flag); alternative.AddUtilityTerm(77, noCarsInHouseholdFlag); //for calibration alternative.AddUtilityTerm(78, carsLessThanDriversFlag); //for calibration alternative.AddUtilityTerm(171, mealTourFlag); alternative.AddUtilityTerm(172, socialOrRecreationTourFlag); alternative.AddUtilityTerm(179, destinationParcel.MixedUse4Index1()); alternative.AddUtilityTerm(178, destinationParcel.HouseholdDensity1()); alternative.AddUtilityTerm(177, destinationParcel.NetIntersectionDensity1()); alternative.AddUtilityTerm(176, originParcel.NetIntersectionDensity1()); alternative.AddUtilityTerm(175, originParcel.HouseholdDensity1()); alternative.AddUtilityTerm(174, originParcel.MixedUse4Index1()); alternative.AddUtilityTerm(181, 1.0 * destinationParcel.MixedUse4Index1() + 0.00001 * destinationParcel.TotalEmploymentDensity1() + 0.001 * destinationParcel.NetIntersectionDensity1() + 0.001 * originParcel.NetIntersectionDensity1() + 0.0001 * originParcel.HouseholdDensity1() + 1.0 * originParcel.MixedUse4Index1()); } else if (mode == Global.Settings.Modes.PaidRideShare) { if (Global.Configuration.PaidRideshare_UseEstimatedInsteadOfAssertedCoefficients) { alternative.AddUtilityTerm(80, 1.0); //alternative.AddUtilityTerm(81, tour.Person.AgeIsBetween26And35.ToFlag()); //alternative.AddUtilityTerm(82, tour.Person.AgeIsBetween18And25.ToFlag()); alternative.AddUtilityTerm(81, noCarsInHouseholdFlag); //for calibration alternative.AddUtilityTerm(82, carsLessThanDriversFlag); //for calibration alternative.AddUtilityTerm(83, (tour.Person.Age >= 65).ToFlag()); alternative.AddUtilityTerm(84, originParcel.HouseholdsBuffer2 + originParcel.StudentsUniversityBuffer2 + originParcel.EmploymentTotalBuffer2); alternative.AddUtilityTerm(85, destinationParcel.HouseholdsBuffer2 + destinationParcel.StudentsUniversityBuffer2 + destinationParcel.EmploymentTotalBuffer2); alternative.AddUtilityTerm(86, income0To25KFlag); alternative.AddUtilityTerm(87, incomeOver100Flag); alternative.AddUtilityTerm(88, mealTourFlag); alternative.AddUtilityTerm(89, shoppingTourFlag); } else { double modeConstant = Global.Configuration.AV_PaidRideShareModeUsesAVs ? Global.Configuration.AV_PaidRideShare_ModeConstant + Global.Configuration.AV_PaidRideShare_DensityCoefficient * Math.Min(originParcel.HouseholdsBuffer2 + originParcel.StudentsUniversityBuffer2 + originParcel.EmploymentTotalBuffer2, (Global.Configuration.PaidRideShare_DensityMeasureCapValue > 0) ? Global.Configuration.PaidRideShare_DensityMeasureCapValue : 6000) + Global.Configuration.AV_PaidRideShare_AVOwnerCoefficient * (household.OwnsAutomatedVehicles > 0).ToFlag() : Global.Configuration.PaidRideShare_ModeConstant + Global.Configuration.PaidRideShare_DensityCoefficient * Math.Min(originParcel.HouseholdsBuffer2 + originParcel.StudentsUniversityBuffer2 + originParcel.EmploymentTotalBuffer2, (Global.Configuration.PaidRideShare_DensityMeasureCapValue > 0) ? Global.Configuration.PaidRideShare_DensityMeasureCapValue : 6000); alternative.AddUtilityTerm(90, modeConstant); alternative.AddUtilityTerm(90, Global.Configuration.PaidRideShare_Age26to35Coefficient * tour.Person.AgeIsBetween26And35.ToFlag()); alternative.AddUtilityTerm(90, Global.Configuration.PaidRideShare_Age18to25Coefficient * tour.Person.AgeIsBetween18And25.ToFlag()); alternative.AddUtilityTerm(90, Global.Configuration.PaidRideShare_AgeOver65Coefficient * (tour.Person.Age >= 65).ToFlag()); } } RegionSpecificCustomizations(alternative, tour, pathTypeModel.PathType, mode, destinationParcel); } }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, ITripWrapper trip, IEnumerable <IPathTypeModel> pathTypeModels, IParcelWrapper originParcel, IParcelWrapper destinationParcel, int departureTime, int choice = Constants.DEFAULT_VALUE) { IHouseholdWrapper household = trip.Household; Framework.DomainModels.Models.IHouseholdTotals householdTotals = household.HouseholdTotals; IPersonWrapper person = trip.Person; ITourWrapper tour = trip.Tour; Framework.DomainModels.Models.IHalfTour halfTour = trip.HalfTour; // household inputs int onePersonHouseholdFlag = household.IsOnePersonHousehold.ToFlag(); int twoPersonHouseholdFlag = household.IsTwoPersonHousehold.ToFlag(); int income0To25KFlag = household.Has0To25KIncome.ToFlag(); int income25To45KFlag = household.Has25To45KIncome.ToFlag(); int incomeOver100Flag = household.Has100KPlusIncome.ToFlag(); int childrenAge5Through15 = householdTotals.ChildrenAge5Through15; int nonworkingAdults = householdTotals.NonworkingAdults; int retiredAdults = householdTotals.RetiredAdults; int noCarsInHouseholdFlag = household.GetFlagForNoCarsInHousehold(household.VehiclesAvailable); int carsLessThanDriversFlag = household.GetFlagForCarsLessThanDrivers(household.VehiclesAvailable); // person inputs int drivingAgeStudentFlag = person.IsDrivingAgeStudent.ToFlag(); int maleFlag = person.IsMale.ToFlag(); int ageLessThan35Flag = person.AgeIsLessThan35.ToFlag(); // tour inputs int parkAndRideTourFlag = tour.IsParkAndRideMode().ToFlag(); int transitTourFlag = tour.IsTransitMode().ToFlag(); int schoolBusTourFlag = tour.IsSchoolBusMode().ToFlag(); int hov3TourFlag = tour.IsHov3Mode().ToFlag(); int hov2TourFlag = tour.IsHov2Mode().ToFlag(); int sovTourFlag = tour.IsSovMode().ToFlag(); int bikeTourFlag = tour.IsBikeMode().ToFlag(); int walkTourFlag = tour.IsWalkMode().ToFlag(); int tncTourFlag = (tour.Mode == Global.Settings.Modes.PaidRideShare).ToFlag(); int homeBasedWorkTourFlag = (tour.IsHomeBasedTour && tour.IsWorkPurpose()).ToFlag(); int homeBasedSchoolTourFlag = (tour.IsHomeBasedTour && tour.IsSchoolPurpose()).ToFlag(); int homeBasedEscortTourFlag = (tour.IsHomeBasedTour && tour.IsEscortPurpose()).ToFlag(); int homeBasedShoppingTourFlag = (tour.IsHomeBasedTour && tour.IsShoppingPurpose()).ToFlag(); int homeBasedMealTourFlag = (tour.IsHomeBasedTour && tour.IsMealPurpose()).ToFlag(); int homeBasedSocialTourFlag = (tour.IsHomeBasedTour && tour.IsSocialPurpose()).ToFlag(); int notHomeBasedTourFlag = (!tour.IsHomeBasedTour).ToFlag(); // var homeBasedNotWorkSchoolEscortTourFlag = (tour.IsHomeBasedTour && tour.DestinationPurpose > Global.Settings.Purposes.Escort).ToFlag(); // var costco = -0.1432 * homeBasedWorkTourFlag - 0.2000 * homeBasedSchoolTourFlag - 0.3000 * homeBasedEscortTourFlag - 0.2000 * homeBasedNotWorkSchoolEscortTourFlag - 0.2000 * notHomeBasedTourFlag; // trip inputs int originHomeEscortFlag = (trip.IsNoneOrHomePurposeByOrigin() && trip.IsEscortPurposeByDestination()).ToFlag(); int originWorkEscortFlag = (trip.IsWorkPurposeByOrigin() && trip.IsEscortPurposeByDestination()).ToFlag(); int destinationHomeEscortFlag = (trip.IsNoneOrHomePurposeByDestination() && trip.IsEscortPurposeByOrigin()).ToFlag(); int destinationWorkEscortFlag = (trip.IsWorkPurposeByDestination() && trip.IsEscortPurposeByOrigin()).ToFlag(); // only trip on first half-tour int onlyTripOnFirstHalfFlag = (trip.IsHalfTourFromOrigin && halfTour.SimulatedTrips == 1 && trip.IsToTourOrigin).ToFlag(); // first trip on first half-tour, not only one int firstTripOnFirstHalfFlag = (trip.IsHalfTourFromOrigin && halfTour.SimulatedTrips == 1 && !trip.IsToTourOrigin).ToFlag(); // last trip first half-tour, not only one int lastTripOnFirstHalfFlag = (trip.IsHalfTourFromOrigin && halfTour.SimulatedTrips > 1 && trip.IsToTourOrigin).ToFlag(); // only trip on second half-tour int onlyTripOnSecondHalfFlag = (!trip.IsHalfTourFromOrigin && halfTour.SimulatedTrips == 1 && trip.IsToTourOrigin).ToFlag(); // first trip on second half-tour, not only one int firstTripOnSecondHalfFlag = (!trip.IsHalfTourFromOrigin && halfTour.SimulatedTrips == 1 && !trip.IsToTourOrigin).ToFlag(); // last trip second half-tour, not only one int lastTripOnSecondHalfFlag = (!trip.IsHalfTourFromOrigin && halfTour.SimulatedTrips > 1 && trip.IsToTourOrigin).ToFlag(); // remaining inputs double originMixedDensity = originParcel.MixedUse4Index1(); double originIntersectionDensity = originParcel.NetIntersectionDensity1(); double destinationParkingCost = destinationParcel.ParkingCostBuffer1(2); int amPeriodFlag = departureTime.IsLeftExclusiveBetween(Global.Settings.Times.SixAM, Global.Settings.Times.TenAM).ToFlag(); int middayPeriodFlag = departureTime.IsLeftExclusiveBetween(Global.Settings.Times.TenAM, Global.Settings.Times.ThreePM).ToFlag(); int pmPeriodFlag = departureTime.IsLeftExclusiveBetween(Global.Settings.Times.ThreePM, Global.Settings.Times.SevenPM).ToFlag(); int eveningPeriodFlag = (departureTime > Global.Settings.Times.SevenPM).ToFlag(); // availability bool[] tripModeAvailable = new bool[Global.Settings.Modes.TotalModes + 1]; bool isLastTripInTour = (!trip.IsHalfTourFromOrigin && halfTour.SimulatedTrips == 1 && trip.IsToTourOrigin) || (!trip.IsHalfTourFromOrigin && halfTour.SimulatedTrips > 1 && trip.IsToTourOrigin); int frequencyPreviousTripModeIsTourMode = trip.IsHalfTourFromOrigin ? tour.HalfTourFromOrigin.Trips.Where(x => x.Sequence < trip.Sequence).Count(x => tour.Mode == x.Mode) : tour.HalfTourFromOrigin.Trips.Union(tour.HalfTourFromDestination.Trips.Where(x => x.Sequence < trip.Sequence)).Count(x => tour.Mode == x.Mode); // if a park and ride tour, only car is available int maxAvail = tour.Mode; if (tour.Mode == Global.Settings.Modes.ParkAndRide) { tripModeAvailable[Global.Settings.Modes.Sov] = tour.Household.VehiclesAvailable > 0 && tour.Person.IsDrivingAge; tripModeAvailable[Global.Settings.Modes.Hov2] = !tripModeAvailable[Global.Settings.Modes.Sov]; } // if the last trip of the tour and tour mode not yet used, only the tour mode is available else if (isLastTripInTour && frequencyPreviousTripModeIsTourMode == 0 && tour.Mode <= maxAvail) { tripModeAvailable[tour.Mode] = true; } else { // set availability based on tour mode for (int mode = Global.Settings.Modes.Walk; mode <= maxAvail; mode++) { if (mode != Global.Settings.Modes.ParkAndRide) { tripModeAvailable[mode] = true; } } } { // school bus is a special case - use HOV3 impedance and only available for school bus tours IPathTypeModel pathTypeExtra = pathTypeModels.First(x => x.Mode == Global.Settings.Modes.Hov3); int modeExtra = Global.Settings.Modes.SchoolBus; bool availableExtra = pathTypeExtra.Available && tour.IsSchoolBusMode() && tripModeAvailable[modeExtra]; double generalizedTimeLogsumExtra = pathTypeExtra.GeneralizedTimeLogsum; ChoiceProbabilityCalculator.Alternative alternative = choiceProbabilityCalculator.GetAlternative(modeExtra, availableExtra, choice == modeExtra); alternative.Choice = modeExtra; alternative.AddNestedAlternative(_nestedAlternativeIds[modeExtra], _nestedAlternativeIndexes[modeExtra], THETA_PARAMETER); if (availableExtra) { // case Global.Settings.Modes.SchoolBus: alternative.AddUtilityTerm(2, generalizedTimeLogsumExtra * tour.TimeCoefficient); alternative.AddUtilityTerm(18, 1); alternative.AddUtilityTerm(100, schoolBusTourFlag); alternative.AddUtilityTerm(102, (schoolBusTourFlag * onlyTripOnFirstHalfFlag)); alternative.AddUtilityTerm(103, (schoolBusTourFlag * onlyTripOnSecondHalfFlag)); alternative.AddUtilityTerm(104, (schoolBusTourFlag * firstTripOnFirstHalfFlag)); alternative.AddUtilityTerm(105, (schoolBusTourFlag * firstTripOnSecondHalfFlag)); alternative.AddUtilityTerm(106, (schoolBusTourFlag * lastTripOnFirstHalfFlag)); alternative.AddUtilityTerm(107, (schoolBusTourFlag * lastTripOnSecondHalfFlag)); alternative.AddUtilityTerm(112, parkAndRideTourFlag); alternative.AddUtilityTerm(113, transitTourFlag); } } foreach (IPathTypeModel pathTypeModel in pathTypeModels) { int mode = pathTypeModel.Mode; bool available = (pathTypeModel.Mode != Global.Settings.Modes.PaidRideShare || Global.Configuration.PaidRideShareModeIsAvailable) && pathTypeModel.Available && tripModeAvailable[mode]; double generalizedTimeLogsum = pathTypeModel.GeneralizedTimeLogsum; ChoiceProbabilityCalculator.Alternative alternative = choiceProbabilityCalculator.GetAlternative(mode, available, choice == mode); alternative.Choice = mode; alternative.AddNestedAlternative(_nestedAlternativeIds[mode], _nestedAlternativeIndexes[mode], THETA_PARAMETER); if (!available) { continue; } double modeTimeCoefficient = (Global.Configuration.AV_IncludeAutoTypeChoice && household.OwnsAutomatedVehicles > 0 && mode >= Global.Settings.Modes.Sov && mode <= Global.Settings.Modes.Hov3) ? tour.TimeCoefficient * (1.0 - Global.Configuration.AV_InVehicleTimeCoefficientDiscountFactor) : (mode == Global.Settings.Modes.PaidRideShare && Global.Configuration.AV_PaidRideShareModeUsesAVs) ? tour.TimeCoefficient * (1.0 - Global.Configuration.AV_InVehicleTimeCoefficientDiscountFactor) : tour.TimeCoefficient; alternative.AddUtilityTerm(2, generalizedTimeLogsum * modeTimeCoefficient); if (mode == Global.Settings.Modes.Transit) { alternative.AddUtilityTerm(20, 1); alternative.AddUtilityTerm(22, carsLessThanDriversFlag); alternative.AddUtilityTerm(100, transitTourFlag); alternative.AddUtilityTerm(102, (transitTourFlag * onlyTripOnFirstHalfFlag)); alternative.AddUtilityTerm(103, (transitTourFlag * onlyTripOnSecondHalfFlag)); alternative.AddUtilityTerm(104, (transitTourFlag * firstTripOnFirstHalfFlag)); alternative.AddUtilityTerm(105, (transitTourFlag * firstTripOnSecondHalfFlag)); alternative.AddUtilityTerm(106, (transitTourFlag * lastTripOnFirstHalfFlag)); alternative.AddUtilityTerm(107, (transitTourFlag * lastTripOnSecondHalfFlag)); alternative.AddUtilityTerm(136, tncTourFlag); } else if (mode == Global.Settings.Modes.Hov3) { alternative.AddUtilityTerm(30, 1); alternative.AddUtilityTerm(1, (destinationParkingCost * tour.CostCoefficient / ChoiceModelUtility.CPFACT3)); alternative.AddUtilityTerm(32, childrenAge5Through15); alternative.AddUtilityTerm(34, (nonworkingAdults + retiredAdults)); alternative.AddUtilityTerm(36, onePersonHouseholdFlag); alternative.AddUtilityTerm(37, twoPersonHouseholdFlag); alternative.AddUtilityTerm(41, noCarsInHouseholdFlag); alternative.AddUtilityTerm(100, hov3TourFlag); alternative.AddUtilityTerm(102, (hov3TourFlag * onlyTripOnFirstHalfFlag)); alternative.AddUtilityTerm(103, (hov3TourFlag * onlyTripOnSecondHalfFlag)); alternative.AddUtilityTerm(104, (hov3TourFlag * firstTripOnFirstHalfFlag)); alternative.AddUtilityTerm(105, (hov3TourFlag * firstTripOnSecondHalfFlag)); alternative.AddUtilityTerm(106, (hov3TourFlag * lastTripOnFirstHalfFlag)); alternative.AddUtilityTerm(107, (hov3TourFlag * lastTripOnSecondHalfFlag)); alternative.AddUtilityTerm(114, parkAndRideTourFlag); alternative.AddUtilityTerm(115, transitTourFlag); alternative.AddUtilityTerm(116, schoolBusTourFlag); alternative.AddUtilityTerm(135, tncTourFlag); alternative.AddUtilityTerm(149, homeBasedWorkTourFlag); alternative.AddUtilityTerm(150, homeBasedSchoolTourFlag); alternative.AddUtilityTerm(152, homeBasedEscortTourFlag); alternative.AddUtilityTerm(153, homeBasedShoppingTourFlag); alternative.AddUtilityTerm(154, homeBasedMealTourFlag); alternative.AddUtilityTerm(155, homeBasedSocialTourFlag); alternative.AddUtilityTerm(161, (destinationWorkEscortFlag * amPeriodFlag)); alternative.AddUtilityTerm(162, (originWorkEscortFlag * pmPeriodFlag)); alternative.AddUtilityTerm(163, (originHomeEscortFlag * amPeriodFlag)); alternative.AddUtilityTerm(164, (originHomeEscortFlag * middayPeriodFlag)); alternative.AddUtilityTerm(165, (originHomeEscortFlag * pmPeriodFlag)); alternative.AddUtilityTerm(166, (originHomeEscortFlag * eveningPeriodFlag)); alternative.AddUtilityTerm(167, (destinationHomeEscortFlag * amPeriodFlag)); alternative.AddUtilityTerm(168, (destinationHomeEscortFlag * middayPeriodFlag)); alternative.AddUtilityTerm(169, (destinationHomeEscortFlag * pmPeriodFlag)); alternative.AddUtilityTerm(170, (destinationHomeEscortFlag * eveningPeriodFlag)); } else if (mode == Global.Settings.Modes.Hov2) { alternative.AddUtilityTerm(40, 1); alternative.AddUtilityTerm(1, (destinationParkingCost * tour.CostCoefficient / ChoiceModelUtility.CPFACT2)); alternative.AddUtilityTerm(32, (childrenAge5Through15 * (1 - homeBasedEscortTourFlag))); alternative.AddUtilityTerm(34, ((nonworkingAdults + retiredAdults) * (1 - homeBasedEscortTourFlag))); alternative.AddUtilityTerm(38, onePersonHouseholdFlag); alternative.AddUtilityTerm(41, noCarsInHouseholdFlag); alternative.AddUtilityTerm(100, hov2TourFlag); alternative.AddUtilityTerm(102, (hov2TourFlag * onlyTripOnFirstHalfFlag)); alternative.AddUtilityTerm(103, (hov2TourFlag * onlyTripOnSecondHalfFlag)); alternative.AddUtilityTerm(104, (hov2TourFlag * firstTripOnFirstHalfFlag)); alternative.AddUtilityTerm(105, (hov2TourFlag * firstTripOnSecondHalfFlag)); alternative.AddUtilityTerm(106, (hov2TourFlag * lastTripOnFirstHalfFlag)); alternative.AddUtilityTerm(107, (hov2TourFlag * lastTripOnSecondHalfFlag)); alternative.AddUtilityTerm(118, transitTourFlag); alternative.AddUtilityTerm(119, schoolBusTourFlag); alternative.AddUtilityTerm(120, hov3TourFlag); alternative.AddUtilityTerm(135, tncTourFlag); alternative.AddUtilityTerm(149, homeBasedWorkTourFlag); alternative.AddUtilityTerm(150, homeBasedSchoolTourFlag); alternative.AddUtilityTerm(152, homeBasedEscortTourFlag); alternative.AddUtilityTerm(153, homeBasedShoppingTourFlag); alternative.AddUtilityTerm(154, homeBasedMealTourFlag); alternative.AddUtilityTerm(155, homeBasedSocialTourFlag); alternative.AddUtilityTerm(161, (destinationWorkEscortFlag * amPeriodFlag)); alternative.AddUtilityTerm(162, (originWorkEscortFlag * pmPeriodFlag)); alternative.AddUtilityTerm(163, (originHomeEscortFlag * amPeriodFlag)); alternative.AddUtilityTerm(164, (originHomeEscortFlag * middayPeriodFlag)); alternative.AddUtilityTerm(165, (originHomeEscortFlag * pmPeriodFlag)); alternative.AddUtilityTerm(166, (originHomeEscortFlag * eveningPeriodFlag)); alternative.AddUtilityTerm(167, (destinationHomeEscortFlag * amPeriodFlag)); alternative.AddUtilityTerm(168, (destinationHomeEscortFlag * middayPeriodFlag)); alternative.AddUtilityTerm(169, (destinationHomeEscortFlag * pmPeriodFlag)); alternative.AddUtilityTerm(170, (destinationHomeEscortFlag * eveningPeriodFlag)); } else if (mode == Global.Settings.Modes.Sov) { alternative.AddUtilityTerm(50, 1); alternative.AddUtilityTerm(1, (destinationParkingCost * tour.CostCoefficient)); alternative.AddUtilityTerm(52, carsLessThanDriversFlag); alternative.AddUtilityTerm(54, income0To25KFlag); alternative.AddUtilityTerm(55, income25To45KFlag); alternative.AddUtilityTerm(59, drivingAgeStudentFlag); alternative.AddUtilityTerm(100, sovTourFlag); alternative.AddUtilityTerm(102, (sovTourFlag * onlyTripOnFirstHalfFlag)); alternative.AddUtilityTerm(103, (sovTourFlag * onlyTripOnSecondHalfFlag)); alternative.AddUtilityTerm(104, (sovTourFlag * firstTripOnFirstHalfFlag)); alternative.AddUtilityTerm(105, (sovTourFlag * firstTripOnSecondHalfFlag)); alternative.AddUtilityTerm(106, (sovTourFlag * lastTripOnFirstHalfFlag)); alternative.AddUtilityTerm(107, (sovTourFlag * lastTripOnSecondHalfFlag)); alternative.AddUtilityTerm(121, parkAndRideTourFlag); alternative.AddUtilityTerm(122, transitTourFlag); alternative.AddUtilityTerm(124, hov3TourFlag); alternative.AddUtilityTerm(125, hov2TourFlag); alternative.AddUtilityTerm(134, tncTourFlag); } else if (mode == Global.Settings.Modes.Bike) { alternative.AddUtilityTerm(60, 1); alternative.AddUtilityTerm(61, maleFlag); alternative.AddUtilityTerm(62, ageLessThan35Flag); alternative.AddUtilityTerm(65, originIntersectionDensity); alternative.AddUtilityTerm(100, bikeTourFlag); alternative.AddUtilityTerm(102, (bikeTourFlag * onlyTripOnFirstHalfFlag)); alternative.AddUtilityTerm(103, (bikeTourFlag * onlyTripOnSecondHalfFlag)); alternative.AddUtilityTerm(104, (bikeTourFlag * firstTripOnFirstHalfFlag)); alternative.AddUtilityTerm(105, (bikeTourFlag * firstTripOnSecondHalfFlag)); alternative.AddUtilityTerm(106, (bikeTourFlag * lastTripOnFirstHalfFlag)); alternative.AddUtilityTerm(107, (bikeTourFlag * lastTripOnSecondHalfFlag)); alternative.AddUtilityTerm(127, transitTourFlag); alternative.AddUtilityTerm(128, schoolBusTourFlag); alternative.AddUtilityTerm(130, hov2TourFlag); alternative.AddUtilityTerm(131, sovTourFlag); alternative.AddUtilityTerm(133, tncTourFlag); alternative.AddUtilityTerm(147, notHomeBasedTourFlag); } else if (mode == Global.Settings.Modes.Walk) { alternative.AddUtilityTerm(72, ageLessThan35Flag); alternative.AddUtilityTerm(75, originIntersectionDensity); alternative.AddUtilityTerm(78, originMixedDensity); // origin and destination mixed use measures - geometric avg. - half mile from cell, in 1000s alternative.AddUtilityTerm(100, walkTourFlag); alternative.AddUtilityTerm(102, (walkTourFlag * onlyTripOnFirstHalfFlag)); alternative.AddUtilityTerm(103, (walkTourFlag * onlyTripOnSecondHalfFlag)); alternative.AddUtilityTerm(104, (walkTourFlag * firstTripOnFirstHalfFlag)); alternative.AddUtilityTerm(105, (walkTourFlag * firstTripOnSecondHalfFlag)); alternative.AddUtilityTerm(106, (walkTourFlag * lastTripOnFirstHalfFlag)); alternative.AddUtilityTerm(107, (walkTourFlag * lastTripOnSecondHalfFlag)); alternative.AddUtilityTerm(141, homeBasedWorkTourFlag); alternative.AddUtilityTerm(142, homeBasedSchoolTourFlag); } else if (mode == Global.Settings.Modes.PaidRideShare) { alternative.AddUtilityTerm(100, tncTourFlag); alternative.AddUtilityTerm(102, (tncTourFlag * onlyTripOnFirstHalfFlag)); alternative.AddUtilityTerm(103, (tncTourFlag * onlyTripOnSecondHalfFlag)); alternative.AddUtilityTerm(104, (tncTourFlag * firstTripOnFirstHalfFlag)); alternative.AddUtilityTerm(105, (tncTourFlag * firstTripOnSecondHalfFlag)); alternative.AddUtilityTerm(106, (tncTourFlag * lastTripOnFirstHalfFlag)); alternative.AddUtilityTerm(107, (tncTourFlag * lastTripOnSecondHalfFlag)); if (Global.Configuration.PaidRideshare_UseEstimatedInsteadOfAssertedCoefficients) { alternative.AddUtilityTerm(80, 1.0); alternative.AddUtilityTerm(81, noCarsInHouseholdFlag); alternative.AddUtilityTerm(82, carsLessThanDriversFlag); alternative.AddUtilityTerm(83, tour.Person.AgeIsBetween26And35.ToFlag()); alternative.AddUtilityTerm(83, tour.Person.AgeIsBetween18And25.ToFlag()); alternative.AddUtilityTerm(84, (tour.Person.Age >= 65).ToFlag()); alternative.AddUtilityTerm(85, originParcel.HouseholdsBuffer2 + originParcel.StudentsUniversityBuffer2 + originParcel.EmploymentTotalBuffer2); alternative.AddUtilityTerm(86, destinationParcel.HouseholdsBuffer2 + originParcel.StudentsUniversityBuffer2 + originParcel.EmploymentTotalBuffer2); alternative.AddUtilityTerm(87, income0To25KFlag); alternative.AddUtilityTerm(88, incomeOver100Flag); alternative.AddUtilityTerm(89, homeBasedWorkTourFlag); alternative.AddUtilityTerm(90, homeBasedSchoolTourFlag); alternative.AddUtilityTerm(91, homeBasedEscortTourFlag); alternative.AddUtilityTerm(92, homeBasedShoppingTourFlag); } else { double modeConstant = Global.Configuration.AV_PaidRideShareModeUsesAVs ? Global.Configuration.AV_PaidRideShare_ModeConstant + Global.Configuration.AV_PaidRideShare_DensityCoefficient * Math.Min(originParcel.HouseholdsBuffer2 + originParcel.StudentsUniversityBuffer2 + originParcel.EmploymentTotalBuffer2, (Global.Configuration.PaidRideShare_DensityMeasureCapValue > 0) ? Global.Configuration.PaidRideShare_DensityMeasureCapValue : 6000) + Global.Configuration.AV_PaidRideShare_AVOwnerCoefficient * (household.OwnsAutomatedVehicles > 0).ToFlag() : Global.Configuration.PaidRideShare_ModeConstant + Global.Configuration.PaidRideShare_DensityCoefficient * Math.Min(originParcel.HouseholdsBuffer2 + originParcel.StudentsUniversityBuffer2 + originParcel.EmploymentTotalBuffer2, (Global.Configuration.PaidRideShare_DensityMeasureCapValue > 0) ? Global.Configuration.PaidRideShare_DensityMeasureCapValue : 6000); alternative.AddUtilityTerm(90, modeConstant); alternative.AddUtilityTerm(90, Global.Configuration.PaidRideShare_Age26to35Coefficient * tour.Person.AgeIsBetween26And35.ToFlag()); alternative.AddUtilityTerm(90, Global.Configuration.PaidRideShare_Age18to25Coefficient * tour.Person.AgeIsBetween18And25.ToFlag()); alternative.AddUtilityTerm(90, Global.Configuration.PaidRideShare_AgeOver65Coefficient * (tour.Person.Age >= 65).ToFlag()); } } } }
public void SetUtilities(ISampleItem sampleItem, int sampleFrequency) { if (sampleItem == null) { throw new ArgumentNullException("sampleItem"); } ChoiceProbabilityCalculator.Alternative alternative = sampleItem.Alternative; if (!alternative.Available) { return; } IParcelWrapper destinationParcel = ChoiceModelFactory.Parcels[sampleItem.ParcelId]; // var destinationZoneTotals = ChoiceModelRunner.ZoneTotals[destinationParcel.ZoneId]; alternative.Choice = destinationParcel; ChoiceProbabilityCalculator.Alternative nestedAlternative = Global.ChoiceModelSession.Get <SchoolTourModeModel>().RunNested(_person, _person.Household.ResidenceParcel, destinationParcel, _destinationArrivalTime, _destinationDepartureTime, _person.Household.HouseholdTotals.DrivingAgeMembers); double schoolTourLogsum = nestedAlternative == null ? 0 : nestedAlternative.ComputeLogsum(); int votSegment = _person.Household.GetVotALSegment(); int taSegment = destinationParcel.TransitAccessSegment(); double aggregateLogsum = Global.AggregateLogsums[destinationParcel.ZoneId][Global.Settings.Purposes.HomeBasedComposite][Global.Settings.CarOwnerships.OneOrMoreCarsPerAdult][votSegment][taSegment]; double distanceFromOrigin = _person.Household.ResidenceParcel.DistanceFromOrigin(destinationParcel, 1); double distance1 = Math.Min(distanceFromOrigin, .1); double distance2 = Math.Max(0, Math.Min(distanceFromOrigin - .1, .5 - .1)); double distance3 = Math.Max(0, distanceFromOrigin - .5); double distanceLog = Math.Log(1 + distanceFromOrigin); double distanceFromWork = _person.IsFullOrPartTimeWorker ? _person.UsualWorkParcel.DistanceFromWorkLog(destinationParcel, 1) : 0; // var millionsSquareFeet = destinationZoneTotals.MillionsSquareFeet(); // zone densities // var eduDensity = destinationZoneTotals.GetEmploymentEducationDensity(millionsSquareFeet); // var govDensity = destinationZoneTotals.GetEmploymentGovernmentDensity(millionsSquareFeet); // var offDensity = destinationZoneTotals.GetEmploymentOfficeDensity(millionsSquareFeet); // var serDensity = destinationZoneTotals.GetEmploymentServiceDensity(millionsSquareFeet); // var houDensity = destinationZoneTotals.GetHouseholdsDensity(millionsSquareFeet); // parcel buffers double educationBuffer1 = Math.Log(destinationParcel.EmploymentEducationBuffer1 + 1); //var governmentBuffer1 = Math.Log(destinationParcel.EmploymentGovernmentBuffer1 + 1); //var officeBuffer1 = Math.Log(destinationParcel.EmploymentOfficeBuffer1 + 1); //var serviceBuffer1 = Math.Log(destinationParcel.EmploymentServiceBuffer1 + 1); //var householdsBuffer1 = Math.Log(destinationParcel.HouseholdsBuffer1 + 1); //var retailBuffer1 = Math.Log(destinationParcel.EmploymentRetailBuffer1 + 1); //var industrialAgricultureConstructionBuffer1 = Math.Log(destinationParcel.EmploymentIndustrialBuffer1 + destinationParcel.EmploymentAgricultureConstructionBuffer1 + 1); //var foodBuffer1 = Math.Log(destinationParcel.EmploymentFoodBuffer1 + 1); //var medicalBuffer1 = Math.Log(destinationParcel.EmploymentMedicalBuffer1 + 1); //var employmentTotalBuffer1 = Math.Log(destinationParcel.EmploymentTotalBuffer1 + 1); double studentsUniversityBuffer1 = Math.Log(destinationParcel.StudentsUniversityBuffer1 + 1); double studentsK8Buffer1 = Math.Log(destinationParcel.StudentsK8Buffer1 + 1); double studentsHighSchoolBuffer1 = Math.Log(destinationParcel.StudentsHighSchoolBuffer1 + 1); //var educationBuffer2 = Math.Log(destinationParcel.EmploymentEducationBuffer2 + 1); //var governmentBuffer2 = Math.Log(destinationParcel.EmploymentGovernmentBuffer2 + 1); //var officeBuffer2 = Math.Log(destinationParcel.EmploymentOfficeBuffer2 + 1); //var serviceBuffer2 = Math.Log(destinationParcel.EmploymentServiceBuffer2 + 1); double householdsBuffer2 = Math.Log(destinationParcel.HouseholdsBuffer2 + 1); //var retailBuffer2 = Math.Log(destinationParcel.EmploymentRetailBuffer2 + 1); //var industrialAgricultureConstructionBuffer2 = Math.Log(destinationParcel.EmploymentIndustrialBuffer2 + destinationParcel.EmploymentAgricultureConstructionBuffer2 + 1); //var foodBuffer2 = Math.Log(destinationParcel.EmploymentFoodBuffer2 + 1); //var medicalBuffer2 = Math.Log(destinationParcel.EmploymentMedicalBuffer2 + 1); double employmentTotalBuffer2 = Math.Log(destinationParcel.EmploymentTotalBuffer2 + 1); double studentsUniversityBuffer2 = Math.Log(destinationParcel.StudentsUniversityBuffer2 + 1); //var studentsK8Buffer2 = Math.Log(destinationParcel.StudentsK8Buffer2 + 1); //var studentsHighSchoolBuffer2 = Math.Log(destinationParcel.StudentsHighSchoolBuffer2 + 1); // var educationBuffer1 = Math.Log(Math.Max(0.0, destinationParcel.EmploymentEducationBuffer1 - destinationParcel.EmploymentEducation) + 1); // var governmentBuffer1 = Math.Log(Math.Max(0.0, destinationParcel.EmploymentGovernmentBuffer1 - destinationParcel.EmploymentGovernment) + 1); // var officeBuffer1 = Math.Log(Math.Max(0.0, destinationParcel.EmploymentOfficeBuffer1 - destinationParcel.EmploymentOffice) + 1); // var serviceBuffer1 = Math.Log(Math.Max(0.0, destinationParcel.EmploymentServiceBuffer1 - destinationParcel.EmploymentService) + 1); // var householdsBuffer1 = Math.Log(Math.Max(0.0, destinationParcel.HouseholdsBuffer1 - destinationParcel.Households) + 1); // var retailBuffer1 = Math.Log(Math.Max(0.0, destinationParcel.EmploymentRetailBuffer1 - destinationParcel.EmploymentRetail) + 1); // var industrialAgricultureConstructionBuffer1 = Math.Log(Math.Max(0.0, destinationParcel.EmploymentIndustrialBuffer1 + destinationParcel.EmploymentAgricultureConstructionBuffer1 // - destinationParcel.EmploymentIndustrial - destinationParcel.EmploymentAgricultureConstruction) + 1); // var foodBuffer1 = Math.Log(Math.Max(0.0, destinationParcel.EmploymentFoodBuffer1 - destinationParcel.EmploymentFood) + 1); // var medicalBuffer1 = Math.Log(Math.Max(0.0, destinationParcel.EmploymentMedicalBuffer1 - destinationParcel.EmploymentMedical) + 1); // var employmentTotalBuffer1 = Math.Log(Math.Max(0.0, destinationParcel.EmploymentTotalBuffer1 - destinationParcel.EmploymentTotal) + 1); // var studentsUniversityBuffer1 = Math.Log(Math.Max(0.0, destinationParcel.StudentsUniversityBuffer1 - destinationParcel.StudentsUniversity) + 1); // var studentsK8Buffer1 = Math.Log(Math.Max(0.0, destinationParcel.StudentsK8Buffer1 - destinationParcel.StudentsK8) + 1); // var studentsHighSchoolBuffer1 = Math.Log(Math.Max(0.0, destinationParcel.StudentsHighSchoolBuffer1 - destinationParcel.StudentsHighSchool) + 1); // // var educationBuffer2 = Math.Log(Math.Max(0.0, destinationParcel.EmploymentEducationBuffer2 - destinationParcel.EmploymentEducation) + 1); // var governmentBuffer2 = Math.Log(Math.Max(0.0, destinationParcel.EmploymentGovernmentBuffer2 - destinationParcel.EmploymentGovernment) + 1); // var officeBuffer2 = Math.Log(Math.Max(0.0, destinationParcel.EmploymentOfficeBuffer2 - destinationParcel.EmploymentOffice) + 1); // var serviceBuffer2 = Math.Log(Math.Max(0.0, destinationParcel.EmploymentServiceBuffer2 - destinationParcel.EmploymentService) + 1); // var householdsBuffer2 = Math.Log(Math.Max(0.0, destinationParcel.HouseholdsBuffer2 - destinationParcel.Households) + 1); // var retailBuffer2 = Math.Log(Math.Max(0.0, destinationParcel.EmploymentRetailBuffer2 - destinationParcel.EmploymentRetail) + 1); // var industrialAgricultureConstructionBuffer2 = Math.Log(Math.Max(0.0, destinationParcel.EmploymentIndustrialBuffer2 + destinationParcel.EmploymentAgricultureConstructionBuffer2 // - destinationParcel.EmploymentIndustrial - destinationParcel.EmploymentAgricultureConstruction) + 1); // var foodBuffer2 = Math.Log(Math.Max(0.0, destinationParcel.EmploymentFoodBuffer2 - destinationParcel.EmploymentFood) + 1); // var medicalBuffer2 = Math.Log(Math.Max(0.0, destinationParcel.EmploymentMedicalBuffer2 - destinationParcel.EmploymentMedical) + 1); // var employmentTotalBuffer2 = Math.Log(Math.Max(0.0, destinationParcel.EmploymentTotalBuffer2 - destinationParcel.EmploymentTotal) + 1); // var studentsUniversityBuffer2 = Math.Log(Math.Max(0.0, destinationParcel.StudentsUniversityBuffer2 - destinationParcel.StudentsUniversity) + 1); // var studentsK8Buffer2 = Math.Log(Math.Max(0.0, destinationParcel.StudentsK8Buffer2 - destinationParcel.StudentsK8) + 1); // var studentsHighSchoolBuffer2 = Math.Log(Math.Max(0.0, destinationParcel.StudentsHighSchoolBuffer2 - destinationParcel.StudentsHighSchool) + 1); alternative.AddUtilityTerm(1, sampleItem.AdjustmentFactor); alternative.AddUtilityTerm(2, _person.IsChildUnder5.ToFlag() * schoolTourLogsum); alternative.AddUtilityTerm(3, _person.IsChildAge5Through15.ToFlag() * schoolTourLogsum); alternative.AddUtilityTerm(4, _person.IsDrivingAgeStudent.ToFlag() * schoolTourLogsum); alternative.AddUtilityTerm(5, _person.IsUniversityStudent.ToFlag() * schoolTourLogsum); alternative.AddUtilityTerm(6, (!_person.IsStudentAge).ToFlag() * schoolTourLogsum); alternative.AddUtilityTerm(7, _person.IsChildUnder5.ToFlag() * distance1); alternative.AddUtilityTerm(8, _person.IsChildUnder5.ToFlag() * distance2); alternative.AddUtilityTerm(9, _person.IsChildUnder5.ToFlag() * distance3); alternative.AddUtilityTerm(10, _person.IsChildAge5Through15.ToFlag() * distance1); alternative.AddUtilityTerm(11, _person.IsChildAge5Through15.ToFlag() * distance2); alternative.AddUtilityTerm(12, _person.IsChildAge5Through15.ToFlag() * distance3); alternative.AddUtilityTerm(13, _person.IsDrivingAgeStudent.ToFlag() * distanceLog); alternative.AddUtilityTerm(14, _person.IsUniversityStudent.ToFlag() * distanceLog); alternative.AddUtilityTerm(15, (!_person.IsStudentAge).ToFlag() * distanceLog); alternative.AddUtilityTerm(16, (!_person.IsStudentAge).ToFlag() * distanceFromWork); alternative.AddUtilityTerm(17, _person.IsChildUnder5.ToFlag() * aggregateLogsum); alternative.AddUtilityTerm(18, _person.IsChildAge5Through15.ToFlag() * aggregateLogsum); alternative.AddUtilityTerm(19, _person.IsDrivingAgeStudent.ToFlag() * aggregateLogsum); alternative.AddUtilityTerm(20, _person.IsUniversityStudent.ToFlag() * aggregateLogsum); alternative.AddUtilityTerm(21, (!_person.IsStudentAge).ToFlag() * aggregateLogsum); //Neighborhood alternative.AddUtilityTerm(30, _person.IsChildUnder5.ToFlag() * householdsBuffer2); alternative.AddUtilityTerm(31, _person.IsChildUnder5.ToFlag() * studentsHighSchoolBuffer1); alternative.AddUtilityTerm(32, _person.IsChildUnder5.ToFlag() * employmentTotalBuffer2); alternative.AddUtilityTerm(33, _person.IsChildAge5Through15.ToFlag() * studentsK8Buffer1); alternative.AddUtilityTerm(34, _person.IsDrivingAgeStudent.ToFlag() * studentsHighSchoolBuffer1); alternative.AddUtilityTerm(35, _person.IsUniversityStudent.ToFlag() * educationBuffer1); alternative.AddUtilityTerm(36, _person.IsAdult.ToFlag() * studentsUniversityBuffer1); alternative.AddUtilityTerm(37, _person.IsAdult.ToFlag() * studentsUniversityBuffer2); alternative.AddUtilityTerm(38, _person.IsAdult.ToFlag() * studentsK8Buffer1); //Size alternative.AddUtilityTerm(61, _person.IsChildUnder5.ToFlag() * destinationParcel.EmploymentEducation); alternative.AddUtilityTerm(62, _person.IsChildUnder5.ToFlag() * destinationParcel.EmploymentService); alternative.AddUtilityTerm(63, _person.IsChildUnder5.ToFlag() * destinationParcel.EmploymentOffice); alternative.AddUtilityTerm(64, _person.IsChildUnder5.ToFlag() * destinationParcel.EmploymentTotal); alternative.AddUtilityTerm(65, _person.IsChildUnder5.ToFlag() * 10.0 * destinationParcel.Households); alternative.AddUtilityTerm(66, _person.IsChildUnder5.ToFlag() * destinationParcel.StudentsK8); alternative.AddUtilityTerm(67, _person.IsChildAge5Through15.ToFlag() * destinationParcel.EmploymentEducation); alternative.AddUtilityTerm(68, _person.IsChildAge5Through15.ToFlag() * destinationParcel.EmploymentService); alternative.AddUtilityTerm(69, _person.IsChildAge5Through15.ToFlag() * destinationParcel.StudentsHighSchool); alternative.AddUtilityTerm(70, _person.IsChildAge5Through15.ToFlag() * destinationParcel.EmploymentTotal); alternative.AddUtilityTerm(71, _person.IsChildAge5Through15.ToFlag() * 10.0 * destinationParcel.Households); alternative.AddUtilityTerm(72, _person.IsChildAge5Through15.ToFlag() * destinationParcel.StudentsK8); alternative.AddUtilityTerm(73, _person.IsDrivingAgeStudent.ToFlag() * destinationParcel.EmploymentEducation); alternative.AddUtilityTerm(74, _person.IsDrivingAgeStudent.ToFlag() * destinationParcel.EmploymentService); alternative.AddUtilityTerm(75, _person.IsDrivingAgeStudent.ToFlag() * destinationParcel.EmploymentOffice); alternative.AddUtilityTerm(76, _person.IsDrivingAgeStudent.ToFlag() * destinationParcel.EmploymentTotal); alternative.AddUtilityTerm(77, _person.IsDrivingAgeStudent.ToFlag() * 10.0 * destinationParcel.Households); alternative.AddUtilityTerm(78, _person.IsDrivingAgeStudent.ToFlag() * destinationParcel.StudentsHighSchool); alternative.AddUtilityTerm(79, _person.IsAdult.ToFlag() * destinationParcel.EmploymentEducation); alternative.AddUtilityTerm(80, _person.IsAdult.ToFlag() * destinationParcel.EmploymentService); alternative.AddUtilityTerm(81, _person.IsAdult.ToFlag() * destinationParcel.EmploymentOffice); alternative.AddUtilityTerm(82, _person.IsAdult.ToFlag() * destinationParcel.EmploymentTotal); alternative.AddUtilityTerm(83, _person.IsAdult.ToFlag() * destinationParcel.StudentsUniversity); alternative.AddUtilityTerm(84, _person.IsAdult.ToFlag() * destinationParcel.StudentsHighSchool); // set shadow price depending on persontype and add it to utility // we are using the sampling adjustment factor assuming that it is 1 if (Global.Configuration.ShouldUseShadowPricing) { alternative.AddUtilityTerm(1, _person.IsAdult ? destinationParcel.ShadowPriceForStudentsUniversity : destinationParcel.ShadowPriceForStudentsK12); } //remove nesting for estimation of conditional MNL alternative.AddNestedAlternative(_sampleSize + 2, 0, 99); }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, ITripWrapper trip, IEnumerable <IPathTypeModel> pathTypeModels, IParcelWrapper originParcel, IParcelWrapper destinationParcel, int choice = Constants.DEFAULT_VALUE) { IHouseholdWrapper household = trip.Household; Framework.DomainModels.Models.IHouseholdTotals householdTotals = household.HouseholdTotals; IPersonWrapper person = trip.Person; ITourWrapper tour = trip.Tour; Framework.DomainModels.Models.IHalfTour halfTour = trip.HalfTour; // household inputs int onePersonHouseholdFlag = household.IsOnePersonHousehold.ToFlag(); int twoPersonHouseholdFlag = household.IsTwoPersonHousehold.ToFlag(); int income0To25KFlag = household.Has0To25KIncome.ToFlag(); int income25To45KFlag = household.Has25To45KIncome.ToFlag(); int childrenAge5Through15 = householdTotals.ChildrenAge5Through15; int nonworkingAdults = householdTotals.NonworkingAdults; int retiredAdults = householdTotals.RetiredAdults; int noCarsInHouseholdFlag = household.GetFlagForNoCarsInHousehold(household.VehiclesAvailable); int carsLessThanDriversFlag = household.GetFlagForCarsLessThanDrivers(household.VehiclesAvailable); // person inputs int drivingAgeStudentFlag = person.IsDrivingAgeStudent.ToFlag(); int maleFlag = person.IsMale.ToFlag(); int ageLessThan35Flag = person.AgeIsLessThan35.ToFlag(); // tour inputs int parkAndRideTourFlag = tour.IsParkAndRideMode().ToFlag(); int transitTourFlag = tour.IsTransitMode().ToFlag(); int schoolBusTourFlag = tour.IsSchoolBusMode().ToFlag(); int hov3TourFlag = tour.IsHov3Mode().ToFlag(); int hov2TourFlag = tour.IsHov2Mode().ToFlag(); int sovTourFlag = tour.IsSovMode().ToFlag(); int bikeTourFlag = tour.IsBikeMode().ToFlag(); int walkTourFlag = tour.IsWalkMode().ToFlag(); int homeBasedWorkTourFlag = (tour.IsHomeBasedTour && tour.IsWorkPurpose()).ToFlag(); int homeBasedSchoolTourFlag = (tour.IsHomeBasedTour && tour.IsSchoolPurpose()).ToFlag(); int homeBasedEscortTourFlag = (tour.IsHomeBasedTour && tour.IsEscortPurpose()).ToFlag(); int homeBasedShoppingTourFlag = (tour.IsHomeBasedTour && tour.IsShoppingPurpose()).ToFlag(); int homeBasedMealTourFlag = (tour.IsHomeBasedTour && tour.IsMealPurpose()).ToFlag(); int homeBasedSocialTourFlag = (tour.IsHomeBasedTour && tour.IsSocialPurpose()).ToFlag(); int notHomeBasedTourFlag = (!tour.IsHomeBasedTour).ToFlag(); int homeBasedNotWorkSchoolEscortTourFlag = (tour.IsHomeBasedTour && tour.DestinationPurpose > Global.Settings.Purposes.Escort).ToFlag(); int jointTourFlag = (tour.JointTourSequence > 0) ? 1 : 0; int partialHalfTourFlag = (trip.IsHalfTourFromOrigin ? tour.PartialHalfTour1Sequence > 0 : tour.PartialHalfTour2Sequence > 0) ? 1 : 0; int fullHalfTourFlag = (trip.IsHalfTourFromOrigin ? tour.FullHalfTour1Sequence > 0 : tour.FullHalfTour2Sequence > 0) ? 1 : 0; // trip inputs int originHomeEscortFlag = (trip.IsNoneOrHomePurposeByOrigin() && trip.IsEscortPurposeByDestination()).ToFlag(); int originWorkEscortFlag = (trip.IsWorkPurposeByOrigin() && trip.IsEscortPurposeByDestination()).ToFlag(); int destinationHomeEscortFlag = (trip.IsNoneOrHomePurposeByDestination() && trip.IsEscortPurposeByOrigin()).ToFlag(); int destinationWorkEscortFlag = (trip.IsWorkPurposeByDestination() && trip.IsEscortPurposeByOrigin()).ToFlag(); // only trip on first half-tour int onlyTripOnFirstHalfFlag = (trip.IsHalfTourFromOrigin && halfTour.SimulatedTrips == 1 && trip.IsToTourOrigin).ToFlag(); // first trip on first half-tour, not only one int firstTripOnFirstHalfFlag = (trip.IsHalfTourFromOrigin && halfTour.SimulatedTrips == 1 && !trip.IsToTourOrigin).ToFlag(); // last trip first half-tour, not only one int lastTripOnFirstHalfFlag = (trip.IsHalfTourFromOrigin && halfTour.SimulatedTrips > 1 && trip.IsToTourOrigin).ToFlag(); // only trip on second half-tour int onlyTripOnSecondHalfFlag = (!trip.IsHalfTourFromOrigin && halfTour.SimulatedTrips == 1 && trip.IsToTourOrigin).ToFlag(); // first trip on second half-tour, not only one int firstTripOnSecondHalfFlag = (!trip.IsHalfTourFromOrigin && halfTour.SimulatedTrips == 1 && !trip.IsToTourOrigin).ToFlag(); // last trip second half-tour, not only one int lastTripOnSecondHalfFlag = (!trip.IsHalfTourFromOrigin && halfTour.SimulatedTrips > 1 && trip.IsToTourOrigin).ToFlag(); // remaining inputs int departureTime = trip.IsHalfTourFromOrigin ? trip.LatestDepartureTime : trip.EarliestDepartureTime; double originMixedDensity = originParcel.MixedUse4Index1(); double originIntersectionDensity = originParcel.NetIntersectionDensity1(); double destinationParkingCost = destinationParcel.ParkingCostBuffer1(2); int amPeriodFlag = departureTime.IsLeftExclusiveBetween(Global.Settings.Times.SixAM, Global.Settings.Times.TenAM).ToFlag(); int middayPeriodFlag = departureTime.IsLeftExclusiveBetween(Global.Settings.Times.TenAM, Global.Settings.Times.ThreePM).ToFlag(); int pmPeriodFlag = departureTime.IsLeftExclusiveBetween(Global.Settings.Times.ThreePM, Global.Settings.Times.SevenPM).ToFlag(); int eveningPeriodFlag = (departureTime > Global.Settings.Times.SevenPM).ToFlag(); // availability bool[] tripModeAvailable = new bool[Global.Settings.Modes.TotalModes]; bool isLastTripInTour = (!trip.IsHalfTourFromOrigin && halfTour.SimulatedTrips >= 1 && trip.IsToTourOrigin); int frequencyPreviousTripModeIsTourMode = 0; if (trip.IsHalfTourFromOrigin) { frequencyPreviousTripModeIsTourMode += tour.HalfTourFromOrigin.Trips.Where(x => x.Sequence < trip.Sequence).Count(x => tour.Mode == x.Mode); } else { if (tour.HalfTourFromOrigin != null) { frequencyPreviousTripModeIsTourMode += tour.HalfTourFromOrigin.Trips.Where(x => x.Sequence > 0).Count(x => tour.Mode == x.Mode); } frequencyPreviousTripModeIsTourMode += tour.HalfTourFromDestination.Trips.Where(x => x.Sequence < trip.Sequence).Count(x => tour.Mode == x.Mode); } // if a park and ride tour, only car is available if (tour.Mode == Global.Settings.Modes.ParkAndRide) { tripModeAvailable[Global.Settings.Modes.Sov] = tour.Household.VehiclesAvailable > 0 && tour.Person.IsDrivingAge; tripModeAvailable[Global.Settings.Modes.Hov2] = !tripModeAvailable[Global.Settings.Modes.Sov]; } // if the last trip of the tour and tour mode not yet used, only the tour mode is available else if (isLastTripInTour && frequencyPreviousTripModeIsTourMode == 0) { tripModeAvailable[tour.Mode] = true; } else { // set availability based on tour mode for (int mode = Global.Settings.Modes.Walk; mode <= tour.Mode; mode++) { tripModeAvailable[mode] = true; } } // school bus is a special case - use HOV3 impedance and only available for school bus tours IPathTypeModel pathTypeExtra = pathTypeModels.First(x => x.Mode == Global.Settings.Modes.Hov3); int modeExtra = Global.Settings.Modes.SchoolBus; bool availableExtra = pathTypeExtra.Available && tour.IsSchoolBusMode() && tripModeAvailable[modeExtra] && (trip.IsHalfTourFromOrigin ? trip.LatestDepartureTime - pathTypeExtra.PathTime >= trip.ArrivalTimeLimit : trip.EarliestDepartureTime + pathTypeExtra.PathTime <= trip.ArrivalTimeLimit); double generalizedTimeLogsumExtra = pathTypeExtra.GeneralizedTimeLogsum; ChoiceProbabilityCalculator.Alternative alternative = choiceProbabilityCalculator.GetAlternative(modeExtra, availableExtra, choice == modeExtra); alternative.Choice = modeExtra; alternative.AddNestedAlternative(_nestedAlternativeIds[modeExtra], _nestedAlternativeIndexes[modeExtra], THETA_PARAMETER); if (availableExtra) { // case Global.Settings.Modes.SchoolBus: alternative.AddUtilityTerm(2, generalizedTimeLogsumExtra * tour.TimeCoefficient); alternative.AddUtilityTerm(18, 1); alternative.AddUtilityTerm(100, schoolBusTourFlag); alternative.AddUtilityTerm(102, (schoolBusTourFlag * onlyTripOnFirstHalfFlag)); alternative.AddUtilityTerm(103, (schoolBusTourFlag * onlyTripOnSecondHalfFlag)); alternative.AddUtilityTerm(104, (schoolBusTourFlag * firstTripOnFirstHalfFlag)); alternative.AddUtilityTerm(105, (schoolBusTourFlag * firstTripOnSecondHalfFlag)); alternative.AddUtilityTerm(106, (schoolBusTourFlag * lastTripOnFirstHalfFlag)); alternative.AddUtilityTerm(107, (schoolBusTourFlag * lastTripOnSecondHalfFlag)); alternative.AddUtilityTerm(112, parkAndRideTourFlag); alternative.AddUtilityTerm(113, transitTourFlag); } foreach (IPathTypeModel pathTypeModel in pathTypeModels) { int mode = pathTypeModel.Mode; bool available = pathTypeModel.Available && tripModeAvailable[mode] && (trip.IsHalfTourFromOrigin ? trip.LatestDepartureTime - pathTypeModel.PathTime >= trip.ArrivalTimeLimit : trip.EarliestDepartureTime + pathTypeModel.PathTime <= trip.ArrivalTimeLimit); double generalizedTimeLogsum = pathTypeModel.GeneralizedTimeLogsum; alternative = choiceProbabilityCalculator.GetAlternative(mode, available, choice == mode); alternative.Choice = mode; alternative.AddNestedAlternative(_nestedAlternativeIds[mode], _nestedAlternativeIndexes[mode], THETA_PARAMETER); if (!available) { continue; } alternative.AddUtilityTerm(2, generalizedTimeLogsum * tour.TimeCoefficient); if (mode == Global.Settings.Modes.Transit) { alternative.AddUtilityTerm(20, 1); alternative.AddUtilityTerm(22, carsLessThanDriversFlag); alternative.AddUtilityTerm(100, transitTourFlag); alternative.AddUtilityTerm(102, (transitTourFlag * onlyTripOnFirstHalfFlag)); alternative.AddUtilityTerm(103, (transitTourFlag * onlyTripOnSecondHalfFlag)); alternative.AddUtilityTerm(104, (transitTourFlag * firstTripOnFirstHalfFlag)); alternative.AddUtilityTerm(105, (transitTourFlag * firstTripOnSecondHalfFlag)); alternative.AddUtilityTerm(106, (transitTourFlag * lastTripOnFirstHalfFlag)); alternative.AddUtilityTerm(107, (transitTourFlag * lastTripOnSecondHalfFlag)); alternative.AddUtilityTerm(181, jointTourFlag); alternative.AddUtilityTerm(182, fullHalfTourFlag + partialHalfTourFlag); } else if (mode == Global.Settings.Modes.Hov3) { alternative.AddUtilityTerm(30, 1); alternative.AddUtilityTerm(1, (destinationParkingCost * tour.CostCoefficient / ChoiceModelUtility.CPFACT3)); alternative.AddUtilityTerm(32, childrenAge5Through15); alternative.AddUtilityTerm(34, (nonworkingAdults + retiredAdults)); alternative.AddUtilityTerm(36, onePersonHouseholdFlag); alternative.AddUtilityTerm(37, twoPersonHouseholdFlag); alternative.AddUtilityTerm(41, noCarsInHouseholdFlag); alternative.AddUtilityTerm(100, hov3TourFlag); alternative.AddUtilityTerm(102, (hov3TourFlag * onlyTripOnFirstHalfFlag)); alternative.AddUtilityTerm(103, (hov3TourFlag * onlyTripOnSecondHalfFlag)); alternative.AddUtilityTerm(104, (hov3TourFlag * firstTripOnFirstHalfFlag)); alternative.AddUtilityTerm(105, (hov3TourFlag * firstTripOnSecondHalfFlag)); alternative.AddUtilityTerm(106, (hov3TourFlag * lastTripOnFirstHalfFlag)); alternative.AddUtilityTerm(107, (hov3TourFlag * lastTripOnSecondHalfFlag)); alternative.AddUtilityTerm(114, parkAndRideTourFlag); alternative.AddUtilityTerm(115, transitTourFlag); alternative.AddUtilityTerm(116, schoolBusTourFlag); alternative.AddUtilityTerm(149, homeBasedWorkTourFlag); alternative.AddUtilityTerm(150, homeBasedSchoolTourFlag); alternative.AddUtilityTerm(152, homeBasedEscortTourFlag); alternative.AddUtilityTerm(153, homeBasedShoppingTourFlag); alternative.AddUtilityTerm(154, homeBasedMealTourFlag); alternative.AddUtilityTerm(155, homeBasedSocialTourFlag); alternative.AddUtilityTerm(161, (destinationWorkEscortFlag * amPeriodFlag)); alternative.AddUtilityTerm(162, (originWorkEscortFlag * pmPeriodFlag)); alternative.AddUtilityTerm(163, (originHomeEscortFlag * amPeriodFlag)); alternative.AddUtilityTerm(164, (originHomeEscortFlag * middayPeriodFlag)); alternative.AddUtilityTerm(165, (originHomeEscortFlag * pmPeriodFlag)); alternative.AddUtilityTerm(166, (originHomeEscortFlag * eveningPeriodFlag)); alternative.AddUtilityTerm(167, (destinationHomeEscortFlag * amPeriodFlag)); alternative.AddUtilityTerm(168, (destinationHomeEscortFlag * middayPeriodFlag)); alternative.AddUtilityTerm(169, (destinationHomeEscortFlag * pmPeriodFlag)); alternative.AddUtilityTerm(170, (destinationHomeEscortFlag * eveningPeriodFlag)); alternative.AddUtilityTerm(183, jointTourFlag); alternative.AddUtilityTerm(184, fullHalfTourFlag + partialHalfTourFlag); } else if (mode == Global.Settings.Modes.Hov2) { alternative.AddUtilityTerm(40, 1); alternative.AddUtilityTerm(1, (destinationParkingCost * tour.CostCoefficient / ChoiceModelUtility.CPFACT2)); alternative.AddUtilityTerm(32, (childrenAge5Through15 * (1 - homeBasedEscortTourFlag))); alternative.AddUtilityTerm(34, ((nonworkingAdults + retiredAdults) * (1 - homeBasedEscortTourFlag))); alternative.AddUtilityTerm(38, onePersonHouseholdFlag); alternative.AddUtilityTerm(41, noCarsInHouseholdFlag); alternative.AddUtilityTerm(100, hov2TourFlag); alternative.AddUtilityTerm(102, (hov2TourFlag * onlyTripOnFirstHalfFlag)); alternative.AddUtilityTerm(103, (hov2TourFlag * onlyTripOnSecondHalfFlag)); alternative.AddUtilityTerm(104, (hov2TourFlag * firstTripOnFirstHalfFlag)); alternative.AddUtilityTerm(105, (hov2TourFlag * firstTripOnSecondHalfFlag)); alternative.AddUtilityTerm(106, (hov2TourFlag * lastTripOnFirstHalfFlag)); alternative.AddUtilityTerm(107, (hov2TourFlag * lastTripOnSecondHalfFlag)); alternative.AddUtilityTerm(118, transitTourFlag); alternative.AddUtilityTerm(119, schoolBusTourFlag); alternative.AddUtilityTerm(120, hov3TourFlag); alternative.AddUtilityTerm(149, homeBasedWorkTourFlag); alternative.AddUtilityTerm(150, homeBasedSchoolTourFlag); alternative.AddUtilityTerm(152, homeBasedEscortTourFlag); alternative.AddUtilityTerm(153, homeBasedShoppingTourFlag); alternative.AddUtilityTerm(154, homeBasedMealTourFlag); alternative.AddUtilityTerm(155, homeBasedSocialTourFlag); alternative.AddUtilityTerm(161, (destinationWorkEscortFlag * amPeriodFlag)); alternative.AddUtilityTerm(162, (originWorkEscortFlag * pmPeriodFlag)); alternative.AddUtilityTerm(163, (originHomeEscortFlag * amPeriodFlag)); alternative.AddUtilityTerm(164, (originHomeEscortFlag * middayPeriodFlag)); alternative.AddUtilityTerm(165, (originHomeEscortFlag * pmPeriodFlag)); alternative.AddUtilityTerm(166, (originHomeEscortFlag * eveningPeriodFlag)); alternative.AddUtilityTerm(167, (destinationHomeEscortFlag * amPeriodFlag)); alternative.AddUtilityTerm(168, (destinationHomeEscortFlag * middayPeriodFlag)); alternative.AddUtilityTerm(169, (destinationHomeEscortFlag * pmPeriodFlag)); alternative.AddUtilityTerm(170, (destinationHomeEscortFlag * eveningPeriodFlag)); } else if (mode == Global.Settings.Modes.Sov) { alternative.AddUtilityTerm(50, 1); alternative.AddUtilityTerm(1, (destinationParkingCost * tour.CostCoefficient)); alternative.AddUtilityTerm(52, carsLessThanDriversFlag); alternative.AddUtilityTerm(54, income0To25KFlag); alternative.AddUtilityTerm(55, income25To45KFlag); alternative.AddUtilityTerm(59, drivingAgeStudentFlag); alternative.AddUtilityTerm(100, sovTourFlag); alternative.AddUtilityTerm(102, (sovTourFlag * onlyTripOnFirstHalfFlag)); alternative.AddUtilityTerm(103, (sovTourFlag * onlyTripOnSecondHalfFlag)); alternative.AddUtilityTerm(104, (sovTourFlag * firstTripOnFirstHalfFlag)); alternative.AddUtilityTerm(105, (sovTourFlag * firstTripOnSecondHalfFlag)); alternative.AddUtilityTerm(106, (sovTourFlag * lastTripOnFirstHalfFlag)); alternative.AddUtilityTerm(107, (sovTourFlag * lastTripOnSecondHalfFlag)); alternative.AddUtilityTerm(121, parkAndRideTourFlag); alternative.AddUtilityTerm(122, transitTourFlag); alternative.AddUtilityTerm(124, hov3TourFlag); alternative.AddUtilityTerm(125, hov2TourFlag); alternative.AddUtilityTerm(185, jointTourFlag); alternative.AddUtilityTerm(186, fullHalfTourFlag + partialHalfTourFlag); } else if (mode == Global.Settings.Modes.Bike) { alternative.AddUtilityTerm(60, 1); alternative.AddUtilityTerm(61, maleFlag); alternative.AddUtilityTerm(62, ageLessThan35Flag); alternative.AddUtilityTerm(65, originIntersectionDensity); alternative.AddUtilityTerm(100, bikeTourFlag); alternative.AddUtilityTerm(102, (bikeTourFlag * onlyTripOnFirstHalfFlag)); alternative.AddUtilityTerm(103, (bikeTourFlag * onlyTripOnSecondHalfFlag)); alternative.AddUtilityTerm(104, (bikeTourFlag * firstTripOnFirstHalfFlag)); alternative.AddUtilityTerm(105, (bikeTourFlag * firstTripOnSecondHalfFlag)); alternative.AddUtilityTerm(106, (bikeTourFlag * lastTripOnFirstHalfFlag)); alternative.AddUtilityTerm(107, (bikeTourFlag * lastTripOnSecondHalfFlag)); alternative.AddUtilityTerm(127, transitTourFlag); alternative.AddUtilityTerm(128, schoolBusTourFlag); alternative.AddUtilityTerm(130, hov2TourFlag); alternative.AddUtilityTerm(131, sovTourFlag); alternative.AddUtilityTerm(147, notHomeBasedTourFlag); alternative.AddUtilityTerm(187, jointTourFlag); alternative.AddUtilityTerm(188, fullHalfTourFlag + partialHalfTourFlag); } else if (mode == Global.Settings.Modes.Walk) { alternative.AddUtilityTerm(72, ageLessThan35Flag); alternative.AddUtilityTerm(75, originIntersectionDensity); alternative.AddUtilityTerm(78, originMixedDensity); // origin and destination mixed use measures - geometric avg. - half mile from cell, in 1000s alternative.AddUtilityTerm(100, walkTourFlag); alternative.AddUtilityTerm(102, (walkTourFlag * onlyTripOnFirstHalfFlag)); alternative.AddUtilityTerm(103, (walkTourFlag * onlyTripOnSecondHalfFlag)); alternative.AddUtilityTerm(104, (walkTourFlag * firstTripOnFirstHalfFlag)); alternative.AddUtilityTerm(105, (walkTourFlag * firstTripOnSecondHalfFlag)); alternative.AddUtilityTerm(106, (walkTourFlag * lastTripOnFirstHalfFlag)); alternative.AddUtilityTerm(107, (walkTourFlag * lastTripOnSecondHalfFlag)); alternative.AddUtilityTerm(141, homeBasedWorkTourFlag); alternative.AddUtilityTerm(142, homeBasedSchoolTourFlag); alternative.AddUtilityTerm(187, jointTourFlag); alternative.AddUtilityTerm(188, fullHalfTourFlag + partialHalfTourFlag); } } }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, ITourWrapper subtour, IEnumerable <IPathTypeModel> pathTypeModels, IParcelWrapper destinationParcel, int parentTourMode, int choice = Constants.DEFAULT_VALUE) { IHouseholdWrapper household = subtour.Household; IPersonWrapper person = subtour.Person; IPersonDayWrapper personDay = subtour.PersonDay; // household inputs int income0To25KFlag = household.Has0To25KIncome.ToFlag(); int income25To50KFlag = household.Has25To50KIncome.ToFlag(); int incomeOver100Flag = household.Has100KPlusIncome.ToFlag(); // person inputs int maleFlag = person.IsMale.ToFlag(); // tour inputs int sovTourFlag = (parentTourMode == Global.Settings.Modes.Sov).ToFlag(); int hov2TourFlag = (parentTourMode == Global.Settings.Modes.Hov2).ToFlag(); int bikeTourFlag = (parentTourMode == Global.Settings.Modes.Bike).ToFlag(); int walkTourFlag = (parentTourMode == Global.Settings.Modes.Walk).ToFlag(); int tncTourFlag = (parentTourMode == Global.Settings.Modes.PaidRideShare).ToFlag(); // remaining inputs IParcelWrapper originParcel = subtour.OriginParcel; int parkingDuration = ChoiceModelUtility.GetParkingDuration(person.IsFulltimeWorker); double destinationParkingCost = destinationParcel.ParkingCostBuffer1(parkingDuration); ChoiceModelUtility.SetEscortPercentages(personDay, out double escortPercentage, out double nonEscortPercentage, true); foreach (IPathTypeModel pathTypeModel in pathTypeModels) { int mode = pathTypeModel.Mode; bool available = (pathTypeModel.Mode != Global.Settings.Modes.PaidRideShare || Global.Configuration.PaidRideShareModeIsAvailable) && pathTypeModel.Available; double generalizedTimeLogsum = pathTypeModel.GeneralizedTimeLogsum; ChoiceProbabilityCalculator.Alternative alternative = choiceProbabilityCalculator.GetAlternative(mode, available, choice == mode); alternative.Choice = mode; alternative.AddNestedAlternative(_nestedAlternativeIds[pathTypeModel.Mode], _nestedAlternativeIndexes[pathTypeModel.Mode], THETA_PARAMETER); if (!available) { continue; } double modeTimeCoefficient = (Global.Configuration.AV_IncludeAutoTypeChoice && household.OwnsAutomatedVehicles > 0 && mode >= Global.Settings.Modes.Sov && mode <= Global.Settings.Modes.Hov3) ? subtour.TimeCoefficient * (1.0 - Global.Configuration.AV_InVehicleTimeCoefficientDiscountFactor) : (mode == Global.Settings.Modes.PaidRideShare && Global.Configuration.AV_PaidRideShareModeUsesAVs) ? subtour.TimeCoefficient * (1.0 - Global.Configuration.AV_InVehicleTimeCoefficientDiscountFactor) : subtour.TimeCoefficient; alternative.AddUtilityTerm(2, generalizedTimeLogsum * modeTimeCoefficient); if (mode == Global.Settings.Modes.Transit) { alternative.AddUtilityTerm(20, 1); // alternative.AddUtility(129, destinationParcel.MixedUse2Index1()); // alternative.AddUtility(128, destinationParcel.TotalEmploymentDensity1()); // alternative.AddUtility(127, destinationParcel.NetIntersectionDensity1()); // alternative.AddUtility(126, originParcel.NetIntersectionDensity1()); // alternative.AddUtility(125, originParcel.TotalEmploymentDensity1()); // alternative.AddUtility(124, originParcel.MixedUse2Index1()); // alternative.AddUtility(123, Math.Log(destinationParcel.StopsTransitBuffer1+1)); // alternative.AddUtility(122, Math.Log(originParcel.StopsTransitBuffer1+1)); } else if (mode == Global.Settings.Modes.Hov3) { alternative.AddUtilityTerm(1, (destinationParkingCost * subtour.CostCoefficient / ChoiceModelUtility.CPFACT3)); alternative.AddUtilityTerm(30, 1); alternative.AddUtilityTerm(88, sovTourFlag); alternative.AddUtilityTerm(89, hov2TourFlag); } else if (mode == Global.Settings.Modes.Hov2) { alternative.AddUtilityTerm(1, (destinationParkingCost * subtour.CostCoefficient / ChoiceModelUtility.CPFACT2)); alternative.AddUtilityTerm(40, 1); alternative.AddUtilityTerm(88, sovTourFlag); alternative.AddUtilityTerm(89, hov2TourFlag); } else if (mode == Global.Settings.Modes.Sov) { alternative.AddUtilityTerm(1, (destinationParkingCost * subtour.CostCoefficient)); alternative.AddUtilityTerm(50, 1); alternative.AddUtilityTerm(54, income0To25KFlag); alternative.AddUtilityTerm(55, income25To50KFlag); alternative.AddUtilityTerm(58, sovTourFlag); alternative.AddUtilityTerm(59, hov2TourFlag); } else if (mode == Global.Settings.Modes.Bike) { alternative.AddUtilityTerm(60, 1); alternative.AddUtilityTerm(61, maleFlag); alternative.AddUtilityTerm(69, bikeTourFlag); alternative.AddUtilityTerm(169, destinationParcel.MixedUse4Index1()); alternative.AddUtilityTerm(168, destinationParcel.TotalEmploymentDensity1()); alternative.AddUtilityTerm(167, destinationParcel.NetIntersectionDensity1()); alternative.AddUtilityTerm(166, originParcel.NetIntersectionDensity1()); alternative.AddUtilityTerm(165, originParcel.TotalEmploymentDensity1()); alternative.AddUtilityTerm(164, originParcel.MixedUse4Index1()); } else if (mode == Global.Settings.Modes.Walk) { alternative.AddUtilityTerm(70, 1); alternative.AddUtilityTerm(79, walkTourFlag); alternative.AddUtilityTerm(179, destinationParcel.MixedUse4Index1()); alternative.AddUtilityTerm(178, destinationParcel.TotalEmploymentDensity1()); alternative.AddUtilityTerm(177, destinationParcel.NetIntersectionDensity1()); alternative.AddUtilityTerm(176, originParcel.NetIntersectionDensity1()); alternative.AddUtilityTerm(175, originParcel.TotalEmploymentDensity1()); alternative.AddUtilityTerm(174, originParcel.MixedUse4Index1()); } else if (mode == Global.Settings.Modes.PaidRideShare) { if (Global.Configuration.PaidRideshare_UseEstimatedInsteadOfAssertedCoefficients) { alternative.AddUtilityTerm(80, 1.0); alternative.AddUtilityTerm(81, sovTourFlag); alternative.AddUtilityTerm(82, walkTourFlag + bikeTourFlag); alternative.AddUtilityTerm(83, subtour.Person.AgeIsBetween26And35.ToFlag()); alternative.AddUtilityTerm(83, subtour.Person.AgeIsBetween18And25.ToFlag()); alternative.AddUtilityTerm(84, tncTourFlag); alternative.AddUtilityTerm(85, originParcel.HouseholdsBuffer2 + originParcel.StudentsUniversityBuffer2 + originParcel.EmploymentTotalBuffer2); alternative.AddUtilityTerm(86, income0To25KFlag); alternative.AddUtilityTerm(87, incomeOver100Flag); } else { double modeConstant = Global.Configuration.AV_PaidRideShareModeUsesAVs ? Global.Configuration.AV_PaidRideShare_ModeConstant + Global.Configuration.AV_PaidRideShare_DensityCoefficient * Math.Min(originParcel.HouseholdsBuffer2 + originParcel.StudentsUniversityBuffer2 + originParcel.EmploymentTotalBuffer2, (Global.Configuration.PaidRideShare_DensityMeasureCapValue > 0) ? Global.Configuration.PaidRideShare_DensityMeasureCapValue : 6000) + Global.Configuration.AV_PaidRideShare_AVOwnerCoefficient * (household.OwnsAutomatedVehicles > 0).ToFlag() : Global.Configuration.PaidRideShare_ModeConstant + Global.Configuration.PaidRideShare_DensityCoefficient * Math.Min(originParcel.HouseholdsBuffer2 + originParcel.StudentsUniversityBuffer2 + originParcel.EmploymentTotalBuffer2, (Global.Configuration.PaidRideShare_DensityMeasureCapValue > 0) ? Global.Configuration.PaidRideShare_DensityMeasureCapValue : 6000); alternative.AddUtilityTerm(90, modeConstant); alternative.AddUtilityTerm(90, Global.Configuration.PaidRideShare_Age26to35Coefficient * subtour.Person.AgeIsBetween26And35.ToFlag()); alternative.AddUtilityTerm(90, Global.Configuration.PaidRideShare_Age18to25Coefficient * subtour.Person.AgeIsBetween18And25.ToFlag()); alternative.AddUtilityTerm(90, Global.Configuration.PaidRideShare_AgeOver65Coefficient * (subtour.Person.Age >= 65).ToFlag()); } } } }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, HouseholdDayWrapper householdDay, TourWrapper tour, IParcelWrapper destinationParcel, int householdCars, int constrainedMode, int constrainedArrivalTime, int constrainedDepartureTime, HTourModeTime choice = null) { //private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, HouseholdDayWrapper householdDay, TourWrapper tour, // int constrainedMode, int constrainedArrivalTime, int constrainedDepartureTime, HTourModeTime choice = null) { IHouseholdWrapper household = tour.Household; IPersonWrapper person = tour.Person; IPersonDayWrapper personDay = tour.PersonDay; IHouseholdTotals householdTotals = household.HouseholdTotals; // household inputs int childrenUnder5 = householdTotals.ChildrenUnder5; int childrenAge5Through15 = householdTotals.ChildrenAge5Through15; int nonworkingAdults = householdTotals.NonworkingAdults; int retiredAdults = householdTotals.RetiredAdults; int onePersonHouseholdFlag = household.IsOnePersonHousehold.ToFlag(); int twoPersonHouseholdFlag = household.IsTwoPersonHousehold.ToFlag(); //var householdCars = household.VehiclesAvailable; int noCarsInHouseholdFlag = household.GetFlagForNoCarsInHousehold(householdCars); int carsLessThanDriversFlag = household.GetFlagForCarsLessThanDrivers(householdCars); int carsLessThanWorkersFlag = household.GetFlagForCarsLessThanWorkers(householdCars); int HHwithChildrenFlag = household.HasChildren.ToFlag(); int HHwithSmallChildrenFlag = household.HasChildrenUnder5.ToFlag(); int HHwithLowIncomeFlag = (household.Income >= 300000 && household.Income < 600000).ToFlag(); int HHwithMidleIncomeFlag = (household.Income >= 600000 && household.Income < 900000).ToFlag(); int HHwithHighIncomeFlag = (household.Income >= 900000).ToFlag(); int primaryFamilyTimeFlag = (householdDay == null) ? 0 : householdDay.PrimaryPriorityTimeFlag; // person inputs int partTimeWorkerFlag = person.IsPartTimeWorker.ToFlag(); int nonworkingAdultFlag = person.IsNonworkingAdult.ToFlag(); int universityStudentFlag = person.IsUniversityStudent.ToFlag(); int retiredAdultFlag = person.IsRetiredAdult.ToFlag(); int fullTimeWorkerFlag = person.IsFulltimeWorker.ToFlag(); int childAge5Through15Flag = person.IsChildAge5Through15.ToFlag(); int childUnder5Flag = person.IsChildUnder5.ToFlag(); int adultFlag = person.IsAdult.ToFlag(); int maleFlag = person.IsMale.ToFlag(); int femaleFlag = person.IsFemale.ToFlag(); int PTpass = person.TransitPassOwnership; // person-day inputs int homeBasedToursOnlyFlag = 1; int firstSimulatedHomeBasedTourFlag = 1; int laterSimulatedHomeBasedTourFlag = 0; int totalStops = 0; int totalSimulatedStops = 0; int escortStops = 0; int homeBasedTours = 1; int simulatedHomeBasedTours = 0; if (!(personDay == null)) { homeBasedToursOnlyFlag = personDay.OnlyHomeBasedToursExist().ToFlag(); firstSimulatedHomeBasedTourFlag = personDay.IsFirstSimulatedHomeBasedTour().ToFlag(); laterSimulatedHomeBasedTourFlag = personDay.IsLaterSimulatedHomeBasedTour().ToFlag(); totalStops = personDay.GetTotalStops(); totalSimulatedStops = personDay.GetTotalSimulatedStops(); escortStops = personDay.EscortStops; homeBasedTours = personDay.HomeBasedTours; simulatedHomeBasedTours = personDay.SimulatedHomeBasedTours; } // tour inputs int escortTourFlag = tour.IsEscortPurpose().ToFlag(); int shoppingTourFlag = tour.IsShoppingPurpose().ToFlag(); int socialTourFlag = tour.IsSocialPurpose().ToFlag(); int personalBusinessTourFlag = tour.IsPersonalBusinessPurpose().ToFlag(); int workTourFlag = tour.IsWorkPurpose().ToFlag(); int educationTourFlag = tour.IsSchoolPurpose().ToFlag(); int businessTourFlag = tour.IsBusinessPurpose().ToFlag(); IParcelWrapper originParcel = tour.OriginParcel; //var destinationParcel = tour.DestinationParcel; int jointTourFlag = (tour.JointTourSequence > 0) ? 1 : 0; int partialHalfTour1Flag = (tour.PartialHalfTour1Sequence > 0) ? 1 : 0; int partialHalfTour2Flag = (tour.PartialHalfTour2Sequence > 0) ? 1 : 0; bool partialHalfTour = (tour.PartialHalfTour1Sequence > 0 || tour.PartialHalfTour2Sequence > 0); int fullHalfTour1Flag = (tour.FullHalfTour1Sequence > 0) ? 1 : 0; int fullHalfTour2Flag = (tour.FullHalfTour2Sequence > 0) ? 1 : 0; // remaining inputs //Initialize a few variables in case personDay is null // Higher priority tour of 2+ tours for the same purpose int highPrioritySameFlag = 0; // Lower priority tour(s) of 2+ tours for the same purpose int lowPrioritySameFlag = 0; // Higher priority tour of 2+ tours for different purposes int highPriorityDifferentFlag = 0; // Lower priority tour of 2+ tours for different purposes int lowPriorityDifferentFlag = 0; if (!(personDay == null)) { // Higher priority tour of 2+ tours for the same purpose highPrioritySameFlag = (tour.GetTotalToursByPurpose() > tour.GetTotalSimulatedToursByPurpose() && tour.GetTotalSimulatedToursByPurpose() == 1).ToFlag(); // Lower priority tour(s) of 2+ tours for the same purpose lowPrioritySameFlag = (tour.GetTotalSimulatedToursByPurpose() > 1).ToFlag(); // Higher priority tour of 2+ tours for different purposes highPriorityDifferentFlag = (personDay.IsFirstSimulatedHomeBasedTour() && personDay.HomeBasedToursExist()).ToFlag() * (1 - highPrioritySameFlag); // Lower priority tour of 2+ tours for different purposes lowPriorityDifferentFlag = (personDay.IsLaterSimulatedHomeBasedTour() && personDay.HomeBasedToursExist()).ToFlag() * (1 - lowPrioritySameFlag); } ITimeWindow timeWindow = (householdDay == null) ? new TimeWindow() : tour.GetRelevantTimeWindow(householdDay); int totalMinutesAvailableInDay = timeWindow.TotalAvailableMinutes(1, 1440); if (totalMinutesAvailableInDay < 0) { if (!Global.Configuration.IsInEstimationMode) { householdDay.IsValid = false; } totalMinutesAvailableInDay = 0; } int bigPeriodCount = DayPeriod.H_BIG_DAY_PERIOD_TOTAL_TOUR_TIMES; int nPeriodCombs = bigPeriodCount * (bigPeriodCount + 1) / 2; bool useTimeComponents = Global.Configuration.IsInEstimationMode || constrainedArrivalTime == 0 || constrainedDepartureTime == 0; int componentIndex = 0; int periodComb = -1; //set components if (useTimeComponents) { for (int arrivalPeriodIndex = 0; arrivalPeriodIndex < bigPeriodCount; arrivalPeriodIndex++) { MinuteSpan arrivalPeriod = DayPeriod.HBigDayPeriods[arrivalPeriodIndex]; int arrivalPeriodAvailableMinutes = timeWindow.TotalAvailableMinutes(arrivalPeriod.Start, arrivalPeriod.End); for (int departurePeriodIndex = arrivalPeriodIndex; departurePeriodIndex < bigPeriodCount; departurePeriodIndex++) { MinuteSpan departurePeriod = DayPeriod.HBigDayPeriods[departurePeriodIndex]; int departurePeriodAvailableMinutes = timeWindow.TotalAvailableMinutes(departurePeriod.Start, departurePeriod.End); if (arrivalPeriod == departurePeriod) { componentIndex = arrivalPeriodIndex; choiceProbabilityCalculator.CreateUtilityComponent(componentIndex); ChoiceProbabilityCalculator.Component arrivalComponent = choiceProbabilityCalculator.GetUtilityComponent(componentIndex); if (arrivalPeriodAvailableMinutes > 0) { double hoursArrival = arrivalPeriod.Middle / 60.0; int firstCoef = 300; arrivalComponent.AddUtilityTerm(300, Math.Log(arrivalPeriodAvailableMinutes)); //arrival shift variables arrivalComponent.AddUtilityTerm(firstCoef + 2, partTimeWorkerFlag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 3, nonworkingAdultFlag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 4, universityStudentFlag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 5, retiredAdultFlag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 6, childAge5Through15Flag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 7, childUnder5Flag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 8, educationTourFlag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 9, escortTourFlag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 10, shoppingTourFlag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 11, businessTourFlag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 12, personalBusinessTourFlag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 13, socialTourFlag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 14, workTourFlag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 15, primaryFamilyTimeFlag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 16, HHwithLowIncomeFlag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 17, HHwithMidleIncomeFlag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 18, HHwithHighIncomeFlag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 19, highPrioritySameFlag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 20, lowPrioritySameFlag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 21, highPriorityDifferentFlag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 22, lowPriorityDifferentFlag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 23, jointTourFlag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 24, partialHalfTour1Flag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 25, fullHalfTour1Flag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 26, partialHalfTour2Flag * hoursArrival); arrivalComponent.AddUtilityTerm(firstCoef + 27, fullHalfTour2Flag * hoursArrival); } componentIndex = bigPeriodCount + departurePeriodIndex; choiceProbabilityCalculator.CreateUtilityComponent(componentIndex); ChoiceProbabilityCalculator.Component departureComponent = choiceProbabilityCalculator.GetUtilityComponent(componentIndex); if (departurePeriodAvailableMinutes > 0) { departureComponent.AddUtilityTerm(300, Math.Log(departurePeriodAvailableMinutes)); } } // set period combination component periodComb++; componentIndex = 2 * bigPeriodCount + periodComb; choiceProbabilityCalculator.CreateUtilityComponent(componentIndex); ChoiceProbabilityCalculator.Component combinationComponent = choiceProbabilityCalculator.GetUtilityComponent(componentIndex); if (arrivalPeriodAvailableMinutes > 0 && departurePeriodAvailableMinutes > 0) { double hoursDuration = (departurePeriod.Middle - arrivalPeriod.Middle) / 60.0; int firstCoef = 700; //combination constants combinationComponent.AddUtilityTerm(firstCoef + periodComb, 1.0); // duration shift variables combinationComponent.AddUtilityTerm(firstCoef + 30, primaryFamilyTimeFlag * hoursDuration); combinationComponent.AddUtilityTerm(firstCoef + 31, escortTourFlag * hoursDuration); combinationComponent.AddUtilityTerm(firstCoef + 32, shoppingTourFlag * hoursDuration); combinationComponent.AddUtilityTerm(firstCoef + 33, educationTourFlag * hoursDuration); combinationComponent.AddUtilityTerm(firstCoef + 34, socialTourFlag * hoursDuration); combinationComponent.AddUtilityTerm(firstCoef + 35, personalBusinessTourFlag * hoursDuration); combinationComponent.AddUtilityTerm(firstCoef + 36, businessTourFlag * hoursDuration); combinationComponent.AddUtilityTerm(firstCoef + 37, workTourFlag * hoursDuration); combinationComponent.AddUtilityTerm(firstCoef + 38, highPrioritySameFlag * hoursDuration); combinationComponent.AddUtilityTerm(firstCoef + 39, lowPrioritySameFlag * hoursDuration); combinationComponent.AddUtilityTerm(firstCoef + 40, highPriorityDifferentFlag * hoursDuration); combinationComponent.AddUtilityTerm(firstCoef + 41, lowPriorityDifferentFlag * hoursDuration); combinationComponent.AddUtilityTerm(firstCoef + 42, partTimeWorkerFlag * hoursDuration); combinationComponent.AddUtilityTerm(firstCoef + 43, jointTourFlag * hoursDuration); combinationComponent.AddUtilityTerm(firstCoef + 44, partialHalfTour1Flag * hoursDuration); combinationComponent.AddUtilityTerm(firstCoef + 45, fullHalfTour1Flag * hoursDuration); combinationComponent.AddUtilityTerm(firstCoef + 46, partialHalfTour2Flag * hoursDuration); combinationComponent.AddUtilityTerm(firstCoef + 47, fullHalfTour2Flag * hoursDuration); // peak-to-peak variables if (arrivalPeriod.Index == DayPeriod.AM_PEAK && departurePeriod.Index == DayPeriod.PM_PEAK) { combinationComponent.AddUtilityTerm(firstCoef + 48, fullTimeWorkerFlag); combinationComponent.AddUtilityTerm(firstCoef + 49, partTimeWorkerFlag); combinationComponent.AddUtilityTerm(firstCoef + 50, maleFlag); } } } } } //for (var mode = Global.Settings.Modes.Walk; mode <= Global.Settings.Modes.WalkRideBike; mode++) { replaced 20171120 JLB for (int mode = Global.Settings.Modes.Walk; mode <= Global.Settings.Modes.PaidRideShare; mode++) { componentIndex = 2 * bigPeriodCount + nPeriodCombs + mode - 1; choiceProbabilityCalculator.CreateUtilityComponent(componentIndex); ChoiceProbabilityCalculator.Component modeComponent = choiceProbabilityCalculator.GetUtilityComponent(componentIndex); //if (mode == Global.Settings.Modes.SchoolBus) { // modeComponent.AddUtilityTerm(10, 1); //} if (mode == Global.Settings.Modes.Transit) { modeComponent.AddUtilityTerm(20, 1); modeComponent.AddUtilityTerm(21, femaleFlag); //modeComponent.AddUtilityTerm(22, retiredAdultFlag); modeComponent.AddUtilityTerm(22, PTpass); //GV: one person HH; 8. juni 2016 //modeComponent.AddUtilityTerm(23, onePersonHouseholdFlag); //GV: income effect is not with a correct sign //modeComponent.AddUtilityTerm(23, HHwithLowIncomeFlag); //modeComponent.AddUtilityTerm(24, HHwithMidleIncomeFlag); //modeComponent.AddUtilityTerm(25, HHwithHighIncomeFlag); //GV: not significant //modeComponent.AddUtilityTerm(26, childrenUnder5); //modeComponent.AddUtilityTerm(27, childrenAge5Through15); modeComponent.AddUtilityTerm(28, nonworkingAdults + retiredAdults); //modeComponent.AddUtilityTerm(26, noCarsInHouseholdFlag); modeComponent.AddUtilityTerm(29, carsLessThanDriversFlag); } else if (mode == Global.Settings.Modes.Hov3) { modeComponent.AddUtilityTerm(30, 1); modeComponent.AddUtilityTerm(31, childrenUnder5); modeComponent.AddUtilityTerm(32, childrenAge5Through15); modeComponent.AddUtilityTerm(33, nonworkingAdults + retiredAdults); modeComponent.AddUtilityTerm(34, femaleFlag); //modeComponent.AddUtilityTerm(38, onePersonHouseholdFlag); modeComponent.AddUtilityTerm(36, twoPersonHouseholdFlag); //GV: commented out 7. june 2016 //modeComponent.AddUtilityTerm(37, noCarsInHouseholdFlag); modeComponent.AddUtilityTerm(38, carsLessThanDriversFlag); } else if (mode == Global.Settings.Modes.Hov2) { modeComponent.AddUtilityTerm(40, 1); modeComponent.AddUtilityTerm(41, maleFlag); //modeComponent.AddUtilityTerm(41, onePersonHouseholdFlag); //GV: Testing coeff. 42-44 again, 26. may 2016, coeff. numbering changed modeComponent.AddUtilityTerm(42, childrenUnder5); modeComponent.AddUtilityTerm(43, childrenAge5Through15); modeComponent.AddUtilityTerm(44, nonworkingAdults + retiredAdults); //GV: these are significant and plus; 8. juni 2016 //modeComponent.AddUtilityTerm(45, HHwithLowIncomeFlag); //modeComponent.AddUtilityTerm(46, HHwithMidleIncomeFlag); //modeComponent.AddUtilityTerm(47, HHwithHighIncomeFlag); //GV coeff. numbering changed; 8. june 2016 - not significant //modeComponent.AddUtilityTerm(48, noCarsInHouseholdFlag); //modeComponent.AddUtilityTerm(49, carsLessThanDriversFlag); } else if (mode == Global.Settings.Modes.Sov) { modeComponent.AddUtilityTerm(50, 1); //not significant: modeComponent.AddUtilityTerm(51, maleFlag); modeComponent.AddUtilityTerm(52, fullTimeWorkerFlag); modeComponent.AddUtilityTerm(53, partTimeWorkerFlag); modeComponent.AddUtilityTerm(54, onePersonHouseholdFlag); //GV: these are NOT significant //modeComponent.AddUtilityTerm(55, HHwithLowIncomeFlag); //modeComponent.AddUtilityTerm(56, HHwithMidleIncomeFlag); //modeComponent.AddUtilityTerm(57, HHwithHighIncomeFlag); //GV: coeff. numbering changed, 26. may 2016 modeComponent.AddUtilityTerm(58, carsLessThanWorkersFlag); } else if (mode == Global.Settings.Modes.Bike) { modeComponent.AddUtilityTerm(60, 1); modeComponent.AddUtilityTerm(61, femaleFlag); //modeComponent.AddUtilityTerm(62, childrenUnder5); //GV: changed small kids to retired; 3. june 2016 modeComponent.AddUtilityTerm(62, retiredAdults); modeComponent.AddUtilityTerm(63, childAge5Through15Flag); //GV: 3. june 2016 - added "no cars in HH" for full/part_time workers modeComponent.AddUtilityTerm(64, fullTimeWorkerFlag + noCarsInHouseholdFlag); modeComponent.AddUtilityTerm(65, partTimeWorkerFlag + noCarsInHouseholdFlag); //modeComponent.AddUtilityTerm(66, noCarsInHouseholdFlag); modeComponent.AddUtilityTerm(67, carsLessThanDriversFlag); //GV: university students; 3. june 2016 - not significant //modeComponent.AddUtilityTerm(68, universityStudentFlag); //GV: one person HH; 8. juni 2016 modeComponent.AddUtilityTerm(69, onePersonHouseholdFlag); } else if (mode == Global.Settings.Modes.Walk) { modeComponent.AddUtilityTerm(70, 1.0); //GV: Testing female variable again; 26. may 2016 - not sign. //modeComponent.AddUtilityTerm(71, femaleFlag); modeComponent.AddUtilityTerm(72, nonworkingAdults); //not sign.: modeComponent.AddUtilityTerm(73, retiredAdults); //GV: one person HH modeComponent.AddUtilityTerm(74, onePersonHouseholdFlag); //GV: not significant //modeComponent.AddUtilityTerm(76, noCarsInHouseholdFlag); //modeComponent.AddUtilityTerm(77, carsLessThanDriversFlag); } else if (mode == Global.Settings.Modes.ParkAndRide) { modeComponent.AddUtilityTerm(80, 1.0); } else if (mode == Global.Settings.Modes.CarKissRideWalk) { modeComponent.AddUtilityTerm(90, 1.0); } else if (mode == Global.Settings.Modes.BikeParkRideWalk) { modeComponent.AddUtilityTerm(100, 1.0); } else if (mode == Global.Settings.Modes.BikeParkRideBike) { modeComponent.AddUtilityTerm(110, 1.0); } else if (mode == Global.Settings.Modes.BikeOnTransit) { modeComponent.AddUtilityTerm(120, 1.0); } else if (mode == Global.Settings.Modes.CarParkRideBike) { modeComponent.AddUtilityTerm(130, 1.0); } else if (mode == Global.Settings.Modes.WalkRideBike) { modeComponent.AddUtilityTerm(140, 1.0); } else if (mode == Global.Settings.Modes.PaidRideShare) { //modeComponent.AddUtilityTerm(150, 1.0); double modeConstant = Global.Configuration.AV_PaidRideShareModeUsesAVs ? Global.Configuration.AV_PaidRideShare_ModeConstant + Global.Configuration.AV_PaidRideShare_DensityCoefficient * Math.Min(originParcel.HouseholdsBuffer2 + originParcel.StudentsUniversityBuffer2 + originParcel.EmploymentTotalBuffer2, 6000) + Global.Configuration.AV_PaidRideShare_AVOwnerCoefficient * (household.OwnsAutomatedVehicles > 0).ToFlag() : Global.Configuration.PaidRideShare_ModeConstant + Global.Configuration.PaidRideShare_DensityCoefficient * Math.Min(originParcel.HouseholdsBuffer2 + originParcel.StudentsUniversityBuffer2 + originParcel.EmploymentTotalBuffer2, 6000); modeComponent.AddUtilityTerm(150, modeConstant); modeComponent.AddUtilityTerm(150, Global.Configuration.PaidRideShare_Age26to35Coefficient * tour.Person.AgeIsBetween26And35.ToFlag()); modeComponent.AddUtilityTerm(150, Global.Configuration.PaidRideShare_Age18to25Coefficient * tour.Person.AgeIsBetween18And25.ToFlag()); modeComponent.AddUtilityTerm(150, Global.Configuration.PaidRideShare_AgeOver65Coefficient * (tour.Person.Age >= 65).ToFlag()); } //GV: Estimation of importance of "purpose" per mode - SOV is zero-alt and Work is zero-alt if (mode == Global.Settings.Modes.Walk || mode == Global.Settings.Modes.Bike || mode == Global.Settings.Modes.Hov2 || mode == Global.Settings.Modes.Hov3 || mode == Global.Settings.Modes.Transit) { int firstCoef = 200 + 10 * mode; modeComponent.AddUtilityTerm(firstCoef + 0, escortTourFlag); modeComponent.AddUtilityTerm(firstCoef + 1, shoppingTourFlag); modeComponent.AddUtilityTerm(firstCoef + 2, educationTourFlag); modeComponent.AddUtilityTerm(firstCoef + 3, socialTourFlag); modeComponent.AddUtilityTerm(firstCoef + 4, personalBusinessTourFlag); modeComponent.AddUtilityTerm(firstCoef + 5, businessTourFlag); //modeComponent.AddUtilityTerm(firstCoef + 6, workTourFlag); //GV: "work" is zero alternative modeComponent.AddUtilityTerm(firstCoef + 7, jointTourFlag); modeComponent.AddUtilityTerm(firstCoef + 8, Math.Min(partialHalfTour1Flag + partialHalfTour2Flag, 1.0)); modeComponent.AddUtilityTerm(firstCoef + 9, Math.Min(fullHalfTour1Flag + fullHalfTour2Flag, 1.0)); } } //loop on all alternatives, using modeTimes objects { foreach (HTourModeTime modeTimes in HTourModeTime.ModeTimes[ParallelUtility.threadLocalAssignedIndex.Value]) { MinuteSpan arrivalPeriod = modeTimes.ArrivalPeriod; int arrivalPeriodAvailableMinutes = timeWindow.TotalAvailableMinutes(arrivalPeriod.Start, arrivalPeriod.End); MinuteSpan departurePeriod = modeTimes.DeparturePeriod; int departurePeriodAvailableMinutes = timeWindow.TotalAvailableMinutes(departurePeriod.Start, departurePeriod.End); periodComb = modeTimes.PeriodCombinationIndex; int mode = modeTimes.Mode; int altIndex = modeTimes.Index; //limit availability based on mode and tour purpose bool available = (mode == Global.Settings.Modes.BikeParkRideBike || mode == Global.Settings.Modes.CarParkRideBike || mode == Global.Settings.Modes.WalkRideBike) && (!(tour.IsWorkPurpose() || tour.IsSchoolPurpose())) ? false : true; //further limit availability on mode if (mode == Global.Settings.Modes.PaidRideShare && !Global.Configuration.PaidRideShareModeIsAvailable) { available = false; } //further limit availability if tour includes joint travel if ((tour.JointTourSequence > 0 || tour.FullHalfTour1Sequence > 0 || tour.FullHalfTour2Sequence > 0 || tour.PartialHalfTour1Sequence > 0 || tour.PartialHalfTour2Sequence > 0) && (mode > Global.Settings.Modes.Transit)) { available = false; } //further limit availability: kissAndRide and carParkRideBike are not supported available = (available == true) && (mode != Global.Settings.Modes.CarKissRideWalk) && (mode != Global.Settings.Modes.CarParkRideBike); //further limit availabillity based on time window variables and any constrained choices available = (available == true) && (modeTimes.LongestFeasibleWindow != null) && (mode > 0) //&& (mode <= Global.Settings.Modes.Transit) && (person.Age >= 18 || (modeTimes.Mode != Global.Settings.Modes.Sov && modeTimes.Mode != Global.Settings.Modes.HovDriver)) && (constrainedMode > 0 || mode == Global.Settings.Modes.Walk || mode == Global.Settings.Modes.Bike || mode == Global.Settings.Modes.HovDriver || mode == Global.Settings.Modes.Transit || !partialHalfTour) && (constrainedMode <= 0 || constrainedMode == mode) && (constrainedArrivalTime <= 0 || (constrainedArrivalTime >= arrivalPeriod.Start && constrainedArrivalTime <= arrivalPeriod.End)) && (constrainedDepartureTime <= 0 || (constrainedDepartureTime >= departurePeriod.Start && constrainedDepartureTime <= departurePeriod.End)); ChoiceProbabilityCalculator.Alternative alternative = choiceProbabilityCalculator.GetAlternative(altIndex, available, choice != null && choice.Index == altIndex); alternative.Choice = modeTimes; // JLB added 20130420 //alternative.AddNestedAlternative(HTourModeTime.TOTAL_TOUR_MODE_TIMES + periodComb + 1, periodComb, THETA_PARAMETER); alternative.AddNestedAlternative(HTourModeTime.TotalTourModeTimes + mode, mode - 1, THETA_PARAMETER); //if (Global.Configuration.IsInEstimationMode && altIndex == choice.Index) { // Global.PrintFile.WriteLine("Aper Dper Mode {0} {1} {2} Travel Times {3} {4} Window {5} {6}", // arrivalPeriod.Index, departurePeriod.Index, mode, // modeTimes.ModeAvailableToDestination ? modeTimes.TravelTimeToDestination : -1, // modeTimes.ModeAvailableFromDestination ? modeTimes.TravelTimeFromDestination : -1, // modeTimes.LongestFeasibleWindow != null ? modeTimes.LongestFeasibleWindow.Start : -1, // modeTimes.LongestFeasibleWindow != null ? modeTimes.LongestFeasibleWindow.End : -1); //} //Following code was used to test handling of partially joint half tours (JLB 20140603) //if (partialHalfTour) { // Global.PrintFile.WriteLine("HH pers {0} {1} avail {2} Aper Dper Mode {3} {4} {5} Travel Times {6} {7} Window {8} {9}", // household.Id, person.Sequence, // available, // arrivalPeriod.Index, departurePeriod.Index, mode, // modeTimes.ModeAvailableToDestination ? modeTimes.TravelTimeToDestination : -1, // modeTimes.ModeAvailableFromDestination ? modeTimes.TravelTimeFromDestination : -1, // modeTimes.LongestFeasibleWindow != null ? modeTimes.LongestFeasibleWindow.Start : -1, // modeTimes.LongestFeasibleWindow != null ? modeTimes.LongestFeasibleWindow.End : -1); //} //if in application mode and combination is not available, can skip the rest if (!Global.Configuration.IsInEstimationMode && !alternative.Available) { continue; } if (useTimeComponents) { // arrival period utility component alternative.AddUtilityComponent(choiceProbabilityCalculator.GetUtilityComponent(arrivalPeriod.Index)); // departure period utility component alternative.AddUtilityComponent( choiceProbabilityCalculator.GetUtilityComponent(bigPeriodCount + departurePeriod.Index)); // period combination utility component alternative.AddUtilityComponent(choiceProbabilityCalculator.GetUtilityComponent(2 * bigPeriodCount + periodComb)); } // mode utility component alternative.AddUtilityComponent( choiceProbabilityCalculator.GetUtilityComponent(2 * bigPeriodCount + nPeriodCombs + mode - 1)); //even in estimation mode, do not need the rest of the code if not available if (!alternative.Available) { continue; } //GV and JB: the parking cost are handled as part of genaralised time double minimumTimeNeeded = modeTimes.TravelTimeToDestination + modeTimes.TravelTimeFromDestination + Global.Settings.Times.MinimumActivityDuration; alternative.AddUtilityTerm(1, modeTimes.GeneralizedTimeToDestination + modeTimes.GeneralizedTimeFromDestination); //alternative.AddUtilityTerm(3, // Math.Log(modeTimes.LongestFeasibleWindow.End - modeTimes.LongestFeasibleWindow.Start - // minimumTimeNeeded + 1.0)); // JLB 20140204 replaced coeff 3 with a different time window formulation: time pressure // instead of having positive utility for increasing time window, have negative utility for decreasing time window alternative.AddUtilityTerm(3, Math.Log(Math.Max(Constants.EPSILON, 1 - Math.Pow(minimumTimeNeeded / (Math.Min(840, modeTimes.LongestFeasibleWindow.End - modeTimes.LongestFeasibleWindow.Start)), 0.8) ))); alternative.AddUtilityTerm(4, Math.Log((totalMinutesAvailableInDay + 1.0) / (minimumTimeNeeded + 1.0))); alternative.AddUtilityTerm(5, (maleFlag == 0 && mode == Global.Settings.Modes.Walk && arrivalPeriod.Index >= DayPeriod.EVENING) ? 1 : 0); if (altIndex == 0) { alternative.AddUtilityTerm(998, tour.DestinationPurpose); alternative.AddUtilityTerm(999, (tour.ParentTour == null) ? 0 : 1); } } } }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, ITourWrapper tour, IEnumerable <IPathTypeModel> pathTypeModels, IParcelWrapper destinationParcel, int householdCars, int choice = Constants.DEFAULT_VALUE) { IHouseholdWrapper household = tour.Household; Framework.DomainModels.Models.IHouseholdTotals householdTotals = household.HouseholdTotals; IPersonDayWrapper personDay = tour.PersonDay; IPersonWrapper person = tour.Person; // household inputs int childrenUnder5 = householdTotals.ChildrenUnder5; int childrenAge5Through15 = householdTotals.ChildrenAge5Through15; // var nonworkingAdults = householdTotals.NonworkingAdults; // var retiredAdults = householdTotals.RetiredAdults; int onePersonHouseholdFlag = household.IsOnePersonHousehold.ToFlag(); int twoPersonHouseholdFlag = household.IsTwoPersonHousehold.ToFlag(); int noCarsInHouseholdFlag = household.GetFlagForNoCarsInHousehold(householdCars); int carsLessThanDriversFlag = household.GetFlagForCarsLessThanDrivers(householdCars); int carsLessThanWorkersFlag = household.GetFlagForCarsLessThanWorkers(householdCars); int income0To25KFlag = household.Has0To25KIncome.ToFlag(); int income75kPlusFlag = household.Has75KPlusIncome.ToFlag(); int incomeOver100Flag = household.Has100KPlusIncome.ToFlag(); // person inputs int maleFlag = person.IsMale.ToFlag(); int ageBetween51And98Flag = person.AgeIsBetween51And98.ToFlag(); int univStudentFlag = person.IsUniversityStudent.ToFlag(); IParcelWrapper originParcel = tour.OriginParcel; int parkingDuration = ChoiceModelUtility.GetParkingDuration(person.IsFulltimeWorker); // parking at work is free if no paid parking at work and tour goes to usual workplace double destinationParkingCost = (Global.Configuration.ShouldRunPayToParkAtWorkplaceModel && tour.Person.UsualWorkParcel != null && destinationParcel == tour.Person.UsualWorkParcel && person.PaidParkingAtWorkplace == 0) ? 0.0 : destinationParcel.ParkingCostBuffer1(parkingDuration); ChoiceModelUtility.SetEscortPercentages(personDay, out double escortPercentage, out double nonEscortPercentage); foreach (IPathTypeModel pathTypeModel in pathTypeModels) { int mode = pathTypeModel.Mode; double generalizedTimeLogsum = pathTypeModel.GeneralizedTimeLogsum; bool available = (pathTypeModel.Mode != Global.Settings.Modes.PaidRideShare || Global.Configuration.PaidRideShareModeIsAvailable) && pathTypeModel.Available; ChoiceProbabilityCalculator.Alternative alternative = choiceProbabilityCalculator.GetAlternative(mode, available, choice == mode); alternative.Choice = mode; alternative.AddNestedAlternative(_nestedAlternativeIds[pathTypeModel.Mode], _nestedAlternativeIndexes[pathTypeModel.Mode], THETA_PARAMETER); if (!available) { continue; } double modeTimeCoefficient = (Global.Configuration.AV_IncludeAutoTypeChoice && household.OwnsAutomatedVehicles > 0 && mode >= Global.Settings.Modes.Sov && mode <= Global.Settings.Modes.Hov3) ? tour.TimeCoefficient * (1.0 - Global.Configuration.AV_InVehicleTimeCoefficientDiscountFactor) : (mode == Global.Settings.Modes.PaidRideShare && Global.Configuration.AV_PaidRideShareModeUsesAVs) ? tour.TimeCoefficient * (1.0 - Global.Configuration.AV_InVehicleTimeCoefficientDiscountFactor) : tour.TimeCoefficient; alternative.AddUtilityTerm(2, generalizedTimeLogsum * modeTimeCoefficient); if (mode == Global.Settings.Modes.ParkAndRide) { alternative.AddUtilityTerm(10, 1); alternative.AddUtilityTerm(11, noCarsInHouseholdFlag); alternative.AddUtilityTerm(13, carsLessThanWorkersFlag); // alternative.AddUtility(129, destinationParcel.MixedUse2Index1()); alternative.AddUtilityTerm(130, Math.Log(destinationParcel.TotalEmploymentDensity1() + 1) * 2553.0 / Math.Log(2553.0)); alternative.AddUtilityTerm(128, destinationParcel.TotalEmploymentDensity1()); alternative.AddUtilityTerm(127, destinationParcel.NetIntersectionDensity1()); alternative.AddUtilityTerm(123, Math.Log(destinationParcel.StopsTransitBuffer1 + 1)); //alternative.AddUtilityTerm(120, Math.Log(destinationParcel.TotalEmploymentDensity1() + 1) * 2553.0 / Math.Log(2553.0)); alternative.AddUtilityTerm(118, destinationParcel.TotalEmploymentDensity1()); //alternative.AddUtilityTerm(117, destinationParcel.NetIntersectionDensity1()); alternative.AddUtilityTerm(113, Math.Log(destinationParcel.StopsTransitBuffer1 + 1)); alternative.AddUtilityTerm(112, Math.Log(originParcel.StopsTransitBuffer1 + 1)); alternative.AddUtilityTerm(115, Math.Log(pathTypeModel.PathParkAndRideNodeCapacity + 1)); } else if (mode == Global.Settings.Modes.Transit) { alternative.AddUtilityTerm(20, 1); alternative.AddUtilityTerm(21, noCarsInHouseholdFlag); //for calibration alternative.AddUtilityTerm(22, carsLessThanDriversFlag); //for calibration // alternative.AddUtility(129, destinationParcel.MixedUse2Index1()); alternative.AddUtilityTerm(130, Math.Log(destinationParcel.TotalEmploymentDensity1() + 1) * 2553.0 / Math.Log(2553.0)); alternative.AddUtilityTerm(128, destinationParcel.TotalEmploymentDensity1()); alternative.AddUtilityTerm(127, destinationParcel.NetIntersectionDensity1()); alternative.AddUtilityTerm(126, originParcel.NetIntersectionDensity1()); //alternative.AddUtilityTerm(125, originParcel.HouseholdDensity1()); //alternative.AddUtilityTerm(124, originParcel.MixedUse2Index1()); alternative.AddUtilityTerm(123, Math.Log(destinationParcel.StopsTransitBuffer1 + 1)); alternative.AddUtilityTerm(122, Math.Log(originParcel.StopsTransitBuffer1 + 1)); alternative.AddUtilityTerm(180, univStudentFlag); alternative.AddUtilityTerm(100, income75kPlusFlag); } else if (mode == Global.Settings.Modes.Hov3) { alternative.AddUtilityTerm(1, (destinationParkingCost * tour.CostCoefficient / Global.Configuration.Coefficients_HOV3CostDivisor_Work)); alternative.AddUtilityTerm(30, 1); alternative.AddUtilityTerm(31, childrenUnder5); alternative.AddUtilityTerm(32, childrenAge5Through15); // alternative.AddUtilityTerm(34, nonworkingAdults + retiredAdults); alternative.AddUtilityTerm(35, pathTypeModel.PathDistance.AlmostEquals(0) ? 0 : Math.Log(pathTypeModel.PathDistance)); alternative.AddUtilityTerm(36, noCarsInHouseholdFlag); // for calibration of hov3 vs hov2 alternative.AddUtilityTerm(37, carsLessThanDriversFlag); // for calibration of hov3 vs hov2 alternative.AddUtilityTerm(38, onePersonHouseholdFlag); alternative.AddUtilityTerm(39, twoPersonHouseholdFlag); alternative.AddUtilityTerm(41, noCarsInHouseholdFlag); alternative.AddUtilityTerm(42, carsLessThanDriversFlag); alternative.AddUtilityTerm(133, escortPercentage); alternative.AddUtilityTerm(134, nonEscortPercentage); } else if (mode == Global.Settings.Modes.Hov2) { alternative.AddUtilityTerm(1, (destinationParkingCost * tour.CostCoefficient / Global.Configuration.Coefficients_HOV2CostDivisor_Work)); alternative.AddUtilityTerm(31, childrenUnder5); alternative.AddUtilityTerm(32, childrenAge5Through15); // alternative.AddUtilityTerm(34, nonworkingAdults + retiredAdults); alternative.AddUtilityTerm(35, pathTypeModel.PathDistance.AlmostEquals(0) ? 0 : Math.Log(pathTypeModel.PathDistance)); alternative.AddUtilityTerm(40, 1); alternative.AddUtilityTerm(41, noCarsInHouseholdFlag); alternative.AddUtilityTerm(42, carsLessThanDriversFlag); alternative.AddUtilityTerm(48, onePersonHouseholdFlag); alternative.AddUtilityTerm(133, escortPercentage); alternative.AddUtilityTerm(134, nonEscortPercentage); } else if (mode == Global.Settings.Modes.Sov) { alternative.AddUtilityTerm(1, (destinationParkingCost) * tour.CostCoefficient); alternative.AddUtilityTerm(50, 1); alternative.AddUtilityTerm(53, carsLessThanWorkersFlag); alternative.AddUtilityTerm(54, income0To25KFlag); alternative.AddUtilityTerm(131, escortPercentage); alternative.AddUtilityTerm(132, nonEscortPercentage); } else if (mode == Global.Settings.Modes.Bike) { double class1Dist = Global.Configuration.PathImpedance_BikeUseTypeSpecificDistanceFractions ? ImpedanceRoster.GetValue("class1distance", mode, Global.Settings.PathTypes.FullNetwork, Global.Settings.ValueOfTimes.DefaultVot, tour.DestinationArrivalTime, originParcel, destinationParcel).Variable : 0; double class2Dist = Global.Configuration.PathImpedance_BikeUseTypeSpecificDistanceFractions ? ImpedanceRoster.GetValue("class2distance", mode, Global.Settings.PathTypes.FullNetwork, Global.Settings.ValueOfTimes.DefaultVot, tour.DestinationArrivalTime, originParcel, destinationParcel).Variable : 0; // double worstDist = Global.Configuration.PathImpedance_BikeUseTypeSpecificDistanceFractions ? // ImpedanceRoster.GetValue("worstdistance", mode, Global.Settings.PathTypes.FullNetwork, // Global.Settings.VotGroups.Medium, tour.DestinationArrivalTime,originParcel, destinationParcel).Variable : 0; alternative.AddUtilityTerm(60, 1); alternative.AddUtilityTerm(61, maleFlag); alternative.AddUtilityTerm(63, ageBetween51And98Flag); alternative.AddUtilityTerm(67, noCarsInHouseholdFlag); //for calibration alternative.AddUtilityTerm(68, carsLessThanDriversFlag); //for calibration alternative.AddUtilityTerm(169, destinationParcel.MixedUse4Index1()); alternative.AddUtilityTerm(168, destinationParcel.TotalEmploymentDensity1()); alternative.AddUtilityTerm(167, destinationParcel.NetIntersectionDensity1()); alternative.AddUtilityTerm(166, originParcel.NetIntersectionDensity1()); alternative.AddUtilityTerm(165, originParcel.HouseholdDensity1()); alternative.AddUtilityTerm(164, originParcel.MixedUse4Index1()); alternative.AddUtilityTerm(162, (class1Dist > 0).ToFlag()); alternative.AddUtilityTerm(162, (class2Dist > 0).ToFlag()); // alternative.AddUtility(163, (worstDist > 0).ToFlag()); alternative.AddUtilityTerm(170, 1.0 * destinationParcel.MixedUse4Index1() + 0.00002 * destinationParcel.TotalEmploymentDensity1() + 0.001 * destinationParcel.NetIntersectionDensity1() + 0.001 * originParcel.NetIntersectionDensity1() + 0.0002 * originParcel.HouseholdDensity1() + 1.0 * originParcel.MixedUse4Index1()); //alternative.AddUtilityTerm(261, originParcel.PCA_DensityTerm_Buffer1()); //alternative.AddUtilityTerm(262, originParcel.PCA_WalkabilityTerm_Buffer1()); //alternative.AddUtilityTerm(263, originParcel.PCA_MixedUseTerm_Buffer1()); //alternative.AddUtilityTerm(264, originParcel.PCA_TransitAccessTerm_Buffer1()); //alternative.AddUtilityTerm(261, destinationParcel.PCA_DensityTerm_Buffer1()); //alternative.AddUtilityTerm(262, destinationParcel.PCA_WalkabilityTerm_Buffer1()); //alternative.AddUtilityTerm(263, destinationParcel.PCA_MixedUseTerm_Buffer1()); //alternative.AddUtilityTerm(264, destinationParcel.PCA_TransitAccessTerm_Buffer1()); //alternative.AddUtilityTerm(265, destinationParcel.PCA_DensityTerm_Buffer1()); //alternative.AddUtilityTerm(266, destinationParcel.PCA_WalkabilityTerm_Buffer1()); //alternative.AddUtilityTerm(267, destinationParcel.PCA_MixedUseTerm_Buffer1()); //alternative.AddUtilityTerm(268, destinationParcel.PCA_TransitAccessTerm_Buffer1()); } else if (mode == Global.Settings.Modes.Walk) { alternative.AddUtilityTerm(70, 1); //for calibration alternative.AddUtilityTerm(71, maleFlag); alternative.AddUtilityTerm(73, ageBetween51And98Flag); alternative.AddUtilityTerm(75, pathTypeModel.PathDistance * pathTypeModel.PathDistance); alternative.AddUtilityTerm(77, noCarsInHouseholdFlag); //for calibration alternative.AddUtilityTerm(78, carsLessThanDriversFlag); //for calibration alternative.AddUtilityTerm(179, destinationParcel.MixedUse4Index1()); alternative.AddUtilityTerm(178, destinationParcel.TotalEmploymentDensity1()); alternative.AddUtilityTerm(177, destinationParcel.NetIntersectionDensity1()); alternative.AddUtilityTerm(176, originParcel.NetIntersectionDensity1()); alternative.AddUtilityTerm(175, originParcel.HouseholdDensity1()); alternative.AddUtilityTerm(179, originParcel.MixedUse4Index1()); alternative.AddUtilityTerm(181, 1.0 * destinationParcel.MixedUse4Index1() + 0.00001 * destinationParcel.TotalEmploymentDensity1() + 0.001 * destinationParcel.NetIntersectionDensity1() + 0.001 * originParcel.NetIntersectionDensity1() + 0.0001 * originParcel.HouseholdDensity1() + 1.0 * originParcel.MixedUse4Index1()); //alternative.AddUtilityTerm(271, originParcel.PCA_DensityTerm_Buffer1()); //alternative.AddUtilityTerm(272, originParcel.PCA_WalkabilityTerm_Buffer1()); //alternative.AddUtilityTerm(273, originParcel.PCA_MixedUseTerm_Buffer1()); //alternative.AddUtilityTerm(274, originParcel.PCA_TransitAccessTerm_Buffer1()); //alternative.AddUtilityTerm(271, destinationParcel.PCA_DensityTerm_Buffer1()); //alternative.AddUtilityTerm(272, destinationParcel.PCA_WalkabilityTerm_Buffer1()); //alternative.AddUtilityTerm(273, destinationParcel.PCA_MixedUseTerm_Buffer1()); //alternative.AddUtilityTerm(274, destinationParcel.PCA_TransitAccessTerm_Buffer1()); //alternative.AddUtilityTerm(275, destinationParcel.PCA_DensityTerm_Buffer1()); //alternative.AddUtilityTerm(276, destinationParcel.PCA_WalkabilityTerm_Buffer1()); //alternative.AddUtilityTerm(277, destinationParcel.PCA_MixedUseTerm_Buffer1()); //alternative.AddUtilityTerm(278, destinationParcel.PCA_TransitAccessTerm_Buffer1()); } else if (mode == Global.Settings.Modes.PaidRideShare) { if (Global.Configuration.PaidRideshare_UseEstimatedInsteadOfAssertedCoefficients) { alternative.AddUtilityTerm(80, 1.0); alternative.AddUtilityTerm(81, noCarsInHouseholdFlag); //for calibration alternative.AddUtilityTerm(82, carsLessThanDriversFlag); //for calibration alternative.AddUtilityTerm(83, tour.Person.AgeIsBetween26And35.ToFlag()); alternative.AddUtilityTerm(83, tour.Person.AgeIsBetween18And25.ToFlag()); alternative.AddUtilityTerm(84, (tour.Person.Age >= 65).ToFlag()); //alternative.AddUtilityTerm(81, tour.Person.AgeIsBetween26And35.ToFlag()); alternative.AddUtilityTerm(85, originParcel.HouseholdsBuffer2 + originParcel.StudentsUniversityBuffer2 + originParcel.EmploymentTotalBuffer2); alternative.AddUtilityTerm(86, destinationParcel.HouseholdsBuffer2 + destinationParcel.StudentsUniversityBuffer2 + destinationParcel.EmploymentTotalBuffer2); alternative.AddUtilityTerm(87, income0To25KFlag); alternative.AddUtilityTerm(88, incomeOver100Flag); } else { double modeConstant = Global.Configuration.AV_PaidRideShareModeUsesAVs ? Global.Configuration.AV_PaidRideShare_ModeConstant + Global.Configuration.AV_PaidRideShare_DensityCoefficient * Math.Min(originParcel.HouseholdsBuffer2 + originParcel.StudentsUniversityBuffer2 + originParcel.EmploymentTotalBuffer2, (Global.Configuration.PaidRideShare_DensityMeasureCapValue > 0) ? Global.Configuration.PaidRideShare_DensityMeasureCapValue : 6000) + Global.Configuration.AV_PaidRideShare_AVOwnerCoefficient * (household.OwnsAutomatedVehicles > 0).ToFlag() : Global.Configuration.PaidRideShare_ModeConstant + Global.Configuration.PaidRideShare_DensityCoefficient * Math.Min(originParcel.HouseholdsBuffer2 + originParcel.StudentsUniversityBuffer2 + originParcel.EmploymentTotalBuffer2, (Global.Configuration.PaidRideShare_DensityMeasureCapValue > 0) ? Global.Configuration.PaidRideShare_DensityMeasureCapValue : 6000); alternative.AddUtilityTerm(90, modeConstant); alternative.AddUtilityTerm(90, Global.Configuration.PaidRideShare_Age26to35Coefficient * tour.Person.AgeIsBetween26And35.ToFlag()); alternative.AddUtilityTerm(90, Global.Configuration.PaidRideShare_Age18to25Coefficient * tour.Person.AgeIsBetween18And25.ToFlag()); alternative.AddUtilityTerm(90, Global.Configuration.PaidRideShare_AgeOver65Coefficient * (tour.Person.Age >= 65).ToFlag()); } } RegionSpecificCustomizations(alternative, tour, pathTypeModel.PathType, mode, destinationParcel); } }
public void SetUtilities(ISampleItem sampleItem, int sampleFrequency) { if (sampleItem == null) { throw new ArgumentNullException("sampleItem"); } ChoiceProbabilityCalculator.Alternative alternative = sampleItem.Alternative; IHouseholdWrapper household = _tour.Household; IPersonWrapper person = _tour.Person; IPersonDayWrapper personDay = _tour.PersonDay; // var householdHasChildren = household.HasChildren; IParcelWrapper destinationParcel = ChoiceModelFactory.Parcels[sampleItem.ParcelId]; IParcelWrapper excludedParcel = person.UsualWorkParcel == null || person.UsualWorkParcelId == household.ResidenceParcelId || _tour.DestinationPurpose != Global.Settings.Purposes.Work || _tour.GetTourCategory() == Global.Settings.TourCategories.WorkBased ? null : person.UsualWorkParcel; bool usualWorkParcel = (excludedParcel != null && excludedParcel.Id == destinationParcel.Id); // only 1 for oddball alternative on tours with oddball alternative int usualWorkParcelFlag = usualWorkParcel.ToFlag(); // Comment out these nesting calls when estimating the conditional flat model // model is NL with oddball alternative if (usualWorkParcelFlag == 0) { // this alternative is in the non-oddball nest alternative.AddNestedAlternative(_sampleSize + 2, 0, 60); // associates alternative with non-oddball nest } else { // this is the oddball alternative alternative.AddNestedAlternative(_sampleSize + 3, 1, 60); // associates alternative with oddball nest } if (!alternative.Available) { return; } // use this block of code to eliminate the oddball alternative for estimation of the conditional model //if (usualWorkParcelFlag == 1) { // alternative.Available = false; // // return; //} double fastestTravelTime = ImpedanceRoster.GetValue("ivtime", Global.Settings.Modes.Hov3, Global.Settings.PathTypes.FullNetwork, Global.Settings.ValueOfTimes.DefaultVot, _fastestAvailableTimeOfDay, _tour.OriginParcel, destinationParcel).Variable + ImpedanceRoster.GetValue("ivtime", Global.Settings.Modes.Hov3, Global.Settings.PathTypes.FullNetwork, Global.Settings.ValueOfTimes.DefaultVot, _fastestAvailableTimeOfDay, destinationParcel, _tour.OriginParcel).Variable; if (fastestTravelTime >= _maxAvailableMinutes) { alternative.Available = false; return; } alternative.Choice = destinationParcel; double tourLogsum; if (_tour.IsHomeBasedTour) { ChoiceProbabilityCalculator.Alternative nestedAlternative = Global.ChoiceModelSession.Get <WorkTourModeModel>().RunNested(_tour, destinationParcel, household.VehiclesAvailable, person.GetTransitFareDiscountFraction()); tourLogsum = nestedAlternative == null ? 0 : nestedAlternative.ComputeLogsum(); } else { ChoiceProbabilityCalculator.Alternative nestedAlternative = Global.ChoiceModelSession.Get <WorkBasedSubtourModeModel>().RunNested(_tour, destinationParcel); tourLogsum = nestedAlternative == null ? 0 : nestedAlternative.ComputeLogsum(); } //var purpose = _tour.TourPurposeSegment; //var nonWorkPurpose = _tour.DestinationPurpose != Global.Settings.Purposes.Work; int carOwnership = person.GetCarOwnershipSegment(); //var votSegment = _tour.VotALSegment; //var transitAccess = destinationParcel.TransitAccessSegment(); //var aggregateLogsum = Global.AggregateLogsums[destinationParcel.ZoneId][purpose][carOwnership][votSegment][transitAccess]; //var aggregateLogsumHomeBased = Global.AggregateLogsums[destinationParcel.ZoneId][Global.Settings.Purposes.HomeBasedComposite][carOwnership][votSegment][transitAccess]; //var aggregateLogsumWorkBased = Global.AggregateLogsums[destinationParcel.ZoneId][Global.Settings.Purposes.Work_BASED][carOwnership][votSegment][transitAccess]; double distanceFromOrigin = _tour.OriginParcel.DistanceFromOrigin(destinationParcel, _tour.DestinationArrivalTime); // var distanceFromOrigin0 = Math.Max(0, Math.Min(distanceFromOrigin - .5, 1 - .5)); // var distanceFromOrigin3 = Math.Max(0, distanceFromOrigin - 1); // var distanceFromOrigin4 = Math.Min(distanceFromOrigin, .10); // var distanceFromOrigin5 = Math.Max(0, Math.Min(distanceFromOrigin - .1, .5 - .1)); // var distanceFromOrigin8 = Math.Max(0, Math.Min(distanceFromOrigin - .1, .35 - .1)); // var distanceFromOrigin9 = Math.Max(0, Math.Min(distanceFromOrigin - .35, 1 - .35)); double distanceFromOriginLog = Math.Log(1 + distanceFromOrigin); double distanceFromWorkLog = person.UsualWorkParcel.DistanceFromWorkLog(destinationParcel, 1); double distanceFromSchoolLog = person.UsualSchoolParcel.DistanceFromSchoolLog(destinationParcel, 1); // var millionsSquareFeet = destinationZoneTotals.MillionsSquareFeet(); double timePressure = Math.Log(1 - fastestTravelTime / _maxAvailableMinutes); // log transforms of buffers for Neighborhood effects double empEduBuffer = Math.Log(destinationParcel.EmploymentEducationBuffer1 + 1.0); // var EMPFOO_B = Math.Log(destinationParcel.EmploymentFoodBuffer1 + 1.0); // var EMPGOV_B = Math.Log(destinationParcel.EmploymentGovernmentBuffer1 + 1.0); double empOfcBuffer = Math.Log(destinationParcel.EmploymentOfficeBuffer1 + 1.0); // var EMPRET_B = Math.Log(destinationParcel.EmploymentRetailBuffer1 + 1.0); // var EMPSVC_B = Math.Log(destinationParcel.EmploymentServiceBuffer1 + 1.0); // var EMPMED_B = Math.Log(destinationParcel.EmploymentMedicalBuffer1 + 1.0); double empIndBuffer = Math.Log(destinationParcel.EmploymentIndustrialBuffer1 + destinationParcel.EmploymentAgricultureConstructionBuffer1 + 1.0); // var EMPTOT_B = Math.Log(destinationParcel.EmploymentTotalBuffer1 + 1.0); double housesBuffer = Math.Log(destinationParcel.HouseholdsBuffer1 + 1.0); // var STUDK12B = Math.Log(destinationParcel.StudentsK8Buffer1 + destinationParcel.StudentsHighSchoolBuffer1 + 1.0); // var STUDUNIB = Math.Log(destinationParcel.StudentsUniversityBuffer1 + 1.0); // var EMPHOU_B = Math.Log(destinationParcel.EmploymentTotalBuffer1 + destinationParcel.HouseholdsBuffer1 + 1.0); // parking attributes // var parcelParkingDensity = destinationParcel.ParcelParkingPerTotalEmployment(); // var zoneParkingDensity = destinationParcel.ZoneParkingPerTotalEmploymentAndK12UniversityStudents(destinationZoneTotals, millionsSquareFeet); // var ParkingPaidDailyLogBuffer1 = Math.Log(1 + destinationParcel.ParkingOffStreetPaidDailySpacesBuffer1); // connectivity attributes // var c34Ratio = destinationParcel.C34RatioBuffer1(); // var carDeficitFlag = FlagUtility.GetCarDeficitFlag(carOwnership); // includes no cars // var carCompetitionFlag = FlagUtility.GetCarCompetitionFlag(carOwnership); // exludes no cars int noCarCompetitionFlag = FlagUtility.GetNoCarCompetitionFlag(carOwnership); // var noCarsFlag = FlagUtility.GetNoCarsFlag(carOwnership); // Usual location attributes alternative.AddUtilityTerm(1, usualWorkParcelFlag); alternative.AddUtilityTerm(2, person.IsPartTimeWorker.ToFlag() * usualWorkParcelFlag); alternative.AddUtilityTerm(3, person.IsStudentAge.ToFlag() * usualWorkParcelFlag); alternative.AddUtilityTerm(4, _primaryFlag * personDay.TwoOrMoreWorkToursExist().ToFlag() * usualWorkParcelFlag); alternative.AddUtilityTerm(5, personDay.WorkStopsExist().ToFlag() * usualWorkParcelFlag); alternative.AddUtilityTerm(6, _secondaryFlag * usualWorkParcelFlag); // non-usual location attributes alternative.AddUtilityTerm(11, (!usualWorkParcel).ToFlag() * sampleItem.AdjustmentFactor); alternative.AddUtilityTerm(12, _tour.IsHomeBasedTour.ToFlag() * (!usualWorkParcel).ToFlag() * timePressure); alternative.AddUtilityTerm(13, (!usualWorkParcel).ToFlag() * person.IsFulltimeWorker.ToFlag() * tourLogsum); alternative.AddUtilityTerm(14, (!usualWorkParcel).ToFlag() * person.IsPartTimeWorker.ToFlag() * tourLogsum); alternative.AddUtilityTerm(15, (!usualWorkParcel).ToFlag() * person.IsNotFullOrPartTimeWorker.ToFlag() * tourLogsum); alternative.AddUtilityTerm(16, (!usualWorkParcel).ToFlag() * person.IsRetiredAdult.ToFlag() * distanceFromOriginLog); alternative.AddUtilityTerm(17, (!usualWorkParcel).ToFlag() * distanceFromWorkLog); alternative.AddUtilityTerm(18, (!usualWorkParcel).ToFlag() * person.IsStudentAge.ToFlag() * distanceFromSchoolLog); alternative.AddUtilityTerm(19, (!usualWorkParcel).ToFlag() * noCarCompetitionFlag * destinationParcel.ParkingHourlyEmploymentCommercialMixBuffer1()); // non-usual location Neighborhood attributes alternative.AddUtilityTerm(31, (!usualWorkParcel).ToFlag() * empEduBuffer); alternative.AddUtilityTerm(32, (!usualWorkParcel).ToFlag() * empOfcBuffer); alternative.AddUtilityTerm(33, (!usualWorkParcel).ToFlag() * housesBuffer); alternative.AddUtilityTerm(34, (!usualWorkParcel).ToFlag() * empIndBuffer); // non-usual location Size terms (consider conditioning these by fulltime, parttime, notFTPT, an income (see original sacog spec) alternative.AddUtilityTerm(40, (!usualWorkParcel).ToFlag() * destinationParcel.EmploymentEducation); alternative.AddUtilityTerm(41, (!usualWorkParcel).ToFlag() * destinationParcel.EmploymentFood); alternative.AddUtilityTerm(42, (!usualWorkParcel).ToFlag() * destinationParcel.EmploymentGovernment); alternative.AddUtilityTerm(43, (!usualWorkParcel).ToFlag() * destinationParcel.EmploymentOffice); alternative.AddUtilityTerm(44, (!usualWorkParcel).ToFlag() * destinationParcel.EmploymentRetail); alternative.AddUtilityTerm(45, (!usualWorkParcel).ToFlag() * destinationParcel.EmploymentService); alternative.AddUtilityTerm(46, (!usualWorkParcel).ToFlag() * destinationParcel.EmploymentMedical); alternative.AddUtilityTerm(47, (!usualWorkParcel).ToFlag() * destinationParcel.EmploymentIndustrial + destinationParcel.EmploymentAgricultureConstruction); alternative.AddUtilityTerm(48, (!usualWorkParcel).ToFlag() * destinationParcel.Households); alternative.AddUtilityTerm(49, (!usualWorkParcel).ToFlag() * destinationParcel.StudentsUniversity); // OD shadow pricing if (!usualWorkParcel && Global.Configuration.ShouldUseODShadowPricing) { int ori = _tour.OriginParcel.District; int des = destinationParcel.District; //var first = res <= des? res : des; //var second = res <= des? des : res; double shadowPriceConfigurationParameter = ori == des ? Global.Configuration.WorkTourDestinationOOShadowPriceCoefficient : Global.Configuration.WorkTourDestinationODShadowPriceCoefficient; int odShadowPriceF12Value = MAX_REGULAR_PARAMETER + Global.Configuration.NumberOfODShadowPricingDistricts * (ori - 1) + des; alternative.AddUtilityTerm(odShadowPriceF12Value, shadowPriceConfigurationParameter); } // // usual location size term // alternative.AddUtilityTerm(50, usualWorkParcelFlag * 1); // // Comment out these nesting calls when estimating the conditional flat model // // model is NL with oddball alternative // if (usualWorkParcelFlag == 0) { // // this alternative is in the non-oddball nest // alternative.AddNestedAlternative(_sampleSize + 2, 0, 60); // associates alternative with non-oddball nest // } // else { // // this is the oddball alternative // alternative.AddNestedAlternative(_sampleSize + 3, 1, 60); // associates alternative with oddball nest // } }