private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, ITourWrapper tour, IEnumerable <IPathTypeModel> pathTypeModels, IParcelWrapper destinationParcel, int householdCars, int choice = Constants.DEFAULT_VALUE) { var household = tour.Household; var person = tour.Person; var personDay = tour.PersonDay; // household inputs var income0To25KFlag = household.Has0To25KIncome.ToFlag(); var income25To50KFlag = household.Has25To50KIncome.ToFlag(); var income75KPlusFlag = household.Has75KPlusIncome.ToFlag(); var onePersonHouseholdFlag = household.IsOnePersonHousehold.ToFlag(); var twoPersonHouseholdFlag = household.IsTwoPersonHousehold.ToFlag(); var noCarsInHouseholdFlag = household.GetFlagForNoCarsInHousehold(householdCars); var carsLessThanDriversFlag = household.GetFlagForCarsLessThanDrivers(householdCars); // person inputs var childUnder5Flag = person.IsChildUnder5.ToFlag(); var adultFlag = person.IsAdult.ToFlag(); var drivingAgeStudentFlag = person.IsDrivingAgeStudent.ToFlag(); var maleFlag = person.IsMale.ToFlag(); // remaining inputs var originParcel = tour.OriginParcel; var destinationParkingCost = destinationParcel.ParkingCostBuffer1(6); double escortPercentage; double nonEscortPercentage; ChoiceModelUtility.SetEscortPercentages(personDay, out escortPercentage, out nonEscortPercentage); // school bus is a special case - use HOV3 impedance { var pathTypeExtra = pathTypeModels.First(x => x.Mode == Global.Settings.Modes.Hov3); var modeExtra = Global.Settings.Modes.SchoolBus; var availableExtra = pathTypeExtra.Available; var generalizedTimeLogsumExtra = pathTypeExtra.GeneralizedTimeLogsum; var 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(17, childUnder5Flag); alternative.AddUtilityTerm(18, adultFlag); } } // paidRideShare is another special case if (Global.Configuration.PaidRideShareModeIsAvailable) { var pathTypeExtra = pathTypeModels.First(x => x.Mode == Global.Settings.Modes.PaidRideShare); var modeExtra = Global.Settings.Modes.PaidRideShare; var availableExtra = pathTypeExtra.Available; var generalizedTimeLogsumExtra = pathTypeExtra.GeneralizedTimeLogsum; var distanceExtra = pathTypeExtra.PathDistance; var alternative = choiceProbabilityCalculator.GetAlternative(modeExtra - 2, availableExtra, choice == modeExtra); alternative.Choice = modeExtra; alternative.AddNestedAlternative(_nestedAlternativeIds[modeExtra], _nestedAlternativeIndexes[modeExtra], THETA_PARAMETER); if (availableExtra) { var extraCostPerMile = Global.Configuration.AV_PaidRideShareModeUsesAVs ? Global.Configuration.AV_PaidRideShare_ExtraCostPerDistanceUnit : Global.Configuration.PaidRideShare_ExtraCostPerDistanceUnit; var fixedCostPerRide = Global.Configuration.AV_PaidRideShareModeUsesAVs ? Global.Configuration.AV_PaidRideShare_FixedCostPerRide : Global.Configuration.PaidRideShare_FixedCostPerRide; var autoTimeCoefficient = Global.Configuration.AV_PaidRideShareModeUsesAVs ? tour.TimeCoefficient * (1.0 - Global.Configuration.AV_InVehicleTimeCoefficientDiscountFactor) : tour.TimeCoefficient; alternative.AddUtilityTerm(2, generalizedTimeLogsumExtra * autoTimeCoefficient); alternative.AddUtilityTerm(2, distanceExtra * extraCostPerMile * tour.CostCoefficient); alternative.AddUtilityTerm(2, fixedCostPerRide * tour.CostCoefficient); var 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); 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 < 16).ToFlag()); } } foreach (var pathTypeModel in pathTypeModels) { var mode = pathTypeModel.Mode; var available = pathTypeModel.Available; var generalizedTimeLogsum = pathTypeModel.GeneralizedTimeLogsum; var alternative = choiceProbabilityCalculator.GetAlternative(mode, available, choice == mode); alternative.Choice = mode; alternative.AddNestedAlternative(_nestedAlternativeIds[mode], _nestedAlternativeIndexes[mode], THETA_PARAMETER); if (!available) { continue; } var 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) : tour.TimeCoefficient; alternative.AddUtilityTerm(2, generalizedTimeLogsum * modeTimeCoefficient); 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(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(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(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(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()); } else if (mode == Global.Settings.Modes.Walk) { alternative.AddUtilityTerm(70, 1); 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()); } RegionSpecificCustomizations(alternative, tour, pathTypeModel.PathType, mode, destinationParcel); } }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, IPersonDayWrapper personDay, int purpose, int choice = Constants.DEFAULT_VALUE) { var household = personDay.Household; var residenceParcel = household.ResidenceParcel; var person = personDay.Person; var carsPerDriver = household.GetCarsPerDriver(); var mixedDensity = residenceParcel.ParcelHouseholdsPerRetailServiceFoodEmploymentBuffer2(); var intersectionDensity = residenceParcel.IntersectionDensity34Minus1Buffer2(); double purposeLogsum; if (purpose == Global.Settings.Purposes.Work) { if (person.UsualWorkParcel == null || person.UsualWorkParcelId == household.ResidenceParcelId) { purposeLogsum = 0; } else { var destinationArrivalTime = ChoiceModelUtility.GetDestinationArrivalTime(Global.Settings.Models.WorkTourModeModel); var destinationDepartureTime = ChoiceModelUtility.GetDestinationDepartureTime(Global.Settings.Models.WorkTourModeModel); var nestedAlternative = Global.ChoiceModelSession.Get <WorkTourModeModel>().RunNested(personDay, residenceParcel, person.UsualWorkParcel, destinationArrivalTime, destinationDepartureTime, household.VehiclesAvailable); purposeLogsum = nestedAlternative == null ? 0 : nestedAlternative.ComputeLogsum(); } } else if (purpose == Global.Settings.Purposes.School) { if (person.UsualSchoolParcel == null || person.UsualSchoolParcelId == household.ResidenceParcelId) { purposeLogsum = 0; } else { var destinationArrivalTime = ChoiceModelUtility.GetDestinationArrivalTime(Global.Settings.Models.SchoolTourModeModel); var destinationDepartureTime = ChoiceModelUtility.GetDestinationDepartureTime(Global.Settings.Models.SchoolTourModeModel); var nestedAlternative = Global.ChoiceModelSession.Get <SchoolTourModeModel>().RunNested(personDay, residenceParcel, person.UsualSchoolParcel, destinationArrivalTime, destinationDepartureTime, household.VehiclesAvailable); purposeLogsum = nestedAlternative == null ? 0 : nestedAlternative.ComputeLogsum(); } } else { var carOwnership = person.GetCarOwnershipSegment(); var votSegment = person.Household.GetVotALSegment(); var transitAccess = residenceParcel.TransitAccessSegment(); purposeLogsum = Global.AggregateLogsums[household.ResidenceZoneId][purpose][carOwnership][votSegment][transitAccess]; } // 1 TOUR var alternative = choiceProbabilityCalculator.GetAlternative(0, true, choice == 1); alternative.Choice = 1; alternative.AddUtilityTerm(1, purpose); // 2 TOURS alternative = choiceProbabilityCalculator.GetAlternative(1, true, choice == 2); const int two = 2; alternative.Choice = two; alternative.AddUtilityTerm(100 * purpose + 1, person.IsFulltimeWorker.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 2, person.IsPartTimeWorker.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 3, person.IsRetiredAdult.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 4, person.IsNonworkingAdult.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 5, person.IsUniversityStudent.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 6, person.IsDrivingAgeStudent.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 7, person.IsChildAge5Through15.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 8, person.IsChildUnder5.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 9, household.Has0To25KIncome.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 10, household.Has25To45KIncome.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 11, household.Has75KPlusIncome.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 12, carsPerDriver); alternative.AddUtilityTerm(100 * purpose + 13, person.IsOnlyAdult().ToFlag()); alternative.AddUtilityTerm(100 * purpose + 14, person.IsOnlyFullOrPartTimeWorker().ToFlag()); alternative.AddUtilityTerm(100 * purpose + 15, 0); alternative.AddUtilityTerm(100 * purpose + 16, person.IsFemale.ToFlag() * person.IsAdult.ToFlag() * (!household.HasChildrenUnder16).ToFlag()); alternative.AddUtilityTerm(100 * purpose + 17, person.IsFemale.ToFlag() * person.IsAdult.ToFlag() * household.HasChildrenUnder5.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 18, person.IsFemale.ToFlag() * person.IsAdult.ToFlag() * household.HasChildrenAge5Through15.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 19, person.IsMale.ToFlag() * person.IsAdult.ToFlag() * household.HasChildrenUnder5.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 20, person.IsMale.ToFlag() * person.IsAdult.ToFlag() * household.HasChildrenAge5Through15.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 21, person.AgeIsBetween18And25.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 22, person.AgeIsBetween26And35.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 23, person.AgeIsBetween51And65.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 24, person.WorksAtHome.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 25, mixedDensity); alternative.AddUtilityTerm(100 * purpose + 26, intersectionDensity); alternative.AddUtilityTerm(100 * purpose + 31, personDay.WorkTours); alternative.AddUtilityTerm(100 * purpose + 32, personDay.SchoolTours); alternative.AddUtilityTerm(100 * purpose + 33, personDay.EscortTours); alternative.AddUtilityTerm(100 * purpose + 34, personDay.PersonalBusinessTours); alternative.AddUtilityTerm(100 * purpose + 35, personDay.ShoppingTours); alternative.AddUtilityTerm(100 * purpose + 36, personDay.MealTours); alternative.AddUtilityTerm(100 * purpose + 37, personDay.SocialTours); alternative.AddUtilityTerm(100 * purpose + 41, personDay.WorkStops); if (purpose <= Global.Settings.Purposes.Escort) { alternative.AddUtilityTerm(100 * purpose + 42, personDay.SchoolStops); } alternative.AddUtilityTerm(100 * purpose + 43, personDay.EscortStops); alternative.AddUtilityTerm(100 * purpose + 44, personDay.PersonalBusinessStops); alternative.AddUtilityTerm(100 * purpose + 45, personDay.ShoppingStops); alternative.AddUtilityTerm(100 * purpose + 46, personDay.MealStops); alternative.AddUtilityTerm(100 * purpose + 47, personDay.SocialStops); alternative.AddUtilityTerm(100 * purpose + 50 + two, 1); // ASC alternative.AddUtilityTerm(100 * purpose + 23 + 2 * two, purposeLogsum); // accessibility effect has different coefficient for 2 and 3+ // 3+ TOURS alternative = choiceProbabilityCalculator.GetAlternative(2, true, choice == 3); const int three = 3; alternative.Choice = three; alternative.AddUtilityTerm(100 * purpose + 1, person.IsFulltimeWorker.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 2, person.IsPartTimeWorker.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 3, person.IsRetiredAdult.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 4, person.IsNonworkingAdult.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 5, person.IsUniversityStudent.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 6, person.IsDrivingAgeStudent.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 7, person.IsChildAge5Through15.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 8, person.IsChildUnder5.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 9, household.Has0To25KIncome.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 10, household.Has25To45KIncome.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 11, household.Has75KPlusIncome.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 12, carsPerDriver); alternative.AddUtilityTerm(100 * purpose + 13, person.IsOnlyAdult().ToFlag()); alternative.AddUtilityTerm(100 * purpose + 14, person.IsOnlyFullOrPartTimeWorker().ToFlag()); alternative.AddUtilityTerm(100 * purpose + 15, 0); alternative.AddUtilityTerm(100 * purpose + 16, person.IsFemale.ToFlag() * person.IsAdult.ToFlag() * (!household.HasChildrenUnder16).ToFlag()); alternative.AddUtilityTerm(100 * purpose + 17, person.IsFemale.ToFlag() * person.IsAdult.ToFlag() * household.HasChildrenUnder5.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 18, person.IsFemale.ToFlag() * person.IsAdult.ToFlag() * household.HasChildrenAge5Through15.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 19, person.IsMale.ToFlag() * person.IsAdult.ToFlag() * household.HasChildrenUnder5.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 20, person.IsMale.ToFlag() * person.IsAdult.ToFlag() * household.HasChildrenAge5Through15.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 21, person.AgeIsBetween18And25.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 22, person.AgeIsBetween26And35.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 23, person.AgeIsBetween51And65.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 24, person.WorksAtHome.ToFlag()); alternative.AddUtilityTerm(100 * purpose + 25, mixedDensity); alternative.AddUtilityTerm(100 * purpose + 26, intersectionDensity); alternative.AddUtilityTerm(100 * purpose + 31, personDay.WorkTours); alternative.AddUtilityTerm(100 * purpose + 32, personDay.SchoolTours); alternative.AddUtilityTerm(100 * purpose + 33, personDay.EscortTours); alternative.AddUtilityTerm(100 * purpose + 34, personDay.PersonalBusinessTours); alternative.AddUtilityTerm(100 * purpose + 35, personDay.ShoppingTours); alternative.AddUtilityTerm(100 * purpose + 36, personDay.MealTours); alternative.AddUtilityTerm(100 * purpose + 37, personDay.SocialTours); alternative.AddUtilityTerm(100 * purpose + 41, personDay.WorkStops); if (purpose <= Global.Settings.Purposes.Escort) { alternative.AddUtilityTerm(100 * purpose + 42, personDay.SchoolStops); } alternative.AddUtilityTerm(100 * purpose + 43, personDay.EscortStops); alternative.AddUtilityTerm(100 * purpose + 44, personDay.PersonalBusinessStops); alternative.AddUtilityTerm(100 * purpose + 45, personDay.ShoppingStops); alternative.AddUtilityTerm(100 * purpose + 46, personDay.MealStops); alternative.AddUtilityTerm(100 * purpose + 47, personDay.SocialStops); alternative.AddUtilityTerm(100 * purpose + 50 + three, 1); // ASC alternative.AddUtilityTerm(100 * purpose + 23 + 2 * three, purposeLogsum); // accessibility effect has different coefficient for 2 and 3+ }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, TourWrapper tour, HouseholdDayWrapper householdDay, int sampleSize, IParcelWrapper choice = null) { timesStartedRunModel++; HouseholdWrapper household = (HouseholdWrapper)tour.Household; PersonWrapper person = (PersonWrapper)tour.Person; PersonDayWrapper personDay = (PersonDayWrapper)tour.PersonDay; // var totalAvailableMinutes = // tour.ParentTour == null // ? personDay.TimeWindow.TotalAvailableMinutes(1, Global.Settings.Times.MinutesInADay) // : tour.ParentTour.TimeWindow.TotalAvailableMinutes(1, Global.Settings.Times.MinutesInADay); TimeWindow timeWindow = new TimeWindow(); if (tour.JointTourSequence > 0) { foreach (PersonDayWrapper pDay in householdDay.PersonDays) { TourWrapper tInJoint = (TourWrapper)pDay.Tours.Find(t => t.JointTourSequence == tour.JointTourSequence); if (!(tInJoint == null)) { // set jointTour time window timeWindow.IncorporateAnotherTimeWindow(tInJoint.PersonDay.TimeWindow); } } } else if (tour.ParentTour == null) { timeWindow.IncorporateAnotherTimeWindow(personDay.TimeWindow); } timeWindow.SetBusyMinutes(Global.Settings.Times.EndOfRelevantWindow, Global.Settings.Times.MinutesInADay + 1); var maxAvailableMinutes = (tour.JointTourSequence > 0 || tour.ParentTour == null) ? timeWindow.MaxAvailableMinutesAfter(Global.Settings.Times.FiveAM) : tour.ParentTour.DestinationDepartureTime - tour.ParentTour.DestinationArrivalTime; // var hoursAvailableInverse = // tour.IsHomeBasedTour // ? (personDay.HomeBasedTours - personDay.SimulatedHomeBasedTours + 1) / (Math.Max(totalAvailableMinutes - 360, 30) / 60D) // : 1 / (Math.Max(totalAvailableMinutes, 1) / 60D); var householdHasChildren = household.HasChildren; var householdHasNoChildren = householdHasChildren ? false : true; var fastestAvailableTimeOfDay = tour.IsHomeBasedTour || tour.ParentTour == null ? 1 : tour.ParentTour.DestinationArrivalTime + (tour.ParentTour.DestinationDepartureTime - tour.ParentTour.DestinationArrivalTime) / 2; var tourCategory = tour.GetTourCategory(); // var primaryFlag = ChoiceModelUtility.GetPrimaryFlag(tourCategory); var secondaryFlag = ChoiceModelUtility.GetSecondaryFlag(tourCategory); var workOrSchoolPatternFlag = personDay.GetIsWorkOrSchoolPattern().ToFlag(); var otherPatternFlag = personDay.GetIsOtherPattern().ToFlag(); int jointTourFlag = (tour.JointTourSequence > 0).ToFlag(); ChoiceModelUtility.DrawRandomTourTimePeriods(tour, tourCategory); if (tour.Household.Id == 80049 && tour.PersonDay.Day == 1 && tour.Person.Sequence == 2 && tour.Sequence == 4) { bool testbreak = true; } var segment = Global.Kernel.Get <SamplingWeightsSettingsFactory>().SamplingWeightsSettings.GetTourDestinationSegment(tour.DestinationPurpose, tour.IsHomeBasedTour ? Global.Settings.TourPriorities.HomeBasedTour : Global.Settings.TourPriorities.WorkBasedTour, Global.Settings.Modes.Sov, person.PersonType); var destinationSampler = new DestinationSampler(choiceProbabilityCalculator, segment, sampleSize, tour.OriginParcel, choice); var tourDestinationUtilities = new TourDestinationUtilities(tour, sampleSize, secondaryFlag, personDay.GetIsWorkOrSchoolPattern().ToFlag(), personDay.GetIsOtherPattern().ToFlag(), fastestAvailableTimeOfDay, maxAvailableMinutes); // get destination sample and perform code that used to be in SetUtilities below var sampleItems = destinationSampler.SampleAndReturnTourDestinations(tourDestinationUtilities); int index = 0; foreach (var sampleItem in sampleItems) { bool available = sampleItem.Key.Available; bool isChosen = sampleItem.Key.IsChosen; double adjustmentFactor = sampleItem.Key.AdjustmentFactor; var destinationParcel = ChoiceModelFactory.Parcels[sampleItem.Key.ParcelId]; if (isChosen) { Global.PrintFile.WriteLine("Sequence {0}: Chosen parcel {1} Available {2} Sample item {3} of {4}", timesStartedRunModel, destinationParcel.Id, available, index, sampleItems.Count); } var alternative = choiceProbabilityCalculator.GetAlternative(index++, available, isChosen); if (!available) { continue; } var 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; continue; } alternative.Choice = destinationParcel; double tourLogsum; if (tour.IsHomeBasedTour) { if (tour.DestinationPurpose == Global.Settings.Purposes.Work) { //JLB 201406 //var nestedAlternative = Global.ChoiceModelSession.Get<WorkTourModeModel>().RunNested(tour, destinationParcel); var nestedAlternative = Global.ChoiceModelSession.Get <WorkTourModeTimeModel>().RunNested(tour, destinationParcel, tour.Household.VehiclesAvailable, tour.Person.GetTransitFareDiscountFraction()); tourLogsum = nestedAlternative == null ? 0 : nestedAlternative.ComputeLogsum(); } // JLB201406 //else if (tour.DestinationPurpose == Global.Settings.Purposes.Escort) { // var nestedAlternative = Global.ChoiceModelSession.Get<EscortTourModeModel>().RunNested(tour, destinationParcel); // tourLogsum = nestedAlternative == null ? 0 : nestedAlternative.ComputeLogsum(); //} else { // JLB201406 //var nestedAlternative = Global.ChoiceModelSession.Get<OtherHomeBasedTourModeModel>().RunNested(tour, destinationParcel); var nestedAlternative = Global.ChoiceModelSession.Get <OtherHomeBasedTourModeTimeModel>().RunNested(tour, destinationParcel, tour.Household.VehiclesAvailable, tour.Person.GetTransitFareDiscountFraction()); tourLogsum = nestedAlternative == null ? 0 : nestedAlternative.ComputeLogsum(); } } else { // JLB201406 //var nestedAlternative = Global.ChoiceModelSession.Get<WorkBasedSubtourModeModel>().RunNested(tour, destinationParcel); var nestedAlternative = Global.ChoiceModelSession.Get <WorkBasedSubtourModeTimeModel>().RunNested(tour, destinationParcel, tour.Household.VehiclesAvailable, tour.Person.GetTransitFareDiscountFraction()); tourLogsum = nestedAlternative == null ? 0 : nestedAlternative.ComputeLogsum(); } //var purpose = tour.TourPurposeSegment; var carOwnership = person.GetCarOwnershipSegment(); var votSegment = tour.GetVotALSegment(); 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.WorkBased][carOwnership][votSegment][transitAccess]; var distanceFromOrigin = tour.OriginParcel.DistanceFromOrigin(destinationParcel, tour.DestinationArrivalTime); // 1. new from GV: Cph KM-distances var piecewiseDistanceFrom0To1Km = Math.Min(distanceFromOrigin, .10); var piecewiseDistanceFrom0To2Km = Math.Min(distanceFromOrigin, .20); //GV: added July 7th var piecewiseDistanceFrom0To5Km = Math.Min(distanceFromOrigin, .50); //GV: added July 7th var piecewiseDistanceFrom1To2Km = Math.Max(0, Math.Min(distanceFromOrigin - .1, .2 - .1)); var piecewiseDistanceFrom2To5Km = Math.Max(0, Math.Min(distanceFromOrigin - .2, .5 - .2)); var piecewiseDistanceFrom5To10Km = Math.Max(0, Math.Min(distanceFromOrigin - .5, 1 - .5)); var piecewiseDistanceFrom10To20Km = Math.Max(0, Math.Min(distanceFromOrigin - 1, 2 - 1)); var piecewiseDistanceFrom20KmToInfinity = Math.Max(0, distanceFromOrigin - 2); var piecewiseDistanceFrom10KmToInfinity = Math.Max(0, distanceFromOrigin - 1); // 1. finished var distanceFromOriginLog = Math.Log(1 + distanceFromOrigin); var distanceFromWorkLog = person.UsualWorkParcel.DistanceFromWorkLog(destinationParcel, 1); var distanceFromSchoolLog = person.UsualSchoolParcel.DistanceFromSchoolLog(destinationParcel, 1); var timePressure = Math.Log(1 - fastestTravelTime / maxAvailableMinutes); // 2. new from GV: Cph buffers for neighborhood effects // log transforms of buffers for Neighborhood effects var logOfOnePlusEducationK8Buffer2 = Math.Log(destinationParcel.StudentsK8Buffer2 + 1.0); var logOfOnePlusEducationUniStuBuffer2 = Math.Log(destinationParcel.StudentsUniversityBuffer2 + 1.0); var logOfOnePlusEmploymentEducationBuffer2 = Math.Log(destinationParcel.EmploymentEducationBuffer2 + 1.0); var logOfOnePlusEmploymentGovernmentBuffer2 = Math.Log(destinationParcel.EmploymentGovernmentBuffer2 + 1.0); var logOfOnePlusEmploymentIndustrialBuffer2 = Math.Log(destinationParcel.EmploymentIndustrialBuffer2 + 1.0); var logOfOnePlusEmploymentOfficeBuffer2 = Math.Log(destinationParcel.EmploymentOfficeBuffer2 + 1.0); var logOfOnePlusEmploymentRetailBuffer2 = Math.Log(destinationParcel.EmploymentRetailBuffer2 + 1.0); var logOfOnePlusEmploymentServiceBuffer2 = Math.Log(destinationParcel.EmploymentServiceBuffer2 + 1.0); var logOfOnePlusEmploymentAgrConstrBuffer2 = Math.Log(destinationParcel.EmploymentAgricultureConstructionBuffer2 + 1.0); var logOfOnePlusEmploymentJobsBuffer2 = Math.Log(destinationParcel.EmploymentTotalBuffer2 + 1.0); var logOfOnePlusHouseholdsBuffer2 = Math.Log(destinationParcel.HouseholdsBuffer2 + 1.0); // 2. finished var logOfOnePlusParkingOffStreetDailySpacesBuffer1 = Math.Log(1 + destinationParcel.ParkingOffStreetPaidDailySpacesBuffer1); // connectivity attributes var c34Ratio = destinationParcel.C34RatioBuffer1(); var carCompetitionFlag = FlagUtility.GetCarCompetitionFlag(carOwnership); // exludes no cars var noCarCompetitionFlag = FlagUtility.GetNoCarCompetitionFlag(carOwnership); var noCarsFlag = FlagUtility.GetNoCarsFlag(carOwnership); alternative.AddUtilityTerm(2, household.Id); alternative.AddUtilityTerm(3, personDay.Day); alternative.AddUtilityTerm(4, person.Sequence); alternative.AddUtilityTerm(5, tour.Sequence); alternative.AddUtilityTerm(8, adjustmentFactor); alternative.AddUtilityTerm(9, tourLogsum); // 3. new from GV: definition of Cph variables //alternative.AddUtilityTerm(260, secondaryFlag * workOrSchoolPatternFlag * piecewiseDistanceFrom0To1Km); alternative.AddUtilityTerm(260, secondaryFlag * workOrSchoolPatternFlag * piecewiseDistanceFrom0To2Km); //GV: added July 7th //alternative.AddUtilityTerm(261, secondaryFlag * workOrSchoolPatternFlag * piecewiseDistanceFrom1To2Km); alternative.AddUtilityTerm(262, secondaryFlag * workOrSchoolPatternFlag * piecewiseDistanceFrom2To5Km); alternative.AddUtilityTerm(263, secondaryFlag * workOrSchoolPatternFlag * piecewiseDistanceFrom5To10Km); alternative.AddUtilityTerm(264, secondaryFlag * workOrSchoolPatternFlag * piecewiseDistanceFrom10To20Km); alternative.AddUtilityTerm(265, secondaryFlag * workOrSchoolPatternFlag * piecewiseDistanceFrom20KmToInfinity); //alternative.AddUtilityTerm(266, secondaryFlag * otherPatternFlag * piecewiseDistanceFrom0To1Km); alternative.AddUtilityTerm(266, secondaryFlag * otherPatternFlag * piecewiseDistanceFrom0To2Km); //GV: added July 7th //alternative.AddUtilityTerm(267, secondaryFlag * otherPatternFlag * piecewiseDistanceFrom1To2Km); alternative.AddUtilityTerm(268, secondaryFlag * otherPatternFlag * piecewiseDistanceFrom2To5Km); alternative.AddUtilityTerm(269, secondaryFlag * otherPatternFlag * piecewiseDistanceFrom5To10Km); alternative.AddUtilityTerm(270, secondaryFlag * otherPatternFlag * piecewiseDistanceFrom10To20Km); alternative.AddUtilityTerm(271, secondaryFlag * otherPatternFlag * piecewiseDistanceFrom20KmToInfinity); //alternative.AddUtilityTerm(268, (!_tour.IsHomeBasedTour).ToFlag() * distanceFromOriginLog); //alternative.AddUtilityTerm(269, household.Has0To15KIncome.ToFlag() * distanceFromOriginLog); //alternative.AddUtilityTerm(270, household.HasMissingIncome.ToFlag() * distanceFromOriginLog); //alternative.AddUtilityTerm(271, person.IsRetiredAdult.ToFlag() * distanceFromOriginLog); //alternative.AddUtilityTerm(272, person.IsUniversityStudent.ToFlag() * distanceFromOriginLog); //alternative.AddUtilityTerm(273, person.IsChildAge5Through15.ToFlag() * distanceFromOriginLog); //alternative.AddUtilityTerm(274, person.IsChildUnder5.ToFlag() * distanceFromOriginLog); alternative.AddUtilityTerm(272, (!tour.IsHomeBasedTour).ToFlag() * distanceFromOriginLog); alternative.AddUtilityTerm(273, (household.Income >= 300000 && household.Income < 600000).ToFlag() * distanceFromOriginLog); alternative.AddUtilityTerm(274, (household.Income >= 600000 && household.Income < 900000).ToFlag() * distanceFromOriginLog); alternative.AddUtilityTerm(275, (household.Income >= 900000).ToFlag() * distanceFromOriginLog); //alternative.AddUtilityTerm(276, person.IsChildUnder5.ToFlag() * distanceFromOriginLog); // commented out by GV, July 7th //alternative.AddUtilityTerm(277, person.IsChildAge5Through15.ToFlag() * distanceFromOriginLog); // commented out by GV, July 7th //alternative.AddUtilityTerm(278, person.IsChildUnder16.ToFlag() * distanceFromOriginLog); // commented out by GV, July 7th alternative.AddUtilityTerm(279, person.IsUniversityStudent.ToFlag() * distanceFromOriginLog); alternative.AddUtilityTerm(280, person.IsAdultMale.ToFlag() * distanceFromOriginLog); alternative.AddUtilityTerm(281, person.IsAdultFemale.ToFlag() * distanceFromOriginLog); alternative.AddUtilityTerm(282, person.IsRetiredAdult.ToFlag() * distanceFromOriginLog); //alternative.AddUtilityTerm(283, (tour.IsHomeBasedTour).ToFlag() * timePressure); //commented out by GV: 7th July 2013 alternative.AddUtilityTerm(284, (tour.IsHomeBasedTour).ToFlag() * distanceFromSchoolLog); //alternative.AddUtilityTerm(14, distanceFromWorkLog); // GV commented out this - on TO DO list //alternative.AddUtilityTerm(277, (carCompetitionFlag + noCarCompetitionFlag) * destinationParcel.ParkingHourlyEmploymentCommercialMixInParcel()); //alternative.AddUtilityTerm(278, noCarCompetitionFlag * destinationParcel.ParkingHourlyEmploymentCommercialMixInParcel()); //alternative.AddUtilityTerm(279, carCompetitionFlag * destinationParcel.ParkingHourlyEmploymentCommercialMixBuffer1()); //alternative.AddUtilityTerm(280, noCarCompetitionFlag * destinationParcel.ParkingHourlyEmploymentCommercialMixBuffer1()); //alternative.AddUtilityTerm(281, noCarsFlag * c34Ratio); //alternative.AddUtilityTerm(282, noCarCompetitionFlag * c34Ratio); //alternative.AddUtilityTerm(283, (carCompetitionFlag + noCarCompetitionFlag) * logOfOnePlusParkingOffStreetDailySpacesBuffer1); //alternative.AddUtilityTerm(285, jointTourFlag * piecewiseDistanceFrom0To1Km); //alternative.AddUtilityTerm(286, jointTourFlag * piecewiseDistanceFrom1To2Km); alternative.AddUtilityTerm(286, jointTourFlag * piecewiseDistanceFrom0To2Km); alternative.AddUtilityTerm(287, jointTourFlag * piecewiseDistanceFrom2To5Km); alternative.AddUtilityTerm(288, jointTourFlag * piecewiseDistanceFrom5To10Km); alternative.AddUtilityTerm(289, jointTourFlag * piecewiseDistanceFrom10To20Km); alternative.AddUtilityTerm(290, jointTourFlag * piecewiseDistanceFrom20KmToInfinity); // 3. finished //4. new from GV: purpose utilities // COMPAS puposes are: Work, Education, Escort, Shopping, Leisure, Personal business, business // You need NO "Work" and "Education", their destinations are known in the synthetic population if (tour.DestinationPurpose == Global.Settings.Purposes.Business) { //alternative.AddUtilityTerm(10, piecewiseDistanceFrom0To1Km); //alternative.AddUtilityTerm(11, piecewiseDistanceFrom1To2Km); //alternative.AddUtilityTerm(12, piecewiseDistanceFrom2To5Km); alternative.AddUtilityTerm(12, piecewiseDistanceFrom0To5Km); alternative.AddUtilityTerm(13, piecewiseDistanceFrom5To10Km); alternative.AddUtilityTerm(14, piecewiseDistanceFrom10To20Km); alternative.AddUtilityTerm(15, piecewiseDistanceFrom20KmToInfinity); alternative.AddUtilityTerm(16, aggregateLogsumWorkBased); // Neighborhood //GV: commented out just temp. //alternative.AddUtilityTerm(20, logOfOnePlusEducationK8Buffer2); //alternative.AddUtilityTerm(21, logOfOnePlusEducationUniStuBuffer2); //alternative.AddUtilityTerm(22, logOfOnePlusEmploymentEducationBuffer2); alternative.AddUtilityTerm(23, logOfOnePlusEmploymentGovernmentBuffer2); //alternative.AddUtilityTerm(24, logOfOnePlusEmploymentIndustrialBuffer2); alternative.AddUtilityTerm(25, logOfOnePlusEmploymentOfficeBuffer2); alternative.AddUtilityTerm(26, logOfOnePlusEmploymentRetailBuffer2); alternative.AddUtilityTerm(27, logOfOnePlusEmploymentServiceBuffer2); alternative.AddUtilityTerm(28, logOfOnePlusEmploymentAgrConstrBuffer2); //alternative.AddUtilityTerm(29, logOfOnePlusEmploymentJobsBuffer2); // Size terms alternative.AddUtilityTerm(30, destinationParcel.EmploymentEducation); alternative.AddUtilityTerm(31, destinationParcel.EmploymentGovernment); alternative.AddUtilityTerm(32, destinationParcel.EmploymentIndustrial); alternative.AddUtilityTerm(33, destinationParcel.EmploymentOffice); alternative.AddUtilityTerm(34, destinationParcel.EmploymentRetail); // GV: 35 is fixed to zero alternative.AddUtilityTerm(35, destinationParcel.EmploymentService); alternative.AddUtilityTerm(36, destinationParcel.EmploymentAgricultureConstruction); alternative.AddUtilityTerm(37, destinationParcel.EmploymentTotal); alternative.AddUtilityTerm(38, destinationParcel.Households); } else if (tour.DestinationPurpose == Global.Settings.Purposes.Escort) { //alternative.AddUtilityTerm(50, piecewiseDistanceFrom0To1Km); alternative.AddUtilityTerm(51, piecewiseDistanceFrom0To2Km); //alternative.AddUtilityTerm(52, piecewiseDistanceFrom2To5Km); alternative.AddUtilityTerm(52, piecewiseDistanceFrom2To5Km); alternative.AddUtilityTerm(53, piecewiseDistanceFrom5To10Km); //alternative.AddUtilityTerm(54, piecewiseDistanceFrom10To20Km); alternative.AddUtilityTerm(55, piecewiseDistanceFrom10KmToInfinity); //alternative.AddUtilityTerm(55, piecewiseDistanceFrom20KmToInfinity); alternative.AddUtilityTerm(56, aggregateLogsumHomeBased); // Neighborhood //GV: commented out just temp. alternative.AddUtilityTerm(60, householdHasNoChildren.ToFlag() * logOfOnePlusEmploymentJobsBuffer2); //alternative.AddUtilityTerm(61, householdHasNoChildren.ToFlag() * logOfOnePlusHouseholdsBuffer2); //alternative.AddUtilityTerm(62, householdHasChildren.ToFlag() * logOfOnePlusHouseholdsBuffer2); //alternative.AddUtilityTerm(64, logOfOnePlusEmploymentJobsBuffer2); // Size terms // GV: no observations alternative.AddUtilityTerm(70, (!householdHasChildren).ToFlag() * destinationParcel.EmploymentEducation); alternative.AddUtilityTerm(71, (!householdHasChildren).ToFlag() * destinationParcel.EmploymentGovernment); alternative.AddUtilityTerm(72, (!householdHasChildren).ToFlag() * destinationParcel.EmploymentIndustrial); alternative.AddUtilityTerm(73, (!householdHasChildren).ToFlag() * destinationParcel.EmploymentOffice); alternative.AddUtilityTerm(74, (!householdHasChildren).ToFlag() * destinationParcel.EmploymentRetail); // GV: 75 is fixed to zero alternative.AddUtilityTerm(75, (!householdHasChildren).ToFlag() * destinationParcel.EmploymentService); alternative.AddUtilityTerm(76, (!householdHasChildren).ToFlag() * destinationParcel.EmploymentAgricultureConstruction); alternative.AddUtilityTerm(77, (!householdHasChildren).ToFlag() * destinationParcel.EmploymentTotal); alternative.AddUtilityTerm(78, (!householdHasChildren).ToFlag() * destinationParcel.Households); alternative.AddUtilityTerm(80, (householdHasChildren).ToFlag() * destinationParcel.EmploymentEducation); alternative.AddUtilityTerm(81, (householdHasChildren).ToFlag() * destinationParcel.EmploymentGovernment); alternative.AddUtilityTerm(82, (householdHasChildren).ToFlag() * destinationParcel.EmploymentIndustrial); alternative.AddUtilityTerm(83, (householdHasChildren).ToFlag() * destinationParcel.EmploymentOffice); alternative.AddUtilityTerm(84, (householdHasChildren).ToFlag() * destinationParcel.EmploymentRetail); // GV 85 is fixed to zero at the moment alternative.AddUtilityTerm(85, (householdHasChildren).ToFlag() * destinationParcel.EmploymentService); alternative.AddUtilityTerm(86, (householdHasChildren).ToFlag() * destinationParcel.EmploymentAgricultureConstruction); alternative.AddUtilityTerm(87, (householdHasChildren).ToFlag() * destinationParcel.EmploymentTotal); alternative.AddUtilityTerm(88, (householdHasChildren).ToFlag() * destinationParcel.Households); } else if (tour.DestinationPurpose == Global.Settings.Purposes.PersonalBusiness) { alternative.AddUtilityTerm(90, piecewiseDistanceFrom0To2Km); //alternative.AddUtilityTerm(91, piecewiseDistanceFrom1To2Km); alternative.AddUtilityTerm(92, piecewiseDistanceFrom2To5Km); alternative.AddUtilityTerm(93, piecewiseDistanceFrom5To10Km); alternative.AddUtilityTerm(94, piecewiseDistanceFrom10To20Km); alternative.AddUtilityTerm(95, piecewiseDistanceFrom20KmToInfinity); alternative.AddUtilityTerm(96, aggregateLogsumHomeBased); // Neighborhood //GV: commented out just temp. //alternative.AddUtilityTerm(100, logOfOnePlusEmploymentEducationBuffer2); //alternative.AddUtilityTerm(101, logOfOnePlusEmploymentGovernmentBuffer2); //alternative.AddUtilityTerm(102, logOfOnePlusEmploymentIndustrialBuffer2); alternative.AddUtilityTerm(103, logOfOnePlusEmploymentOfficeBuffer2); alternative.AddUtilityTerm(104, logOfOnePlusEmploymentRetailBuffer2); alternative.AddUtilityTerm(105, logOfOnePlusEmploymentServiceBuffer2); //alternative.AddUtilityTerm(106, logOfOnePlusEmploymentAgrConstrBuffer2); //alternative.AddUtilityTerm(107, logOfOnePlusEmploymentJobsBuffer2); // Size terms alternative.AddUtilityTerm(110, destinationParcel.EmploymentEducation); alternative.AddUtilityTerm(111, destinationParcel.EmploymentGovernment); alternative.AddUtilityTerm(112, destinationParcel.EmploymentIndustrial); alternative.AddUtilityTerm(113, destinationParcel.EmploymentOffice); alternative.AddUtilityTerm(114, destinationParcel.EmploymentRetail); // GV 115 is fixed to zero alternative.AddUtilityTerm(115, destinationParcel.EmploymentService); alternative.AddUtilityTerm(116, destinationParcel.EmploymentAgricultureConstruction); alternative.AddUtilityTerm(117, destinationParcel.EmploymentTotal); alternative.AddUtilityTerm(118, destinationParcel.Households); } else if (tour.DestinationPurpose == Global.Settings.Purposes.Shopping) { //alternative.AddUtilityTerm(120, piecewiseDistanceFrom0To1Km); alternative.AddUtilityTerm(121, piecewiseDistanceFrom0To2Km); alternative.AddUtilityTerm(122, piecewiseDistanceFrom2To5Km); alternative.AddUtilityTerm(123, piecewiseDistanceFrom5To10Km); alternative.AddUtilityTerm(124, piecewiseDistanceFrom10To20Km); alternative.AddUtilityTerm(125, piecewiseDistanceFrom20KmToInfinity); alternative.AddUtilityTerm(126, aggregateLogsumHomeBased); // Neighborhood //GV: commented out just temp. //alternative.AddUtilityTerm(130, logOfOnePlusEmploymentEducationBuffer2); alternative.AddUtilityTerm(131, logOfOnePlusEmploymentRetailBuffer2); //alternative.AddUtilityTerm(132, logOfOnePlusEmploymentJobsBuffer2); // Size terms alternative.AddUtilityTerm(140, destinationParcel.EmploymentOffice); alternative.AddUtilityTerm(141, destinationParcel.EmploymentRetail); // GV 142 is fixed to zero alternative.AddUtilityTerm(142, destinationParcel.EmploymentService); alternative.AddUtilityTerm(143, destinationParcel.EmploymentTotal); } else if (tour.DestinationPurpose == Global.Settings.Purposes.Social) { //alternative.AddUtilityTerm(170, piecewiseDistanceFrom0To1Km); //alternative.AddUtilityTerm(171, piecewiseDistanceFrom1To2Km); alternative.AddUtilityTerm(170, piecewiseDistanceFrom0To2Km); alternative.AddUtilityTerm(172, piecewiseDistanceFrom2To5Km); alternative.AddUtilityTerm(173, piecewiseDistanceFrom5To10Km); alternative.AddUtilityTerm(174, piecewiseDistanceFrom10To20Km); alternative.AddUtilityTerm(175, piecewiseDistanceFrom20KmToInfinity); alternative.AddUtilityTerm(176, aggregateLogsumHomeBased); // Neighborhood //GV: commented out just temp. //alternative.AddUtilityTerm(180, logOfOnePlusEmploymentOfficeBuffer2); alternative.AddUtilityTerm(181, logOfOnePlusEmploymentRetailBuffer2); alternative.AddUtilityTerm(182, logOfOnePlusEmploymentServiceBuffer2); //alternative.AddUtilityTerm(183, logOfOnePlusEmploymentJobsBuffer2); // Size terms alternative.AddUtilityTerm(190, destinationParcel.EmploymentEducation); alternative.AddUtilityTerm(191, destinationParcel.EmploymentGovernment); alternative.AddUtilityTerm(192, destinationParcel.EmploymentIndustrial); alternative.AddUtilityTerm(193, destinationParcel.EmploymentOffice); alternative.AddUtilityTerm(194, destinationParcel.EmploymentRetail); // GV 195 is fixed to zero alternative.AddUtilityTerm(195, destinationParcel.EmploymentService); alternative.AddUtilityTerm(196, destinationParcel.EmploymentAgricultureConstruction); alternative.AddUtilityTerm(197, destinationParcel.EmploymentTotal); alternative.AddUtilityTerm(198, destinationParcel.Households); } } }
public void Save() { _household.Export(); foreach (var person in _household.Persons) { person.Export(); } foreach (var householdDay in _household.HouseholdDays) { householdDay.Export(); if (Global.Settings.UseJointTours) { foreach (var jointTour in householdDay.JointToursList) { jointTour.Export(); } foreach (var fullHalfTour in householdDay.FullHalfToursList) { fullHalfTour.Export(); } foreach (var fullHalfTour in householdDay.FullHalfToursList) { fullHalfTour.Export(); } foreach (var partialHalfTour in householdDay.PartialHalfToursList) { partialHalfTour.Export(); } } foreach (var personDay in householdDay.PersonDays) { personDay.Export(); if (personDay.Tours == null) { continue; } if (personDay.Tours.Count > 1) { // sorts tours chronologically personDay.Tours.Sort((tour1, tour2) => tour1.OriginDepartureTime.CompareTo(tour2.OriginDepartureTime)); } foreach (var tour in personDay.Tours) { tour.Export(); if (tour.HalfTourFromOrigin != null && tour.HalfTourFromDestination != null) { foreach (var trip in tour.HalfTourFromOrigin.Trips.Invert()) { trip.SetTourSequence(tour.Sequence); trip.SetTripValueOfTime(); trip.Export(); ChoiceModelUtility.WriteTripForTDM(trip, ChoiceModelFactory.TDMTripListExporter); } foreach (var trip in tour.HalfTourFromDestination.Trips) { trip.SetTourSequence(tour.Sequence); trip.SetTripValueOfTime(); trip.Export(); ChoiceModelUtility.WriteTripForTDM(trip, ChoiceModelFactory.TDMTripListExporter); } } if (tour.Subtours.Count > 1) { // sorts subtours chronologically tour.Subtours.Sort((tour1, tour2) => tour1.OriginDepartureTime.CompareTo(tour2.OriginDepartureTime)); } foreach (var subtour in tour.Subtours) { subtour.SetParentTourSequence(tour.Sequence); subtour.Export(); if (subtour.HalfTourFromOrigin == null || subtour.HalfTourFromDestination == null) { continue; } foreach (var trip in subtour.HalfTourFromOrigin.Trips.Invert()) { trip.SetTourSequence(subtour.Sequence); trip.Export(); ChoiceModelUtility.WriteTripForTDM(trip, ChoiceModelFactory.TDMTripListExporter); } foreach (var trip in subtour.HalfTourFromDestination.Trips) { trip.SetTourSequence(subtour.Sequence); trip.Export(); ChoiceModelUtility.WriteTripForTDM(trip, ChoiceModelFactory.TDMTripListExporter); } } } } } }
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)); } 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.AddUtility(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.AddUtility(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()); } else if (mode == Global.Settings.Modes.Walk) { alternative.AddUtilityTerm(70, 1); //for calibration alternative.AddUtilityTerm(71, maleFlag); alternative.AddUtilityTerm(73, ageBetween51And98Flag); 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()); } 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); } }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, PersonDayWrapper personDay, HouseholdDayWrapper householdDay, int maxPurpose, int choice = Constants.DEFAULT_VALUE) { IEnumerable <PersonDayWrapper> orderedPersonDays = householdDay.PersonDays.OrderBy(p => p.GetJointTourParticipationPriority()).ToList().Cast <PersonDayWrapper>(); var household = householdDay.Household; var residenceParcel = household.ResidenceParcel; var carOwnership = household.VehiclesAvailable == 0 ? Global.Settings.CarOwnerships.NoCars : household.VehiclesAvailable < household.HouseholdTotals.DrivingAgeMembers ? Global.Settings.CarOwnerships.LtOneCarPerAdult : Global.Settings.CarOwnerships.OneOrMoreCarsPerAdult; var noCarsFlag = FlagUtility.GetNoCarsFlag(carOwnership); var carCompetitionFlag = FlagUtility.GetCarCompetitionFlag(carOwnership); var votALSegment = household.GetVotALSegment(); var transitAccessSegment = household.ResidenceParcel.TransitAccessSegment(); var personalBusinessAggregateLogsum = Global.AggregateLogsums[household.ResidenceParcel.ZoneId] [Global.Settings.Purposes.PersonalBusiness][carOwnership][votALSegment][transitAccessSegment]; var shoppingAggregateLogsum = Global.AggregateLogsums[household.ResidenceParcel.ZoneId] [Global.Settings.Purposes.Shopping][Global.Settings.CarOwnerships.NoCars][votALSegment][transitAccessSegment]; //var mealAggregateLogsum = Global.AggregateLogsums[household.ResidenceParcel.ZoneId] // [Global.Settings.Purposes.Meal][carOwnership][votALSegment][transitAccessSegment]; var socialAggregateLogsum = Global.AggregateLogsums[household.ResidenceParcel.ZoneId] [Global.Settings.Purposes.Social][carOwnership][votALSegment][transitAccessSegment]; var totalAggregateLogsum = Global.AggregateLogsums[household.ResidenceParcel.ZoneId] [Global.Settings.Purposes.HomeBasedComposite][carOwnership][votALSegment][transitAccessSegment]; // var recreationAggregateLogsum = Global.AggregateLogsums[household.ResidenceParcel.ZoneId] // [Global.Settings.Purposes.Recreation][carOwnership][votALSegment][transitAccessSegment]; // var medicalAggregateLogsum = Global.AggregateLogsums[household.ResidenceParcel.ZoneId] // [Global.Settings.Purposes.Medical][carOwnership][votALSegment][transitAccessSegment]; //var compositeLogsum = Global.AggregateLogsums[household.ResidenceZoneId][Global.Settings.Purposes.HomeBasedComposite][carOwnership][votALSegment][transitAccessSegment]; var compositeLogsum = Global.AggregateLogsums[household.ResidenceZoneId][Global.Settings.Purposes.HomeBasedComposite][Global.Settings.CarOwnerships.NoCars][votALSegment][transitAccessSegment]; int countNonMandatory = 0; int countMandatory = 0; int countWorkingAtHome = 0; double totalTimeWork = 0; int[] mandPerstype = new int[8]; int[] nonMandPerstype = new int[8]; double[] workLogsum = new double[8]; double[] schoolLogsum = new double[8]; int count = 0; foreach (PersonDayWrapper pDay in orderedPersonDays) { var person = pDay.Person; count++; if (count > 8) { break; } if (pDay.WorksAtHomeFlag == 1) { countWorkingAtHome++; } if (pDay.PatternType == 1) { countMandatory++; mandPerstype[pDay.Person.PersonType - 1]++; } if (pDay.PatternType == 2) { countNonMandatory++; nonMandPerstype[pDay.Person.PersonType - 1]++; } if (person.UsualWorkParcel == null || person.UsualWorkParcelId == household.ResidenceParcelId) { workLogsum[count - 1] = 0; } else { var destinationArrivalTime = ChoiceModelUtility.GetDestinationArrivalTime(Global.Settings.Models.WorkTourModeModel); var destinationDepartureTime = ChoiceModelUtility.GetDestinationDepartureTime(Global.Settings.Models.WorkTourModeModel); //JLB 201406 //var nestedAlternative = Global.ChoiceModelSession.Get<WorkTourModeModel>().RunNested(pDay, residenceParcel, person.UsualWorkParcel, destinationArrivalTime, destinationDepartureTime, household.VehiclesAvailable); //JLB 201602 //var nestedAlternative = Global.ChoiceModelSession.Get<WorkTourModeTimeModel>().RunNested(pDay, residenceParcel, person.UsualWorkParcel, destinationArrivalTime, destinationDepartureTime, household.VehiclesAvailable); var nestedAlternative = Global.ChoiceModelSession.Get <TourModeTimeModel>().RunNested(pDay, residenceParcel, person.UsualWorkParcel, destinationArrivalTime, destinationDepartureTime, household.VehiclesAvailable, Global.Settings.Purposes.Work); workLogsum[count - 1] = nestedAlternative == null ? 0 : nestedAlternative.ComputeLogsum(); } if (person.UsualSchoolParcel == null || person.UsualSchoolParcelId == household.ResidenceParcelId) { schoolLogsum[count - 1] = 0; } else { var destinationArrivalTime = ChoiceModelUtility.GetDestinationArrivalTime(Global.Settings.Models.SchoolTourModeModel); var destinationDepartureTime = ChoiceModelUtility.GetDestinationDepartureTime(Global.Settings.Models.SchoolTourModeModel); //JLB 201406 //var nestedAlternative = Global.ChoiceModelSession.Get<SchoolTourModeModel>().RunNested(pDay, residenceParcel, person.UsualSchoolParcel, destinationArrivalTime, destinationDepartureTime, household.VehiclesAvailable); //JLB 201602 //var nestedAlternative = Global.ChoiceModelSession.Get<SchoolTourModeTimeModel>().RunNested(pDay, residenceParcel, person.UsualSchoolParcel, destinationArrivalTime, destinationDepartureTime, household.VehiclesAvailable); var nestedAlternative = Global.ChoiceModelSession.Get <TourModeTimeModel>().RunNested(pDay, residenceParcel, person.UsualSchoolParcel, destinationArrivalTime, destinationDepartureTime, household.VehiclesAvailable, Global.Settings.Purposes.School); schoolLogsum[count - 1] = nestedAlternative == null ? 0 : nestedAlternative.ComputeLogsum(); } } // NONE_OR_HOME var alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.NoneOrHome, true, choice == Global.Settings.Purposes.NoneOrHome); alternative.Choice = Global.Settings.Purposes.NoneOrHome; //alternative.AddUtilityTerm(1, (personDay.TotalCreatedTours == 1).ToFlag()); alternative.AddUtilityTerm(2, (personDay.GetTotalCreatedTours() == 2).ToFlag()); alternative.AddUtilityTerm(3, (personDay.GetTotalCreatedTours() >= 3).ToFlag()); //alternative.AddUtilityTerm(4, (personDay.TotalCreatedTours >= 4).ToFlag()); //alternative.AddUtilityTerm(5, householdDay.PrimaryPriorityTimeFlag); //alternative.AddUtilityTerm(6, householdDay.Household.HasChildren.ToFlag()); alternative.AddUtilityTerm(4, householdDay.Household.HasChildrenUnder5.ToFlag()); alternative.AddUtilityTerm(5, householdDay.Household.HasChildrenAge5Through15.ToFlag()); //alternative.AddUtilityTerm(6, (householdDay.Household.Size == 2 && householdDay.AdultsInSharedHomeStay == 2).ToFlag()); //alternative.AddUtilityTerm(7, (householdDay.AdultsInSharedHomeStay == 1 && householdDay.Household.HasChildrenUnder16).ToFlag()); //alternative.AddUtilityTerm(8, (householdDay.AdultsInSharedHomeStay == 2 && householdDay.Household.HouseholdTotals.FullAndPartTimeWorkers >= 2).ToFlag()); //alternative.AddUtilityTerm(10, (householdDay.Household.Income >= 300000 && householdDay.Household.Income < 600000).ToFlag()); //alternative.AddUtilityTerm(11, (householdDay.Household.Income >= 600000 && householdDay.Household.Income < 900000).ToFlag()); //alternative.AddUtilityTerm(12, (householdDay.Household.Income >= 900000).ToFlag()); alternative.AddUtilityTerm(13, householdDay.PrimaryPriorityTimeFlag); alternative.AddUtilityTerm(14, personDay.Person.IsPartTimeWorker.ToFlag()); alternative.AddUtilityTerm(15, personDay.Person.WorksAtHome.ToFlag()); //alternative.AddUtilityTerm(16, personDay.Person.IsFulltimeWorker.ToFlag()); //alternative.AddUtilityTerm(15, (personDay.Person.Gender == 1).ToFlag()); //alternative.AddUtilityTerm(10, (householdDay.Household.Size == 3).ToFlag()); //alternative.AddUtilityTerm(11, (householdDay.Household.Size == 4).ToFlag()); //alternative.AddUtilityTerm(12, (householdDay.Household.Size >= 5).ToFlag()); //alternative.AddNestedAlternative(11, 0, 200); // WORK alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Work, false, choice == Global.Settings.Purposes.Work); alternative.Choice = Global.Settings.Purposes.Work; alternative.AddUtilityTerm(202, 1); //alternative.AddNestedAlternative(12, 1, 200); // SCHOOL alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.School, false, choice == Global.Settings.Purposes.School); alternative.Choice = Global.Settings.Purposes.School; alternative.AddUtilityTerm(203, 1); //alternative.AddNestedAlternative(12, 1, 200); // ESCORT alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Escort, maxPurpose <= Global.Settings.Purposes.Escort && personDay.CreatedEscortTours > 0, choice == Global.Settings.Purposes.Escort); alternative.Choice = Global.Settings.Purposes.Escort; alternative.AddUtilityTerm(151, 1); alternative.AddUtilityTerm(152, (personDay.CreatedEscortTours > 1).ToFlag()); //alternative.AddUtilityTerm(152, householdDay.PrimaryPriorityTimeFlag); //alternative.AddUtilityTerm(153, (householdDay.Household.Size == 3).ToFlag()); //alternative.AddUtilityTerm(154, (householdDay.Household.Size >= 4).ToFlag()); //alternative.AddUtilityTerm(155, (householdDay.Household.Size > 4).ToFlag()); alternative.AddUtilityTerm(155, compositeLogsum); //alternative.AddUtilityTerm(156, (householdDay.Household.VehiclesAvailable == 0).ToFlag()); //alternative.AddNestedAlternative(12, 1, 200); // PERSONAL_BUSINESS alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.PersonalBusiness, maxPurpose <= Global.Settings.Purposes.PersonalBusiness && personDay.CreatedPersonalBusinessTours > 0, choice == Global.Settings.Purposes.PersonalBusiness); alternative.Choice = Global.Settings.Purposes.PersonalBusiness; alternative.AddUtilityTerm(21, 1); //alternative.AddUtilityTerm(22, (personDay.CreatedPersonalBusinessTours > 1).ToFlag()); //GV: 30. april 2013 - goes to infinity alternative.AddUtilityTerm(156, compositeLogsum); //alternative.AddNestedAlternative(12, 1, 200); // SHOPPING alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Shopping, maxPurpose <= Global.Settings.Purposes.Shopping && personDay.CreatedShoppingTours > 0, choice == Global.Settings.Purposes.Shopping); alternative.Choice = Global.Settings.Purposes.Shopping; alternative.AddUtilityTerm(41, 1); //alternative.AddUtilityTerm(42, (personDay.CreatedShoppingTours > 1).ToFlag()); //GV: cannot be estimated //alternative.AddUtilityTerm(42, householdDay.PrimaryPriorityTimeFlag); //alternative.AddUtilityTerm(43, (householdDay.Household.Size == 3).ToFlag()); //alternative.AddUtilityTerm(44, (householdDay.Household.Size == 4).ToFlag()); //alternative.AddUtilityTerm(45, (householdDay.Household.Size > 4).ToFlag()); //alternative.AddUtilityTerm(46, (householdDay.Household.VehiclesAvailable == 0).ToFlag()); //alternative.AddUtilityTerm(157, compositeLogsum); //GV wrong sign //alternative.AddUtilityTerm(157, shoppingAggregateLogsum); //GV wrong sign //alternative.AddNestedAlternative(12, 1, 200); // MEAL alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Meal, false, choice == Global.Settings.Purposes.Meal); alternative.Choice = Global.Settings.Purposes.Meal; alternative.AddUtilityTerm(61, 1); alternative.AddUtilityTerm(62, (personDay.CreatedMealTours > 1).ToFlag()); //alternative.AddNestedAlternative(12, 1, 200); // SOCIAL alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Social, maxPurpose <= Global.Settings.Purposes.Social && personDay.CreatedSocialTours > 0, choice == Global.Settings.Purposes.Social); alternative.Choice = Global.Settings.Purposes.Social; alternative.AddUtilityTerm(81, 1); alternative.AddUtilityTerm(82, (personDay.CreatedSocialTours > 1).ToFlag()); //alternative.AddUtilityTerm(82, householdDay.PrimaryPriorityTimeFlag); //alternative.AddUtilityTerm(83, (householdDay.Household.Size == 3).ToFlag()); //alternative.AddUtilityTerm(84, (householdDay.Household.Size == 4).ToFlag()); //alternative.AddUtilityTerm(85, (householdDay.Household.Size > 4).ToFlag()); alternative.AddUtilityTerm(158, compositeLogsum); //alternative.AddNestedAlternative(12, 1, 200); // RECREATION alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Recreation, false, choice == Global.Settings.Purposes.Recreation); alternative.Choice = Global.Settings.Purposes.Recreation; alternative.AddUtilityTerm(101, 1); //alternative.AddUtilityTerm(102, (personDay.CreatedRecreationTours > 1).ToFlag()); //alternative.AddNestedAlternative(12, 1, 60); // MEDICAL alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Medical, false, choice == Global.Settings.Purposes.Medical); alternative.Choice = Global.Settings.Purposes.Medical; alternative.AddUtilityTerm(121, 1); //alternative.AddUtilityTerm(122, (personDay.CreatedMedicalTours > 1).ToFlag()); //alternative.AddNestedAlternative(11, 1, 60); }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, ITourWrapper tour, IEnumerable <dynamic> pathTypeModels, IParcelWrapper destinationParcel, int householdCars, int choice = Constants.DEFAULT_VALUE) { var household = tour.Household; var person = tour.Person; var personDay = tour.PersonDay; // household inputs var income0To25KFlag = household.Has0To25KIncome.ToFlag(); var income25To50KFlag = household.Has25To50KIncome.ToFlag(); var income75KPlusFlag = household.Has75KPlusIncome.ToFlag(); var onePersonHouseholdFlag = household.IsOnePersonHousehold.ToFlag(); var twoPersonHouseholdFlag = household.IsTwoPersonHousehold.ToFlag(); var noCarsInHouseholdFlag = household.GetFlagForNoCarsInHousehold(householdCars); var carsLessThanDriversFlag = household.GetFlagForCarsLessThanDrivers(householdCars); // person inputs var childUnder5Flag = person.IsChildUnder5.ToFlag(); var adultFlag = person.IsAdult.ToFlag(); var drivingAgeStudentFlag = person.IsDrivingAgeStudent.ToFlag(); var maleFlag = person.IsMale.ToFlag(); // remaining inputs var originParcel = tour.OriginParcel; var destinationParkingCost = destinationParcel.ParkingCostBuffer1(6); double escortPercentage; double nonEscortPercentage; ChoiceModelUtility.SetEscortPercentages(personDay, out escortPercentage, out nonEscortPercentage); // school bus is a special case - use HOV3 impedance var pathTypeExtra = pathTypeModels.First(x => x.Mode == Global.Settings.Modes.Hov3); var modeExtra = Global.Settings.Modes.SchoolBus; var availableExtra = pathTypeExtra.Available; var generalizedTimeLogsumExtra = pathTypeExtra.GeneralizedTimeLogsum; var 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(17, childUnder5Flag); alternative.AddUtilityTerm(18, adultFlag); } foreach (var pathTypeModel in pathTypeModels) { var mode = pathTypeModel.Mode; var available = pathTypeModel.Available; var 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(21, noCarsInHouseholdFlag); alternative.AddUtilityTerm(22, carsLessThanDriversFlag); alternative.AddUtilityTerm(27, childUnder5Flag); alternative.AddUtilityTerm(28, adultFlag); alternative.AddUtilityTerm(29, drivingAgeStudentFlag); alternative.AddUtilityTerm(129, destinationParcel.MixedUse2Index1()); // alternative.AddUtility(128, destinationParcel.TotalEmploymentDensity1()); // alternative.AddUtility(127, destinationParcel.NetIntersectionDensity1()); // alternative.AddUtility(126, originParcel.NetIntersectionDensity1()); // alternative.AddUtility(125, originParcel.HouseholdDensity1()); // alternative.AddUtility(124, originParcel.MixedUse2Index1()); // alternative.AddUtility(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(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(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(69, adultFlag); alternative.AddUtilityTerm(169, destinationParcel.MixedUse4Index1()); alternative.AddUtilityTerm(168, destinationParcel.TotalEmploymentDensity1()); // alternative.AddUtility(167, destinationParcel.NetIntersectionDensity1()); // alternative.AddUtility(166, originParcel.NetIntersectionDensity1()); // alternative.AddUtility(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()); } else if (mode == Global.Settings.Modes.Walk) { alternative.AddUtilityTerm(79, adultFlag); alternative.AddUtilityTerm(179, destinationParcel.MixedUse4Index1()); // alternative.AddUtility(178, destinationParcel.TotalEmploymentDensity1()); // alternative.AddUtility(177, destinationParcel.NetIntersectionDensity1()); // alternative.AddUtility(176, originParcel.NetIntersectionDensity1()); // alternative.AddUtility(175, originParcel.HouseholdDensity1()); alternative.AddUtilityTerm(179, originParcel.MixedUse4Index1()); } } }
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(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 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, HouseholdWrapper household, int choice = Constants.DEFAULT_VALUE) { // // var distanceToTransitCappedUnderQtrMile = household.ResidenceParcel.DistanceToTransitCappedUnderQtrMile(); // // var distanceToTransitQtrToHalfMile = household.ResidenceParcel.DistanceToTransitQtrToHalfMile(); //var foodRetailServiceMedicalLogBuffer1 = household.ResidenceParcel.FoodRetailServiceMedicalLogBuffer1(); var workTourLogsumDifference = 0D; // (full or part-time workers) full car ownership vs. no car ownership var schoolTourLogsumDifference = 0D; // (school) full car ownership vs. no car ownership // // const double workTourOtherLogsumDifference = 0D; // (other workers) full car ownership vs. no car ownership // // Stefan var netIncome = (household.Income / 1000.0) / 2.0; // in 1000s of DKK var userCost = 2.441 * 15.0; //annual cost to use 1 car in 1000s of DKK bool isInCopenhagenMunicipality = household.MunicipalCode == 101; bool municipality101 = household.MunicipalCode == 101; bool municipality147 = household.MunicipalCode == 147; bool municipality151 = household.MunicipalCode == 151; bool municipality153 = household.MunicipalCode == 153; bool municipality155 = household.MunicipalCode == 155; bool municipality157 = household.MunicipalCode == 157; bool municipality159 = household.MunicipalCode == 159; bool municipality161 = household.MunicipalCode == 161; bool municipality163 = household.MunicipalCode == 163; bool municipality165 = household.MunicipalCode == 165; bool municipality167 = household.MunicipalCode == 167; bool municipality169 = household.MunicipalCode == 169; bool municipality173 = household.MunicipalCode == 173; bool municipality175 = household.MunicipalCode == 175; bool municipality183 = household.MunicipalCode == 183; bool municipality185 = household.MunicipalCode == 185; bool municipality187 = household.MunicipalCode == 187; bool municipality190 = household.MunicipalCode == 190; bool municipality201 = household.MunicipalCode == 201; bool municipality210 = household.MunicipalCode == 210; bool municipality217 = household.MunicipalCode == 217; bool municipality219 = household.MunicipalCode == 219; bool municipality223 = household.MunicipalCode == 223; bool municipality230 = household.MunicipalCode == 230; bool municipality240 = household.MunicipalCode == 240; bool municipality250 = household.MunicipalCode == 250; bool municipality253 = household.MunicipalCode == 253; bool municipality259 = household.MunicipalCode == 259; bool municipality260 = household.MunicipalCode == 260; bool municipality265 = household.MunicipalCode == 265; bool municipality269 = household.MunicipalCode == 269; bool municipality270 = household.MunicipalCode == 270; bool municipality336 = household.MunicipalCode == 336; bool municipality350 = household.MunicipalCode == 350; int numberAdults = 0; int numberChildren = 0; int numberWorkers = 0; int sumAdultAges = 0; double averageAdultAge = 0.0; bool isMale = false; foreach (PersonWrapper person in household.Persons) { if (person.IsWorker && person.UsualWorkParcel != null && person.UsualWorkParcelId != household.ResidenceParcelId) { var destinationArrivalTime = ChoiceModelUtility.GetDestinationArrivalTime(Global.Settings.Models.WorkTourModeModel); var destinationDepartureTime = ChoiceModelUtility.GetDestinationDepartureTime(Global.Settings.Models.WorkTourModeModel); //JLB 201602 //var nestedAlternative1 = Global.ChoiceModelSession.Get<WorkTourModeTimeModel>().RunNested(person, household.ResidenceParcel, person.UsualWorkParcel, destinationArrivalTime, destinationDepartureTime, household.HouseholdTotals.DrivingAgeMembers, 0.0); //var nestedAlternative2 = Global.ChoiceModelSession.Get<WorkTourModeTimeModel>().RunNested(person, household.ResidenceParcel, person.UsualWorkParcel, destinationArrivalTime, destinationDepartureTime, 0, 0.0); var nestedAlternative1 = Global.ChoiceModelSession.Get<TourModeTimeModel>().RunNested(person, household.ResidenceParcel, person.UsualWorkParcel, destinationArrivalTime, destinationDepartureTime, household.HouseholdTotals.DrivingAgeMembers, 0.0, Global.Settings.Purposes.Work); var nestedAlternative2 = Global.ChoiceModelSession.Get<TourModeTimeModel>().RunNested(person, household.ResidenceParcel, person.UsualWorkParcel, destinationArrivalTime, destinationDepartureTime, 0, 0.0, Global.Settings.Purposes.Work); workTourLogsumDifference += nestedAlternative1 == null ? 0 : nestedAlternative1.ComputeLogsum(); workTourLogsumDifference -= nestedAlternative2 == null ? 0 : nestedAlternative2.ComputeLogsum(); } if (person.IsDrivingAgeStudent && person.UsualSchoolParcel != null && person.UsualSchoolParcelId != household.ResidenceParcelId) { var destinationArrivalTime = ChoiceModelUtility.GetDestinationArrivalTime(Global.Settings.Models.SchoolTourModeModel); var destinationDepartureTime = ChoiceModelUtility.GetDestinationDepartureTime(Global.Settings.Models.SchoolTourModeModel); //TODO: change the following school logsum retrievals when estimating this model after schoolTourModeTimeModel is enhanced for COMPAS2 var nestedAlternative1 = Global.ChoiceModelSession.Get<TourModeTimeModel>().RunNested(person, household.ResidenceParcel, person.UsualSchoolParcel, destinationArrivalTime, destinationDepartureTime, household.HouseholdTotals.DrivingAgeMembers, 0.0, Global.Settings.Purposes.School); var nestedAlternative2 = Global.ChoiceModelSession.Get<TourModeTimeModel>().RunNested(person, household.ResidenceParcel, person.UsualSchoolParcel, destinationArrivalTime, destinationDepartureTime, 0, 0.0, Global.Settings.Purposes.School); schoolTourLogsumDifference += nestedAlternative1 == null ? 0 : nestedAlternative1.ComputeLogsum(); schoolTourLogsumDifference -= nestedAlternative2 == null ? 0 : nestedAlternative2.ComputeLogsum(); } if (person.Age >= 18) { numberAdults++; sumAdultAges = sumAdultAges + person.Age; isMale = person.IsMale; if (person.PersonType == Global.Settings.PersonTypes.FullTimeWorker //|| person.PersonType == Constants.PersonType.PART_TIME_WORKER ) { numberWorkers++; } } else { numberChildren++; } } averageAdultAge = sumAdultAges / Math.Max(numberAdults, 1); // var votSegment = household.VotALSegment; //var taSegment = household.ResidenceParcel.TransitAccessSegment(); //var aggregateLogsumDifference = // full car ownership vs. no car ownership // Global.AggregateLogsums[household.ResidenceZoneId][Global.Settings.Purposes.HomeBasedComposite][Global.Settings.CarOwnerships.OneOrMoreCarsPerAdult][votSegment][taSegment] - // Global.AggregateLogsums[household.ResidenceZoneId][Global.Settings.Purposes.HomeBasedComposite][Global.Settings.CarOwnerships.NoCars][votSegment][taSegment]; //var distanceToStop // = household.ResidenceParcel.GetDistanceToTransit() > 0 // ? Math.Min(household.ResidenceParcel.GetDistanceToTransit(), 2 * Global.Settings.DistanceUnitsPerMile) // JLBscale // : 2 * Global.Settings.DistanceUnitsPerMile; //var ruralFlag = household.ResidenceParcel.RuralFlag(); var zeroVehAVEffect = (Global.Configuration.AV_IncludeAutoTypeChoice && household.OwnsAutomatedVehicles > 0) ? Global.Configuration.AV_Own0VehiclesCoefficientForAVHouseholds : 0; var oneVehAVEffect = (Global.Configuration.AV_IncludeAutoTypeChoice && household.OwnsAutomatedVehicles > 0) ? Global.Configuration.AV_Own1VehicleCoefficientForAVHouseholds : 0; var zeroVehSEEffect = (Global.Configuration.PaidRideShareModeIsAvailable && Global.Configuration.AV_PaidRideShareModeUsesAVs) ? Global.Configuration.AV_SharingEconomy_DensityCoefficientForOwning0Vehicles * Math.Min(household.ResidenceBuffer2Density, 6000) : 0; var oneVehSEEffect = (Global.Configuration.PaidRideShareModeIsAvailable && Global.Configuration.AV_PaidRideShareModeUsesAVs) ? Global.Configuration.AV_SharingEconomy_ConstantForOwning1Vehicle : 0; var twoVehSEEffect = (Global.Configuration.PaidRideShareModeIsAvailable && Global.Configuration.AV_PaidRideShareModeUsesAVs) ? Global.Configuration.AV_SharingEconomy_ConstantForOwning2Vehicles : 0; //var threeVehSEEffect = (Global.Configuration.PaidRideShareModeIsAvailable && Global.Configuration.AV_PaidRideShareModeUsesAVs) ? Global.Configuration.AV_SharingEconomy_ConstantForOwning3Vehicles : 0; //var fourVehSEEffect = (Global.Configuration.PaidRideShareModeIsAvailable && Global.Configuration.AV_PaidRideShareModeUsesAVs) ? Global.Configuration.AV_SharingEconomy_ConstantForOwning4Vehicles : 0; // 0 AUTOS var alternative = choiceProbabilityCalculator.GetAlternative(0, true, choice == 0); alternative.Choice = 0; alternative.AddUtilityTerm(14, Math.Log(Math.Max(netIncome, 1))); alternative.AddUtilityTerm(15, workTourLogsumDifference); // instead of all Stefan's work-related and logsum variables alternative.AddUtilityTerm(90, 1); //calibration constant alternative.AddUtilityTerm(100, zeroVehAVEffect); alternative.AddUtilityTerm(100, zeroVehSEEffect); alternative.AddUtilityTerm(101, municipality101.ToFlag()); alternative.AddUtilityTerm(102, municipality147.ToFlag()); alternative.AddUtilityTerm(103, municipality151.ToFlag()); alternative.AddUtilityTerm(104, municipality153.ToFlag()); alternative.AddUtilityTerm(105, municipality155.ToFlag()); alternative.AddUtilityTerm(106, municipality157.ToFlag()); alternative.AddUtilityTerm(107, municipality159.ToFlag()); alternative.AddUtilityTerm(108, municipality161.ToFlag()); alternative.AddUtilityTerm(109, municipality163.ToFlag()); alternative.AddUtilityTerm(110, municipality165.ToFlag()); alternative.AddUtilityTerm(111, municipality167.ToFlag()); alternative.AddUtilityTerm(112, municipality169.ToFlag()); alternative.AddUtilityTerm(113, municipality173.ToFlag()); alternative.AddUtilityTerm(114, municipality175.ToFlag()); alternative.AddUtilityTerm(115, municipality183.ToFlag()); alternative.AddUtilityTerm(116, municipality185.ToFlag()); alternative.AddUtilityTerm(117, municipality187.ToFlag()); alternative.AddUtilityTerm(118, municipality190.ToFlag()); alternative.AddUtilityTerm(119, municipality201.ToFlag()); alternative.AddUtilityTerm(120, municipality210.ToFlag()); alternative.AddUtilityTerm(121, municipality217.ToFlag()); alternative.AddUtilityTerm(122, municipality219.ToFlag()); alternative.AddUtilityTerm(123, municipality223.ToFlag()); alternative.AddUtilityTerm(124, municipality230.ToFlag()); alternative.AddUtilityTerm(125, municipality240.ToFlag()); alternative.AddUtilityTerm(126, municipality250.ToFlag()); alternative.AddUtilityTerm(127, municipality253.ToFlag()); alternative.AddUtilityTerm(128, municipality259.ToFlag()); alternative.AddUtilityTerm(129, municipality260.ToFlag()); alternative.AddUtilityTerm(130, municipality265.ToFlag()); alternative.AddUtilityTerm(131, municipality269.ToFlag()); alternative.AddUtilityTerm(132, municipality270.ToFlag()); alternative.AddUtilityTerm(133, municipality336.ToFlag()); alternative.AddUtilityTerm(134, municipality350.ToFlag()); // 1 AUTO var beta010 = -6.59; var beta011 = 4.25; var beta012 = 5.53; var beta013 = 6.54; var beta014 = 1.17; var beta015 = 0.54; var beta016 = 0.81; var beta017 = 1.20; var beta018 = -0.54; var beta019 = 0.0; var beta020 = 0.45; var beta021 = 0.0; var beta022 = -0.04; var beta023 = 0.57; var beta024 = 0.18; var beta025 = -0.82; var stefanOneCarUtility = beta010 * 1.0 + beta011 * household.Has1Driver.ToFlag() + beta012 * household.Has2Drivers.ToFlag() + beta013 * (household.Has3Drivers || household.Has4OrMoreDrivers).ToFlag() + beta014 * Math.Log(Math.Max(netIncome - userCost, 1)) + beta015 * (numberChildren == 1).ToFlag() + beta016 * (numberChildren == 2).ToFlag() + beta017 * (numberChildren > 2).ToFlag() + beta018 * (numberAdults == 1 && !isMale).ToFlag() + beta019 * (numberAdults == 1 && isMale).ToFlag() + beta020 * averageAdultAge / 10.0 + beta021 * Math.Pow(averageAdultAge / 10.0, 2.0) + beta022 * 0 + //household.ResidenceParcel.PSearchTime16_17 + // Add this when new parcel variables with seach time are available beta023 * household.ResidenceParcel.DistanceToLocalBus + beta024 * household.ResidenceParcel.DistanceToExpressBus + beta025 * isInCopenhagenMunicipality.ToFlag() + 0; alternative = choiceProbabilityCalculator.GetAlternative(1, true, choice == 1); alternative.Choice = 1; //Stefan //alternative.AddUtilityTerm(10, 1.0); //alternative.AddUtilityTerm(11, household.Has1Driver.ToFlag()); //alternative.AddUtilityTerm(12, household.Has2Drivers.ToFlag()); //alternative.AddUtilityTerm(13, (household.Has3Drivers || household.Has4OrMoreDrivers).ToFlag()); //alternative.AddUtilityTerm(14, Math.Log(Math.Max(netIncome - userCost, 1))); //alternative.AddUtilityTerm(15, (numberChildren == 1).ToFlag()); //alternative.AddUtilityTerm(16, (numberChildren == 2).ToFlag()); //alternative.AddUtilityTerm(17, (numberChildren > 2).ToFlag()); //alternative.AddUtilityTerm(18, (numberAdults == 1 && !isMale).ToFlag()); //alternative.AddUtilityTerm(19, (numberAdults == 1 && isMale).ToFlag()); //alternative.AddUtilityTerm(20, averageAdultAge / 10.0); //alternative.AddUtilityTerm(21, Math.Pow(averageAdultAge / 10.0, 2.0)); ////alternative.AddUtilityTerm(22, household.ResidenceParcel.PSearchTime16_17); // Add this when new parcel variables with seach time are available //alternative.AddUtilityTerm(23, household.ResidenceParcel.DistanceToLocalBus); //alternative.AddUtilityTerm(24, household.ResidenceParcel.DistanceToExpressBus); //alternative.AddUtilityTerm(25, isInCopenhagenMunicipality.ToFlag()); alternative.AddUtilityTerm(26, stefanOneCarUtility); //this composite replaces above separate terms 10-25 alternative.AddUtilityTerm(27, workTourLogsumDifference * household.HasMoreDriversThan1.ToFlag()); // instead of all Stefan's work-related and logsum variables alternative.AddUtilityTerm(91, 1); //calibration constant alternative.AddUtilityTerm(100, oneVehAVEffect); alternative.AddUtilityTerm(100, oneVehSEEffect); //alternative.AddUtilityTerm(24, household.HouseholdTotals.RetiredAdultsPerDrivingAgeMembers); //alternative.AddUtilityTerm(25, household.HouseholdTotals.UniversityStudentsPerDrivingAgeMembers); //alternative.AddUtilityTerm(26, household.HouseholdTotals.DrivingAgeStudentsPerDrivingAgeMembers); //alternative.AddUtilityTerm(27, household.HouseholdTotals.HomeBasedPersonsPerDrivingAgeMembers); // 2+ AUTOS var beta040 = -9.540; var beta041 = 2.79; var beta042 = 6.09; var beta043 = 7.77; var beta044 = 0; var beta045 = 0.35; var beta046 = 0.81; var beta047 = 1.33; var beta048 = -1.13; var beta049 = 0.60; var beta050 = 0.92; var beta051 = -0.05; var beta052 = -0.09; var beta053 = 0.94; var beta054 = 0.31; var beta055 = -1.54; var stefanTwoCarUtility = beta040 * 1.0 + beta041 * household.Has1Driver.ToFlag() + beta042 * household.Has2Drivers.ToFlag() + beta043 * (household.Has3Drivers || household.Has4OrMoreDrivers).ToFlag() + beta014 * Math.Log(Math.Max(netIncome - userCost * 2.0, 1)) + beta045 * (numberChildren == 1).ToFlag() + beta046 * (numberChildren == 2).ToFlag() + beta047 * (numberChildren > 2).ToFlag() + beta048 * (numberAdults == 1 && !isMale).ToFlag() + beta049 * (numberAdults == 1 && isMale).ToFlag() + beta050 * averageAdultAge / 10.0 + beta051 * Math.Pow(averageAdultAge / 10.0, 2.0) + beta052 * 0 + //household.ResidenceParcel.PSearchTime16_17 + // Add this when new parcel variables with seach time are available beta053 * household.ResidenceParcel.DistanceToLocalBus + beta054 * household.ResidenceParcel.DistanceToExpressBus + beta055 * isInCopenhagenMunicipality.ToFlag() + 0; alternative = choiceProbabilityCalculator.GetAlternative(2, true, choice == 2); alternative.Choice = 2; //Stefan //alternative.AddUtilityTerm(40, 1.0); //alternative.AddUtilityTerm(41, household.Has1Driver.ToFlag()); //alternative.AddUtilityTerm(42, household.Has2Drivers.ToFlag()); //alternative.AddUtilityTerm(43, (household.Has3Drivers || household.Has4OrMoreDrivers).ToFlag()); //alternative.AddUtilityTerm(14, Math.Log(Math.Max(netIncome - userCost * 2.0, 1))); //alternative.AddUtilityTerm(45, (numberChildren == 1).ToFlag()); //alternative.AddUtilityTerm(46, (numberChildren == 2).ToFlag()); //alternative.AddUtilityTerm(47, (numberChildren > 2).ToFlag()); //alternative.AddUtilityTerm(48, (numberAdults == 1 && !isMale).ToFlag()); //alternative.AddUtilityTerm(49, (numberAdults == 1 && isMale).ToFlag()); //alternative.AddUtilityTerm(50, averageAdultAge / 10.0); //alternative.AddUtilityTerm(51, Math.Pow(averageAdultAge / 10.0, 2.0)); ////alternative.AddUtilityTerm(52, household.ResidenceParcel.PSearchTime16_17); // Add this when new parcel variables with seach time are available //alternative.AddUtilityTerm(53, household.ResidenceParcel.DistanceToLocalBus); //alternative.AddUtilityTerm(54, household.ResidenceParcel.DistanceToExpressBus); //alternative.AddUtilityTerm(55, isInCopenhagenMunicipality.ToFlag()); alternative.AddUtilityTerm(56, stefanTwoCarUtility); //this composite replaces above separate terms 40-55 //alternative.AddUtilityTerm(57, workTourLogsumDifference); alternative.AddUtilityTerm(92, 1); //new calibration constant - must be constrained to 0 in estimation alternative.AddUtilityTerm(100, twoVehSEEffect); alternative.AddUtilityTerm(201, municipality101.ToFlag()); alternative.AddUtilityTerm(202, municipality147.ToFlag()); alternative.AddUtilityTerm(203, municipality151.ToFlag()); alternative.AddUtilityTerm(204, municipality153.ToFlag()); alternative.AddUtilityTerm(205, municipality155.ToFlag()); alternative.AddUtilityTerm(206, municipality157.ToFlag()); alternative.AddUtilityTerm(207, municipality159.ToFlag()); alternative.AddUtilityTerm(208, municipality161.ToFlag()); alternative.AddUtilityTerm(209, municipality163.ToFlag()); alternative.AddUtilityTerm(210, municipality165.ToFlag()); alternative.AddUtilityTerm(211, municipality167.ToFlag()); alternative.AddUtilityTerm(212, municipality169.ToFlag()); alternative.AddUtilityTerm(213, municipality173.ToFlag()); alternative.AddUtilityTerm(214, municipality175.ToFlag()); alternative.AddUtilityTerm(215, municipality183.ToFlag()); alternative.AddUtilityTerm(216, municipality185.ToFlag()); alternative.AddUtilityTerm(217, municipality187.ToFlag()); alternative.AddUtilityTerm(218, municipality190.ToFlag()); alternative.AddUtilityTerm(219, municipality201.ToFlag()); alternative.AddUtilityTerm(220, municipality210.ToFlag()); alternative.AddUtilityTerm(221, municipality217.ToFlag()); alternative.AddUtilityTerm(222, municipality219.ToFlag()); alternative.AddUtilityTerm(223, municipality223.ToFlag()); alternative.AddUtilityTerm(224, municipality230.ToFlag()); alternative.AddUtilityTerm(225, municipality240.ToFlag()); alternative.AddUtilityTerm(226, municipality250.ToFlag()); alternative.AddUtilityTerm(227, municipality253.ToFlag()); alternative.AddUtilityTerm(228, municipality259.ToFlag()); alternative.AddUtilityTerm(229, municipality260.ToFlag()); alternative.AddUtilityTerm(230, municipality265.ToFlag()); alternative.AddUtilityTerm(231, municipality269.ToFlag()); alternative.AddUtilityTerm(232, municipality270.ToFlag()); alternative.AddUtilityTerm(233, municipality336.ToFlag()); alternative.AddUtilityTerm(234, municipality350.ToFlag()); //alternative.AddUtilityTerm(44, household.HouseholdTotals.RetiredAdultsPerDrivingAgeMembers); //alternative.AddUtilityTerm(45, household.HouseholdTotals.UniversityStudentsPerDrivingAgeMembers); //alternative.AddUtilityTerm(46, household.HouseholdTotals.DrivingAgeStudentsPerDrivingAgeMembers); //alternative.AddUtilityTerm(47, household.HouseholdTotals.HomeBasedPersonsPerDrivingAgeMembers); }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, HouseholdDayWrapper householdDay, int choice = Constants.DEFAULT_VALUE) { Framework.DomainModels.Wrappers.IHouseholdWrapper household = householdDay.Household; Framework.DomainModels.Wrappers.IParcelWrapper residenceParcel = household.ResidenceParcel; // set household characteristics here that don't depend on person characteristics int hasAdultEducLevel12 = 0; int youngestAge = 999; double firstWorkLogsum = 0; double secondWorkLogsum = 0; bool firstWorkLogsumIsSet = false; bool secondWorkLogsumIsSet = false; int numberWorkers = 0; int numberAdults = 0; int numberChildren = 0; int numberChildrenUnder5 = 0; // set characteristics here that depend on person characteristics foreach (PersonDayWrapper personDay in householdDay.PersonDays) { double workLogsum = 0; PersonWrapper person = (PersonWrapper)personDay.Person; if (person.UsualWorkParcel == null || person.UsualWorkParcelId == household.ResidenceParcelId || (person.PersonType != Global.Settings.PersonTypes.FullTimeWorker && person.PersonType != Global.Settings.PersonTypes.PartTimeWorker)) // || household.VehiclesAvailable == 0) { } else { int destinationArrivalTime = ChoiceModelUtility.GetDestinationArrivalTime(Global.Settings.Models.WorkTourModeModel); int destinationDepartureTime = ChoiceModelUtility.GetDestinationDepartureTime(Global.Settings.Models.WorkTourModeModel); //JLB 201406 //var nestedAlternative = Global.ChoiceModelSession.Get<WorkTourModeModel>().RunNested(personDay, residenceParcel, person.UsualWorkParcel, destinationArrivalTime, destinationDepartureTime, household.VehiclesAvailable); //JLB 201602 //var nestedAlternative = Global.ChoiceModelSession.Get<TourModeTimeModel>().RunNested(personDay, residenceParcel, person.UsualWorkParcel, destinationArrivalTime, destinationDepartureTime, household.VehiclesAvailable); ChoiceProbabilityCalculator.Alternative nestedAlternative = Global.ChoiceModelSession.Get <TourModeTimeModel>().RunNested(personDay, residenceParcel, person.UsualWorkParcel, destinationArrivalTime, destinationDepartureTime, household.VehiclesAvailable, Global.Settings.Purposes.Work); workLogsum = nestedAlternative == null ? 0 : nestedAlternative.ComputeLogsum(); } //if (person.Age >= 18 && person.EducationLevel >= 12) { // hasAdultEducLevel12 = 1; //} //if (person.Age >= 18 && person.EducationLevel < 12) { //} if (person.Age < youngestAge) { youngestAge = person.Age; } if (workLogsum != 0 && !firstWorkLogsumIsSet) { firstWorkLogsum = workLogsum; firstWorkLogsumIsSet = true; } else if (workLogsum != 0 && !secondWorkLogsumIsSet) { secondWorkLogsum = workLogsum; secondWorkLogsumIsSet = true; } if (person.Age >= 18) { numberAdults++; if (person.PersonType == Global.Settings.PersonTypes.FullTimeWorker //|| person.PersonType == Constants.PersonType.PART_TIME_WORKER ) { numberWorkers++; } } else { numberChildren++; if (person.PersonType == Global.Settings.PersonTypes.ChildUnder5) { numberChildrenUnder5++; } } } bool singleWorkerWithChildUnder5 = (numberAdults == numberWorkers && numberAdults == 1 && numberChildrenUnder5 > 0) ? true : false; bool workingCoupleNoChildren = (numberAdults == numberWorkers && numberAdults == 2 && numberChildren == 0) ? true : false; bool workingCoupleAllChildrenUnder5 = (numberAdults == numberWorkers && numberAdults == 2 && numberChildren > 0 && numberChildren == numberChildrenUnder5) ? true : false; bool otherHouseholdWithPTFTWorkers = false; if (!workingCoupleNoChildren && !workingCoupleAllChildrenUnder5 && firstWorkLogsum != 0) { otherHouseholdWithPTFTWorkers = true; } if (!workingCoupleNoChildren && !workingCoupleAllChildrenUnder5 && !otherHouseholdWithPTFTWorkers) { } // var votSegment = household.VotALSegment; //var taSegment = household.ResidenceParcel.TransitAccessSegment(); //var aggregateLogsumDifference = // full car ownership vs. no car ownership // Global.AggregateLogsums[household.ResidenceZoneId][Global.Settings.Purposes.HomeBasedComposite][Global.Settings.CarOwnerships.OneOrMoreCarsPerAdult][votSegment][taSegment] - // Global.AggregateLogsums[household.ResidenceZoneId][Global.Settings.Purposes.HomeBasedComposite][Global.Settings.CarOwnerships.NoCars][votSegment][taSegment]; //var householdDay = (ActumHouseholdDayWrapper)tour.HouseholdDay; int carOwnership = household.VehiclesAvailable == 0 ? Global.Settings.CarOwnerships.NoCars : household.VehiclesAvailable < household.HouseholdTotals.DrivingAgeMembers ? Global.Settings.CarOwnerships.LtOneCarPerAdult : Global.Settings.CarOwnerships.OneOrMoreCarsPerAdult; int noCarsFlag = FlagUtility.GetNoCarsFlag(carOwnership); int carCompetitionFlag = FlagUtility.GetCarCompetitionFlag(carOwnership); int votALSegment = Global.Settings.VotALSegments.Medium; // TODO: calculate a VOT segment that depends on household income int transitAccessSegment = household.ResidenceParcel.TransitAccessSegment(); double personalBusinessAggregateLogsum = Global.AggregateLogsums[household.ResidenceParcel.ZoneId] [Global.Settings.Purposes.PersonalBusiness][carOwnership][votALSegment][transitAccessSegment]; double shoppingAggregateLogsum = Global.AggregateLogsums[household.ResidenceParcel.ZoneId] [Global.Settings.Purposes.Shopping][carOwnership][votALSegment][transitAccessSegment]; double mealAggregateLogsum = Global.AggregateLogsums[household.ResidenceParcel.ZoneId] [Global.Settings.Purposes.Meal][carOwnership][votALSegment][transitAccessSegment]; double socialAggregateLogsum = Global.AggregateLogsums[household.ResidenceParcel.ZoneId] [Global.Settings.Purposes.Social][carOwnership][votALSegment][transitAccessSegment]; //var compositeLogsum = Global.AggregateLogsums[household.ResidenceZoneId][Global.Settings.Purposes.HomeBasedComposite][carOwnership][votALSegment][transitAccessSegment]; double compositeLogsum = Global.AggregateLogsums[household.ResidenceZoneId][Global.Settings.Purposes.HomeBasedComposite][Global.Settings.CarOwnerships.NoCars][votALSegment][transitAccessSegment]; int componentIndex = 0; for (int pfpt = 0; pfpt < 2; pfpt++) { if (pfpt == 1) { componentIndex = 1; choiceProbabilityCalculator.CreateUtilityComponent(componentIndex); ChoiceProbabilityCalculator.Component pfptComponent = choiceProbabilityCalculator.GetUtilityComponent(componentIndex); pfptComponent.AddUtilityTerm(1, (householdDay.Household.Size == 3).ToFlag()); pfptComponent.AddUtilityTerm(2, (householdDay.Household.Size >= 4).ToFlag()); pfptComponent.AddUtilityTerm(3, householdDay.Household.HasChildrenUnder5.ToFlag()); pfptComponent.AddUtilityTerm(4, (householdDay.AdultsInSharedHomeStay == 1 && householdDay.Household.HasChildrenAge5Through15).ToFlag()); pfptComponent.AddUtilityTerm(5, (householdDay.AdultsInSharedHomeStay == 2 && householdDay.Household.HouseholdTotals.FullAndPartTimeWorkers >= 2).ToFlag()); pfptComponent.AddUtilityTerm(6, (householdDay.AdultsInSharedHomeStay == 2 && hasAdultEducLevel12 == 1).ToFlag()); pfptComponent.AddUtilityTerm(7, (householdDay.Household.VehiclesAvailable == 1 && household.Has2Drivers).ToFlag()); pfptComponent.AddUtilityTerm(8, (householdDay.Household.VehiclesAvailable >= 2 && household.Has2Drivers).ToFlag()); pfptComponent.AddUtilityTerm(11, (householdDay.Household.Income >= 300000 && householdDay.Household.Income < 600000).ToFlag()); pfptComponent.AddUtilityTerm(12, (householdDay.Household.Income >= 600000 && householdDay.Household.Income < 900000).ToFlag()); pfptComponent.AddUtilityTerm(13, (householdDay.Household.Income >= 900000).ToFlag()); // OBS; 27. aug., work tour mode logsum does not work - see what happens in the old PFPT model // GV, sep. 1st - it is not significant pfptComponent.AddUtilityTerm(15, (firstWorkLogsum + secondWorkLogsum) * (workingCoupleNoChildren || workingCoupleAllChildrenUnder5).ToFlag()); pfptComponent.AddUtilityTerm(15, (firstWorkLogsum + secondWorkLogsum) * otherHouseholdWithPTFTWorkers.ToFlag()); // dette er gamle at-work logsum - it should be plus and significant //alternative.AddUtilityTerm(31, (firstWorkLogsum + secondWorkLogsum) * //(workingCoupleNoChildren || workingCoupleAllChildrenUnder5).ToFlag()); //alternative.AddUtilityTerm(31, (firstWorkLogsum + secondWorkLogsum) * otherHouseholdWithPTFTWorkers.ToFlag()); // at-home logsum works pfptComponent.AddUtilityTerm(16, compositeLogsum); //pfpt constant pfptComponent.AddUtilityTerm(51, 1); } } for (int jointTourFlag = 0; jointTourFlag < 2; jointTourFlag++) { if (jointTourFlag == 1) { componentIndex = 2; choiceProbabilityCalculator.CreateUtilityComponent(componentIndex); ChoiceProbabilityCalculator.Component jointComponent = choiceProbabilityCalculator.GetUtilityComponent(componentIndex); jointComponent.AddUtilityTerm(21, (householdDay.Household.Size == 3).ToFlag()); jointComponent.AddUtilityTerm(22, (householdDay.Household.Size >= 4).ToFlag()); // GV: 1st sep. //jointComponent.AddUtilityTerm(23, (householdDay.Household.Size == 2 && householdDay.Household.HasChildren).ToFlag()); //jointComponent.AddUtilityTerm(23, (householdDay.Household.Size >= 2 && householdDay.Household.HasChildren).ToFlag()); jointComponent.AddUtilityTerm(23, (householdDay.Household.HasChildren).ToFlag()); //jointComponent.AddUtilityTerm(21, householdDay.Household.HasChildrenUnder5.ToFlag()); //jointComponent.AddUtilityTerm(22, householdDay.Household.HasChildrenAge5Through15.ToFlag()); //jointComponent.AddUtilityTerm(23, householdDay.Household.HasChildren.ToFlag()); jointComponent.AddUtilityTerm(24, (householdDay.Household.Size == 2 && householdDay.AdultsInSharedHomeStay == 2).ToFlag()); //jointComponent.AddUtilityTerm(25, (householdDay.AdultsInSharedHomeStay == 2 && householdDay.Household.HouseholdTotals.FullAndPartTimeWorkers >= 2).ToFlag()); jointComponent.AddUtilityTerm(26, (householdDay.AdultsInSharedHomeStay == 2 && hasAdultEducLevel12 == 1).ToFlag()); //jointComponent.AddUtilityTerm(27, (householdDay.Household.Size == 2 && householdDay.Household.HasChildrenUnder5).ToFlag()); //jointComponent.AddUtilityTerm(28, (householdDay.Household.Size == 2 && householdDay.Household.HasChildrenAge5Through15).ToFlag()); //jointComponent.AddUtilityTerm(27, (householdDay.Household.Size == 2 && householdDay.Household.HasChildrenUnder16).ToFlag()); jointComponent.AddUtilityTerm(29, (householdDay.AdultsInSharedHomeStay == 1 && householdDay.Household.HasChildrenUnder16).ToFlag()); //jointComponent.AddUtilityTerm(37, (householdDay.Household.VehiclesAvailable == 1 && household.Has2Drivers).ToFlag()); //jointComponent.AddUtilityTerm(38, (householdDay.Household.VehiclesAvailable >= 2 && household.Has2Drivers).ToFlag()); jointComponent.AddUtilityTerm(30, (householdDay.Household.VehiclesAvailable >= 1 && household.Has2Drivers).ToFlag()); jointComponent.AddUtilityTerm(31, (householdDay.Household.Income >= 300000 && householdDay.Household.Income < 600000).ToFlag()); jointComponent.AddUtilityTerm(32, (householdDay.Household.Income >= 600000 && householdDay.Household.Income < 900000).ToFlag()); jointComponent.AddUtilityTerm(33, (householdDay.Household.Income >= 900000).ToFlag()); // GV, sep. 1st - it is not significant //jointComponent.AddUtilityTerm(41, compositeLogsum); // joint non-mandatory tour constant jointComponent.AddUtilityTerm(61, 1); } } bool available = true; for (int pfpt = 0; pfpt < 2; pfpt++) { for (int jointTourFlag = 0; jointTourFlag < 2; jointTourFlag++) { int altIndex = pfpt + jointTourFlag * 2; if (household.Size < 2 && altIndex > 0) { available = false; } else { available = true; } ChoiceProbabilityCalculator.Alternative alternative = choiceProbabilityCalculator.GetAlternative(altIndex, available, choice == altIndex); alternative.Choice = altIndex; //NESTING WAS REJECTED BY TESTS //GV: PFPT on top - cannot be estimated //alternative.AddNestedAlternative(5 + pfpt, pfpt, THETA_PARAMETER); //alternative.AddNestedAlternative(5 + jointTourFlag, jointTourFlag, THETA_PARAMETER); //jointTourFlag on top if (pfpt == 1) { alternative.AddUtilityComponent(choiceProbabilityCalculator.GetUtilityComponent(1)); //alternative.AddUtilityTerm(20, 1); } if (jointTourFlag == 1) { alternative.AddUtilityComponent(choiceProbabilityCalculator.GetUtilityComponent(2)); //alternative.AddUtilityTerm(40, 1); } if (pfpt == 1 && jointTourFlag == 1) { alternative.AddUtilityTerm(71, 1); //alternative.AddUtilityTerm(72, (householdDay.Household.Size == 2 && householdDay.AdultsInSharedHomeStay == 2).ToFlag()); // GV: comented out sep. 1st //GV: coeff. 73 is with a wrong sign - 13. june 2016 //alternative.AddUtilityTerm(73, householdDay.Household.HasChildren.ToFlag()); //alternative.AddUtilityTerm(74, householdDay.Household.HasChildrenUnder16.ToFlag()); } } } }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, HouseholdDayWrapper householdDay, int choice = Constants.DEFAULT_VALUE) { var household = householdDay.Household; var residenceParcel = household.ResidenceParcel; // set household characteristics here that don't depend on person characteristics int hasAdultEducLevel12 = 0; int allAdultEducLevel12 = 1; int youngestAge = 999; double firstWorkLogsum = 0; double secondWorkLogsum = 0; bool firstWorkLogsumIsSet = false; bool secondWorkLogsumIsSet = false; int numberWorkers = 0; int numberAdults = 0; int numberChildren = 0; int numberChildrenUnder5 = 0; // set characteristics here that depend on person characteristics foreach (PersonDayWrapper personDay in householdDay.PersonDays) { double workLogsum = 0; var person = (PersonWrapper)personDay.Person; if (person.UsualWorkParcel == null || person.UsualWorkParcelId == household.ResidenceParcelId || (person.PersonType != Global.Settings.PersonTypes.FullTimeWorker && person.PersonType != Global.Settings.PersonTypes.PartTimeWorker)) // || household.VehiclesAvailable == 0) { } else { var destinationArrivalTime = ChoiceModelUtility.GetDestinationArrivalTime(Global.Settings.Models.WorkTourModeModel); var destinationDepartureTime = ChoiceModelUtility.GetDestinationDepartureTime(Global.Settings.Models.WorkTourModeModel); //JLB 201406 //var nestedAlternative = Global.ChoiceModelSession.Get<WorkTourModeModel>().RunNested(personDay, residenceParcel, person.UsualWorkParcel, destinationArrivalTime, destinationDepartureTime, household.VehiclesAvailable); var nestedAlternative = Global.ChoiceModelSession.Get <WorkTourModeTimeModel>().RunNested(personDay, residenceParcel, person.UsualWorkParcel, destinationArrivalTime, destinationDepartureTime, household.VehiclesAvailable); workLogsum = nestedAlternative == null ? 0 : nestedAlternative.ComputeLogsum(); } if (person.Age >= 18 && person.EducationLevel >= 12) { hasAdultEducLevel12 = 1; } if (person.Age >= 18 && person.EducationLevel < 12) { allAdultEducLevel12 = 0; } if (person.Age < youngestAge) { youngestAge = person.Age; } if (workLogsum != 0 && !firstWorkLogsumIsSet) { firstWorkLogsum = workLogsum; firstWorkLogsumIsSet = true; } else if (workLogsum != 0 && !secondWorkLogsumIsSet) { secondWorkLogsum = workLogsum; secondWorkLogsumIsSet = true; } if (person.Age >= 18) { numberAdults++; if (person.PersonType == Global.Settings.PersonTypes.FullTimeWorker //|| person.PersonType == Constants.PersonType.PART_TIME_WORKER ) { numberWorkers++; } } else { numberChildren++; if (person.PersonType == Global.Settings.PersonTypes.ChildUnder5) { numberChildrenUnder5++; } } } var singleWorkerWithChildUnder5 = (numberAdults == numberWorkers && numberAdults == 1 && numberChildrenUnder5 > 0) ? true : false; var workingCoupleNoChildren = (numberAdults == numberWorkers && numberAdults == 2 && numberChildren == 0) ? true : false; var workingCoupleAllChildrenUnder5 = (numberAdults == numberWorkers && numberAdults == 2 && numberChildren > 0 && numberChildren == numberChildrenUnder5) ? true : false; var otherHouseholdWithPTFTWorkers = false; if (!workingCoupleNoChildren && !workingCoupleAllChildrenUnder5 && firstWorkLogsum != 0) { otherHouseholdWithPTFTWorkers = true; } var nonWorkingHousehold = false; if (!workingCoupleNoChildren && !workingCoupleAllChildrenUnder5 && !otherHouseholdWithPTFTWorkers) { nonWorkingHousehold = true; } // var votSegment = household.VotALSegment; //var taSegment = household.ResidenceParcel.TransitAccessSegment(); //var aggregateLogsumDifference = // full car ownership vs. no car ownership // Global.AggregateLogsums[household.ResidenceZoneId][Global.Settings.Purposes.HomeBasedComposite][Global.Settings.CarOwnerships.OneOrMoreCarsPerAdult][votSegment][taSegment] - // Global.AggregateLogsums[household.ResidenceZoneId][Global.Settings.Purposes.HomeBasedComposite][Global.Settings.CarOwnerships.NoCars][votSegment][taSegment]; //var householdDay = (LDHouseholdDayWrapper)tour.HouseholdDay; var carOwnership = household.VehiclesAvailable == 0 ? Global.Settings.CarOwnerships.NoCars : household.VehiclesAvailable < household.HouseholdTotals.DrivingAgeMembers ? Global.Settings.CarOwnerships.LtOneCarPerAdult : Global.Settings.CarOwnerships.OneOrMoreCarsPerAdult; var noCarsFlag = FlagUtility.GetNoCarsFlag(carOwnership); var carCompetitionFlag = FlagUtility.GetCarCompetitionFlag(carOwnership); var votALSegment = Global.Settings.VotALSegments.Medium; // TODO: calculate a VOT segment that depends on household income var transitAccessSegment = household.ResidenceParcel.TransitAccessSegment(); var personalBusinessAggregateLogsum = Global.AggregateLogsums[household.ResidenceParcel.ZoneId] [Global.Settings.Purposes.PersonalBusiness][carOwnership][votALSegment][transitAccessSegment]; var shoppingAggregateLogsum = Global.AggregateLogsums[household.ResidenceParcel.ZoneId] [Global.Settings.Purposes.Shopping][carOwnership][votALSegment][transitAccessSegment]; var mealAggregateLogsum = Global.AggregateLogsums[household.ResidenceParcel.ZoneId] [Global.Settings.Purposes.Meal][carOwnership][votALSegment][transitAccessSegment]; var socialAggregateLogsum = Global.AggregateLogsums[household.ResidenceParcel.ZoneId] [Global.Settings.Purposes.Social][carOwnership][votALSegment][transitAccessSegment]; //var compositeLogsum = Global.AggregateLogsums[household.ResidenceZoneId][Global.Settings.Purposes.HomeBasedComposite][carOwnership][votALSegment][transitAccessSegment]; var compositeLogsum = Global.AggregateLogsums[household.ResidenceZoneId][Global.Settings.Purposes.HomeBasedComposite][Global.Settings.CarOwnerships.NoCars][votALSegment][transitAccessSegment]; var componentIndex = 0; for (int pfpt = 0; pfpt < 2; pfpt++) { if (pfpt == 1) { componentIndex = 1; choiceProbabilityCalculator.CreateUtilityComponent(componentIndex); var pfptComponent = choiceProbabilityCalculator.GetUtilityComponent(componentIndex); pfptComponent.AddUtilityTerm(1, (householdDay.Household.Size == 3).ToFlag()); pfptComponent.AddUtilityTerm(2, (householdDay.Household.Size >= 4).ToFlag()); pfptComponent.AddUtilityTerm(3, householdDay.Household.HasChildrenUnder5.ToFlag()); pfptComponent.AddUtilityTerm(4, (householdDay.AdultsInSharedHomeStay == 1 && householdDay.Household.HasChildrenAge5Through15).ToFlag()); pfptComponent.AddUtilityTerm(5, (householdDay.AdultsInSharedHomeStay == 2 && householdDay.Household.HouseholdTotals.FullAndPartTimeWorkers >= 2).ToFlag()); pfptComponent.AddUtilityTerm(6, (householdDay.AdultsInSharedHomeStay == 2 && hasAdultEducLevel12 == 1).ToFlag()); pfptComponent.AddUtilityTerm(7, (householdDay.Household.VehiclesAvailable == 1 && household.Has2Drivers).ToFlag()); pfptComponent.AddUtilityTerm(8, (householdDay.Household.VehiclesAvailable >= 2 && household.Has2Drivers).ToFlag()); //pfptComponent.AddUtilityTerm(29, (householdDay.Household.Income >= 300000 && householdDay.Household.Income < 600000).ToFlag()); //pfptComponent.AddUtilityTerm(30, (householdDay.Household.Income >= 600000 && householdDay.Household.Income < 900000).ToFlag()); //pfptComponent.AddUtilityTerm(31, (householdDay.Household.Income >= 900000).ToFlag()); pfptComponent.AddUtilityTerm(9, (firstWorkLogsum + secondWorkLogsum) * (workingCoupleNoChildren || workingCoupleAllChildrenUnder5).ToFlag()); pfptComponent.AddUtilityTerm(9, (firstWorkLogsum + secondWorkLogsum) * otherHouseholdWithPTFTWorkers.ToFlag()); pfptComponent.AddUtilityTerm(10, compositeLogsum); } } for (var jointTourFlag = 0; jointTourFlag < 2; jointTourFlag++) { if (jointTourFlag == 1) { componentIndex = 2; choiceProbabilityCalculator.CreateUtilityComponent(componentIndex); var jointComponent = choiceProbabilityCalculator.GetUtilityComponent(componentIndex); jointComponent.AddUtilityTerm(21, householdDay.Household.HasChildrenUnder5.ToFlag()); jointComponent.AddUtilityTerm(22, householdDay.Household.HasChildrenAge5Through15.ToFlag()); jointComponent.AddUtilityTerm(23, (youngestAge >= 40).ToFlag()); //noJointComponent.AddUtilityTerm(50, (householdDay.Household.Income >= 300000 && householdDay.Household.Income < 600000).ToFlag()); //noJointComponent.AddUtilityTerm(51, (householdDay.Household.Income >= 600000 && householdDay.Household.Income < 900000).ToFlag()); //noJointComponent.AddUtilityTerm(52, (householdDay.Household.Income >= 900000).ToFlag()); jointComponent.AddUtilityTerm(24, compositeLogsum); } } var available = true; for (int pfpt = 0; pfpt < 2; pfpt++) { for (var jointTourFlag = 0; jointTourFlag < 2; jointTourFlag++) { var altIndex = pfpt + jointTourFlag * 2; if (household.Size < 2 && altIndex > 0) { available = false; } else { available = true; } var alternative = choiceProbabilityCalculator.GetAlternative(altIndex, available, choice != null && choice == altIndex); alternative.Choice = altIndex; //NESTING WAS REJECTED BY TESTS //alternative.AddNestedAlternative(5 + pfpt, pfpt, THETA_PARAMETER); // pfpt on top //alternative.AddNestedAlternative(5 + jointTourFlag, jointTourFlag, THETA_PARAMETER); //jointTourFlag on top if (pfpt == 1) { alternative.AddUtilityComponent(choiceProbabilityCalculator.GetUtilityComponent(1)); //alternative.AddUtilityTerm(20, 1); } if (jointTourFlag == 0) { alternative.AddUtilityComponent(choiceProbabilityCalculator.GetUtilityComponent(2)); //alternative.AddUtilityTerm(40, 1); } if (pfpt == 0 && jointTourFlag == 0) { } else if (pfpt == 1 && jointTourFlag == 0) { alternative.AddUtilityTerm(51, 1); } else if (pfpt == 0 && jointTourFlag == 1) { alternative.AddUtilityTerm(61, 1); } else if (pfpt == 1 && jointTourFlag == 1) { alternative.AddUtilityTerm(71, 1); //alternative.AddUtilityTerm(72, (householdDay.Household.Size == 2 && householdDay.AdultsInSharedHomeStay == 2).ToFlag()); //alternative.AddUtilityTerm(73, (householdDay.AdultsInSharedHomeStay == 1 && householdDay.Household.HasChildrenUnder16).ToFlag()); //alternative.AddUtilityTerm(74, (householdDay.AdultsInSharedHomeStay == 2 && householdDay.Household.HouseholdTotals.FullAndPartTimeWorkers >= 2).ToFlag()); //alternative.AddUtilityTerm(75, (householdDay.AdultsInSharedHomeStay == 2 && hasAdultEducLevel12 == 1).ToFlag()); } } } }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, TourWrapper tour, int nCallsForTour, HouseholdDayWrapper householdDay, int choice = Constants.DEFAULT_VALUE) { IEnumerable <PersonDayWrapper> orderedPersonDays = householdDay.PersonDays.OrderBy(p => p.GetJointTourParticipationPriority()).ToList().Cast <PersonDayWrapper>(); var person = tour.Person; var personDay = tour.PersonDay; var adultFemaleFlag = person.IsAdultFemale.ToFlag(); var partTimeWorkerFlag = person.IsPartTimeWorker.ToFlag(); var foodBuffer2 = tour.DestinationParcel.EmploymentFoodBuffer2; var medBuffer2 = tour.DestinationParcel.EmploymentMedicalBuffer2; var intDensBuffer2 = tour.DestinationParcel.IntersectionDensity34Buffer2(); var serviceBuffer2 = tour.DestinationParcel.EmploymentServiceBuffer2; var totEmpBuffer2 = tour.DestinationParcel.EmploymentTotalBuffer2; var totHHBuffer2 = tour.DestinationParcel.HouseholdsBuffer2; var openSpaceBuffer2 = tour.DestinationParcel.OpenSpaceType1Buffer2; var mixedUse = tour.DestinationParcel.MixedUse2Index2(); //var retailBuffer2 = tour.DestinationParcel.EmploymentRetailBuffer2; //var retailBuffer1 = tour.DestinationParcel.EmploymentRetailBuffer1; var carOwnership = person.GetCarOwnershipSegment(); var noCarsFlag = FlagUtility.GetNoCarsFlag(carOwnership); //var carCompetitionFlag = AggregateLogsumsCalculator.GetCarCompetitionFlag(carOwnership); var votALSegment = tour.GetVotALSegment(); var workTaSegment = tour.DestinationParcel.TransitAccessSegment(); var workAggregateLogsum = Global.AggregateLogsums[tour.DestinationParcel.ZoneId] [Global.Settings.Purposes.WorkBased][carOwnership][votALSegment][workTaSegment]; var shopAggregateLogsum = Global.AggregateLogsums[tour.DestinationParcel.ZoneId] [Global.Settings.Purposes.Shopping][carOwnership][votALSegment][workTaSegment]; //var mealAggregateLogsum = Global.AggregateLogsums[tour.DestinationParcel.ZoneId] //[Global.Settings.Purposes.Meal][carOwnership][votALSegment][workTaSegment]; //var persBusAggregateLogsum = Global.AggregateLogsums[tour.DestinationParcel.ZoneId] //[Global.Settings.Purposes.PersonalBusiness][carOwnership][votALSegment][workTaSegment]; //var socialAggregateLogsum = Global.AggregateLogsums[tour.DestinationParcel.ZoneId] //[Global.Settings.Purposes.Social][carOwnership][votALSegment][workTaSegment]; int numStopPurposes = (personDay.SimulatedEscortStops > 1).ToFlag() + (personDay.SimulatedShoppingStops > 1).ToFlag() + (personDay.SimulatedMealStops > 1).ToFlag() + (personDay.SimulatedPersonalBusinessStops > 1).ToFlag() + (personDay.SimulatedSocialStops > 1).ToFlag() + (personDay.SimulatedRecreationStops > 1).ToFlag() + (personDay.SimulatedMedicalStops > 1).ToFlag(); var workDestinationArrivalTime = ChoiceModelUtility.GetDestinationArrivalTime(Global.Settings.Models.WorkTourModeModel); var workDestinationDepartureTime = ChoiceModelUtility.GetDestinationDepartureTime(Global.Settings.Models.WorkTourModeModel); double workLogsum = 0; var nestedAlternative = Global.ChoiceModelSession.Get <WorkTourModeTimeModel>().RunNested(personDay, person.Household.ResidenceParcel, person.UsualWorkParcel, workDestinationArrivalTime, workDestinationDepartureTime, person.Household.VehiclesAvailable); workLogsum = nestedAlternative == null ? 0 : nestedAlternative.ComputeLogsum(); //double logTimeAtWork = Math.Log(1 + (workDestinationDepartureTime - workDestinationArrivalTime) / 60); //int countMandatoryKids = (from personDayHH in orderedPersonDays where personDayHH.PatternType == 1 && personDayHH.Person.Age < 12 select personDayHH.PatternType).Count(); //int countNonMandatory = (from personDayHH in orderedPersonDays where personDayHH.PatternType == 2 select personDayHH.PatternType).Count(); //int countAtHome = (from personDayHH in orderedPersonDays where personDayHH.PatternType == 3 select personDayHH.PatternType).Count(); int countNonMandatoryKids = (from personDayHH in orderedPersonDays where personDayHH.PatternType == 2 && personDayHH.Person.Age < 12 select personDayHH.PatternType).Count(); // NONE_OR_HOME var alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.NoneOrHome, true, choice == Global.Settings.Purposes.NoneOrHome); alternative.Choice = Global.Settings.Purposes.NoneOrHome; alternative.AddUtilityTerm(1, (nCallsForTour > 1).ToFlag()); alternative.AddUtilityTerm(3, personDay.TwoOrMoreWorkToursExist().ToFlag()); alternative.AddUtilityTerm(4, noCarsFlag); //alternative.AddUtilityTerm(5, carCompetitionFlag); alternative.AddUtilityTerm(6, partTimeWorkerFlag); //alternative.AddUtilityTerm(8, (person.UsualModeToWork != Global.Settings.Modes.Sov).ToFlag()); alternative.AddUtilityTerm(10, person.TransitPassOwnership); //alternative.AddUtilityTerm(15, logTimeAtWork); alternative.AddUtilityTerm(17, numStopPurposes); alternative.AddUtilityTerm(18, Math.Log(personDay.GetTotalCreatedTours() + 1)); // WORK alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Work, personDay.WorkStops > 0, choice == Global.Settings.Purposes.Work); alternative.Choice = Global.Settings.Purposes.Work; alternative.AddUtilityTerm(21, 1); alternative.AddUtilityTerm(22, Math.Log(1 + totEmpBuffer2)); //alternative.AddUtilityTerm(23, (person.Household.Income<30000).ToFlag()); alternative.AddUtilityTerm(24, (person.Household.Has100KPlusIncome).ToFlag()); alternative.AddUtilityTerm(25, workLogsum); // SCHOOL //no observations in the PSRC dataset alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.School, false, choice == Global.Settings.Purposes.School); alternative.Choice = Global.Settings.Purposes.School; //alternative.AddUtilityTerm(3, 1); // ESCORT alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Escort, personDay.EscortStops > 0, choice == Global.Settings.Purposes.Escort); alternative.Choice = Global.Settings.Purposes.Escort; alternative.AddUtilityTerm(31, 1); //alternative.AddUtilityTerm(33, k8HighSchoolQtrMileLog); alternative.AddUtilityTerm(36, countNonMandatoryKids); alternative.AddUtilityTerm(37, adultFemaleFlag); //alternative.AddUtilityTerm(38, person.Household.Size); //alternative.AddUtilityTerm(39, householdDay.Household.HouseholdTotals.ChildrenAge5Through15); //alternative.AddUtilityTerm(40, partTimeWorkerFlag); alternative.AddUtilityTerm(39, workLogsum); // PERSONAL_BUSINESS alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.PersonalBusiness, personDay.PersonalBusinessStops > 0, choice == Global.Settings.Purposes.PersonalBusiness); alternative.Choice = Global.Settings.Purposes.PersonalBusiness; alternative.AddUtilityTerm(41, 1); //alternative.AddUtilityTerm(43, persBusAggregateLogsum); alternative.AddUtilityTerm(45, Math.Log(1 + totEmpBuffer2)); //alternative.AddUtilityTerm(48, (person.Household.Income>90000).ToFlag()); alternative.AddUtilityTerm(49, (person.Household.HouseholdTotals.ChildrenUnder16)); // SHOPPING alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Shopping, personDay.ShoppingStops > 0, choice == Global.Settings.Purposes.Shopping); alternative.Choice = Global.Settings.Purposes.Shopping; alternative.AddUtilityTerm(51, 1); //alternative.AddUtilityTerm(53, retailBuffer1); //alternative.AddUtilityTerm(54, partTimeWorkerFlag); alternative.AddUtilityTerm(55, (person.Household.Has100KPlusIncome).ToFlag()); alternative.AddUtilityTerm(57, person.Household.HouseholdTotals.ChildrenUnder16); alternative.AddUtilityTerm(58, shopAggregateLogsum); //alternative.AddUtilityTerm(59, person.Household.Size); //alternative.AddUtilityTerm(59, (person.Household.Income<30000).ToFlag()); // MEAL alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Meal, personDay.MealStops > 0, choice == Global.Settings.Purposes.Meal); alternative.Choice = Global.Settings.Purposes.Meal; alternative.AddUtilityTerm(71, 1); alternative.AddUtilityTerm(73, Math.Log(1 + foodBuffer2)); alternative.AddUtilityTerm(74, mixedUse); alternative.AddUtilityTerm(75, intDensBuffer2); //alternative.AddUtilityTerm(76, (person.Household.Income<30000).ToFlag()); //alternative.AddUtilityTerm(77, person.Household.HouseholdTotals.ChildrenUnder16); // SOCIAL alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Social, personDay.SocialStops > 0, choice == Global.Settings.Purposes.Social); alternative.Choice = Global.Settings.Purposes.Social; alternative.AddUtilityTerm(91, 1); alternative.AddUtilityTerm(93, person.Household.HouseholdTotals.ChildrenUnder16); alternative.AddUtilityTerm(94, (person.Age < 35).ToFlag()); //alternative.AddUtilityTerm(115, workAggregateLogsum); alternative.AddUtilityTerm(96, Math.Log(1 + totHHBuffer2 + totEmpBuffer2)); alternative.AddUtilityTerm(97, (person.Household.Income < 30000).ToFlag()); //alternative.AddUtilityTerm(118, person.Household.Has100KPlusIncome.ToFlag()); // RECREATION alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Recreation, personDay.RecreationStops > 0, choice == Global.Settings.Purposes.Recreation); alternative.Choice = Global.Settings.Purposes.Recreation; alternative.AddUtilityTerm(111, 1); alternative.AddUtilityTerm(113, person.Household.HouseholdTotals.ChildrenUnder16); alternative.AddUtilityTerm(114, (person.Age < 35).ToFlag()); alternative.AddUtilityTerm(116, Math.Log(1 + totHHBuffer2 + totEmpBuffer2)); alternative.AddUtilityTerm(117, (person.Household.Income < 30000).ToFlag()); alternative.AddUtilityTerm(118, (person.Household.Income > 100000).ToFlag()); alternative.AddUtilityTerm(119, Math.Log(1 + openSpaceBuffer2)); // MEDICAL alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Medical, personDay.MedicalStops > 0, choice == Global.Settings.Purposes.Medical); alternative.Choice = Global.Settings.Purposes.Medical; alternative.AddUtilityTerm(121, 1); alternative.AddUtilityTerm(123, adultFemaleFlag); alternative.AddUtilityTerm(124, (person.Age > 65).ToFlag()); alternative.AddUtilityTerm(125, Math.Log(1 + medBuffer2)); //alternative.AddUtilityTerm(126, workAggregateLogsum); //alternative.AddNestedAlternative(12, 1, 60); }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, ITourWrapper subtour, IEnumerable <IPathTypeModel> pathTypeModels, IParcelWrapper destinationParcel, int parentTourMode, int choice = Constants.DEFAULT_VALUE) { var household = subtour.Household; var person = subtour.Person; var personDay = subtour.PersonDay; // household inputs var income0To25KFlag = household.Has0To25KIncome.ToFlag(); var income25To50KFlag = household.Has25To50KIncome.ToFlag(); // person inputs var maleFlag = person.IsMale.ToFlag(); // tour inputs var sovTourFlag = (parentTourMode == Global.Settings.Modes.Sov).ToFlag(); var hov2TourFlag = (parentTourMode == Global.Settings.Modes.Hov2).ToFlag(); var bikeTourFlag = (parentTourMode == Global.Settings.Modes.Bike).ToFlag(); var walkTourFlag = (parentTourMode == Global.Settings.Modes.Walk).ToFlag(); // remaining inputs var originParcel = subtour.OriginParcel; var parkingDuration = ChoiceModelUtility.GetParkingDuration(person.IsFulltimeWorker); var destinationParkingCost = destinationParcel.ParkingCostBuffer1(parkingDuration); double escortPercentage; double nonEscortPercentage; ChoiceModelUtility.SetEscortPercentages(personDay, out escortPercentage, out nonEscortPercentage, true); // paidRideShare is a special case if (Global.Configuration.PaidRideShareModeIsAvailable) { var pathTypeExtra = pathTypeModels.First(x => x.Mode == Global.Settings.Modes.PaidRideShare); var modeExtra = Global.Settings.Modes.PaidRideShare; var availableExtra = pathTypeExtra.Available; var generalizedTimeLogsumExtra = pathTypeExtra.GeneralizedTimeLogsum; var distanceExtra = pathTypeExtra.PathDistance; var alternative = choiceProbabilityCalculator.GetAlternative(modeExtra - 2, availableExtra, choice == modeExtra); alternative.Choice = modeExtra; alternative.AddNestedAlternative(_nestedAlternativeIds[modeExtra], _nestedAlternativeIndexes[modeExtra], THETA_PARAMETER); if (availableExtra) { var extraCostPerMile = Global.Configuration.AV_PaidRideShareModeUsesAVs ? Global.Configuration.AV_PaidRideShare_ExtraCostPerDistanceUnit : Global.Configuration.PaidRideShare_ExtraCostPerDistanceUnit; var fixedCostPerRide = Global.Configuration.AV_PaidRideShareModeUsesAVs ? Global.Configuration.AV_PaidRideShare_FixedCostPerRide : Global.Configuration.PaidRideShare_FixedCostPerRide; var autoTimeCoefficient = Global.Configuration.AV_PaidRideShareModeUsesAVs ? subtour.TimeCoefficient * (1.0 - Global.Configuration.AV_InVehicleTimeCoefficientDiscountFactor) : subtour.TimeCoefficient; alternative.AddUtilityTerm(2, generalizedTimeLogsumExtra * autoTimeCoefficient); alternative.AddUtilityTerm(2, distanceExtra * extraCostPerMile * subtour.CostCoefficient); alternative.AddUtilityTerm(2, fixedCostPerRide * subtour.CostCoefficient); var 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); 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()); } } foreach (var pathTypeModel in pathTypeModels) { var mode = pathTypeModel.Mode; var available = pathTypeModel.Mode != Global.Settings.Modes.ParkAndRide && pathTypeModel.Available; var generalizedTimeLogsum = pathTypeModel.GeneralizedTimeLogsum; var alternative = choiceProbabilityCalculator.GetAlternative(mode, available, choice == mode); alternative.Choice = mode; alternative.AddNestedAlternative(_nestedAlternativeIds[pathTypeModel.Mode], _nestedAlternativeIndexes[pathTypeModel.Mode], THETA_PARAMETER); if (!available) { continue; } var 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) : 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.AddUtility(169, destinationParcel.MixedUse4Index1()); // alternative.AddUtility(168, destinationParcel.TotalEmploymentDensity1()); // alternative.AddUtility(167, destinationParcel.NetIntersectionDensity1()); // alternative.AddUtility(166, originParcel.NetIntersectionDensity1()); // alternative.AddUtility(165, originParcel.TotalEmploymentDensity1()); // alternative.AddUtility(164, originParcel.MixedUse4Index1()); } else if (mode == Global.Settings.Modes.Walk) { alternative.AddUtilityTerm(70, 1); alternative.AddUtilityTerm(79, walkTourFlag); // alternative.AddUtility(179, destinationParcel.MixedUse4Index1()); // alternative.AddUtility(178, destinationParcel.TotalEmploymentDensity1()); // alternative.AddUtility(177, destinationParcel.NetIntersectionDensity1()); // alternative.AddUtility(176, originParcel.NetIntersectionDensity1()); // alternative.AddUtility(175, originParcel.TotalEmploymentDensity1()); // alternative.AddUtility(174, originParcel.MixedUse4Index1()); } } }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, PersonWrapper person, int sampleSize, IParcelWrapper choice = null, bool choseHome = false) { var segment = Global.Kernel.Get <SamplingWeightsSettingsFactory>().SamplingWeightsSettings.GetTourDestinationSegment(Global.Settings.Purposes.Work, Global.Settings.TourPriorities.HomeBasedTour, Global.Settings.Modes.Sov, person.PersonType); var destinationSampler = new DestinationSampler(choiceProbabilityCalculator, segment, sampleSize, person.Household.ResidenceParcel, choice); var destinationArrivalTime = ChoiceModelUtility.GetDestinationArrivalTime(Global.Settings.Models.WorkTourModeModel); var destinationDepartureTime = ChoiceModelUtility.GetDestinationDepartureTime(Global.Settings.Models.WorkTourModeModel); var workLocationUtilites = new WorkLocationUtilities(person, sampleSize, destinationArrivalTime, destinationDepartureTime); var sampleItems = destinationSampler.SampleAndReturnTourDestinations(workLocationUtilites); int index = 0; foreach (var sampleItem in sampleItems) { bool available = sampleItem.Key.Available; bool isChosen = sampleItem.Key.IsChosen; double adjustmentFactor = sampleItem.Key.AdjustmentFactor; var destinationParcel = ChoiceModelFactory.Parcels[sampleItem.Key.ParcelId]; var alternative = choiceProbabilityCalculator.GetAlternative(index++, available, isChosen); if (!available) { continue; } alternative.Choice = destinationParcel; var workTourLogsum = 0D; //JLB 201602 //var nestedAlternative = Global.ChoiceModelSession.Get<WorkTourModeTimeModel>().RunNested(person, person.Household.ResidenceParcel, destinationParcel, destinationArrivalTime, destinationDepartureTime, person.Household.HouseholdTotals.DrivingAgeMembers, 0.0); var 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(); var votSegment = person.Household.GetVotALSegment(); var taSegment = destinationParcel.TransitAccessSegment(); var aggregateLogsum = Global.AggregateLogsums[destinationParcel.ZoneId][Global.Settings.Purposes.HomeBasedComposite][Global.Settings.CarOwnerships.OneOrMoreCarsPerAdult][votSegment][taSegment]; var distanceFromOrigin = person.Household.ResidenceParcel.DistanceFromOrigin(destinationParcel, 1); var distance1 = Math.Min(distanceFromOrigin, .35); var distance2 = Math.Max(0, Math.Min(distanceFromOrigin - .35, 1 - .35)); var distance3 = Math.Max(0, distanceFromOrigin - 1); var distanceLog = Math.Log(1 + distanceFromOrigin); var distanceFromSchool = person.IsFullOrPartTimeWorker ? 0 : person.UsualSchoolParcel.DistanceFromSchoolLog(destinationParcel, 1); // parcel buffers var educationBuffer = Math.Log(destinationParcel.EmploymentEducationBuffer2 + 1); var governmentBuffer = Math.Log(destinationParcel.EmploymentGovernmentBuffer2 + 1); var officeBuffer = Math.Log(destinationParcel.EmploymentOfficeBuffer2 + 1); var serviceBuffer = Math.Log(destinationParcel.EmploymentServiceBuffer2 + 1); var householdsBuffer = Math.Log(destinationParcel.HouseholdsBuffer2 + 1); // var retailBuffer = Math.Log(destinationParcel.EmploymentRetailBuffer2 + 1); var industrialAgricultureConstructionBuffer = Math.Log(destinationParcel.EmploymentIndustrialBuffer2 + destinationParcel.EmploymentAgricultureConstructionBuffer2 + 1); var foodBuffer = Math.Log(destinationParcel.EmploymentFoodBuffer2 + 1); var medicalBuffer = Math.Log(destinationParcel.EmploymentMedicalBuffer2 + 1); var employmentTotalBuffer = Math.Log(destinationParcel.EmploymentTotalBuffer2 + 1); var studentsUniversityBuffer = Math.Log(destinationParcel.StudentsUniversityBuffer2 + 1); var studentsK12Buffer = Math.Log(destinationParcel.StudentsK8Buffer2 + destinationParcel.StudentsHighSchoolBuffer2 + 1); // var mixedUse4Index = destinationParcel.MixedUse4Index2(); //size attributes (derived) var employmentIndustrialAgricultureConstruction = destinationParcel.EmploymentIndustrial + destinationParcel.EmploymentAgricultureConstruction; // parking attributes var parcelParkingDensity = destinationParcel.ParcelParkingPerTotalEmployment(); // connectivity attributes var c34Ratio = destinationParcel.C34RatioBuffer1(); // Stefan bool isInCopenhagenMunicipality = true; //destinationParcel.Municipality == 101; Need to change this after Municipality property is added to Actum parcel file var employmentCommercial = destinationParcel.EmploymentRetail + destinationParcel.EmploymentService; var 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 beta00010 = 0.55; var 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 var 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); }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, HouseholdWrapper household, int choice = Constants.DEFAULT_VALUE) { // double workTourLogsumDifference = 0D; // (full or part-time workers) full car ownership vs. no car ownership double countTransitPasses = 0D; foreach (Framework.DomainModels.Wrappers.IPersonWrapper person in household.Persons) { if (person.TransitPassOwnership == 1) { countTransitPasses++; } if (person.IsWorker && person.UsualWorkParcel != null && person.UsualWorkParcelId != household.ResidenceParcelId) { int destinationArrivalTime = ChoiceModelUtility.GetDestinationArrivalTime(Global.Settings.Models.WorkTourModeModel); int destinationDepartureTime = ChoiceModelUtility.GetDestinationDepartureTime(Global.Settings.Models.WorkTourModeModel); ChoiceProbabilityCalculator.Alternative nestedAlternative1 = Global.ChoiceModelSession.Get <WorkTourModeTimeModel>().RunNested(person, household.ResidenceParcel, person.UsualWorkParcel, destinationArrivalTime, destinationDepartureTime, household.HouseholdTotals.DrivingAgeMembers, 0.0); ChoiceProbabilityCalculator.Alternative nestedAlternative2 = Global.ChoiceModelSession.Get <WorkTourModeTimeModel>().RunNested(person, household.ResidenceParcel, person.UsualWorkParcel, destinationArrivalTime, destinationDepartureTime, 0, 0.0); workTourLogsumDifference += nestedAlternative1 == null ? 0 : nestedAlternative1.ComputeLogsum(); workTourLogsumDifference -= nestedAlternative2 == null ? 0 : nestedAlternative2.ComputeLogsum(); } } int oldestAge = (from persons in household.Persons select persons.Age).Max(); int youngestAge = (from persons in household.Persons select persons.Age).Min(); int noTransitPasses = countTransitPasses == 0 ? 1 : 0; int votSegment = household.GetVotALSegment(); int taSegment = household.ResidenceParcel.TransitAccessSegment(); //var aggregateLogsumDifference = // full car ownership vs. no car ownership // Global.AggregateLogsums[household.ResidenceZoneId][Global.Settings.Purposes.HomeBasedComposite][Global.Settings.CarOwnerships.OneOrMoreCarsPerAdult][votSegment][taSegment] - // Global.AggregateLogsums[household.ResidenceZoneId][Global.Settings.Purposes.HomeBasedComposite][Global.Settings.CarOwnerships.NoCars][votSegment][taSegment]; double noCarAggLogsum = Global.AggregateLogsums[household.ResidenceZoneId][Global.Settings.Purposes.HomeBasedComposite][Global.Settings.CarOwnerships.NoCars][votSegment][taSegment]; double distanceToStop = household.ResidenceParcel.GetDistanceToTransit() > 0 ? Math.Min(household.ResidenceParcel.GetDistanceToTransit(), 2 * Global.Settings.DistanceUnitsPerMile) // JLBscale : 2 * Global.Settings.DistanceUnitsPerMile; int ruralFlag = household.ResidenceParcel.RuralFlag(); double discretionaryIncome = (household.Income / 10000 - (1.2 * Math.Log(household.Size) + 2.0)); //home parcel buffer variables double foodRetailServiceMedicalLogBuffer1 = Math.Log(1 + household.ResidenceParcel.FoodRetailServiceMedicalLogBuffer1()); double intrDens = Math.Log(1 + household.ResidenceParcel.IntersectionDensity34Buffer2()); // 0 AUTOS ChoiceProbabilityCalculator.Alternative alternative = choiceProbabilityCalculator.GetAlternative(0, true, choice == 0); alternative.Choice = 0; alternative.AddUtilityTerm(1, household.Has1Driver.ToFlag()); alternative.AddUtilityTerm(2, household.Has2Drivers.ToFlag()); alternative.AddUtilityTerm(3, household.Has3Drivers.ToFlag()); alternative.AddUtilityTerm(4, household.Has4OrMoreDrivers.ToFlag()); alternative.AddUtilityTerm(5, household.HasNoFullOrPartTimeWorker.ToFlag()); alternative.AddUtilityTerm(8, household.HouseholdTotals.UniversityStudentsPerDrivingAgeMembers); alternative.AddUtilityTerm(9, household.HouseholdTotals.DrivingAgeStudentsPerDrivingAgeMembers); alternative.AddUtilityTerm(12, household.Has0To25KIncome.ToFlag()); alternative.AddUtilityTerm(13, discretionaryIncome); alternative.AddUtilityTerm(14, household.HasIncomeOver50K.ToFlag()); alternative.AddUtilityTerm(16, household.HasMissingIncome.ToFlag()); alternative.AddUtilityTerm(17, workTourLogsumDifference); alternative.AddUtilityTerm(21, Math.Log(distanceToStop)); alternative.AddUtilityTerm(23, Math.Log(1 + household.ResidenceParcel.ParkingOffStreetPaidDailyPriceBuffer2 / 100)); alternative.AddUtilityTerm(28, noTransitPasses); alternative.AddUtilityTerm(29, intrDens); alternative.AddUtilityTerm(31, household.HasChildrenUnder16.ToFlag()); alternative.AddUtilityTerm(33, (household.Has50To75KIncome).ToFlag() * noCarAggLogsum); alternative.AddUtilityTerm(34, (household.Has75KPlusIncome).ToFlag() * noCarAggLogsum); alternative.AddUtilityTerm(35, (youngestAge > 70).ToFlag()); alternative.AddUtilityTerm(36, (oldestAge < 35).ToFlag()); // 1 AUTO alternative = choiceProbabilityCalculator.GetAlternative(1, true, choice == 1); alternative.Choice = 1; alternative.AddUtilityTerm(37, household.Has2Drivers.ToFlag()); alternative.AddUtilityTerm(38, household.Has3Drivers.ToFlag()); alternative.AddUtilityTerm(39, household.Has4OrMoreDrivers.ToFlag()); alternative.AddUtilityTerm(5, household.Has1OrLessFullOrPartTimeWorkers.ToFlag()); alternative.AddUtilityTerm(8, household.HouseholdTotals.UniversityStudentsPerDrivingAgeMembers); alternative.AddUtilityTerm(9, household.HouseholdTotals.DrivingAgeStudentsPerDrivingAgeMembers); alternative.AddUtilityTerm(41, household.Has0To25KIncome.ToFlag()); alternative.AddUtilityTerm(45, household.HasMissingIncome.ToFlag()); alternative.AddUtilityTerm(19, discretionaryIncome); alternative.AddUtilityTerm(17, workTourLogsumDifference * household.HasMoreDriversThan1.ToFlag()); alternative.AddUtilityTerm(23, Math.Log(1 + household.ResidenceParcel.ParkingOffStreetPaidDailyPriceBuffer2 / 100) * household.HasMoreDriversThan1.ToFlag()); alternative.AddUtilityTerm(46, intrDens); alternative.AddUtilityTerm(35, (youngestAge > 70).ToFlag()); alternative.AddUtilityTerm(36, (oldestAge < 35).ToFlag()); alternative.AddUtilityTerm(48, household.HasChildrenUnder16.ToFlag()); // 2 AUTOS alternative = choiceProbabilityCalculator.GetAlternative(2, true, choice == 2); alternative.Choice = 2; alternative.AddUtilityTerm(50, household.Has1Driver.ToFlag()); alternative.AddUtilityTerm(51, household.Has3Drivers.ToFlag()); alternative.AddUtilityTerm(52, household.Has4OrMoreDrivers.ToFlag()); alternative.AddUtilityTerm(5, household.Has2OrLessFullOrPartTimeWorkers.ToFlag()); alternative.AddUtilityTerm(17, workTourLogsumDifference * household.HasMoreDriversThan2.ToFlag()); alternative.AddUtilityTerm(23, Math.Log(1 + household.ResidenceParcel.ParkingOffStreetPaidDailyPriceBuffer2 / 100) * household.HasMoreDriversThan2.ToFlag()); alternative.AddUtilityTerm(27, ruralFlag); // 3 AUTOS alternative = choiceProbabilityCalculator.GetAlternative(3, true, choice == 3); alternative.Choice = 3; alternative.AddUtilityTerm(70, household.Has1Driver.ToFlag()); alternative.AddUtilityTerm(71, household.Has2Drivers.ToFlag()); alternative.AddUtilityTerm(72, household.Has4OrMoreDrivers.ToFlag()); alternative.AddUtilityTerm(5, household.Has3OrLessFullOrPartTimeWorkers.ToFlag()); alternative.AddUtilityTerm(91, household.HouseholdTotals.PartTimeWorkersPerDrivingAgeMembers); alternative.AddUtilityTerm(92, household.HouseholdTotals.RetiredAdultsPerDrivingAgeMembers); alternative.AddUtilityTerm(93, household.HouseholdTotals.UniversityStudentsPerDrivingAgeMembers); alternative.AddUtilityTerm(94, household.HouseholdTotals.DrivingAgeStudentsPerDrivingAgeMembers); alternative.AddUtilityTerm(96, household.HouseholdTotals.ChildrenUnder5PerDrivingAgeMembers); alternative.AddUtilityTerm(73, household.Has0To25KIncome.ToFlag()); alternative.AddUtilityTerm(75, household.Has100KPlusIncome.ToFlag()); alternative.AddUtilityTerm(76, household.HasMissingIncome.ToFlag()); alternative.AddUtilityTerm(17, workTourLogsumDifference * household.HasMoreDriversThan3.ToFlag()); alternative.AddUtilityTerm(23, Math.Log(1 + household.ResidenceParcel.ParkingOffStreetPaidDailyPriceBuffer2 / 100) * household.HasMoreDriversThan3.ToFlag()); alternative.AddUtilityTerm(79, ruralFlag); // 4+ AUTOS alternative = choiceProbabilityCalculator.GetAlternative(4, true, choice == 4); alternative.Choice = 4; alternative.AddUtilityTerm(100, household.Has1Driver.ToFlag()); alternative.AddUtilityTerm(101, household.Has2Drivers.ToFlag()); alternative.AddUtilityTerm(102, household.Has3Drivers.ToFlag()); alternative.AddUtilityTerm(5, household.Has4OrLessFullOrPartTimeWorkers.ToFlag()); alternative.AddUtilityTerm(91, household.HouseholdTotals.PartTimeWorkersPerDrivingAgeMembers); alternative.AddUtilityTerm(92, household.HouseholdTotals.RetiredAdultsPerDrivingAgeMembers); alternative.AddUtilityTerm(93, household.HouseholdTotals.UniversityStudentsPerDrivingAgeMembers); alternative.AddUtilityTerm(94, household.HouseholdTotals.DrivingAgeStudentsPerDrivingAgeMembers); alternative.AddUtilityTerm(96, household.HouseholdTotals.ChildrenUnder5PerDrivingAgeMembers); alternative.AddUtilityTerm(107, household.Has0To25KIncome.ToFlag()); alternative.AddUtilityTerm(108, household.Has50To75KIncome.ToFlag()); alternative.AddUtilityTerm(109, household.Has75KPlusIncome.ToFlag()); alternative.AddUtilityTerm(110, household.HasMissingIncome.ToFlag()); alternative.AddUtilityTerm(17, workTourLogsumDifference * household.HasMoreDriversThan4.ToFlag()); alternative.AddUtilityTerm(23, Math.Log(1 + household.ResidenceParcel.ParkingOffStreetPaidDailyPriceBuffer2 / 100) * household.HasMoreDriversThan4.ToFlag()); alternative.AddUtilityTerm(111, ruralFlag); }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, ITourWrapper tour, IEnumerable <dynamic> pathTypeModels, IParcelWrapper destinationParcel, int householdCars, int choice = Constants.DEFAULT_VALUE) { var household = tour.Household; var householdTotals = household.HouseholdTotals; var personDay = tour.PersonDay; var person = tour.Person; // household inputs var childrenUnder5 = householdTotals.ChildrenUnder5; var childrenAge5Through15 = householdTotals.ChildrenAge5Through15; // var nonworkingAdults = householdTotals.NonworkingAdults; // var retiredAdults = householdTotals.RetiredAdults; var onePersonHouseholdFlag = household.IsOnePersonHousehold.ToFlag(); var twoPersonHouseholdFlag = household.IsTwoPersonHousehold.ToFlag(); var noCarsInHouseholdFlag = household.GetFlagForNoCarsInHousehold(householdCars); var carsLessThanDriversFlag = household.GetFlagForCarsLessThanDrivers(householdCars); var carsLessThanWorkersFlag = household.GetFlagForCarsLessThanWorkers(householdCars); var income0To25KFlag = household.Has0To25KIncome.ToFlag(); // person inputs var maleFlag = person.IsMale.ToFlag(); var ageBetween51And98Flag = person.AgeIsBetween51And98.ToFlag(); var originParcel = tour.OriginParcel; var parkingDuration = ChoiceModelUtility.GetParkingDuration(person.IsFulltimeWorker); // parking at work is free if no paid parking at work and tour goes to usual workplace var destinationParkingCost = (Global.Configuration.ShouldRunPayToParkAtWorkplaceModel && tour.Person.UsualWorkParcel != null && destinationParcel == tour.Person.UsualWorkParcel && person.PaidParkingAtWorkplace == 0) ? 0.0 : destinationParcel.ParkingCostBuffer1(parkingDuration); double escortPercentage; double nonEscortPercentage; ChoiceModelUtility.SetEscortPercentages(personDay, out escortPercentage, out nonEscortPercentage); // var timeWindow = (originParcel == tour.Household.ResidenceParcel) ? personDay.TimeWindow : tour.ParentTour.TimeWindow; // var longestWindow = timeWindow.MaxAvailableMinutesAfter(1); // var totalWindow = timeWindow.TotalAvailableMinutesAfter(1); // var expectedDurationCurrentTour = person.IsFulltimeWorker ? Global.Settings.Times.EightHours : Global.Settings.Times.FourHours; // var expectedDurationOtherTours = (personDay.TotalTours - personDay.TotalSimulatedTours) * Global.Settings.Times.TwoHours; // var expectedDurationStops = (Math.Min(personDay.TotalStops,1) - Math.Min(personDay.TotalSimulatedStops,1)) * Global.Settings.Times.OneHour; // var totalExpectedDuration = expectedDurationCurrentTour + expectedDurationOtherTours + expectedDurationStops; foreach (var pathTypeModel in pathTypeModels) { var mode = pathTypeModel.Mode; var generalizedTime = pathTypeModel.GeneralizedTimeLogsum; // var travelTime = pathTypeModel.PathTime; // var travelCost = pathTypeModel.PathCost; var available = pathTypeModel.Available; //&& (travelTime < longestWindow); var alternative = choiceProbabilityCalculator.GetAlternative(mode, available, choice == mode); alternative.Choice = mode; alternative.AddNestedAlternative(_nestedAlternativeIds[pathTypeModel.Mode], _nestedAlternativeIndexes[pathTypeModel.Mode], THETA_PARAMETER); // if (mode == Global.Settings.Modes.ParkAndRide) { // Console.WriteLine("Park and ride logsum = {0}", generalizedTimeLogsum); // } if (!available) { continue; } alternative.AddUtilityTerm(2, generalizedTime * tour.TimeCoefficient); // alternative.AddUtility(3, Math.Log(1.0 - travelTime / longestWindow)); // alternative.AddUtility(4, travelTime < longestWindow - expectedDurationCurrentTour ? Math.Log(1.0 - travelTime / (longestWindow - expectedDurationCurrentTour)) : 0); // alternative.AddUtility(5, travelTime < longestWindow - expectedDurationCurrentTour ? 0 : 1); // alternative.AddUtility(6, travelTime < totalWindow - totalExpectedDuration ? Math.Log(1.0 - travelTime / (totalWindow - totalExpectedDuration)) : 0); // alternative.AddUtility(7, travelTime < totalWindow - totalExpectedDuration ? 0 : 1); // var vot = tour.TimeCoefficient / tour.CostCoefficient; 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.AddUtility(123, Math.Log(destinationParcel.StopsTransitBuffer1+1)); } else if (mode == Global.Settings.Modes.Transit) { alternative.AddUtilityTerm(20, 1); // 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.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)); } 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.AddUtility(34, nonworkingAdults + retiredAdults); alternative.AddUtilityTerm(35, ((double)pathTypeModel.PathDistance).AlmostEquals(0) ? 0 : Math.Log(pathTypeModel.PathDistance)); 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.AddUtility(34, nonworkingAdults + retiredAdults); alternative.AddUtilityTerm(35, ((double)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(169, destinationParcel.MixedUse4Index1()); alternative.AddUtilityTerm(168, destinationParcel.TotalEmploymentDensity1()); // alternative.AddUtility(167, destinationParcel.NetIntersectionDensity1()); // alternative.AddUtility(166, originParcel.NetIntersectionDensity1()); // alternative.AddUtility(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()); } else if (mode == Global.Settings.Modes.Walk) { alternative.AddUtilityTerm(71, maleFlag); // alternative.AddUtility(73, ageBetween51And98Flag); alternative.AddUtilityTerm(179, destinationParcel.MixedUse4Index1()); // alternative.AddUtility(178, destinationParcel.TotalEmploymentDensity1()); // alternative.AddUtility(177, destinationParcel.NetIntersectionDensity1()); // alternative.AddUtility(176, originParcel.NetIntersectionDensity1()); // alternative.AddUtility(175, originParcel.HouseholdDensity1()); alternative.AddUtilityTerm(179, originParcel.MixedUse4Index1()); } } }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, ITourWrapper tour, IHouseholdDayWrapper householdDay, int sampleSize, IParcelWrapper choice = null) { // var household = tour.Household; IPersonWrapper person = tour.Person; IPersonDayWrapper personDay = tour.PersonDay; // var totalAvailableMinutes = // tour.ParentTour == null // ? personDay.TimeWindow.TotalAvailableMinutes(1, Global.Settings.Times.MinutesInADay) // : tour.ParentTour.TimeWindow.TotalAvailableMinutes(1, Global.Settings.Times.MinutesInADay); TimeWindow timeWindow = new TimeWindow(); if (tour.JointTourSequence > 0) { foreach (PersonDayWrapper pDay in householdDay.PersonDays) { ITourWrapper tInJoint = pDay.Tours.Find(t => t.JointTourSequence == tour.JointTourSequence); if (!(tInJoint == null)) { // set jointTour time window timeWindow.IncorporateAnotherTimeWindow(tInJoint.PersonDay.TimeWindow); } } } else if (tour.ParentTour == null) { timeWindow.IncorporateAnotherTimeWindow(personDay.TimeWindow); } timeWindow.SetBusyMinutes(Global.Settings.Times.EndOfRelevantWindow, Global.Settings.Times.MinutesInADay + 1); int maxAvailableMinutes = (tour.JointTourSequence > 0 || tour.ParentTour == null) ? timeWindow.MaxAvailableMinutesAfter(Global.Settings.Times.FiveAM) : tour.ParentTour.DestinationDepartureTime - tour.ParentTour.DestinationArrivalTime; // var hoursAvailableInverse = // tour.IsHomeBasedTour // ? (personDay.HomeBasedTours - personDay.SimulatedHomeBasedTours + 1) / (Math.Max(totalAvailableMinutes - 360, 30) / 60D) // : 1 / (Math.Max(totalAvailableMinutes, 1) / 60D); int fastestAvailableTimeOfDay = tour.IsHomeBasedTour || tour.ParentTour == null ? 1 : tour.ParentTour.DestinationArrivalTime + (tour.ParentTour.DestinationDepartureTime - tour.ParentTour.DestinationArrivalTime) / 2; int tourCategory = tour.GetTourCategory(); // var primaryFlag = ChoiceModelUtility.GetPrimaryFlag(tourCategory); int secondaryFlag = ChoiceModelUtility.GetSecondaryFlag(tourCategory); ChoiceModelUtility.DrawRandomTourTimePeriodsActum(tour, tourCategory); int segment = Global.ContainerDaySim.GetInstance <SamplingWeightsSettingsFactory>().SamplingWeightsSettings.GetTourDestinationSegment(tour.DestinationPurpose, tour.IsHomeBasedTour ? Global.Settings.TourPriorities.HomeBasedTour : Global.Settings.TourPriorities.WorkBasedTour, Global.Settings.Modes.Sov, person.PersonType); DestinationSampler destinationSampler = new DestinationSampler(choiceProbabilityCalculator, segment, sampleSize, choice, tour.OriginParcel); TourDestinationUtilities tourDestinationUtilities = new TourDestinationUtilities(tour, sampleSize, secondaryFlag, personDay.GetIsWorkOrSchoolPattern().ToFlag(), personDay.GetIsOtherPattern().ToFlag(), fastestAvailableTimeOfDay, maxAvailableMinutes); destinationSampler.SampleTourDestinations(tourDestinationUtilities); }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, IPersonDayWrapper personDay, DayPattern choice = null) { var household = personDay.Household; var residenceParcel = household.ResidenceParcel; var person = personDay.Person; var carsPerDriver = household.GetCarsPerDriver(); var mixedDensity = residenceParcel.MixedUse3Index2(); var intersectionDensity = residenceParcel.IntersectionDensity34Minus1Buffer2(); var purposeLogsums = new double[Global.Settings.Purposes.TotalPurposes]; var atUsualLogsums = new double[3]; var carOwnership = person.GetCarOwnershipSegment(); var votSegment = person.Household.GetVotALSegment(); var transitAccess = residenceParcel.TransitAccessSegment(); if (person.UsualWorkParcel == null || person.UsualWorkParcelId == household.ResidenceParcelId) { purposeLogsums[Global.Settings.Purposes.Work] = 0; } else { var destinationArrivalTime = ChoiceModelUtility.GetDestinationArrivalTime(Global.Settings.Models.WorkTourModeModel); var destinationDepartureTime = ChoiceModelUtility.GetDestinationDepartureTime(Global.Settings.Models.WorkTourModeModel); var nestedAlternative = Global.ChoiceModelSession.Get <WorkTourModeModel>().RunNested(personDay, residenceParcel, person.UsualWorkParcel, destinationArrivalTime, destinationDepartureTime, household.VehiclesAvailable); purposeLogsums[Global.Settings.Purposes.Work] = nestedAlternative == null ? 0 : nestedAlternative.ComputeLogsum(); atUsualLogsums[Global.Settings.Purposes.Work] = Global.AggregateLogsums[person.UsualWorkParcel.ZoneId][Global.Settings.Purposes.HomeBasedComposite][carOwnership][votSegment][person.UsualWorkParcel.TransitAccessSegment()]; } if (person.UsualSchoolParcel == null || person.UsualSchoolParcelId == household.ResidenceParcelId) { purposeLogsums[Global.Settings.Purposes.School] = 0; } else { var destinationArrivalTime = ChoiceModelUtility.GetDestinationArrivalTime(Global.Settings.Models.SchoolTourModeModel); var destinationDepartureTime = ChoiceModelUtility.GetDestinationDepartureTime(Global.Settings.Models.SchoolTourModeModel); var nestedAlternative = Global.ChoiceModelSession.Get <SchoolTourModeModel>().RunNested(personDay, residenceParcel, person.UsualSchoolParcel, destinationArrivalTime, destinationDepartureTime, household.VehiclesAvailable); purposeLogsums[Global.Settings.Purposes.School] = nestedAlternative == null ? 0 : nestedAlternative.ComputeLogsum(); atUsualLogsums[Global.Settings.Purposes.School] = Global.AggregateLogsums[person.UsualSchoolParcel.ZoneId][Global.Settings.Purposes.HomeBasedComposite][carOwnership][votSegment][person.UsualSchoolParcel.TransitAccessSegment()]; } var compositeLogsum = Global.AggregateLogsums[household.ResidenceZoneId][Global.Settings.Purposes.HomeBasedComposite][carOwnership][votSegment][transitAccess]; purposeLogsums[Global.Settings.Purposes.Escort] = Global.AggregateLogsums[household.ResidenceZoneId][Global.Settings.Purposes.Escort][carOwnership][votSegment][transitAccess]; purposeLogsums[Global.Settings.Purposes.PersonalBusiness] = Global.AggregateLogsums[household.ResidenceZoneId][Global.Settings.Purposes.PersonalBusiness][carOwnership][votSegment][transitAccess]; purposeLogsums[Global.Settings.Purposes.Shopping] = Global.AggregateLogsums[household.ResidenceZoneId][Global.Settings.Purposes.Shopping][carOwnership][votSegment][transitAccess]; purposeLogsums[Global.Settings.Purposes.Meal] = Global.AggregateLogsums[household.ResidenceZoneId][Global.Settings.Purposes.Meal][carOwnership][votSegment][transitAccess]; purposeLogsums[Global.Settings.Purposes.Social] = Global.AggregateLogsums[household.ResidenceZoneId][Global.Settings.Purposes.Social][carOwnership][votSegment][transitAccess]; purposeLogsums[Global.Settings.Purposes.Recreation] = compositeLogsum; purposeLogsums[Global.Settings.Purposes.Medical] = compositeLogsum; for (var xPurpose = Global.Settings.Purposes.Work; xPurpose <= Global.Settings.Purposes.Social + 10; xPurpose++) { // extra components 1-5 are for 2,3,4,5,6 tour purposes // extra components 6-10 are for 2,3,4,5,6 stop puroposes // recode purpose to match coefficients var purpose = xPurpose <= Global.Settings.Purposes.Social ? xPurpose : xPurpose <= Global.Settings.Purposes.Social + 5 ? Global.Settings.Purposes.Social + 1 : Global.Settings.Purposes.Social + 2; // get correct multiplier on coefficients. var xMultiplier = xPurpose <= Global.Settings.Purposes.Social ? 1.0 : xPurpose <= Global.Settings.Purposes.Social + 5 ? Math.Log(xPurpose - Global.Settings.Purposes.Social + 1) : Math.Log(xPurpose - Global.Settings.Purposes.Social - 5 + 1); choiceProbabilityCalculator.CreateUtilityComponent(xPurpose); var component = choiceProbabilityCalculator.GetUtilityComponent(xPurpose); component.AddUtilityTerm(100 * purpose + 51, xMultiplier * person.IsFulltimeWorker.ToFlag()); component.AddUtilityTerm(100 * purpose + 2, xMultiplier * person.IsPartTimeWorker.ToFlag()); component.AddUtilityTerm(100 * purpose + 3, xMultiplier * person.IsRetiredAdult.ToFlag()); component.AddUtilityTerm(100 * purpose + 4, xMultiplier * person.IsNonworkingAdult.ToFlag()); component.AddUtilityTerm(100 * purpose + 5, xMultiplier * person.IsUniversityStudent.ToFlag()); component.AddUtilityTerm(100 * purpose + 6, xMultiplier * person.IsDrivingAgeStudent.ToFlag()); component.AddUtilityTerm(100 * purpose + 7, xMultiplier * person.IsChildAge5Through15.ToFlag()); component.AddUtilityTerm(100 * purpose + 8, xMultiplier * person.IsChildUnder5.ToFlag()); component.AddUtilityTerm(100 * purpose + 9, xMultiplier * household.Has0To25KIncome.ToFlag()); component.AddUtilityTerm(100 * purpose + 10, xMultiplier * household.Has25To45KIncome.ToFlag()); component.AddUtilityTerm(100 * purpose + 11, xMultiplier * household.Has75KPlusIncome.ToFlag()); component.AddUtilityTerm(100 * purpose + 12, xMultiplier * carsPerDriver); component.AddUtilityTerm(100 * purpose + 13, xMultiplier * person.IsOnlyAdult().ToFlag()); component.AddUtilityTerm(100 * purpose + 14, xMultiplier * person.IsOnlyFullOrPartTimeWorker().ToFlag()); component.AddUtilityTerm(100 * purpose + 15, xMultiplier * 0); component.AddUtilityTerm(100 * purpose + 16, xMultiplier * person.IsFemale.ToFlag() * person.IsAdult.ToFlag() * (!household.HasChildrenUnder16).ToFlag()); component.AddUtilityTerm(100 * purpose + 17, xMultiplier * person.IsFemale.ToFlag() * person.IsAdult.ToFlag() * household.HasChildrenUnder5.ToFlag()); component.AddUtilityTerm(100 * purpose + 18, xMultiplier * person.IsFemale.ToFlag() * person.IsAdult.ToFlag() * household.HasChildrenAge5Through15.ToFlag()); component.AddUtilityTerm(100 * purpose + 19, xMultiplier * person.IsMale.ToFlag() * person.IsAdult.ToFlag() * household.HasChildrenUnder5.ToFlag()); component.AddUtilityTerm(100 * purpose + 20, xMultiplier * person.IsMale.ToFlag() * person.IsAdult.ToFlag() * household.HasChildrenAge5Through15.ToFlag()); component.AddUtilityTerm(100 * purpose + 21, xMultiplier * person.AgeIsBetween18And25.ToFlag()); component.AddUtilityTerm(100 * purpose + 22, xMultiplier * person.AgeIsBetween26And35.ToFlag()); component.AddUtilityTerm(100 * purpose + 23, xMultiplier * person.AgeIsBetween51And65.ToFlag()); component.AddUtilityTerm(100 * purpose + 24, xMultiplier * person.WorksAtHome.ToFlag()); component.AddUtilityTerm(100 * purpose + 25, xMultiplier * mixedDensity); component.AddUtilityTerm(100 * purpose + 26, xMultiplier * intersectionDensity); component.AddUtilityTerm(100 * purpose + 27, xMultiplier * purposeLogsums[purpose]); component.AddUtilityTerm(100 * purpose + 28, xMultiplier * person.TransitPassOwnership); } // tour utility var tourComponentIndex = Global.Settings.Purposes.Social + 11; choiceProbabilityCalculator.CreateUtilityComponent(tourComponentIndex); var tourComponent = choiceProbabilityCalculator.GetUtilityComponent(tourComponentIndex); tourComponent.AddUtilityTerm(1401, carsPerDriver); tourComponent.AddUtilityTerm(1402, person.WorksAtHome.ToFlag()); tourComponent.AddUtilityTerm(1403, mixedDensity); tourComponent.AddUtilityTerm(1404, mixedDensity * person.IsChildAge5Through15.ToFlag()); tourComponent.AddUtilityTerm(1405, compositeLogsum); tourComponent.AddUtilityTerm(1406, person.TransitPassOwnership); // stop utility var stopComponentIndex = Global.Settings.Purposes.Social + 12; choiceProbabilityCalculator.CreateUtilityComponent(stopComponentIndex); var stopComponent = choiceProbabilityCalculator.GetUtilityComponent(stopComponentIndex); stopComponent.AddUtilityTerm(1411, carsPerDriver); stopComponent.AddUtilityTerm(1412, person.WorksAtHome.ToFlag()); stopComponent.AddUtilityTerm(1413, mixedDensity); stopComponent.AddUtilityTerm(1414, mixedDensity * person.IsChildAge5Through15.ToFlag()); stopComponent.AddUtilityTerm(1415, compositeLogsum); stopComponent.AddUtilityTerm(1416, person.TransitPassOwnership); for (var alternativeIndex = 0; alternativeIndex < TOTAL_ALTERNATIVES; alternativeIndex++) { var dayPattern = _dayPatterns[alternativeIndex]; var available = // work tours and stops only available for workers (person.IsWorker || (dayPattern.WorkTours <= 0 && dayPattern.WorkStops <= 0)) && // school tours and stops only available for students with usual school parcel not at home ((person.IsStudent && person.UsualSchoolParcel != null && person.UsualSchoolParcel != person.Household.ResidenceParcel) || (dayPattern.SchoolTours <= 0 && dayPattern.SchoolStops <= 0)) && // school stops not available if usual school parcel is same as usual work parcel ((person.IsStudent && person.UsualSchoolParcel != null && person.UsualSchoolParcel != person.UsualWorkParcel) || (dayPattern.SchoolStops <= 0)); var alternative = choiceProbabilityCalculator.GetAlternative(alternativeIndex, available, choice != null && choice.Equals(dayPattern)); if (!Global.Configuration.IsInEstimationMode && !alternative.Available) { continue; } alternative.Choice = dayPattern; // components for the purposes for (var purpose = Global.Settings.Purposes.Work; purpose <= Global.Settings.Purposes.Social; purpose++) { if (dayPattern.Tours[purpose] > 0 || dayPattern.Stops[purpose] > 0) { alternative.AddUtilityComponent(choiceProbabilityCalculator.GetUtilityComponent(purpose)); if (dayPattern.Tours[purpose] > 0) { alternative.AddUtilityTerm(100 * purpose, 1); // tour purpose ASC alternative.AddUtilityTerm(100 * purpose + 29, purposeLogsums[purpose]); // tour purpose logsum alternative.AddUtilityTerm(100 * purpose + 30, person.PaidParkingAtWorkplace); // only use for work purpose } if (dayPattern.Stops[purpose] > 0) { alternative.AddUtilityTerm(100 * purpose + 1, 1); // stop purpose ASC alternative.AddUtilityTerm(100 * purpose + 31, purposeLogsums[purpose]); // stop purpose logsum } if (Global.Configuration.IsInEstimationMode) { alternative.AddUtilityTerm(100 * purpose + 32, 1 - person.PaperDiary); alternative.AddUtilityTerm(100 * purpose + 33, person.ProxyResponse); } } } // multiple tour purposes component if (dayPattern.TotalTours > 1) { alternative.AddUtilityComponent(choiceProbabilityCalculator.GetUtilityComponent(Global.Settings.Purposes.Social + (dayPattern.TotalTours - 1))); } // multiple stop purposes component if (dayPattern.TotalStops > 1) { alternative.AddUtilityComponent(choiceProbabilityCalculator.GetUtilityComponent(Global.Settings.Purposes.Social + 5 + (dayPattern.TotalStops - 1))); } for (var tourPurpose = Global.Settings.Purposes.Work; tourPurpose <= Global.Settings.Purposes.Social; tourPurpose++) { for (var stopPurpose = Global.Settings.Purposes.Work; stopPurpose <= Global.Settings.Purposes.Social - 1; stopPurpose++) { if (tourPurpose > Global.Settings.Purposes.School && stopPurpose <= Global.Settings.Purposes.School) { continue; } if (dayPattern.Tours[tourPurpose] > 0 && dayPattern.Stops[stopPurpose] > 0) { alternative.AddUtilityTerm(1000 + 10 * tourPurpose + stopPurpose, 1); // tour-stop comb. utility } } } for (var tourPurpose = Global.Settings.Purposes.Work; tourPurpose <= Global.Settings.Purposes.School; tourPurpose++) { if (dayPattern.Tours[tourPurpose] == 1 && dayPattern.TotalStops >= 1) { alternative.AddUtilityTerm(1000 + 10 * tourPurpose, purposeLogsums[tourPurpose]); // usual location logsum x presence of stops in work or school pattern alternative.AddUtilityTerm(1000 + 10 * tourPurpose + 8, compositeLogsum); // home aggregate logsum x presence of stops in work or school pattern alternative.AddUtilityTerm(1000 + 10 * tourPurpose + 9, atUsualLogsums[tourPurpose]); // at usual location aggregate logsum x presence of stops in work or school pattern } } for (var tourPurpose = Global.Settings.Purposes.Work; tourPurpose <= Global.Settings.Purposes.Social - 2; tourPurpose++) { for (var tourPurpose2 = tourPurpose + 1; tourPurpose2 <= Global.Settings.Purposes.Social; tourPurpose2++) { if (dayPattern.Tours[tourPurpose] > 0 && dayPattern.Tours[tourPurpose2] > 0) { alternative.AddUtilityTerm(1100 + 10 * tourPurpose + tourPurpose2, 1); // tour-tour comb. utility } } } for (var stopPurpose = Global.Settings.Purposes.Work; stopPurpose <= Global.Settings.Purposes.Social - 2; stopPurpose++) { for (var stopPurpose2 = stopPurpose + 1; stopPurpose2 <= Global.Settings.Purposes.Social; stopPurpose2++) { if (dayPattern.Stops[stopPurpose] > 0 && dayPattern.Stops[stopPurpose2] > 0) { alternative.AddUtilityTerm(1200 + 10 * stopPurpose + stopPurpose2, 1); // stop-stop comb. utility } } } if (dayPattern.TotalTours > 0 && dayPattern.TotalStops > 0) { var totalStops = dayPattern.TotalStops; if (totalStops > 3) { totalStops = 3; } alternative.AddUtilityTerm(1300 + 10 * dayPattern.TotalTours + totalStops, 1); // nttour-ntstop utility } if (dayPattern.TotalTours - dayPattern.Tours[Global.Settings.Purposes.Work] - dayPattern.Tours[Global.Settings.Purposes.School] > 0) { // tour utility alternative.AddUtilityComponent(choiceProbabilityCalculator.GetUtilityComponent(tourComponentIndex)); } if (dayPattern.TotalStops - dayPattern.Stops[Global.Settings.Purposes.Work] - dayPattern.Stops[Global.Settings.Purposes.School] > 0) { // stop utility alternative.AddUtilityComponent(choiceProbabilityCalculator.GetUtilityComponent(stopComponentIndex)); } } }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, IPersonDayWrapper personDay, IHouseholdDayWrapper householdDay, int maxPurpose, int choice = Constants.DEFAULT_VALUE) { IEnumerable <PersonDayWrapper> orderedPersonDays = householdDay.PersonDays.OrderBy(p => p.GetJointTourParticipationPriority()).ToList().Cast <PersonDayWrapper>(); var person = personDay.Person; var household = householdDay.Household; var residenceParcel = household.ResidenceParcel; var carOwnership = household.VehiclesAvailable == 0 ? Global.Settings.CarOwnerships.NoCars : household.VehiclesAvailable < household.HouseholdTotals.DrivingAgeMembers ? Global.Settings.CarOwnerships.LtOneCarPerAdult : Global.Settings.CarOwnerships.OneOrMoreCarsPerAdult; var noCarsFlag = FlagUtility.GetNoCarsFlag(carOwnership); var carCompetitionFlag = FlagUtility.GetCarCompetitionFlag(carOwnership); var votALSegment = household.GetVotALSegment(); var transitAccessSegment = household.ResidenceParcel.TransitAccessSegment(); var personalBusinessAggregateLogsum = Global.AggregateLogsums[household.ResidenceParcel.ZoneId] [Global.Settings.Purposes.PersonalBusiness][carOwnership][votALSegment][transitAccessSegment]; var shoppingAggregateLogsum = Global.AggregateLogsums[household.ResidenceParcel.ZoneId] [Global.Settings.Purposes.Shopping][carOwnership][votALSegment][transitAccessSegment]; var mealAggregateLogsum = Global.AggregateLogsums[household.ResidenceParcel.ZoneId] [Global.Settings.Purposes.Meal][carOwnership][votALSegment][transitAccessSegment]; var socialAggregateLogsum = Global.AggregateLogsums[household.ResidenceParcel.ZoneId] [Global.Settings.Purposes.Social][carOwnership][votALSegment][transitAccessSegment]; var totalAggregateLogsum = Global.AggregateLogsums[household.ResidenceParcel.ZoneId] [Global.Settings.Purposes.HomeBasedComposite][carOwnership][votALSegment][transitAccessSegment]; // var recreationAggregateLogsum = Global.AggregateLogsums[household.ResidenceParcel.ZoneId] // [Global.Settings.Purposes.Recreation][carOwnership][votALSegment][transitAccessSegment]; // var medicalAggregateLogsum = Global.AggregateLogsums[household.ResidenceParcel.ZoneId] // [Global.Settings.Purposes.Medical][carOwnership][votALSegment][transitAccessSegment]; int[] nonMandPerstype = new int[8]; int[] mandPerstype = new int[8]; //int mandatoryAdult=0; //int mandatoryChild=0; //int nonMandatoryWorker=0; //int nonMandatoryNonWorker=0; //int nonMandatoryRetired=0; //int nonMandatoryChild=0; int countNonMandatory = 0; int countMandatory = 0; double workLogsum = 0; double schoolLogsum = 0; //int worksAtHome=0; int countWorkingAtHome = 0; var workDestinationArrivalTime = 0; var workDestinationDepartureTime = 0; int numStopPurposes = 0; int numTourPurposes = 0; numTourPurposes = (personDay.CreatedEscortTours > 1).ToFlag() + (personDay.CreatedShoppingTours > 1).ToFlag() + (personDay.CreatedMealTours > 1).ToFlag() + (personDay.CreatedPersonalBusinessTours > 1).ToFlag() + (personDay.CreatedSocialTours > 1).ToFlag() + (personDay.CreatedRecreationTours > 1).ToFlag() + (personDay.CreatedMedicalTours > 1).ToFlag(); numStopPurposes = (personDay.SimulatedEscortStops > 1).ToFlag() + (personDay.SimulatedShoppingStops > 1).ToFlag() + (personDay.SimulatedMealStops > 1).ToFlag() + (personDay.SimulatedPersonalBusinessStops > 1).ToFlag() + (personDay.SimulatedSocialStops > 1).ToFlag() + (personDay.SimulatedRecreationStops > 1).ToFlag() + (personDay.SimulatedMedicalStops > 1).ToFlag(); if (person.UsualWorkParcel == null || person.UsualWorkParcelId == household.ResidenceParcelId) { workLogsum = 0; } else { workDestinationArrivalTime = ChoiceModelUtility.GetDestinationArrivalTime(Global.Settings.Models.WorkTourModeModel); workDestinationDepartureTime = ChoiceModelUtility.GetDestinationDepartureTime(Global.Settings.Models.WorkTourModeModel); var nestedAlternative = Global.ChoiceModelSession.Get <WorkTourModeTimeModel>().RunNested(personDay, residenceParcel, person.UsualWorkParcel, workDestinationArrivalTime, workDestinationDepartureTime, household.VehiclesAvailable); workLogsum = nestedAlternative == null ? 0 : nestedAlternative.ComputeLogsum(); } if (person.UsualSchoolParcel == null || person.UsualSchoolParcelId == household.ResidenceParcelId) { schoolLogsum = 0; } else { var destinationArrivalTime = ChoiceModelUtility.GetDestinationArrivalTime(Global.Settings.Models.SchoolTourModeModel); var destinationDepartureTime = ChoiceModelUtility.GetDestinationDepartureTime(Global.Settings.Models.SchoolTourModeModel); var nestedAlternative = Global.ChoiceModelSession.Get <SchoolTourModeTimeModel>().RunNested(personDay, residenceParcel, person.UsualSchoolParcel, destinationArrivalTime, destinationDepartureTime, household.VehiclesAvailable); schoolLogsum = nestedAlternative == null ? 0 : nestedAlternative.ComputeLogsum(); } //if (personDay.WorksAtHomeFlag == 1) { // worksAtHome =1; //} int count = 0; foreach (PersonDayWrapper pDay in orderedPersonDays) { count++; if (count > 8) { break; } if (pDay.WorksAtHomeFlag == 1) { countWorkingAtHome++; } if (pDay.PatternType == 1) { countMandatory++; } if (pDay.PatternType == 2) { countNonMandatory++; } } // NONE_OR_HOME var alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.NoneOrHome, true, choice == Global.Settings.Purposes.NoneOrHome); alternative.Choice = Global.Settings.Purposes.NoneOrHome; //alternative.AddUtilityTerm(2, (personDay.GetTotalCreatedTours()== 2).ToFlag()); //alternative.AddUtilityTerm(3, (personDay.GetTotalCreatedTours()==3).ToFlag()); alternative.AddUtilityTerm(4, (personDay.GetTotalCreatedTours() >= 4).ToFlag()); alternative.AddUtilityTerm(5, (numStopPurposes >= 1).ToFlag()); alternative.AddUtilityTerm(6, (numTourPurposes >= 2).ToFlag()); alternative.AddUtilityTerm(7, personDay.CreatedWorkTours + personDay.CreatedSchoolTours); alternative.AddUtilityTerm(8, (personDay.JointTours)); alternative.AddUtilityTerm(9, Math.Log(1 + (workDestinationDepartureTime - workDestinationArrivalTime) / 60)); //alternative.AddUtilityTerm(10, (household.Size==1).ToFlag()); //alternative.AddNestedAlternative(11, 0, 200); // WORK alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Work, false, choice == Global.Settings.Purposes.Work); alternative.Choice = Global.Settings.Purposes.Work; alternative.AddUtilityTerm(198, 1); //alternative.AddNestedAlternative(12, 1, 200); // SCHOOL alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.School, false, choice == Global.Settings.Purposes.School); alternative.Choice = Global.Settings.Purposes.School; alternative.AddUtilityTerm(199, 1); //alternative.AddNestedAlternative(12, 1, 200); // ESCORT alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Escort, maxPurpose <= Global.Settings.Purposes.Escort && personDay.CreatedEscortTours > 0, choice == Global.Settings.Purposes.Escort); alternative.Choice = Global.Settings.Purposes.Escort; alternative.AddUtilityTerm(11, 1); alternative.AddUtilityTerm(12, (personDay.PatternType == 2).ToFlag()); alternative.AddUtilityTerm(13, personDay.JointTours); alternative.AddUtilityTerm(14, (personDay.EscortStops > 0).ToFlag()); alternative.AddUtilityTerm(15, (personDay.CreatedEscortTours > 1).ToFlag()); alternative.AddUtilityTerm(17, (household.HouseholdType == Global.Settings.HouseholdTypes.TwoPlusWorkerStudentAdultsWithChildren).ToFlag() + ( household.HouseholdType == Global.Settings.HouseholdTypes.TwoPlusAdultsOnePlusWorkersStudentsWithChildren).ToFlag()); alternative.AddUtilityTerm(20, (household.HouseholdType == Global.Settings.HouseholdTypes.OneAdultWithChildren).ToFlag()); alternative.AddUtilityTerm(25, (person.PersonType == Global.Settings.PersonTypes.PartTimeWorker).ToFlag()); alternative.AddUtilityTerm(28, (person.PersonType == Global.Settings.PersonTypes.ChildUnder5).ToFlag()); alternative.AddUtilityTerm(29, (person.PersonType == Global.Settings.PersonTypes.ChildAge5Through15).ToFlag()); alternative.AddUtilityTerm(31, (person.PersonType == Global.Settings.PersonTypes.UniversityStudent).ToFlag()); alternative.AddUtilityTerm(32, countMandatory); // alternative.AddUtilityTerm(33, personDay.CreatedWorkTours); //alternative.AddNestedAlternative(12, 1, 200); // PERSONAL_BUSINESS alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.PersonalBusiness, maxPurpose <= Global.Settings.Purposes.PersonalBusiness && personDay.CreatedPersonalBusinessTours > 0, choice == Global.Settings.Purposes.PersonalBusiness); alternative.Choice = Global.Settings.Purposes.PersonalBusiness; alternative.AddUtilityTerm(41, 1); alternative.AddUtilityTerm(42, (personDay.PatternType == 2).ToFlag()); alternative.AddUtilityTerm(43, (personDay.PersonalBusinessStops > 0).ToFlag()); alternative.AddUtilityTerm(44, personalBusinessAggregateLogsum); alternative.AddUtilityTerm(45, (household.HouseholdType == Global.Settings.HouseholdTypes.IndividualWorkerStudent).ToFlag()); alternative.AddUtilityTerm(46, (household.HouseholdType == Global.Settings.HouseholdTypes.IndividualNonworkerNonstudent).ToFlag()); alternative.AddUtilityTerm(47, (personDay.CreatedWorkTours + personDay.CreatedSchoolTours)); // SHOPPING alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Shopping, maxPurpose <= Global.Settings.Purposes.Shopping && personDay.CreatedShoppingTours > 0, choice == Global.Settings.Purposes.Shopping); alternative.Choice = Global.Settings.Purposes.Shopping; alternative.AddUtilityTerm(61, 1); alternative.AddUtilityTerm(52, (personDay.PatternType == 2).ToFlag()); alternative.AddUtilityTerm(54, (personDay.ShoppingStops > 0).ToFlag()); //alternative.AddUtilityTerm(55, Math.Log(1+person.Household.ResidenceParcel.EmploymentRetailBuffer2)); alternative.AddUtilityTerm(56, shoppingAggregateLogsum); alternative.AddUtilityTerm(57, (person.PersonType == Global.Settings.PersonTypes.RetiredAdult).ToFlag()); alternative.AddUtilityTerm(58, (household.HouseholdType == Global.Settings.HouseholdTypes.OnePlusWorkerStudentAdultsAndOnePlusNonworkerNonstudentAdultsWithoutChildren).ToFlag()); alternative.AddUtilityTerm(60, (household.HouseholdType == Global.Settings.HouseholdTypes.IndividualWorkerStudent).ToFlag()); alternative.AddUtilityTerm(69, (person.PersonType == Global.Settings.PersonTypes.UniversityStudent).ToFlag()); alternative.AddUtilityTerm(70, (household.Has100KPlusIncome).ToFlag()); // MEAL alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Meal, maxPurpose <= Global.Settings.Purposes.Meal && personDay.CreatedMealTours > 0, choice == Global.Settings.Purposes.Meal); alternative.Choice = Global.Settings.Purposes.Meal; alternative.AddUtilityTerm(71, 1); alternative.AddUtilityTerm(72, (personDay.PatternType == 2).ToFlag()); alternative.AddUtilityTerm(74, mealAggregateLogsum); alternative.AddUtilityTerm(80, (household.HouseholdType == Global.Settings.HouseholdTypes.IndividualWorkerStudent).ToFlag()); alternative.AddUtilityTerm(82, (household.HouseholdType == Global.Settings.HouseholdTypes.TwoPlusNonworkerNonstudentAdultsWithoutChildren).ToFlag()); alternative.AddUtilityTerm(85, (person.PersonType == Global.Settings.PersonTypes.RetiredAdult).ToFlag()); // SOCIAL alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Social, maxPurpose <= Global.Settings.Purposes.Social && personDay.CreatedSocialTours > 0, choice == Global.Settings.Purposes.Social); alternative.Choice = Global.Settings.Purposes.Social; alternative.AddUtilityTerm(111, 1); alternative.AddUtilityTerm(112, (personDay.PatternType == 2).ToFlag()); alternative.AddUtilityTerm(113, household.HouseholdTotals.ChildrenUnder16); //alternative.AddUtilityTerm(114, socialAggregateLogsum); alternative.AddUtilityTerm(115, Math.Log(1 + person.Household.ResidenceParcel.HouseholdsBuffer2)); alternative.AddUtilityTerm(122, (household.HouseholdType == Global.Settings.HouseholdTypes.TwoPlusNonworkerNonstudentAdultsWithoutChildren).ToFlag()); alternative.AddUtilityTerm(123, (person.PersonType == Global.Settings.PersonTypes.PartTimeWorker).ToFlag()); alternative.AddUtilityTerm(126, (person.PersonType == Global.Settings.PersonTypes.ChildUnder5).ToFlag()); alternative.AddUtilityTerm(127, (person.PersonType == Global.Settings.PersonTypes.ChildAge5Through15).ToFlag()); alternative.AddUtilityTerm(130, (person.PersonType == Global.Settings.PersonTypes.RetiredAdult).ToFlag()); // RECREATION alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Recreation, maxPurpose <= Global.Settings.Purposes.Recreation && personDay.CreatedRecreationTours > 0, choice == Global.Settings.Purposes.Recreation); alternative.Choice = Global.Settings.Purposes.Recreation; alternative.AddUtilityTerm(111, 1); alternative.AddUtilityTerm(112, (personDay.PatternType == 2).ToFlag()); alternative.AddUtilityTerm(113, household.HouseholdTotals.ChildrenUnder16); //alternative.AddUtilityTerm(114, totalAggregateLogsum); alternative.AddUtilityTerm(115, Math.Log(1 + person.Household.ResidenceParcel.HouseholdsBuffer2)); alternative.AddUtilityTerm(122, (household.HouseholdType == Global.Settings.HouseholdTypes.TwoPlusNonworkerNonstudentAdultsWithoutChildren).ToFlag()); alternative.AddUtilityTerm(123, (person.PersonType == Global.Settings.PersonTypes.PartTimeWorker).ToFlag()); alternative.AddUtilityTerm(126, (person.PersonType == Global.Settings.PersonTypes.ChildUnder5).ToFlag()); alternative.AddUtilityTerm(127, (person.PersonType == Global.Settings.PersonTypes.ChildAge5Through15).ToFlag()); alternative.AddUtilityTerm(128, (household.Has100KPlusIncome).ToFlag()); // MEDICAL alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Medical, maxPurpose <= Global.Settings.Purposes.Medical && personDay.CreatedMedicalTours > 0, choice == Global.Settings.Purposes.Medical); alternative.Choice = Global.Settings.Purposes.Medical; alternative.AddUtilityTerm(131, 1); alternative.AddUtilityTerm(132, Math.Log(1 + household.ResidenceParcel.EmploymentMedicalBuffer2)); alternative.AddUtilityTerm(133, (person.PersonType == Global.Settings.PersonTypes.RetiredAdult).ToFlag()); //alternative.AddNestedAlternative(11, 1, 60); }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, ITourWrapper tour, IEnumerable <PathTypeModel> pathTypeModels, IParcelWrapper destinationParcel, int choice = Constants.DEFAULT_VALUE) { var household = tour.Household; var householdTotals = household.HouseholdTotals; var person = tour.Person; var personDay = tour.PersonDay; // household inputs var income0To25KFlag = household.Has0To25KIncome.ToFlag(); var childrenUnder5 = householdTotals.ChildrenUnder5; var childrenAge5Through15 = householdTotals.ChildrenAge5Through15; var nonworkingAdults = householdTotals.NonworkingAdults; var retiredAdults = householdTotals.RetiredAdults; var onePersonHouseholdFlag = household.IsOnePersonHousehold.ToFlag(); var twoPersonHouseholdFlag = household.IsTwoPersonHousehold.ToFlag(); var noCarsInHouseholdFlag = household.GetFlagForNoCarsInHousehold(household.VehiclesAvailable); var carsLessThanDriversFlag = household.GetFlagForCarsLessThanDrivers(household.VehiclesAvailable); var carsLessThanWorkersFlag = household.GetFlagForCarsLessThanWorkers(household.VehiclesAvailable); // person inputs var maleFlag = person.IsMale.ToFlag(); var ageBetween51And98Flag = person.AgeIsBetween51And98.ToFlag(); // tour inputs var shoppingTourFlag = (tour.DestinationPurpose == Global.Settings.Purposes.Shopping).ToFlag(); var mealTourFlag = (tour.DestinationPurpose == Global.Settings.Purposes.Meal).ToFlag(); var socialOrRecreationTourFlag = (tour.DestinationPurpose == Global.Settings.Purposes.Social).ToFlag(); // remaining inputs var originParcel = tour.OriginParcel; var parkingDuration = ChoiceModelUtility.GetParkingDuration(person.IsFulltimeWorker); var destinationParkingCost = destinationParcel.ParkingCostBuffer1(parkingDuration); double escortPercentage; double nonEscortPercentage; ChoiceModelUtility.SetEscortPercentages(personDay, out escortPercentage, out nonEscortPercentage, true); foreach (var pathTypeModel in pathTypeModels) { var mode = pathTypeModel.Mode; var available = pathTypeModel.Mode != Global.Settings.Modes.ParkAndRide && pathTypeModel.Available; var generalizedTimeLogsum = pathTypeModel.GeneralizedTimeLogsum; var alternative = choiceProbabilityCalculator.GetAlternative(mode, available, choice == mode); alternative.Choice = mode; alternative.AddNestedAlternative(_nestedAlternativeIds[pathTypeModel.Mode], _nestedAlternativeIndexes[pathTypeModel.Mode], THETA_PARAMETER); if (!available) { continue; } alternative.AddUtilityTerm(2, generalizedTimeLogsum * tour.TimeCoefficient); if (mode == Global.Settings.Modes.Transit) { alternative.AddUtilityTerm(20, 1); alternative.AddUtilityTerm(21, noCarsInHouseholdFlag); alternative.AddUtilityTerm(120, shoppingTourFlag); // alternative.AddUtility(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)); } 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(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) { var class1Dist = Global.Configuration.PathImpedance_BikeUseTypeSpecificDistanceFractions ? ImpedanceRoster.GetValue("class1distance", mode, Global.Settings.PathTypes.FullNetwork, Global.Settings.ValueOfTimes.DefaultVot, tour.DestinationArrivalTime, originParcel, destinationParcel).Variable : 0; var class2Dist = Global.Configuration.PathImpedance_BikeUseTypeSpecificDistanceFractions ? ImpedanceRoster.GetValue("class2distance", mode, Global.Settings.PathTypes.FullNetwork, Global.Settings.ValueOfTimes.DefaultVot, tour.DestinationArrivalTime, originParcel, destinationParcel).Variable : 0; var 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(160, socialOrRecreationTourFlag); alternative.AddUtilityTerm(169, destinationParcel.MixedUse4Index1()); alternative.AddUtilityTerm(168, destinationParcel.TotalEmploymentDensity1()); // alternative.AddUtility(167, destinationParcel.NetIntersectionDensity1()); // alternative.AddUtility(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()); } else if (mode == Global.Settings.Modes.Walk) { alternative.AddUtilityTerm(73, ageBetween51And98Flag); alternative.AddUtilityTerm(171, mealTourFlag); alternative.AddUtilityTerm(172, socialOrRecreationTourFlag); // alternative.AddUtility(179, destinationParcel.MixedUse4Index1()); alternative.AddUtilityTerm(178, destinationParcel.HouseholdDensity1()); // alternative.AddUtility(177, destinationParcel.NetIntersectionDensity1()); // alternative.AddUtility(176, originParcel.NetIntersectionDensity1()); alternative.AddUtilityTerm(175, originParcel.HouseholdDensity1()); // alternative.AddUtility(174, originParcel.MixedUse4Index1()); } } }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, HouseholdWrapper household, int choice = Constants.DEFAULT_VALUE) { // var distanceToTransitCappedUnderQtrMile = household.ResidenceParcel.DistanceToTransitCappedUnderQtrMile(); // var distanceToTransitQtrToHalfMile = household.ResidenceParcel.DistanceToTransitQtrToHalfMile(); var foodRetailServiceMedicalLogBuffer1 = household.ResidenceParcel.FoodRetailServiceMedicalLogBuffer1(); var workTourLogsumDifference = 0D; // (full or part-time workers) full car ownership vs. no car ownership var schoolTourLogsumDifference = 0D; // (school) full car ownership vs. no car ownership // const double workTourOtherLogsumDifference = 0D; // (other workers) full car ownership vs. no car ownership // Stefan var netIncome = (household.Income / 1000.0) / 2.0; // in 1000s of DKK var userCost = 2.441 * 15.0; //annual cost to use 1 car in 1000s of DKK bool isInCopenhagenMunicipality = true; //household.ResidenceParcel.Municipality == 101; Need to change this after Municipality property is added to Actum parcel file int numberAdults = 0; int numberChildren = 0; int numberWorkers = 0; int sumAdultAges = 0; double averageAdultAge = 0.0; bool isMale = false; foreach (PersonWrapper person in household.Persons) { if (person.IsWorker && person.UsualWorkParcel != null && person.UsualWorkParcelId != household.ResidenceParcelId) { var destinationArrivalTime = ChoiceModelUtility.GetDestinationArrivalTime(Global.Settings.Models.WorkTourModeModel); var destinationDepartureTime = ChoiceModelUtility.GetDestinationDepartureTime(Global.Settings.Models.WorkTourModeModel); var nestedAlternative1 = Global.ChoiceModelSession.Get <WorkTourModeTimeModel>().RunNested(person, household.ResidenceParcel, person.UsualWorkParcel, destinationArrivalTime, destinationDepartureTime, household.HouseholdTotals.DrivingAgeMembers, 0.0); var nestedAlternative2 = Global.ChoiceModelSession.Get <WorkTourModeTimeModel>().RunNested(person, household.ResidenceParcel, person.UsualWorkParcel, destinationArrivalTime, destinationDepartureTime, 0, 0.0); workTourLogsumDifference += nestedAlternative1 == null ? 0 : nestedAlternative1.ComputeLogsum(); workTourLogsumDifference -= nestedAlternative2 == null ? 0 : nestedAlternative2.ComputeLogsum(); } if (person.IsDrivingAgeStudent && person.UsualSchoolParcel != null && person.UsualSchoolParcelId != household.ResidenceParcelId) { var destinationArrivalTime = ChoiceModelUtility.GetDestinationArrivalTime(Global.Settings.Models.SchoolTourModeModel); var destinationDepartureTime = ChoiceModelUtility.GetDestinationDepartureTime(Global.Settings.Models.SchoolTourModeModel); var nestedAlternative1 = Global.ChoiceModelSession.Get <SchoolTourModeTimeModel>().RunNested(person, household.ResidenceParcel, person.UsualSchoolParcel, destinationArrivalTime, destinationDepartureTime, household.HouseholdTotals.DrivingAgeMembers, 0.0); var nestedAlternative2 = Global.ChoiceModelSession.Get <SchoolTourModeTimeModel>().RunNested(person, household.ResidenceParcel, person.UsualSchoolParcel, destinationArrivalTime, destinationDepartureTime, 0, 0.0); schoolTourLogsumDifference += nestedAlternative1 == null ? 0 : nestedAlternative1.ComputeLogsum(); schoolTourLogsumDifference -= nestedAlternative2 == null ? 0 : nestedAlternative2.ComputeLogsum(); } if (person.Age >= 18) { numberAdults++; sumAdultAges = sumAdultAges + person.Age; isMale = person.IsMale; if (person.PersonType == Global.Settings.PersonTypes.FullTimeWorker //|| person.PersonType == Constants.PersonType.PART_TIME_WORKER ) { numberWorkers++; } } else { numberChildren++; } } averageAdultAge = sumAdultAges / Math.Max(numberAdults, 1); // var votSegment = household.VotALSegment; //var taSegment = household.ResidenceParcel.TransitAccessSegment(); //var aggregateLogsumDifference = // full car ownership vs. no car ownership // Global.AggregateLogsums[household.ResidenceZoneId][Global.Settings.Purposes.HomeBasedComposite][Global.Settings.CarOwnerships.OneOrMoreCarsPerAdult][votSegment][taSegment] - // Global.AggregateLogsums[household.ResidenceZoneId][Global.Settings.Purposes.HomeBasedComposite][Global.Settings.CarOwnerships.NoCars][votSegment][taSegment]; // 0 AUTOS var alternative = choiceProbabilityCalculator.GetAlternative(0, true, choice == 0); alternative.Choice = 0; alternative.AddUtilityTerm(14, Math.Log(Math.Max(netIncome, 1))); // 1 AUTO var beta010 = -6.59; var beta011 = 4.25; var beta012 = 5.53; var beta013 = 6.54; var beta014 = 1.17; var beta015 = 0.54; var beta016 = 0.81; var beta017 = 1.20; var beta018 = -0.54; var beta019 = 0.0; var beta020 = 0.45; var beta021 = 0.0; var beta022 = -0.04; var beta023 = 0.57; var beta024 = 0.18; var beta025 = -0.82; var stefanOneCarUtility = beta010 * 1.0 + beta011 * household.Has1Driver.ToFlag() + beta012 * household.Has2Drivers.ToFlag() + beta013 * (household.Has3Drivers || household.Has4OrMoreDrivers).ToFlag() + beta014 * Math.Log(Math.Max(netIncome - userCost, 1)) + beta015 * (numberChildren == 1).ToFlag() + beta016 * (numberChildren == 2).ToFlag() + beta017 * (numberChildren > 2).ToFlag() + beta018 * (numberAdults == 1 && !isMale).ToFlag() + beta019 * (numberAdults == 1 && isMale).ToFlag() + beta020 * averageAdultAge / 10.0 + beta021 * Math.Pow(averageAdultAge / 10.0, 2.0) + beta022 * 0 + //household.ResidenceParcel.PSearchTime16_17 + // Add this when new parcel variables with seach time are available beta023 * household.ResidenceParcel.DistanceToLocalBus + beta024 * household.ResidenceParcel.DistanceToExpressBus + beta025 * isInCopenhagenMunicipality.ToFlag() + 0; alternative = choiceProbabilityCalculator.GetAlternative(1, true, choice == 1); alternative.Choice = 1; //Stefan //alternative.AddUtilityTerm(10, 1.0); //alternative.AddUtilityTerm(11, household.Has1Driver.ToFlag()); //alternative.AddUtilityTerm(12, household.Has2Drivers.ToFlag()); //alternative.AddUtilityTerm(13, (household.Has3Drivers || household.Has4OrMoreDrivers).ToFlag()); //alternative.AddUtilityTerm(14, Math.Log(Math.Max(netIncome - userCost, 1))); //alternative.AddUtilityTerm(15, (numberChildren == 1).ToFlag()); //alternative.AddUtilityTerm(16, (numberChildren == 2).ToFlag()); //alternative.AddUtilityTerm(17, (numberChildren > 2).ToFlag()); //alternative.AddUtilityTerm(18, (numberAdults == 1 && !isMale).ToFlag()); //alternative.AddUtilityTerm(19, (numberAdults == 1 && isMale).ToFlag()); //alternative.AddUtilityTerm(20, averageAdultAge / 10.0); //alternative.AddUtilityTerm(21, Math.Pow(averageAdultAge / 10.0, 2.0)); ////alternative.AddUtilityTerm(22, household.ResidenceParcel.PSearchTime16_17); // Add this when new parcel variables with seach time are available //alternative.AddUtilityTerm(23, household.ResidenceParcel.DistanceToLocalBus); //alternative.AddUtilityTerm(24, household.ResidenceParcel.DistanceToExpressBus); //alternative.AddUtilityTerm(25, isInCopenhagenMunicipality.ToFlag()); alternative.AddUtilityTerm(26, stefanOneCarUtility); //this composite replaces above separate terms 10-25 alternative.AddUtilityTerm(27, workTourLogsumDifference); // instead of all Stefan's work-related and logsum variables //alternative.AddUtilityTerm(24, household.HouseholdTotals.RetiredAdultsPerDrivingAgeMembers); //alternative.AddUtilityTerm(25, household.HouseholdTotals.UniversityStudentsPerDrivingAgeMembers); //alternative.AddUtilityTerm(26, household.HouseholdTotals.DrivingAgeStudentsPerDrivingAgeMembers); //alternative.AddUtilityTerm(27, household.HouseholdTotals.HomeBasedPersonsPerDrivingAgeMembers); // 2+ AUTOS var beta040 = -9.540; var beta041 = 2.79; var beta042 = 6.09; var beta043 = 7.77; var beta044 = 0; var beta045 = 0.35; var beta046 = 0.81; var beta047 = 1.33; var beta048 = -1.13; var beta049 = 0.60; var beta050 = 0.92; var beta051 = -0.05; var beta052 = -0.09; var beta053 = 0.94; var beta054 = 0.31; var beta055 = -1.54; var stefanTwoCarUtility = beta040 * 1.0 + beta041 * household.Has1Driver.ToFlag() + beta042 * household.Has2Drivers.ToFlag() + beta043 * (household.Has3Drivers || household.Has4OrMoreDrivers).ToFlag() + beta014 * Math.Log(Math.Max(netIncome - userCost * 2.0, 1)) + beta045 * (numberChildren == 1).ToFlag() + beta046 * (numberChildren == 2).ToFlag() + beta047 * (numberChildren > 2).ToFlag() + beta048 * (numberAdults == 1 && !isMale).ToFlag() + beta049 * (numberAdults == 1 && isMale).ToFlag() + beta050 * averageAdultAge / 10.0 + beta051 * Math.Pow(averageAdultAge / 10.0, 2.0) + beta052 * 0 + //household.ResidenceParcel.PSearchTime16_17 + // Add this when new parcel variables with seach time are available beta053 * household.ResidenceParcel.DistanceToLocalBus + beta054 * household.ResidenceParcel.DistanceToExpressBus + beta055 * isInCopenhagenMunicipality.ToFlag() + 0; alternative = choiceProbabilityCalculator.GetAlternative(2, true, choice == 2); alternative.Choice = 2; //Stefan //alternative.AddUtilityTerm(40, 1.0); //alternative.AddUtilityTerm(41, household.Has1Driver.ToFlag()); //alternative.AddUtilityTerm(42, household.Has2Drivers.ToFlag()); //alternative.AddUtilityTerm(43, (household.Has3Drivers || household.Has4OrMoreDrivers).ToFlag()); //alternative.AddUtilityTerm(14, Math.Log(Math.Max(netIncome - userCost * 2.0, 1))); //alternative.AddUtilityTerm(45, (numberChildren == 1).ToFlag()); //alternative.AddUtilityTerm(46, (numberChildren == 2).ToFlag()); //alternative.AddUtilityTerm(47, (numberChildren > 2).ToFlag()); //alternative.AddUtilityTerm(48, (numberAdults == 1 && !isMale).ToFlag()); //alternative.AddUtilityTerm(49, (numberAdults == 1 && isMale).ToFlag()); //alternative.AddUtilityTerm(50, averageAdultAge / 10.0); //alternative.AddUtilityTerm(51, Math.Pow(averageAdultAge / 10.0, 2.0)); ////alternative.AddUtilityTerm(52, household.ResidenceParcel.PSearchTime16_17); // Add this when new parcel variables with seach time are available //alternative.AddUtilityTerm(53, household.ResidenceParcel.DistanceToLocalBus); //alternative.AddUtilityTerm(54, household.ResidenceParcel.DistanceToExpressBus); //alternative.AddUtilityTerm(55, isInCopenhagenMunicipality.ToFlag()); alternative.AddUtilityTerm(56, stefanTwoCarUtility); //this composite replaces above separate terms 40-55 alternative.AddUtilityTerm(57, workTourLogsumDifference); //alternative.AddUtilityTerm(44, household.HouseholdTotals.RetiredAdultsPerDrivingAgeMembers); //alternative.AddUtilityTerm(45, household.HouseholdTotals.UniversityStudentsPerDrivingAgeMembers); //alternative.AddUtilityTerm(46, household.HouseholdTotals.DrivingAgeStudentsPerDrivingAgeMembers); //alternative.AddUtilityTerm(47, household.HouseholdTotals.HomeBasedPersonsPerDrivingAgeMembers); }