private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, HouseholdDayWrapper householdDay, int[][] pfptSchedule, int[] choice = null) { //var householdDay = (ActumHouseholdDayWrapper)tour.HouseholdDay; Framework.DomainModels.Wrappers.IHouseholdWrapper household = householdDay.Household; //Generate utility funtions for the alternatives bool[] available = new bool[TOTAL_ALTERNATIVES + 1]; bool[] chosen = new bool[TOTAL_ALTERNATIVES + 1]; for (int alt = 1; alt <= TOTAL_ALTERNATIVES; alt++) { available[alt] = false; chosen[alt] = false; // set availability based on household CHILDREN if ((household.HasChildren && pfptSchedule[alt][0] == 1) || (!household.HasChildren && pfptSchedule[alt][0] == 0)) { available[alt] = true; } ChoiceProbabilityCalculator.Alternative alternative = choiceProbabilityCalculator.GetAlternative(alt - 1, available[alt], chosen[alt]); alternative.Choice = pfptSchedule[alt]; // add utility terms for this alterative alternative.AddUtilityTerm(1, 1); // asc } }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, PersonWrapper person, int choice = Constants.DEFAULT_VALUE) { Framework.DomainModels.Wrappers.IParcelWrapper homeParcel = person.Household.ResidenceParcel; Framework.DomainModels.Wrappers.IParcelWrapper workParcel = person.IsUniversityStudent ? person.UsualSchoolParcel : person.UsualWorkParcel; Framework.DomainModels.Wrappers.IParcelWrapper schoolParcel = person.IsUniversityStudent ? null : person.UsualSchoolParcel; bool workParcelMissing = workParcel == null; bool schoolParcelMissing = schoolParcel == null; const double maxTranDist = 1.5; double homeTranDist = 99.0; if (homeParcel.GetDistanceToTransit() >= 0.0001 && homeParcel.GetDistanceToTransit() <= maxTranDist) { homeTranDist = homeParcel.GetDistanceToTransit(); } double workTranDist = 99.0; if (!workParcelMissing && workParcel.GetDistanceToTransit() >= 0.0001 && workParcel.GetDistanceToTransit() <= maxTranDist) { workTranDist = workParcel.GetDistanceToTransit(); } double schoolTranDist = 99.0; if (!schoolParcelMissing && schoolParcel.GetDistanceToTransit() >= 0.0001 && schoolParcel.GetDistanceToTransit() <= maxTranDist) { schoolTranDist = schoolParcel.GetDistanceToTransit(); } double workGenTimeNoPass = -99.0; double workGenTimeWithPass = -99.0; if (!workParcelMissing && workTranDist < maxTranDist && homeTranDist < maxTranDist) { IEnumerable <IPathTypeModel> pathTypeModels = PathTypeModelFactory.Singleton.Run( person.Household.RandomUtility, homeParcel, workParcel, Global.Settings.Times.EightAM, Global.Settings.Times.FivePM, Global.Settings.Purposes.Work, Global.Coefficients_BaseCostCoefficientPerMonetaryUnit, Global.Configuration.Coefficients_MeanTimeCoefficient_Work, true, 1, 0, false, 0.0, false, Global.Settings.Modes.Transit); IPathTypeModel path = pathTypeModels.First(); workGenTimeNoPass = path.GeneralizedTimeLogsum; // intermediate variable of type IEnumerable<dynamic> is needed to acquire First() method as extension pathTypeModels = PathTypeModelFactory.Singleton.Run( person.Household.RandomUtility, homeParcel, workParcel, Global.Settings.Times.EightAM, Global.Settings.Times.FivePM, Global.Settings.Purposes.Work, Global.Coefficients_BaseCostCoefficientPerMonetaryUnit, Global.Configuration.Coefficients_MeanTimeCoefficient_Work, /* isDrivingAge */ true, /* householdCars */ 1, /* transitPassOwnership */ 1, /* carsAreAVs */ false, /* transitDiscountFraction */ 1.0, /* randomChoice */ false, Global.Settings.Modes.Transit); path = pathTypeModels.First(); workGenTimeWithPass = path.GeneralizedTimeLogsum; } // double schoolGenTimeNoPass = -99.0; double schoolGenTimeWithPass = -99.0; if (!schoolParcelMissing && schoolTranDist < maxTranDist && homeTranDist < maxTranDist) { // schoolGenTimeNoPass = path.GeneralizedTimeLogsum; IEnumerable <IPathTypeModel> pathTypeModels = PathTypeModelFactory.Singleton.Run( person.Household.RandomUtility, homeParcel, schoolParcel, Global.Settings.Times.EightAM, Global.Settings.Times.ThreePM, Global.Settings.Purposes.School, Global.Coefficients_BaseCostCoefficientPerMonetaryUnit, Global.Configuration.Coefficients_MeanTimeCoefficient_Other, true, 1, 1, false, 1.0, false, Global.Settings.Modes.Transit); IPathTypeModel path = pathTypeModels.First(); schoolGenTimeWithPass = path.GeneralizedTimeLogsum; } const double inflection = 0.50; double homeTranDist1 = Math.Pow(Math.Min(inflection, homeTranDist), 2.0); double homeTranDist2 = Math.Pow(Math.Max(homeTranDist - inflection, 0), 0.5); // var workTranDist1 = Math.Pow(Math.Min(inflection, workTranDist),2.0); // var workTranDist2 = Math.Pow(Math.Max(workTranDist - inflection, 0),0.5); const double minimumAggLogsum = -15.0; int votSegment = person.Household.GetVotALSegment(); int homeTaSegment = homeParcel.TransitAccessSegment(); double homeAggregateLogsumNoCar = Math.Max(minimumAggLogsum, Global.AggregateLogsums[homeParcel.ZoneId][Global.Settings.Purposes.HomeBasedComposite][Global.Settings.CarOwnerships.NoCars][votSegment][homeTaSegment]); int workTaSegment = workParcelMissing ? 0 : workParcel.TransitAccessSegment(); double workAggregateLogsumNoCar = workParcelMissing ? 0 : Math.Max(minimumAggLogsum, Global.AggregateLogsums[workParcel.ZoneId][Global.Settings.Purposes.WorkBased][Global.Settings.CarOwnerships.NoCars][votSegment][workTaSegment]); int schoolTaSegment = schoolParcelMissing ? 0 : schoolParcel.TransitAccessSegment(); double schoolAggregateLogsumNoCar = schoolParcelMissing ? 0 : Math.Max(minimumAggLogsum, Global.AggregateLogsums[schoolParcel.ZoneId][Global.Settings.Purposes.WorkBased][Global.Settings.CarOwnerships.NoCars][votSegment][schoolTaSegment]); double transitPassCostChange = !Global.Configuration.IsInEstimationMode ? Global.Configuration.PathImpedance_TransitPassCostPercentChangeVersusBase : 0; double workTourLogsumDifference = 0D; // (full or part-time workers) full car ownership vs. no car ownership double schoolTourLogsumDifference = 0D; // (school) full car ownership vs. no car ownership Framework.DomainModels.Wrappers.IHouseholdWrapper household = person.Household; if (person.UsualWorkParcel != null && person.UsualWorkParcelId != household.ResidenceParcelId) { int destinationArrivalTime = ChoiceModelUtility.GetDestinationArrivalTime(Global.Settings.Models.WorkTourModeModel); int destinationDepartureTime = ChoiceModelUtility.GetDestinationDepartureTime(Global.Settings.Models.WorkTourModeModel); //JLB 201602 //var nestedAlternative1 = Global.ChoiceModelSession.Get<WorkTourModeTimeModel>().RunNested(person, household.ResidenceParcel, person.UsualWorkParcel, destinationArrivalTime, destinationDepartureTime, household.VehiclesAvailable, 1.0); //var nestedAlternative2 = Global.ChoiceModelSession.Get<WorkTourModeTimeModel>().RunNested(person, household.ResidenceParcel, person.UsualWorkParcel, destinationArrivalTime, destinationDepartureTime, household.VehiclesAvailable, 0.0); ChoiceProbabilityCalculator.Alternative nestedAlternative1 = Global.ChoiceModelSession.Get <TourModeTimeModel>().RunNested(person, household.ResidenceParcel, person.UsualWorkParcel, destinationArrivalTime, destinationDepartureTime, household.VehiclesAvailable, 1.0, Global.Settings.Purposes.Work); ChoiceProbabilityCalculator.Alternative nestedAlternative2 = Global.ChoiceModelSession.Get <TourModeTimeModel>().RunNested(person, household.ResidenceParcel, person.UsualWorkParcel, destinationArrivalTime, destinationDepartureTime, household.VehiclesAvailable, 0.0, Global.Settings.Purposes.Work); workTourLogsumDifference = nestedAlternative1 == null ? 0 : nestedAlternative1.ComputeLogsum(); workTourLogsumDifference = nestedAlternative2 == null ? 0 : nestedAlternative2.ComputeLogsum(); } if (person.UsualSchoolParcel != null && person.UsualSchoolParcelId != household.ResidenceParcelId) { int destinationArrivalTime = ChoiceModelUtility.GetDestinationArrivalTime(Global.Settings.Models.SchoolTourModeModel); int destinationDepartureTime = ChoiceModelUtility.GetDestinationDepartureTime(Global.Settings.Models.SchoolTourModeModel); //JLB 201602 //var nestedAlternative1 = Global.ChoiceModelSession.Get<SchoolTourModeTimeModel>().RunNested(person, household.ResidenceParcel, person.UsualSchoolParcel, destinationArrivalTime, destinationDepartureTime, household.VehiclesAvailable, 1.0); //var nestedAlternative2 = Global.ChoiceModelSession.Get<SchoolTourModeTimeModel>().RunNested(person, household.ResidenceParcel, person.UsualSchoolParcel, destinationArrivalTime, destinationDepartureTime, household.VehiclesAvailable, 0.0); ChoiceProbabilityCalculator.Alternative nestedAlternative1 = Global.ChoiceModelSession.Get <TourModeTimeModel>().RunNested(person, household.ResidenceParcel, person.UsualSchoolParcel, destinationArrivalTime, destinationDepartureTime, household.VehiclesAvailable, 1.0, Global.Settings.Purposes.School); ChoiceProbabilityCalculator.Alternative nestedAlternative2 = Global.ChoiceModelSession.Get <TourModeTimeModel>().RunNested(person, household.ResidenceParcel, person.UsualSchoolParcel, destinationArrivalTime, destinationDepartureTime, household.VehiclesAvailable, 0.0, Global.Settings.Purposes.School); schoolTourLogsumDifference = nestedAlternative1 == null ? 0 : nestedAlternative1.ComputeLogsum(); schoolTourLogsumDifference = nestedAlternative2 == null ? 0 : nestedAlternative2.ComputeLogsum(); } //Stefan variables double netIncomeNetCarOwnership = Math.Max(0, (person.Household.Income / 1000.0) / 2.0 - 2.441 * 15.0 * person.Household.VehiclesAvailable); //net income minus annual cost to use household's cars in 1000s of DKK //set household characteristics here that depend on person characteristics int numberAdults = 0; int numberChildren = 0; foreach (PersonWrapper p in person.Household.Persons) { if (p.Age >= 18) { numberAdults++; } else { numberChildren++; } } Framework.DomainModels.Wrappers.IParcelWrapper usualParcel = person.IsFullOrPartTimeWorker ? person.UsualWorkParcel : null; usualParcel = (usualParcel == null && person.UsualSchoolParcel != null) ? person.UsualSchoolParcel : null; int parkingSearchTime = 0; double commuteDistance = 0.0; int parkingCost = 0; int model = 3; if (usualParcel != null) { //parkingSearchTime = usualParcel.PSearchTime07_08; //uncomment when the new parcel attributes have been defined commuteDistance = ImpedanceRoster.GetValue("distance", Global.Settings.Modes.Sov, Global.Settings.PathTypes.FullNetwork, 1.0, Global.Settings.Times.EightAM, household.ResidenceParcel, usualParcel).Variable; //parkingCost = usualParcel.ParkingCostPerHour8_18; //uncomment when the new parcel attributes have been defined if (person.IsFulltimeWorker && usualParcel == person.UsualWorkParcel) { parkingCost = parkingCost * 8; model = 1; } else if (person.IsPartTimeWorker && usualParcel == person.UsualWorkParcel) { parkingCost = parkingCost * 4; model = 1; } else { parkingCost = parkingCost * 6; // parking for school model = 2; } } // 0 No transit pass ChoiceProbabilityCalculator.Alternative alternative = choiceProbabilityCalculator.GetAlternative(0, true, choice == 0); alternative.Choice = 0; alternative.AddUtilityTerm(1, 0.0); // 1 Transit pass double stefanUtility = 0.0; alternative = choiceProbabilityCalculator.GetAlternative(1, true, choice == 1); alternative.Choice = 1; if (model == 1 && person.Household.VehiclesAvailable == 0) { double beta001 = -0.33; double beta002 = -0.34; double beta003 = -1.15; double beta004 = -0.34; double beta005 = 0.0; double beta006 = 0.0; double beta007 = 0.0; double beta008 = 0.0; double beta009 = 0.0; double beta010 = 0.0; double beta011 = 0.0; double beta012 = 0.0; stefanUtility = beta001 * 1.0 + beta002 * numberChildren + beta003 * netIncomeNetCarOwnership + beta004 * person.IsMale.ToFlag() + beta005 * (person.IsAdultFemale && numberAdults == 1).ToFlag() + beta006 * (person.IsAdultFemale && numberAdults > 1).ToFlag() + beta007 * person.Age + beta008 * Math.Pow(person.Age, 2.0) + beta009 * (person.Household.VehiclesAvailable >= 2).ToFlag() + beta010 * (person.IsAdultMale && numberAdults == 1).ToFlag() + beta011 * Math.Min(person.Household.ResidenceParcel.DistanceToLocalBus, 2.0) + beta012 * Math.Min(5.0, person.Household.ResidenceParcel.DistanceToExpressBus) + 0.0; //Stefan utility //alternative.AddUtilityTerm(1, 1.0); //alternative.AddUtilityTerm(2, numberChildren); //alternative.AddUtilityTerm(3, netIncomeNetCarOwnership); //alternative.AddUtilityTerm(4, person.IsMale.ToFlag()); //alternative.AddUtilityTerm(5, (person.IsAdultFemale && numberAdults == 1).ToFlag()); //alternative.AddUtilityTerm(6, (person.IsAdultFemale && numberAdults > 1).ToFlag()); //alternative.AddUtilityTerm(7, person.Age); //alternative.AddUtilityTerm(8, Math.Pow(person.Age, 2.0)); //non-worker/non-student models only //alternative.AddUtilityTerm(9, (person.Household.VehiclesAvailable >= 2).ToFlag()); //alternative.AddUtilityTerm(10, (person.IsAdultMale && numberAdults == 1).ToFlag()); //alternative.AddUtilityTerm(11, Math.Min(person.Household.ResidenceParcel.DistanceToLocalBus, 2.0)); //alternative.AddUtilityTerm(12, Math.Min(5.0, person.Household.ResidenceParcel.DistanceToExpressBus)); alternative.AddUtilityTerm(1, stefanUtility); // this composite replaces terms *1-*12 above //Stefan impedance (try replacign these with logsums) alternative.AddUtilityTerm(13, Math.Min(person.Household.ResidenceParcel.DistanceToLocalBus, person.Household.ResidenceParcel.DistanceToExpressBus)); alternative.AddUtilityTerm(14, (commuteDistance > 0 && commuteDistance < 3).ToFlag()); alternative.AddUtilityTerm(15, (commuteDistance >= 7 && commuteDistance < 13).ToFlag()); alternative.AddUtilityTerm(16, (commuteDistance >= 13).ToFlag()); alternative.AddUtilityTerm(17, parkingCost); alternative.AddUtilityTerm(18, parkingSearchTime); //commute logsum difference variable (with and without transit pass) alternative.AddUtilityTerm(19, workTourLogsumDifference); } else if (model == 1 && person.Household.VehiclesAvailable == 1) { double beta101 = -1.16; int beta102 = 0; int beta103 = 0; int beta104 = 0; int beta105 = 0; double beta106 = 0.63; double beta107 = -0.76; double beta108 = 0.09; int beta109 = 0; int beta110 = 0; int beta111 = 0; int beta112 = 0; stefanUtility = beta101 * 1.0 + beta102 * numberChildren + beta103 * netIncomeNetCarOwnership + beta104 * person.IsMale.ToFlag() + beta105 * (person.IsAdultFemale && numberAdults == 1).ToFlag() + beta106 * (person.IsAdultFemale && numberAdults > 1).ToFlag() + beta107 * person.Age + beta108 * Math.Pow(person.Age, 2.0) + beta109 * (person.Household.VehiclesAvailable >= 2).ToFlag() + beta110 * (person.IsAdultMale && numberAdults == 1).ToFlag() + beta111 * Math.Min(person.Household.ResidenceParcel.DistanceToLocalBus, 2.0) + beta112 * Math.Min(5.0, person.Household.ResidenceParcel.DistanceToExpressBus) + 0.0; //Stefan utility //alternative.AddUtilityTerm(101, 1.0); //alternative.AddUtilityTerm(102, numberChildren); //alternative.AddUtilityTerm(103, netIncomeNetCarOwnership); //alternative.AddUtilityTerm(104, person.IsMale.ToFlag()); //alternative.AddUtilityTerm(105, (person.IsAdultFemale && numberAdults == 1).ToFlag()); //alternative.AddUtilityTerm(106, (person.IsAdultFemale && numberAdults > 1).ToFlag()); //alternative.AddUtilityTerm(107, person.Age); //alternative.AddUtilityTerm(108, Math.Pow(person.Age, 2.0)); ////non-worker/non-student models only //alternative.AddUtilityTerm(109, (person.Household.VehiclesAvailable >= 2).ToFlag()); //alternative.AddUtilityTerm(110, (person.IsAdultMale && numberAdults == 1).ToFlag()); //alternative.AddUtilityTerm(111, Math.Min(person.Household.ResidenceParcel.DistanceToLocalBus, 2.0)); //alternative.AddUtilityTerm(112, Math.Min(5.0, person.Household.ResidenceParcel.DistanceToExpressBus)); alternative.AddUtilityTerm(101, stefanUtility); // this composite replaces terms *1-*12 above //Stefan impedance (try replacign these with logsums) alternative.AddUtilityTerm(113, Math.Min(person.Household.ResidenceParcel.DistanceToLocalBus, person.Household.ResidenceParcel.DistanceToExpressBus)); alternative.AddUtilityTerm(114, (commuteDistance > 0 && commuteDistance < 3).ToFlag()); alternative.AddUtilityTerm(115, (commuteDistance >= 7 && commuteDistance < 13).ToFlag()); alternative.AddUtilityTerm(116, (commuteDistance >= 13).ToFlag()); alternative.AddUtilityTerm(117, parkingCost); alternative.AddUtilityTerm(118, parkingSearchTime); //commute logsum difference variable (with and without transit pass) alternative.AddUtilityTerm(119, workTourLogsumDifference); } else if (model == 1 && person.Household.VehiclesAvailable >= 2) { double beta201 = -0.54; int beta202 = 0; int beta203 = 0; int beta204 = 0; double beta205 = 1.35; double beta206 = 0.42; double beta207 = -1.5; double beta208 = 0.17; int beta209 = 0; int beta210 = 0; int beta211 = 0; int beta212 = 0; stefanUtility = beta201 * 1.0 + beta202 * numberChildren + beta203 * netIncomeNetCarOwnership + beta204 * person.IsMale.ToFlag() + beta205 * (person.IsAdultFemale && numberAdults == 1).ToFlag() + beta206 * (person.IsAdultFemale && numberAdults > 1).ToFlag() + beta207 * person.Age + beta208 * Math.Pow(person.Age, 2.0) + beta209 * (person.Household.VehiclesAvailable >= 2).ToFlag() + beta210 * (person.IsAdultMale && numberAdults == 1).ToFlag() + beta211 * Math.Min(person.Household.ResidenceParcel.DistanceToLocalBus, 2.0) + beta212 * Math.Min(5.0, person.Household.ResidenceParcel.DistanceToExpressBus) + 0.0; //Stefan utility //alternative.AddUtilityTerm(201, 1.0); //alternative.AddUtilityTerm(202, numberChildren); //alternative.AddUtilityTerm(203, netIncomeNetCarOwnership); //alternative.AddUtilityTerm(204, person.IsMale.ToFlag()); //alternative.AddUtilityTerm(205, (person.IsAdultFemale && numberAdults == 1).ToFlag()); //alternative.AddUtilityTerm(206, (person.IsAdultFemale && numberAdults > 1).ToFlag()); //alternative.AddUtilityTerm(207, person.Age); //alternative.AddUtilityTerm(208, Math.Pow(person.Age, 2.0)); //non-worker/non-student models only //alternative.AddUtilityTerm(209, (person.Household.VehiclesAvailable >= 2).ToFlag()); //alternative.AddUtilityTerm(210, (person.IsAdultMale && numberAdults == 1).ToFlag()); //alternative.AddUtilityTerm(211, Math.Min(person.Household.ResidenceParcel.DistanceToLocalBus, 2.0)); //alternative.AddUtilityTerm(212, Math.Min(5.0, person.Household.ResidenceParcel.DistanceToExpressBus)); alternative.AddUtilityTerm(201, stefanUtility); // this composite replaces terms *1-*12 above //Stefan impedance (try replacign these with logsums) alternative.AddUtilityTerm(213, Math.Min(person.Household.ResidenceParcel.DistanceToLocalBus, person.Household.ResidenceParcel.DistanceToExpressBus)); alternative.AddUtilityTerm(214, (commuteDistance > 0 && commuteDistance < 3).ToFlag()); alternative.AddUtilityTerm(215, (commuteDistance >= 7 && commuteDistance < 13).ToFlag()); alternative.AddUtilityTerm(216, (commuteDistance >= 13).ToFlag()); alternative.AddUtilityTerm(217, parkingCost); alternative.AddUtilityTerm(218, parkingSearchTime); //commute logsum difference variable (with and without transit pass) alternative.AddUtilityTerm(219, workTourLogsumDifference); } else if (model == 2 && person.Household.VehiclesAvailable == 0) { double beta301 = 4.74; double beta302 = 0.39; int beta303 = 0; int beta304 = 0; int beta305 = 0; int beta306 = 0; double beta307 = -3.95; double beta308 = 0.62; int beta309 = 0; int beta310 = 0; int beta311 = 0; int beta312 = 0; stefanUtility = beta301 * 1.0 + beta302 * numberChildren + beta303 * netIncomeNetCarOwnership + beta304 * person.IsMale.ToFlag() + beta305 * (person.IsAdultFemale && numberAdults == 1).ToFlag() + beta306 * (person.IsAdultFemale && numberAdults > 1).ToFlag() + beta307 * person.Age + beta308 * Math.Pow(person.Age, 2.0) + beta309 * (person.Household.VehiclesAvailable >= 2).ToFlag() + beta310 * (person.IsAdultMale && numberAdults == 1).ToFlag() + beta311 * Math.Min(person.Household.ResidenceParcel.DistanceToLocalBus, 2.0) + beta312 * Math.Min(5.0, person.Household.ResidenceParcel.DistanceToExpressBus) + 0.0; //Stefan utility //alternative.AddUtilityTerm(301, 1.0); //alternative.AddUtilityTerm(302, numberChildren); //alternative.AddUtilityTerm(303, netIncomeNetCarOwnership); //alternative.AddUtilityTerm(304, person.IsMale.ToFlag()); //alternative.AddUtilityTerm(305, (person.IsAdultFemale && numberAdults == 1).ToFlag()); //alternative.AddUtilityTerm(306, (person.IsAdultFemale && numberAdults > 1).ToFlag()); //alternative.AddUtilityTerm(307, person.Age); //alternative.AddUtilityTerm(308, Math.Pow(person.Age, 2.0)); ////non-worker/non-student models only //alternative.AddUtilityTerm(309, (person.Household.VehiclesAvailable >= 2).ToFlag()); //alternative.AddUtilityTerm(310, (person.IsAdultMale && numberAdults == 1).ToFlag()); //alternative.AddUtilityTerm(311, Math.Min(person.Household.ResidenceParcel.DistanceToLocalBus, 2.0)); //alternative.AddUtilityTerm(312, Math.Min(5.0, person.Household.ResidenceParcel.DistanceToExpressBus)); alternative.AddUtilityTerm(301, stefanUtility); // this composite replaces terms *1-*12 above //Stefan impedance (try replacign these with logsums) alternative.AddUtilityTerm(313, Math.Min(person.Household.ResidenceParcel.DistanceToLocalBus, person.Household.ResidenceParcel.DistanceToExpressBus)); alternative.AddUtilityTerm(314, (commuteDistance > 0 && commuteDistance < 3).ToFlag()); alternative.AddUtilityTerm(315, (commuteDistance >= 7 && commuteDistance < 13).ToFlag()); alternative.AddUtilityTerm(316, (commuteDistance >= 13).ToFlag()); alternative.AddUtilityTerm(317, parkingCost); alternative.AddUtilityTerm(318, parkingSearchTime); //commute logsum difference variable (with and without transit pass) alternative.AddUtilityTerm(319, schoolTourLogsumDifference); } else if (model == 2 && person.Household.VehiclesAvailable >= 1) { double beta401 = 3.75; int beta402 = 0; int beta403 = 0; int beta404 = 0; int beta405 = 0; int beta406 = 0; double beta407 = 2.81; double beta408 = 0.33; int beta409 = 0; int beta410 = 0; int beta411 = 0; int beta412 = 0; stefanUtility = beta401 * 1.0 + beta402 * numberChildren + beta403 * netIncomeNetCarOwnership + beta404 * person.IsMale.ToFlag() + beta405 * (person.IsAdultFemale && numberAdults == 1).ToFlag() + beta406 * (person.IsAdultFemale && numberAdults > 1).ToFlag() + beta407 * person.Age + beta408 * Math.Pow(person.Age, 2.0) + beta409 * (person.Household.VehiclesAvailable >= 2).ToFlag() + beta410 * (person.IsAdultMale && numberAdults == 1).ToFlag() + beta411 * Math.Min(person.Household.ResidenceParcel.DistanceToLocalBus, 2.0) + beta412 * Math.Min(5.0, person.Household.ResidenceParcel.DistanceToExpressBus) + 0.0; //Stefan utility //alternative.AddUtilityTerm(401, 1.0); //alternative.AddUtilityTerm(402, numberChildren); //alternative.AddUtilityTerm(403, netIncomeNetCarOwnership); //alternative.AddUtilityTerm(404, person.IsMale.ToFlag()); //alternative.AddUtilityTerm(405, (person.IsAdultFemale && numberAdults == 1).ToFlag()); //alternative.AddUtilityTerm(406, (person.IsAdultFemale && numberAdults > 1).ToFlag()); //alternative.AddUtilityTerm(407, person.Age); //alternative.AddUtilityTerm(408, Math.Pow(person.Age, 2.0)); ////non-worker/non-student models only //alternative.AddUtilityTerm(409, (person.Household.VehiclesAvailable >= 2).ToFlag()); //alternative.AddUtilityTerm(410, (person.IsAdultMale && numberAdults == 1).ToFlag()); //alternative.AddUtilityTerm(411, Math.Min(person.Household.ResidenceParcel.DistanceToLocalBus, 2.0)); //alternative.AddUtilityTerm(412, Math.Min(5.0, person.Household.ResidenceParcel.DistanceToExpressBus)); alternative.AddUtilityTerm(401, stefanUtility); // this composite replaces terms *1-*12 above //Stefan impedance (try replacign these with logsums) alternative.AddUtilityTerm(413, Math.Min(person.Household.ResidenceParcel.DistanceToLocalBus, person.Household.ResidenceParcel.DistanceToExpressBus)); alternative.AddUtilityTerm(414, (commuteDistance > 0 && commuteDistance < 3).ToFlag()); alternative.AddUtilityTerm(415, (commuteDistance >= 7 && commuteDistance < 13).ToFlag()); alternative.AddUtilityTerm(416, (commuteDistance >= 13).ToFlag()); alternative.AddUtilityTerm(417, parkingCost); alternative.AddUtilityTerm(418, parkingSearchTime); //commute logsum difference variable (with and without transit pass) alternative.AddUtilityTerm(419, schoolTourLogsumDifference); } else if (model == 3 && person.Household.VehiclesAvailable == 0) { double beta501 = 0.05; int beta502 = 0; int beta503 = 0; int beta504 = 0; double beta505 = 0.56; double beta506 = 0.41; int beta507 = 0; int beta508 = 0; int beta509 = 0; int beta510 = 0; double beta511 = -0.45; int beta512 = 0; stefanUtility = beta501 * 1.0 + beta502 * numberChildren + beta503 * netIncomeNetCarOwnership + beta504 * person.IsMale.ToFlag() + beta505 * (person.IsAdultFemale && numberAdults == 1).ToFlag() + beta506 * (person.IsAdultFemale && numberAdults > 1).ToFlag() + beta507 * person.Age + beta508 * Math.Pow(person.Age, 2.0) + beta509 * (person.Household.VehiclesAvailable >= 2).ToFlag() + beta510 * (person.IsAdultMale && numberAdults == 1).ToFlag() + beta511 * Math.Min(person.Household.ResidenceParcel.DistanceToLocalBus, 2.0) + beta512 * Math.Min(5.0, person.Household.ResidenceParcel.DistanceToExpressBus) + 0.0; //Stefan utility //alternative.AddUtilityTerm(501, 1.0); //alternative.AddUtilityTerm(502, numberChildren); //alternative.AddUtilityTerm(503, netIncomeNetCarOwnership); //alternative.AddUtilityTerm(504, person.IsMale.ToFlag()); //alternative.AddUtilityTerm(505, (person.IsAdultFemale && numberAdults == 1).ToFlag()); //alternative.AddUtilityTerm(506, (person.IsAdultFemale && numberAdults > 1).ToFlag()); //alternative.AddUtilityTerm(507, person.Age); //alternative.AddUtilityTerm(508, Math.Pow(person.Age, 2.0)); ////non-worker/non-student models only //alternative.AddUtilityTerm(509, (person.Household.VehiclesAvailable >= 2).ToFlag()); //alternative.AddUtilityTerm(510, (person.IsAdultMale && numberAdults == 1).ToFlag()); //alternative.AddUtilityTerm(511, Math.Min(person.Household.ResidenceParcel.DistanceToLocalBus, 2.0)); //alternative.AddUtilityTerm(512, Math.Min(5.0, person.Household.ResidenceParcel.DistanceToExpressBus)); alternative.AddUtilityTerm(501, stefanUtility); // this composite replaces terms *1-*12 above } else //(model == 3 && person.Household.VehiclesAvailable >= 1) { double beta601 = -1.7; int beta602 = 0; double beta603 = 0.47; int beta604 = 0; double beta605 = 0.63; double beta606 = 0.46; int beta607 = 0; int beta608 = 0; double beta609 = -0.32; double beta610 = 0.35; double beta611 = -0.37; double beta612 = -0.09; stefanUtility = beta601 * 1.0 + beta602 * numberChildren + beta603 * netIncomeNetCarOwnership + beta604 * person.IsMale.ToFlag() + beta605 * (person.IsAdultFemale && numberAdults == 1).ToFlag() + beta606 * (person.IsAdultFemale && numberAdults > 1).ToFlag() + beta607 * person.Age + beta608 * Math.Pow(person.Age, 2.0) + beta609 * (person.Household.VehiclesAvailable >= 2).ToFlag() + beta610 * (person.IsAdultMale && numberAdults == 1).ToFlag() + beta611 * Math.Min(person.Household.ResidenceParcel.DistanceToLocalBus, 2.0) + beta612 * Math.Min(5.0, person.Household.ResidenceParcel.DistanceToExpressBus) + 0.0; //Stefan utility //alternative.AddUtilityTerm(601, 1.0); //alternative.AddUtilityTerm(602, numberChildren); //alternative.AddUtilityTerm(603, netIncomeNetCarOwnership); //alternative.AddUtilityTerm(604, person.IsMale.ToFlag()); //alternative.AddUtilityTerm(605, (person.IsAdultFemale && numberAdults == 1).ToFlag()); //alternative.AddUtilityTerm(606, (person.IsAdultFemale && numberAdults > 1).ToFlag()); //alternative.AddUtilityTerm(607, person.Age); //alternative.AddUtilityTerm(608, Math.Pow(person.Age, 2.0)); //non-worker/non-student models only //alternative.AddUtilityTerm(609, (person.Household.VehiclesAvailable >= 2).ToFlag()); //alternative.AddUtilityTerm(610, (person.IsAdultMale && numberAdults == 1).ToFlag()); //alternative.AddUtilityTerm(611, Math.Min(person.Household.ResidenceParcel.DistanceToLocalBus, 2.0)); //alternative.AddUtilityTerm(612, Math.Min(5.0, person.Household.ResidenceParcel.DistanceToExpressBus)); alternative.AddUtilityTerm(601, stefanUtility); // this composite replaces terms *1-*12 above } //alternative.AddUtilityTerm(2, person.IsPartTimeWorker.ToFlag()); //alternative.AddUtilityTerm(3, (person.IsWorker && person.IsNotFullOrPartTimeWorker).ToFlag()); //alternative.AddUtilityTerm(4, person.IsUniversityStudent.ToFlag()); //alternative.AddUtilityTerm(5, person.IsRetiredAdult.ToFlag()); //alternative.AddUtilityTerm(6, person.IsNonworkingAdult.ToFlag()); //alternative.AddUtilityTerm(7, person.IsDrivingAgeStudent.ToFlag()); //alternative.AddUtilityTerm(8, person.IsChildUnder16.ToFlag()); //alternative.AddUtilityTerm(9, Math.Log(Math.Max(1, person.Household.Income))); //alternative.AddUtilityTerm(10, person.Household.HasMissingIncome.ToFlag()); //alternative.AddUtilityTerm(11, workParcelMissing.ToFlag()); //alternative.AddUtilityTerm(12, schoolParcelMissing.ToFlag()); //alternative.AddUtilityTerm(13, (homeTranDist < 90.0) ? homeTranDist1 : 0); //alternative.AddUtilityTerm(14, (homeTranDist < 90.0) ? homeTranDist2 : 0); //alternative.AddUtilityTerm(15, (homeTranDist > 90.0) ? 1 : 0); // //alternative.AddUtility(16, (workTranDist < 90.0) ? workTranDist : 0); // //alternative.AddUtility(17, (workTranDist < 90.0) ? workTranDist2 : 0); // //alternative.AddUtility(18, (workTranDist > 90.0) ? 1 : 0); // //alternative.AddUtility(19, (schoolTranDist < 90.0) ? schoolTranDist : 0); // //alternative.AddUtility(20, (schoolTranDist > 90.0) ? 1 : 0); // //alternative.AddUtility(21, (!workParcelMissing && workGenTimeWithPass > -90 ) ? workGenTimeWithPass : 0); //alternative.AddUtilityTerm(22, (!workParcelMissing && workGenTimeWithPass <= -90) ? 1 : 0); //alternative.AddUtilityTerm(23, (!workParcelMissing && workGenTimeWithPass > -90 && workGenTimeNoPass > -90) ? workGenTimeNoPass - workGenTimeWithPass : 0); // //alternative.AddUtility(24, (!schoolParcelMissing && schoolGenTimeWithPass > -90 ) ? schoolGenTimeWithPass : 0); //alternative.AddUtilityTerm(25, (!schoolParcelMissing && schoolGenTimeWithPass <= -90) ? 1 : 0); //alternative.AddUtilityTerm(26, homeAggregateLogsumNoCar * (person.IsFullOrPartTimeWorker || person.IsUniversityStudent).ToFlag()); //alternative.AddUtilityTerm(27, homeAggregateLogsumNoCar * (person.IsDrivingAgeStudent || person.IsChildUnder16).ToFlag()); //alternative.AddUtilityTerm(28, homeAggregateLogsumNoCar * (person.IsNonworkingAdult).ToFlag()); //alternative.AddUtilityTerm(29, homeAggregateLogsumNoCar * (person.IsRetiredAdult).ToFlag()); //alternative.AddUtilityTerm(30, workParcelMissing ? 0 : workAggregateLogsumNoCar); //alternative.AddUtilityTerm(31, schoolParcelMissing ? 0 : schoolAggregateLogsumNoCar); //alternative.AddUtilityTerm(32, transitPassCostChange); }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, PersonDayWrapper personDay, HouseholdDayWrapper householdDay, int choice = Constants.DEFAULT_VALUE) { Framework.DomainModels.Wrappers.IHouseholdWrapper household = personDay.Household; Framework.DomainModels.Wrappers.IPersonWrapper person = personDay.Person; IEnumerable <PersonDayWrapper> personTypeOrderedPersonDays = householdDay.PersonDays.OrderBy(p => p.Person.PersonType).ToList().Cast <PersonDayWrapper>(); int mandatoryCount = 0; int nonMandatoryCount = 0; int homeCount = 0; // int mandatoryKids = 0; //int kidsAtHome = 0; //int nonMandatoryKids = 0; //int adultsAtHome = 0; double mandatoryLogsum = 0.0; int i = 0; foreach (PersonDayWrapper pDay in personTypeOrderedPersonDays) { i++; if (i <= 4) { if (pDay.PatternType == Global.Settings.PatternTypes.Mandatory) { mandatoryCount++; } else if (pDay.PatternType == Global.Settings.PatternTypes.Optional) { nonMandatoryCount++; } else { homeCount++; } } } /*int oldestAge = (from persons in household.Persons select persons.Age).Max(); * int youngestAge = (from persons in household.Persons select persons.Age).Min(); * int countTransitPassses = (from persons in household.Persons * where persons.TransitPassOwnershipFlag == 1 * select persons.TransitPassOwnershipFlag).Count();*/ Framework.DomainModels.Wrappers.IParcelWrapper residenceParcel = household.ResidenceParcel; 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 = household.GetVotALSegment(); int transitAccessSegment = household.ResidenceParcel.TransitAccessSegment(); double totalAggregateLogsum = Global.AggregateLogsums[household.ResidenceParcel.ZoneId] [Global.Settings.Purposes.HomeBasedComposite][carOwnership][votALSegment][transitAccessSegment]; double distanceToStop = household.ResidenceParcel.GetDistanceToTransit() > 0 ? Math.Min(household.ResidenceParcel.GetDistanceToTransit(), 2 * Global.Settings.DistanceUnitsPerMile) // JLBscale : 2 * Global.Settings.DistanceUnitsPerMile; if (person.PersonType <= Global.Settings.PersonTypes.PartTimeWorker) { if (person.UsualWorkParcelId != Constants.DEFAULT_VALUE && person.UsualWorkParcelId != Global.Settings.OutOfRegionParcelId) { if (person.UsualDeparturePeriodFromWork != Constants.DEFAULT_VALUE && person.UsualArrivalPeriodToWork != Constants.DEFAULT_VALUE) { ChoiceProbabilityCalculator.Alternative nestedAlternative = Global.ChoiceModelSession.Get <WorkTourModeTimeModel>().RunNested(personDay, person.Household.ResidenceParcel, person.UsualWorkParcel, (int)person.UsualArrivalPeriodToWork, (int)person.UsualDeparturePeriodFromWork, person.Household.HouseholdTotals.DrivingAgeMembers); mandatoryLogsum = nestedAlternative == null ? 0 : nestedAlternative.ComputeLogsum(); } else { ChoiceProbabilityCalculator.Alternative nestedAlternative = Global.ChoiceModelSession.Get <WorkTourModeTimeModel>().RunNested(personDay, person.Household.ResidenceParcel, person.UsualWorkParcel, Global.Settings.Times.EightAM, Global.Settings.Times.FivePM, person.Household.HouseholdTotals.DrivingAgeMembers); mandatoryLogsum = nestedAlternative == null ? 0 : nestedAlternative.ComputeLogsum(); } } else { mandatoryLogsum = 0; } } else if (person.PersonType >= Global.Settings.PersonTypes.UniversityStudent) { if (person.UsualSchoolParcelId != 0 && person.UsualSchoolParcelId != -1 && person.UsualSchoolParcelId != Global.Settings.OutOfRegionParcelId) { ChoiceProbabilityCalculator.Alternative schoolNestedAlternative = Global.ChoiceModelSession.Get <SchoolTourModeTimeModel>().RunNested(personDay, person.Household.ResidenceParcel, person.UsualSchoolParcel, Global.Settings.Times.EightAM, Global.Settings.Times.TwoPM, person.Household.HouseholdTotals.DrivingAgeMembers); mandatoryLogsum = schoolNestedAlternative == null ? 0 : schoolNestedAlternative.ComputeLogsum(); } else { mandatoryLogsum = 0; } } bool mandatoryAvailableFlag = true; if (personDay.Person.IsNonworkingAdult || personDay.Person.IsRetiredAdult || (!personDay.Person.IsWorker && !personDay.Person.IsStudent) || (!Global.Configuration.IsInEstimationMode && !personDay.Person.IsWorker && personDay.Person.UsualSchoolParcel == null) ) { mandatoryAvailableFlag = false; } // Pattern Type Mandatory on tour (at least one work or school tour) ChoiceProbabilityCalculator.Alternative alternative = choiceProbabilityCalculator.GetAlternative(0, mandatoryAvailableFlag, choice == 1); alternative.Choice = 1; //alternative.AddUtilityTerm(1, 1); //alternative.AddUtilityTerm(3, (person.IsStudent && person.IsWorker).ToFlag()); //alternative.AddUtilityTerm(4, person.IsPartTimeWorker.ToFlag()); alternative.AddUtilityTerm(6, (person.Age > 5).ToFlag() * (person.Age <= 18).ToFlag()); // alternative.AddUtilityTerm(10, (mandatoryCount == 2).ToFlag()); alternative.AddUtilityTerm(11, (mandatoryCount >= 3).ToFlag()); alternative.AddUtilityTerm(12, mandatoryLogsum); //alternative.AddUtilityTerm(13, totalAggregateLogsum); alternative.AddUtilityTerm(15, household.Has100KPlusIncome.ToFlag()); // PatternType NonMandatory on tour (tours, but none for work or school) alternative = choiceProbabilityCalculator.GetAlternative(1, true, choice == 2); alternative.Choice = 2; alternative.AddUtilityTerm(21, 1); alternative.AddUtilityTerm(23, person.IsPartTimeWorker.ToFlag()); alternative.AddUtilityTerm(24, person.IsDrivingAgeStudent.ToFlag()); alternative.AddUtilityTerm(25, person.IsUniversityStudent.ToFlag()); alternative.AddUtilityTerm(26, person.IsNonworkingAdult.ToFlag()); //alternative.AddUtilityTerm(28, person.IsRetiredAdult.ToFlag()); alternative.AddUtilityTerm(29, (nonMandatoryCount == 0).ToFlag()); //alternative.AddUtilityTerm(30, (nonMandatoryKids==1).ToFlag()); alternative.AddUtilityTerm(31, ((nonMandatoryCount == 2).ToFlag())); alternative.AddUtilityTerm(32, ((nonMandatoryCount >= 3).ToFlag())); alternative.AddUtilityTerm(34, totalAggregateLogsum); alternative.AddUtilityTerm(35, person.IsAdultFemale.ToFlag()); //alternative.AddUtilityTerm(37, household.Has75KPlusIncome.ToFlag()); // PatternType Home (all day) alternative = choiceProbabilityCalculator.GetAlternative(2, true, choice == 3); alternative.Choice = 3; alternative.AddUtilityTerm(41, 1); alternative.AddUtilityTerm(42, person.IsPartTimeWorker.ToFlag()); alternative.AddUtilityTerm(45, person.IsDrivingAgeStudent.ToFlag()); alternative.AddUtilityTerm(48, person.IsUniversityStudent.ToFlag()); alternative.AddUtilityTerm(52, (person.Age > 75).ToFlag()); alternative.AddUtilityTerm(53, (homeCount == 0).ToFlag()); alternative.AddUtilityTerm(57, (homeCount >= 2).ToFlag()); //alternative.AddUtilityTerm(58, person.IsAdultFemale.ToFlag()); // alternative.AddUtilityTerm(60, noCarsFlag + carCompetitionFlag); alternative.AddUtilityTerm(62, distanceToStop); //alternative.AddUtilityTerm(63, totalAggregateLogsum); alternative.AddUtilityTerm(64, mandatoryLogsum); //alternative.AddUtilityTerm(65, Math.Log(1+youngestAge)); //alternative.AddUtilityTerm(66, Math.Log(1+oldestAge)); }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, HouseholdDayWrapper householdDay, int nCallsForTour, int choice = Constants.DEFAULT_VALUE) { IEnumerable <PersonDayWrapper> orderedPersonDays = householdDay.PersonDays.OrderBy(p => p.GetJointTourParticipationPriority()).ToList().Cast <PersonDayWrapper>(); Framework.DomainModels.Wrappers.IHouseholdWrapper household = householdDay.Household; Framework.DomainModels.Wrappers.IParcelWrapper residenceParcel = household.ResidenceParcel; 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 = household.GetVotALSegment(); 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]; double 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 countNonMandatory = 0; int countMandatory = 0; int countWorkingAtHome = 0; int countAge5to8 = 0; int countAge9to12 = 0; int countAge13to15 = 0; int countAdultFemale = 0; int countAdultMale = 0; int youngestAge = 150; int oldestAge = 0; int mandatoryHTours = 0; int mandatoryHStops = 0; int[] mandPerstype = new int[8]; int[] nonMandPerstype = new int[8]; int[] atHomePersType = new int[8]; List <KeyValuePair <int, double> > hhSchools = new List <KeyValuePair <int, double> >(); List <KeyValuePair <int, double> > hhJobs = new List <KeyValuePair <int, double> >(); int count = 0; foreach (PersonDayWrapper personDay in orderedPersonDays) { Framework.DomainModels.Wrappers.IPersonWrapper person = personDay.Person; count++; if (count > 8) { break; } if (personDay.Person.Age >= 5 && personDay.Person.Age <= 8) { countAge5to8++; } if (personDay.Person.Age >= 9 && personDay.Person.Age <= 12) { countAge9to12++; } if (personDay.Person.Age >= 13 && personDay.Person.Age <= 15) { countAge13to15++; } if (personDay.Person.IsAdultFemale) { countAdultFemale++; } else if (personDay.Person.IsAdultMale) { countAdultMale++; } if (personDay.Person.Age < youngestAge) { youngestAge = personDay.Person.Age; } if (personDay.Person.Age > oldestAge) { oldestAge = personDay.Person.Age; } mandatoryHTours = mandatoryHTours + personDay.WorkTours + personDay.SchoolTours; mandatoryHStops = mandatoryHStops + (personDay.WorkStops > 0).ToFlag() + (personDay.SchoolTours > 0).ToFlag(); if (personDay.WorksAtHomeFlag == 1) { countWorkingAtHome++; } if (personDay.PatternType == 1) { countMandatory++; mandPerstype[personDay.Person.PersonType - 1]++; } if (personDay.PatternType == 2) { countNonMandatory++; nonMandPerstype[personDay.Person.PersonType - 1]++; } if (personDay.PatternType == 3) { atHomePersType[personDay.Person.PersonType - 1]++; } } youngestAge = youngestAge == 150 ? 0 : youngestAge; // NONE_OR_HOME ChoiceProbabilityCalculator.Alternative alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.NoneOrHome, true, choice == Global.Settings.Purposes.NoneOrHome); alternative.Choice = Global.Settings.Purposes.NoneOrHome; //alternative.AddUtilityTerm(1, (nCallsForTour == 1).ToFlag()); alternative.AddUtilityTerm(2, (nCallsForTour == 2).ToFlag()); alternative.AddUtilityTerm(3, (nCallsForTour >= 3).ToFlag()); alternative.AddUtilityTerm(12, atHomePersType[4]); // alternative.AddUtilityTerm(15, Math.Log(1+aveWorkTime)); // alternative.AddUtilityTerm(16, Math.Log(1+aveSchoolTime)); // WORK alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Work, false, choice == Global.Settings.Purposes.Work); alternative.Choice = Global.Settings.Purposes.Work; alternative.AddUtilityTerm(202, 1); // SCHOOL alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.School, false, choice == Global.Settings.Purposes.School); alternative.Choice = Global.Settings.Purposes.School; alternative.AddUtilityTerm(203, 1); // ESCORT alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Escort, true, choice == Global.Settings.Purposes.Escort); alternative.Choice = Global.Settings.Purposes.Escort; alternative.AddUtilityTerm(151, 1); alternative.AddUtilityTerm(152, nonMandPerstype[0]); alternative.AddUtilityTerm(153, nonMandPerstype[1]); alternative.AddUtilityTerm(154, nonMandPerstype[2]); alternative.AddUtilityTerm(155, nonMandPerstype[3]); alternative.AddUtilityTerm(156, nonMandPerstype[4]); alternative.AddUtilityTerm(157, nonMandPerstype[5]); alternative.AddUtilityTerm(158, nonMandPerstype[6]); alternative.AddUtilityTerm(159, nonMandPerstype[7]); alternative.AddUtilityTerm(160, countMandatory); alternative.AddUtilityTerm(162, countWorkingAtHome); alternative.AddUtilityTerm(165, countAdultFemale); alternative.AddUtilityTerm(166, countAdultMale); alternative.AddUtilityTerm(167, countAge5to8); alternative.AddUtilityTerm(168, countAge9to12); alternative.AddUtilityTerm(169, countAge13to15); alternative.AddUtilityTerm(170, Math.Log(1 + youngestAge)); alternative.AddUtilityTerm(173, Math.Log(1 + household.ResidenceParcel.HouseholdsBuffer2)); // PERSONAL_BUSINESS alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.PersonalBusiness, true, choice == Global.Settings.Purposes.PersonalBusiness); alternative.Choice = Global.Settings.Purposes.PersonalBusiness; alternative.AddUtilityTerm(21, 1); alternative.AddUtilityTerm(22, nonMandPerstype[0]); alternative.AddUtilityTerm(23, nonMandPerstype[1]); alternative.AddUtilityTerm(24, nonMandPerstype[2]); alternative.AddUtilityTerm(25, nonMandPerstype[3]); alternative.AddUtilityTerm(26, nonMandPerstype[4]); alternative.AddUtilityTerm(27, nonMandPerstype[5]); alternative.AddUtilityTerm(28, nonMandPerstype[6]); alternative.AddUtilityTerm(29, nonMandPerstype[7]); alternative.AddUtilityTerm(30, countMandatory); alternative.AddUtilityTerm(37, Math.Log(1 + oldestAge)); // SHOPPING alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Shopping, true, choice == Global.Settings.Purposes.Shopping); alternative.Choice = Global.Settings.Purposes.Shopping; alternative.AddUtilityTerm(41, 1); alternative.AddUtilityTerm(42, nonMandPerstype[0]); alternative.AddUtilityTerm(43, nonMandPerstype[1]); alternative.AddUtilityTerm(44, nonMandPerstype[2]); alternative.AddUtilityTerm(45, nonMandPerstype[3]); alternative.AddUtilityTerm(46, nonMandPerstype[4]); alternative.AddUtilityTerm(47, nonMandPerstype[5]); alternative.AddUtilityTerm(48, nonMandPerstype[6]); alternative.AddUtilityTerm(49, nonMandPerstype[7]); alternative.AddUtilityTerm(50, countMandatory); alternative.AddUtilityTerm(51, shoppingAggregateLogsum); alternative.AddUtilityTerm(52, householdDay.Household.Has0To25KIncome.ToFlag()); alternative.AddUtilityTerm(58, Math.Log(1 + youngestAge)); alternative.AddUtilityTerm(59, Math.Log(1 + oldestAge)); // MEAL alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Meal, true, choice == Global.Settings.Purposes.Meal); alternative.Choice = Global.Settings.Purposes.Meal; alternative.AddUtilityTerm(61, 1); alternative.AddUtilityTerm(62, nonMandPerstype[0]); alternative.AddUtilityTerm(63, nonMandPerstype[1]); alternative.AddUtilityTerm(64, nonMandPerstype[2]); alternative.AddUtilityTerm(65, nonMandPerstype[3]); alternative.AddUtilityTerm(66, nonMandPerstype[4]); alternative.AddUtilityTerm(67, nonMandPerstype[5]); alternative.AddUtilityTerm(68, nonMandPerstype[6]); alternative.AddUtilityTerm(69, nonMandPerstype[7]); alternative.AddUtilityTerm(70, countMandatory); alternative.AddUtilityTerm(71, mealAggregateLogsum); alternative.AddUtilityTerm(78, Math.Log(1 + youngestAge)); alternative.AddUtilityTerm(79, Math.Log(1 + oldestAge)); alternative.AddUtilityTerm(80, Math.Log(1 + household.ResidenceParcel.HouseholdsBuffer2)); // SOCIAL alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Social, true, choice == Global.Settings.Purposes.Social); alternative.Choice = Global.Settings.Purposes.Social; alternative.AddUtilityTerm(81, 1); alternative.AddUtilityTerm(82, nonMandPerstype[0]); alternative.AddUtilityTerm(83, nonMandPerstype[1]); alternative.AddUtilityTerm(84, nonMandPerstype[2]); alternative.AddUtilityTerm(85, nonMandPerstype[3]); alternative.AddUtilityTerm(86, nonMandPerstype[4]); alternative.AddUtilityTerm(87, nonMandPerstype[5]); alternative.AddUtilityTerm(88, nonMandPerstype[6]); alternative.AddUtilityTerm(89, nonMandPerstype[7]); alternative.AddUtilityTerm(90, countMandatory); alternative.AddUtilityTerm(91, socialAggregateLogsum); alternative.AddUtilityTerm(93, Math.Log(1 + householdDay.Household.ResidenceParcel.HouseholdsBuffer1)); alternative.AddUtilityTerm(96, countAge5to8); alternative.AddUtilityTerm(97, countAge9to12); alternative.AddUtilityTerm(98, countAge13to15); alternative.AddUtilityTerm(100, Math.Log(1 + oldestAge)); // RECREATION alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Recreation, true, choice == Global.Settings.Purposes.Recreation); alternative.Choice = Global.Settings.Purposes.Recreation; alternative.AddUtilityTerm(101, 1); alternative.AddUtilityTerm(102, nonMandPerstype[0]); alternative.AddUtilityTerm(103, nonMandPerstype[1]); alternative.AddUtilityTerm(104, nonMandPerstype[2]); alternative.AddUtilityTerm(105, nonMandPerstype[3]); alternative.AddUtilityTerm(106, nonMandPerstype[4]); alternative.AddUtilityTerm(107, nonMandPerstype[5]); alternative.AddUtilityTerm(108, nonMandPerstype[6]); alternative.AddUtilityTerm(109, nonMandPerstype[7]); alternative.AddUtilityTerm(110, countMandatory); alternative.AddUtilityTerm(111, totalAggregateLogsum); alternative.AddUtilityTerm(112, Math.Log(1 + householdDay.Household.ResidenceParcel.OpenSpaceType1Buffer1)); alternative.AddUtilityTerm(113, countAdultFemale); alternative.AddUtilityTerm(114, countAdultMale); alternative.AddUtilityTerm(115, countAge5to8); alternative.AddUtilityTerm(116, countAge9to12); alternative.AddUtilityTerm(117, countAge13to15); alternative.AddUtilityTerm(118, Math.Log(1 + youngestAge)); // MEDICAL alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Medical, true, choice == Global.Settings.Purposes.Medical); alternative.Choice = Global.Settings.Purposes.Medical; alternative.AddUtilityTerm(121, 1); alternative.AddUtilityTerm(122, nonMandPerstype[0]); alternative.AddUtilityTerm(123, nonMandPerstype[1]); alternative.AddUtilityTerm(124, nonMandPerstype[2]); alternative.AddUtilityTerm(125, nonMandPerstype[3]); alternative.AddUtilityTerm(126, nonMandPerstype[4]); alternative.AddUtilityTerm(127, nonMandPerstype[5]); alternative.AddUtilityTerm(128, nonMandPerstype[6]); alternative.AddUtilityTerm(129, nonMandPerstype[7]); alternative.AddUtilityTerm(130, countMandatory); alternative.AddUtilityTerm(131, totalAggregateLogsum); }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, HouseholdDayWrapper householdDay, int nCallsForTour, bool[] available, int choice = Constants.DEFAULT_VALUE) { if (available[4]) { } Framework.DomainModels.Wrappers.IHouseholdWrapper household = householdDay.Household; IEnumerable <PersonDayWrapper> orderedPersonDays = householdDay.PersonDays.OrderBy(p => p.GetJointHalfTourParticipationPriority()).ToList().Cast <PersonDayWrapper>(); 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 carsGrAdults = household.VehiclesAvailable > household.HouseholdTotals.DrivingAgeMembers ? 1 : 0; int votALSegment = household.GetVotALSegment(); int transitAccessSegment = household.ResidenceParcel.TransitAccessSegment(); double totAggregateLogsum = Global.AggregateLogsums[household.ResidenceParcel.ZoneId] [Global.Settings.Purposes.HomeBasedComposite][carOwnership][votALSegment][transitAccessSegment]; int countWorkingAtHome = 0; int transitPassOwnership = 0; int oldestChild = 0; int payParkWork = 0; int numSchoolMatch = 0; int count = 0; List <KeyValuePair <int, double> > hhSchools = new List <KeyValuePair <int, double> >(); List <KeyValuePair <int, double> > hhJobs = new List <KeyValuePair <int, double> >(); foreach (PersonDayWrapper personDay in orderedPersonDays) { Framework.DomainModels.Wrappers.IPersonWrapper person = personDay.Person; count++; if (count > 8) { break; } if (person.UsualSchoolParcelId > 0) { hhSchools.Add(new KeyValuePair <int, double>(person.UsualSchoolParcelId, person.AutoTimeToUsualSchool)); } if (person.UsualWorkParcelId > 0) { hhJobs.Add(new KeyValuePair <int, double>(person.UsualWorkParcelId, person.AutoTimeToUsualWork)); } if (personDay.WorksAtHomeFlag == 1) { countWorkingAtHome++; } if (person.TransitPassOwnership == 1) { transitPassOwnership++; } if (person.TransitPassOwnership == 1) { payParkWork++; } } int countMandatoryAdults = (from personDayHH in orderedPersonDays where personDayHH.PatternType == 1 && personDayHH.Person.IsAdult select personDayHH.PatternType).Count(); int countMandatoryChildren = (from personDayHH in orderedPersonDays where personDayHH.PatternType == 1 && personDayHH.Person.IsChildUnder16 select personDayHH.PatternType).Count(); int countNonMandatoryAdults = (from personDayHH in orderedPersonDays where personDayHH.PatternType == 2 && personDayHH.Person.IsAdult select personDayHH.PatternType).Count(); int countKidsAtHome = (from personDayHH in orderedPersonDays where personDayHH.PatternType == 3 && personDayHH.Person.Age < 12 select personDayHH.PatternType).Count(); int youngestAge = (from person in household.Persons select person.Age).Min(); if (youngestAge <= 18) { oldestChild = (from person in household.Persons where person.Age <= 18 select person.Age).Max(); } if (hhSchools.Count > 1) { //number of schools - number of unique schools gives matches numSchoolMatch = hhSchools.Count - (from schoolm in hhSchools select schoolm).Distinct().Count(); } double lnYoungestAge = Math.Log(1 + youngestAge); double lnOldestChild = Math.Log(1 + oldestChild); int noStudents = household.HouseholdTotals.AllStudents == 0 ? 1 : 0; int noWorkers = household.HouseholdTotals.AllWorkers == 0 ? 1 : 0; // NONE_OR_HOME ChoiceProbabilityCalculator.Alternative alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.NoneOrHome, available[0], choice == Global.Settings.Purposes.NoneOrHome); alternative.Choice = Global.Settings.Purposes.NoneOrHome; alternative.AddUtilityTerm(1, (nCallsForTour == 2).ToFlag()); alternative.AddUtilityTerm(2, (nCallsForTour == 3).ToFlag()); alternative.AddUtilityTerm(3, (nCallsForTour >= 4).ToFlag()); alternative.AddUtilityTerm(4, noCarsFlag); alternative.AddUtilityTerm(5, carsGrAdults); alternative.AddUtilityTerm(6, (countKidsAtHome > 0).ToFlag()); alternative.AddUtilityTerm(7, noStudents); alternative.AddUtilityTerm(8, noWorkers); // FULL PAIRED // base is two person- two worker household alternative = choiceProbabilityCalculator.GetAlternative(1, available[1], choice == 1); alternative.Choice = 1; alternative.AddUtilityTerm(11, 1); alternative.AddUtilityTerm(20, (countMandatoryAdults > 2).ToFlag()); alternative.AddUtilityTerm(13, (household.Has0To25KIncome).ToFlag()); alternative.AddUtilityTerm(12, (countMandatoryAdults == household.HouseholdTotals.Adults).ToFlag() * (countMandatoryChildren == 1).ToFlag()); alternative.AddUtilityTerm(14, (countMandatoryAdults == household.HouseholdTotals.Adults).ToFlag() * (countMandatoryChildren == 2).ToFlag()); alternative.AddUtilityTerm(15, (countMandatoryChildren >= 3).ToFlag()); alternative.AddUtilityTerm(16, (countNonMandatoryAdults > 0).ToFlag() * (countMandatoryChildren == 0).ToFlag()); alternative.AddUtilityTerm(17, (countNonMandatoryAdults > 0).ToFlag() * (countMandatoryChildren == 1).ToFlag()); alternative.AddUtilityTerm(18, (countNonMandatoryAdults > 0).ToFlag() * (countMandatoryChildren == 2).ToFlag()); alternative.AddUtilityTerm(19, numSchoolMatch); alternative.AddUtilityTerm(21, lnYoungestAge); alternative.AddUtilityTerm(22, (household.HouseholdTotals.DrivingAgeStudents > 0).ToFlag()); // FULL HalfTour 1 alternative = choiceProbabilityCalculator.GetAlternative(2, available[2], choice == 2); alternative.Choice = 2; alternative.AddUtilityTerm(31, 1); alternative.AddUtilityTerm(32, (countMandatoryAdults > 2).ToFlag()); alternative.AddUtilityTerm(39, (countMandatoryAdults == household.HouseholdTotals.Adults).ToFlag() * (countMandatoryChildren == 1).ToFlag()); alternative.AddUtilityTerm(40, (countMandatoryAdults == household.HouseholdTotals.Adults).ToFlag() * (countMandatoryChildren == 2).ToFlag()); alternative.AddUtilityTerm(41, (countMandatoryChildren >= 3).ToFlag()); alternative.AddUtilityTerm(42, (countNonMandatoryAdults > 0).ToFlag() * (countMandatoryChildren == 0).ToFlag()); alternative.AddUtilityTerm(43, (countNonMandatoryAdults > 0).ToFlag() * (countMandatoryChildren == 1).ToFlag()); alternative.AddUtilityTerm(44, (countNonMandatoryAdults > 0).ToFlag() * (countMandatoryChildren == 2).ToFlag()); alternative.AddUtilityTerm(45, numSchoolMatch); alternative.AddUtilityTerm(46, (household.HouseholdTotals.DrivingAgeStudents > 0).ToFlag()); alternative.AddUtilityTerm(47, lnOldestChild); alternative.AddUtilityTerm(49, totAggregateLogsum); alternative.AddUtilityTerm(53, (household.HouseholdTotals.ChildrenUnder5 > 1).ToFlag()); alternative.AddUtilityTerm(54, countWorkingAtHome); // Full HalfTour 2 alternative = choiceProbabilityCalculator.GetAlternative(3, available[3], choice == 3); alternative.Choice = 3; alternative.AddUtilityTerm(51, 1); alternative.AddUtilityTerm(32, (countMandatoryAdults > 2).ToFlag()); alternative.AddUtilityTerm(39, (countMandatoryAdults == household.HouseholdTotals.Adults).ToFlag() * (countMandatoryChildren == 1).ToFlag()); alternative.AddUtilityTerm(40, (countMandatoryAdults == household.HouseholdTotals.Adults).ToFlag() * (countMandatoryChildren == 2).ToFlag()); alternative.AddUtilityTerm(41, (countMandatoryChildren >= 3).ToFlag()); alternative.AddUtilityTerm(42, (countNonMandatoryAdults > 0).ToFlag() * (countMandatoryChildren == 0).ToFlag()); alternative.AddUtilityTerm(43, (countNonMandatoryAdults > 0).ToFlag() * (countMandatoryChildren == 1).ToFlag()); alternative.AddUtilityTerm(44, (countNonMandatoryAdults > 0).ToFlag() * (countMandatoryChildren == 2).ToFlag()); alternative.AddUtilityTerm(45, numSchoolMatch); alternative.AddUtilityTerm(46, (household.HouseholdTotals.DrivingAgeStudents > 0).ToFlag()); alternative.AddUtilityTerm(47, lnOldestChild); alternative.AddUtilityTerm(49, totAggregateLogsum); alternative.AddUtilityTerm(53, (household.HouseholdTotals.ChildrenUnder5 > 1).ToFlag()); alternative.AddUtilityTerm(54, countWorkingAtHome); // PARTIAL PAIRED alternative = choiceProbabilityCalculator.GetAlternative(4, available[4], choice == 4); alternative.Choice = 4; alternative.AddUtilityTerm(61, 1); alternative.AddUtilityTerm(62, (countMandatoryAdults > 2).ToFlag()); alternative.AddUtilityTerm(69, (countMandatoryAdults == household.HouseholdTotals.Adults).ToFlag() * (countMandatoryChildren == 1).ToFlag()); alternative.AddUtilityTerm(70, (countMandatoryAdults == household.HouseholdTotals.Adults).ToFlag() * (countMandatoryChildren == 2).ToFlag()); alternative.AddUtilityTerm(72, (countNonMandatoryAdults > 0).ToFlag() * (countMandatoryChildren == 0).ToFlag()); alternative.AddUtilityTerm(73, (countNonMandatoryAdults > 0).ToFlag() * (countMandatoryChildren == 1).ToFlag()); alternative.AddUtilityTerm(74, (countNonMandatoryAdults > 0).ToFlag() * (countMandatoryChildren == 2).ToFlag()); alternative.AddUtilityTerm(75, lnYoungestAge); alternative.AddUtilityTerm(78, household.Has75KPlusIncome.ToFlag()); alternative.AddUtilityTerm(86, (household.HouseholdTotals.DrivingAgeStudents > 0).ToFlag()); alternative.AddUtilityTerm(87, (countMandatoryChildren >= 3).ToFlag()); // PARTIAL HalfTour 1 alternative = choiceProbabilityCalculator.GetAlternative(5, available[5], choice == 5); alternative.Choice = 5; alternative.AddUtilityTerm(91, 1); alternative.AddUtilityTerm(92, (countMandatoryAdults > 2).ToFlag()); alternative.AddUtilityTerm(98, (countMandatoryAdults == household.HouseholdTotals.Adults).ToFlag() * (countMandatoryChildren == 1).ToFlag()); alternative.AddUtilityTerm(99, (countMandatoryAdults == household.HouseholdTotals.Adults).ToFlag() * (countMandatoryChildren == 2).ToFlag()); alternative.AddUtilityTerm(102, (countNonMandatoryAdults > 0).ToFlag() * (countMandatoryChildren == 0).ToFlag()); alternative.AddUtilityTerm(103, (countNonMandatoryAdults > 0).ToFlag() * (countMandatoryChildren == 1).ToFlag()); alternative.AddUtilityTerm(104, (countNonMandatoryAdults > 0).ToFlag() * (countMandatoryChildren == 2).ToFlag()); alternative.AddUtilityTerm(105, (countMandatoryChildren >= 3).ToFlag()); alternative.AddUtilityTerm(108, lnYoungestAge); alternative.AddUtilityTerm(109, lnOldestChild); alternative.AddUtilityTerm(114, (household.Has0To25KIncome).ToFlag()); alternative.AddUtilityTerm(115, (household.Has100KPlusIncome).ToFlag()); alternative.AddUtilityTerm(117, (household.HouseholdTotals.ChildrenAge5Through15 > 1).ToFlag()); alternative.AddUtilityTerm(118, (household.HouseholdTotals.PartTimeWorkers > 0).ToFlag()); // PARTIAL HalfTour 2 alternative = choiceProbabilityCalculator.GetAlternative(6, available[6], choice == 6); alternative.Choice = 6; alternative.AddUtilityTerm(101, 1); alternative.AddUtilityTerm(92, (countMandatoryAdults > 2).ToFlag()); alternative.AddUtilityTerm(98, (countMandatoryAdults == household.HouseholdTotals.Adults).ToFlag() * (countMandatoryChildren == 1).ToFlag()); alternative.AddUtilityTerm(99, (countMandatoryAdults == household.HouseholdTotals.Adults).ToFlag() * (countMandatoryChildren == 2).ToFlag()); alternative.AddUtilityTerm(102, (countNonMandatoryAdults > 0).ToFlag() * (countMandatoryChildren == 0).ToFlag()); alternative.AddUtilityTerm(103, (countNonMandatoryAdults > 0).ToFlag() * (countMandatoryChildren == 1).ToFlag()); alternative.AddUtilityTerm(104, (countNonMandatoryAdults > 0).ToFlag() * (countMandatoryChildren == 2).ToFlag()); alternative.AddUtilityTerm(105, (countMandatoryChildren >= 3).ToFlag()); alternative.AddUtilityTerm(108, lnYoungestAge); alternative.AddUtilityTerm(109, lnOldestChild); alternative.AddUtilityTerm(114, (household.Has0To25KIncome).ToFlag()); alternative.AddUtilityTerm(115, (household.Has100KPlusIncome).ToFlag()); alternative.AddUtilityTerm(117, (household.HouseholdTotals.ChildrenAge5Through15 > 1).ToFlag()); alternative.AddUtilityTerm(118, (household.HouseholdTotals.PartTimeWorkers > 0).ToFlag()); }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, PersonDayWrapper personDay, HouseholdDayWrapper householdDay, int choice = Constants.DEFAULT_VALUE) { Framework.DomainModels.Wrappers.IHouseholdWrapper household = personDay.Household; Framework.DomainModels.Wrappers.IPersonWrapper person = personDay.Person; IEnumerable <PersonDayWrapper> personTypeOrderedPersonDays = householdDay.PersonDays.OrderBy(p => p.Person.PersonType).ToList().Cast <PersonDayWrapper>(); int mandatoryCount = 0; int nonMandatoryCount = 0; int homeCount = 0; int i = 0; foreach (PersonDayWrapper pDay in personTypeOrderedPersonDays) { i++; if (i <= 5) { if (pDay.PatternType == Global.Settings.PatternTypes.Mandatory) { mandatoryCount++; } else if (pDay.PatternType == Global.Settings.PatternTypes.Optional) { nonMandatoryCount++; } else { homeCount++; } } } bool mandatoryAvailableFlag = true; if (personDay.Person.IsNonworkingAdult || personDay.Person.IsRetiredAdult || (!personDay.Person.IsWorker && !personDay.Person.IsStudent) || (!Global.Configuration.IsInEstimationMode && !personDay.Person.IsWorker && personDay.Person.UsualSchoolParcel == null) ) { mandatoryAvailableFlag = false; } 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]; // Pattern Type Mandatory on tour (at least one work or school tour) ChoiceProbabilityCalculator.Alternative alternative = choiceProbabilityCalculator.GetAlternative(0, mandatoryAvailableFlag, choice == 1); alternative.Choice = 1; alternative.AddUtilityTerm(1, 1); alternative.AddUtilityTerm(2, person.IsChildUnder5.ToFlag()); alternative.AddUtilityTerm(3, person.IsChildAge5Through15.ToFlag()); alternative.AddUtilityTerm(4, person.IsFulltimeWorker.ToFlag()); alternative.AddUtilityTerm(5, person.IsMale.ToFlag()); //alternative.AddUtilityTerm(4, person.IsPartTimeWorker.ToFlag()); alternative.AddUtilityTerm(7, householdDay.Household.HasChildrenUnder5.ToFlag()); alternative.AddUtilityTerm(8, householdDay.Household.HasChildrenAge5Through15.ToFlag()); alternative.AddUtilityTerm(10, (householdDay.AdultsInSharedHomeStay == 2 && householdDay.Household.HouseholdTotals.FullAndPartTimeWorkers >= 2).ToFlag()); //alternative.AddUtilityTerm(14, (householdDay.AdultsInSharedHomeStay == 2).ToFlag()); //alternative.AddUtilityTerm(15, (householdDay.Household.HouseholdTotals.FullAndPartTimeWorkers >= 2).ToFlag()); alternative.AddUtilityTerm(11, (householdDay.AdultsInSharedHomeStay == 1 && householdDay.Household.HasChildren).ToFlag()); //alternative.AddUtilityTerm(12, (householdDay.Household.Size == 2).ToFlag()); //GV; 16. april 2013, not significant //alternative.AddUtilityTerm(13, (householdDay.Household.Size == 3).ToFlag()); //GV; 16. april 2013, not significant //alternative.AddUtilityTerm(14, (householdDay.Household.Size >= 4).ToFlag()); //GV; 16. april 2013, not significant //alternative.AddUtilityTerm(12, (householdDay.Household.VehiclesAvailable == 1).ToFlag()); //alternative.AddUtilityTerm(13, (householdDay.Household.VehiclesAvailable >= 2).ToFlag()); //GV: not sign. 10. juni 2016 //alternative.AddUtilityTerm(15, (householdDay.Household.VehiclesAvailable == 1 && household.Has2Drivers).ToFlag()); alternative.AddUtilityTerm(16, (householdDay.Household.VehiclesAvailable >= 2 && household.Has2Drivers).ToFlag()); //GV: introduced again - 10. june 2016 //GV: logsum for mandatory - wrong sign //alternative.AddUtilityTerm(17, compositeLogsum); //alternative.AddUtilityTerm(17, (householdDay.Household.Income >= 300000 && householdDay.Household.Income < 600000).ToFlag()); //GV; 16. april 2013, not significant //alternative.AddUtilityTerm(18, (householdDay.Household.Income >= 600000 && householdDay.Household.Income < 900000).ToFlag()); //GV; 16. april 2013, not significant //alternative.AddUtilityTerm(19, (householdDay.Household.Income >= 900000).ToFlag()); //GV; 16. april 2013, not significant alternative.AddUtilityTerm(20, householdDay.PrimaryPriorityTimeFlag); //alternative.AddUtilityTerm(19, (mandatoryCount == 0)? 1 : 0); //GV - goes to infinity // PatternType NonMandatory on tour (tours, but none for work or school) alternative = choiceProbabilityCalculator.GetAlternative(1, true, choice == 2); alternative.Choice = 2; alternative.AddUtilityTerm(22, person.IsRetiredAdult.ToFlag()); alternative.AddUtilityTerm(23, person.IsNonworkingAdult.ToFlag()); //GV: not sign. 10. june 2016 //alternative.AddUtilityTerm(24, householdDay.Household.HasChildrenUnder5.ToFlag()); //alternative.AddUtilityTerm(25, householdDay.Household.HasChildrenAge5Through15.ToFlag()); //alternative.AddUtilityTerm(31, (householdDay.AdultsInSharedHomeStay == 2).ToFlag()); //alternative.AddUtilityTerm(33, (householdDay.Household.HouseholdTotals.FullAndPartTimeWorkers >= 2).ToFlag()); alternative.AddUtilityTerm(26, (householdDay.AdultsInSharedHomeStay == 2 && householdDay.Household.HouseholdTotals.FullAndPartTimeWorkers >= 2).ToFlag()); alternative.AddUtilityTerm(27, (householdDay.AdultsInSharedHomeStay == 1 && householdDay.Household.HasChildren).ToFlag()); //alternative.AddUtilityTerm(28, (householdDay.Household.Size == 2).ToFlag()); //GV; 16. april 2013, not significant //alternative.AddUtilityTerm(29, (householdDay.Household.Size == 3).ToFlag()); //GV; 16. april 2013, not significant //alternative.AddUtilityTerm(30, (householdDay.Household.Size >= 4).ToFlag()); //GV; 16. april 2013, not significant //alternative.AddUtilityTerm(27, (householdDay.Household.VehiclesAvailable == 1).ToFlag()); //alternative.AddUtilityTerm(28, (householdDay.Household.VehiclesAvailable >= 2).ToFlag()); alternative.AddUtilityTerm(31, (householdDay.Household.VehiclesAvailable == 1 && household.Has2Drivers).ToFlag()); alternative.AddUtilityTerm(32, (householdDay.Household.VehiclesAvailable >= 2 && household.Has2Drivers).ToFlag()); //alternative.AddUtilityTerm(33, compositeLogsum); //GV: logsum for non-mandatory //alternative.AddUtilityTerm(33, (householdDay.Household.Income >= 300000 && householdDay.Household.Income < 600000).ToFlag()); //GV; 16. april 2013, not significant //alternative.AddUtilityTerm(34, (householdDay.Household.Income >= 600000 && householdDay.Household.Income < 900000).ToFlag()); //GV; 16. april 2013, not significant //alternative.AddUtilityTerm(35, (householdDay.Household.Income >= 900000).ToFlag()); //GV; 16. april 2013, not significant alternative.AddUtilityTerm(36, householdDay.PrimaryPriorityTimeFlag); //alternative.AddUtilityTerm(24, person.IsChildUnder5.ToFlag()); //alternative.AddUtilityTerm(25, person.IsNonworkingAdult.ToFlag()); // PatternType Home (all day) alternative = choiceProbabilityCalculator.GetAlternative(2, true, choice == 3); alternative.Choice = 3; alternative.AddUtilityTerm(41, 1); alternative.AddUtilityTerm(42, person.WorksAtHome().ToFlag()); //GV: introduced again - 10. june 2016; not sign. //alternative.AddUtilityTerm(43, person.IsUniversityStudent.ToFlag()); //alternative.AddUtilityTerm(54, (homeCount > 0)? 1 : 0); //GV: can be estimated but the valus is huge }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, HouseholdDayWrapper householdDay, int nCallsForTour, int choice = Constants.DEFAULT_VALUE) { //var householdDay = (ActumHouseholdDayWrapper)tour.HouseholdDay; Framework.DomainModels.Wrappers.IHouseholdWrapper household = householdDay.Household; 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]; [Global.Settings.Purposes.Shopping][Global.Settings.CarOwnerships.NoCars][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 allAdultEducLevel12 = 1; int youngestAge = 999; foreach (PersonWrapper person in householdDay.Household.Persons) { // set characteristics here that depend on person characteristics //if (person.Age >= 18 && person.EducationLevel >= 12) { //} //if (person.Age >= 18 && person.EducationLevel < 12) allAdultEducLevel12 = 0; if (person.Age < youngestAge) { youngestAge = person.Age; } } // NONE_OR_HOME bool noneOrHomeAvailable = true; if (Global.Configuration.ShouldRunActumPrimaryPriorityTimeModel && householdDay.JointTourFlag == 1 && nCallsForTour == 1) { noneOrHomeAvailable = false; } ChoiceProbabilityCalculator.Alternative alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.NoneOrHome, noneOrHomeAvailable, choice == Global.Settings.Purposes.NoneOrHome); alternative.Choice = Global.Settings.Purposes.NoneOrHome; alternative.AddUtilityTerm(1, (nCallsForTour == 2).ToFlag()); alternative.AddUtilityTerm(13, (nCallsForTour > 2).ToFlag()); //alternative.AddUtilityTerm(2, noCarsFlag); //alternative.AddUtilityTerm(3, carCompetitionFlag); //alternative.AddUtilityTerm(4, householdDay.PrimaryPriorityTimeFlag); //alternative.AddUtilityTerm(2, householdDay.Household.HasChildren.ToFlag()); //GV Sep 2014 - commented out //alternative.AddUtilityTerm(2, householdDay.Household.HasChildrenUnder5.ToFlag()); //alternative.AddUtilityTerm(3, householdDay.Household.HasChildrenAge5Through15.ToFlag()); //alternative.AddUtilityTerm(4, (householdDay.Household.Size == 2 && householdDay.AdultsInSharedHomeStay == 2).ToFlag()); //alternative.AddUtilityTerm(5, (householdDay.AdultsInSharedHomeStay == 1 && householdDay.Household.HasChildrenUnder16).ToFlag()); //alternative.AddUtilityTerm(6, (householdDay.AdultsInSharedHomeStay == 2 && householdDay.Household.HouseholdTotals.FullAndPartTimeWorkers >= 2).ToFlag()); //alternative.AddUtilityTerm(7, (householdDay.AdultsInSharedHomeStay == 2 && hasAdultEducLevel12 == 1).ToFlag()); //alternative.AddUtilityTerm(8, (youngestAge >= 40).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()); //GV old //alternative.AddNestedAlternative(11, 0, 60); // WORK alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Work, false, choice == Global.Settings.Purposes.Work); alternative.Choice = Global.Settings.Purposes.Work; alternative.AddUtilityTerm(52, 1); //alternative.AddNestedAlternative(12, 1, 60); // SCHOOL alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.School, false, choice == Global.Settings.Purposes.School); alternative.Choice = Global.Settings.Purposes.School; alternative.AddUtilityTerm(53, 1); //alternative.AddNestedAlternative(12, 1, 60); // ESCORT alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Escort, false, choice == Global.Settings.Purposes.Escort); alternative.Choice = Global.Settings.Purposes.Escort; alternative.AddUtilityTerm(54, 1); //alternative.AddUtilityTerm(22, householdDay.PrimaryPriorityTimeFlag); //alternative.AddUtilityTerm(23, (householdDay.Household.Size == 3).ToFlag()); //alternative.AddUtilityTerm(24, (householdDay.Household.Size >= 4).ToFlag()); //alternative.AddUtilityTerm(25, (householdDay.Household.VehiclesAvailable >= 2 && household.Has2Drivers).ToFlag()); //alternative.AddUtilityTerm(58, compositeLogsum); // PERSONAL_BUSINESS alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.PersonalBusiness, true, choice == Global.Settings.Purposes.PersonalBusiness); alternative.Choice = Global.Settings.Purposes.PersonalBusiness; alternative.AddUtilityTerm(21, 1); //GV: NEW alternative.AddUtilityTerm(22, householdDay.PrimaryPriorityTimeFlag); alternative.AddUtilityTerm(23, (householdDay.Household.Size == 3).ToFlag()); alternative.AddUtilityTerm(24, (householdDay.Household.Size >= 4).ToFlag()); alternative.AddUtilityTerm(28, (householdDay.Household.VehiclesAvailable >= 2 && household.Has2Drivers).ToFlag()); alternative.AddUtilityTerm(56, compositeLogsum); //alternative.AddUtilityTerm(25, (householdDay.Household.Size >= 5).ToFlag()); //alternative.AddUtilityTerm(26, (householdDay.Household.VehiclesAvailable == 0).ToFlag()); //alternative.AddUtilityTerm(27, (householdDay.Household.VehiclesAvailable == 1 && household.Has2Drivers).ToFlag()); //alternative.AddUtilityTerm(28, (householdDay.Household.VehiclesAvailable >= 2 && household.Has2Drivers).ToFlag()); //alternative.AddUtilityTerm(27, (householdDay.Household.Size == 2 && householdDay.AdultsInSharedHomeStay == 2).ToFlag()); //alternative.AddUtilityTerm(28, (householdDay.AdultsInSharedHomeStay == 1 && householdDay.Household.HasChildrenUnder16).ToFlag()); //alternative.AddUtilityTerm(56, personalBusinessAggregateLogsum); //alternative.AddUtilityTerm(56, compositeLogsum); //alternative.AddNestedAlternative(12, 1, 60); // SHOPPING alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Shopping, true, choice == Global.Settings.Purposes.Shopping); alternative.Choice = Global.Settings.Purposes.Shopping; alternative.AddUtilityTerm(31, 1); //GV: NEW alternative.AddUtilityTerm(32, householdDay.PrimaryPriorityTimeFlag); alternative.AddUtilityTerm(33, (householdDay.Household.Size == 3).ToFlag()); alternative.AddUtilityTerm(34, (householdDay.Household.Size >= 4).ToFlag()); alternative.AddUtilityTerm(37, (householdDay.Household.VehiclesAvailable == 1 && household.Has2Drivers).ToFlag()); alternative.AddUtilityTerm(59, compositeLogsum); //alternative.AddUtilityTerm(35, (householdDay.Household.Size >= 5).ToFlag()); //alternative.AddUtilityTerm(36, (householdDay.Household.VehiclesAvailable == 0).ToFlag()); //alternative.AddUtilityTerm(37, (householdDay.Household.VehiclesAvailable == 1 && household.Has2Drivers).ToFlag()); //GV Sep 2014 commeted out //alternative.AddUtilityTerm(38, (householdDay.Household.VehiclesAvailable >= 2 && household.Has2Drivers).ToFlag()); //GV old //alternative.AddUtilityTerm(37, (householdDay.Household.Size == 2 && householdDay.AdultsInSharedHomeStay == 2).ToFlag()); //alternative.AddUtilityTerm(38, (householdDay.AdultsInSharedHomeStay == 1 && householdDay.Household.HasChildrenUnder16).ToFlag()); //alternative.AddUtilityTerm(57, shoppingAggregateLogsum); //alternative.AddUtilityTerm(59, compositeLogsum); //alternative.AddNestedAlternative(12, 1, 60); // MEAL alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Meal, false, choice == Global.Settings.Purposes.Meal); alternative.Choice = Global.Settings.Purposes.Meal; alternative.AddUtilityTerm(55, 1); //alternative.AddNestedAlternative(12, 1, 60); // SOCIAL alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Social, true, choice == Global.Settings.Purposes.Social); alternative.Choice = Global.Settings.Purposes.Social; //GV: John's mail 16. june 2016, coeff 41 constrained to 0 alternative.AddUtilityTerm(41, 1); //GV: NEW //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 >= 5).ToFlag()); //alternative.AddUtilityTerm(46, (householdDay.Household.VehiclesAvailable >= 1).ToFlag()); //alternative.AddUtilityTerm(47, (householdDay.Household.VehiclesAvailable == 1 && household.Has2Drivers).ToFlag()); //GV Sep 2014 commeted out //alternative.AddUtilityTerm(48, (householdDay.Household.VehiclesAvailable >= 2 && household.Has2Drivers).ToFlag()); //alternative.AddUtilityTerm(46, (householdDay.Household.VehiclesAvailable > 0 && householdDay.Household.HasChildren).ToFlag()); //alternative.AddUtilityTerm(46, (householdDay.Household.VehiclesAvailable == 0).ToFlag()); cars have no impact on fully joint social tour //alternative.AddUtilityTerm(47, householdDay.Household.HasChildrenUnder5.ToFlag()); //alternative.AddUtilityTerm(48, householdDay.Household.HasChildrenAge5Through15.ToFlag()); //alternative.AddUtilityTerm(47, (householdDay.Household.Size == 2 && householdDay.AdultsInSharedHomeStay == 2).ToFlag()); //alternative.AddUtilityTerm(48, (householdDay.AdultsInSharedHomeStay == 1 && householdDay.Household.HasChildrenUnder16).ToFlag()); //alternative.AddUtilityTerm(58, socialAggregateLogsum); //alternative.AddUtilityTerm(58, compositeLogsum); //alternative.AddNestedAlternative(12, 1, 60); }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, PersonDayWrapper personDay, HouseholdDayWrapper householdDay, int choice = Constants.DEFAULT_VALUE) { Framework.DomainModels.Wrappers.IHouseholdWrapper household = householdDay.Household; // set household characteristics here that don't depend on person characteristics bool available = (householdDay.Household.Size > 1); int hasAdultEducLevel12 = 0; //int allAdultEducLevel12 = 1; int youngestAge = 999; foreach (PersonWrapper person in householdDay.Household.Persons) { // set characteristics here that depend on person characteristics 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; } } double workTourLogsum; if (personDay.Person.UsualWorkParcelId != Constants.DEFAULT_VALUE && personDay.Person.UsualWorkParcelId != Global.Settings.OutOfRegionParcelId) { //JLB 201406 //var nestedAlternative = Global.ChoiceModelSession.Get<WorkTourModeModel>().RunNested(personDay.Person, personDay.Person.Household.ResidenceParcel, personDay.Person.UsualWorkParcel, Global.Settings.Times.EightAM, Global.Settings.Times.FivePM, personDay.Person.Household.HouseholdTotals.DrivingAgeMembers); //JLB 201602 //var nestedAlternative = Global.ChoiceModelSession.Get<WorkTourModeTimeModel>().RunNested(personDay, personDay.Person.Household.ResidenceParcel, personDay.Person.UsualWorkParcel, Global.Settings.Times.EightAM, Global.Settings.Times.FivePM, personDay.Person.Household.HouseholdTotals.DrivingAgeMembers); ChoiceProbabilityCalculator.Alternative nestedAlternative = Global.ChoiceModelSession.Get <TourModeTimeModel>().RunNested(personDay, personDay.Person.Household.ResidenceParcel, personDay.Person.UsualWorkParcel, Global.Settings.Times.EightAM, Global.Settings.Times.FivePM, personDay.Person.Household.HouseholdTotals.DrivingAgeMembers, Global.Settings.Purposes.Work); workTourLogsum = nestedAlternative == null ? 0 : nestedAlternative.ComputeLogsum(); } else { workTourLogsum = 0; } int atHomeDay = personDay.PatternType == 3 ? 1 : 0; int nonMandatoryTourDay = personDay.PatternType == 2 ? 1 : 0; int MandatoryTourDay = personDay.PatternType == 1 ? 1 : 0; 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]; //var householdDay = (ActumHouseholdDayWrapper)tour.HouseholdDay; //var household = householdDay.Household; // 0 Person doesn't work at home more than specified number of minutes ChoiceProbabilityCalculator.Alternative alternative = choiceProbabilityCalculator.GetAlternative(0, true, choice == 0); alternative.Choice = 0; alternative.AddUtilityTerm(1, 0.0); // 1 Works at home alternative = choiceProbabilityCalculator.GetAlternative(1, true, choice == 1); alternative.Choice = 1; alternative.AddUtilityTerm(1, 1.0); alternative.AddUtilityTerm(2, householdDay.Household.HasChildrenUnder5.ToFlag()); //GV: not sign. - 13. june 2016 //alternative.AddUtilityTerm(3, householdDay.Household.HasChildrenAge5Through15.ToFlag()); alternative.AddUtilityTerm(4, (householdDay.Household.Size == 2 && householdDay.AdultsInSharedHomeStay == 2).ToFlag()); alternative.AddUtilityTerm(5, (householdDay.AdultsInSharedHomeStay == 1 && householdDay.Household.HasChildrenUnder16).ToFlag()); //GV: not sign. - 13. june 2016 //alternative.AddUtilityTerm(6, (householdDay.AdultsInSharedHomeStay == 2 && householdDay.Household.HouseholdTotals.FullAndPartTimeWorkers >= 2).ToFlag()); //alternative.AddUtilityTerm(7, (householdDay.AdultsInSharedHomeStay == 2 && hasAdultEducLevel12 == 1).ToFlag()); alternative.AddUtilityTerm(8, (youngestAge >= 40).ToFlag()); //GV: not sign. - 13. june 2016 //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(15, householdDay.PrimaryPriorityTimeFlag); //GV: not sign. - 13. june 2016 //alternative.AddUtilityTerm(16, (householdDay.Household.Size == 2).ToFlag()); //alternative.AddUtilityTerm(17, (householdDay.Household.Size == 3).ToFlag()); //alternative.AddUtilityTerm(18, (householdDay.Household.Size >= 4).ToFlag()); ////alternative.AddUtilityTerm(18, (householdDay.Household.Size >= 5).ToFlag()); alternative.AddUtilityTerm(21, personDay.Person.IsPartTimeWorker.ToFlag()); //alternative.AddUtilityTerm(2, personDay.Person.IsFulltimeWorker.ToFlag()); alternative.AddUtilityTerm(22, (personDay.Person.Gender == 1).ToFlag()); alternative.AddUtilityTerm(23, (hasAdultEducLevel12 == 1).ToFlag()); //alternative.AddUtilityTerm(24, MandatoryTourDay); alternative.AddUtilityTerm(25, nonMandatoryTourDay); alternative.AddUtilityTerm(26, atHomeDay); //alternative.AddUtilityTerm(27, workTourLogsum); //GV: put in instead of compositeLogsum - 13. june 2016 alternative.AddUtilityTerm(27, workTourLogsum * MandatoryTourDay); alternative.AddUtilityTerm(28, workTourLogsum * nonMandatoryTourDay); //GV: not sign. - 13. june 2016 //alternative.AddUtilityTerm(27, compositeLogsum); //alternative.AddUtilityTerm(27, (householdDay.Household.VehiclesAvailable == 1 && household.Has2Drivers).ToFlag()); //GV not significant //alternative.AddUtilityTerm(28, (householdDay.Household.VehiclesAvailable >= 2 && household.Has2Drivers).ToFlag()); //GV not significant }
public PersonWrapper(Framework.DomainModels.Models.IPerson person, Framework.DomainModels.Wrappers.IHouseholdWrapper householdWrapper) : base(person, householdWrapper) { _person = (IActumPerson)person; }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, HouseholdDayWrapper householdDay, int nCallsForTour, bool[] available, int choice = Constants.DEFAULT_VALUE) { //var householdDay = (ActumHouseholdDayWrapper)tour.HouseholdDay; Framework.DomainModels.Wrappers.IHouseholdWrapper household = householdDay.Household; double workTourLogsum = 0; double schoolTourLogsum = 0; IEnumerable <PersonDayWrapper> orderedPersonDays = householdDay.PersonDays.OrderBy(p => p.GetJointHalfTourParticipationPriority()).ToList().Cast <PersonDayWrapper>(); foreach (PersonDayWrapper personDay in orderedPersonDays) { //Double workTourLogsum; if (personDay.Person.UsualWorkParcelId != Constants.DEFAULT_VALUE && personDay.Person.UsualWorkParcelId != Global.Settings.OutOfRegionParcelId) { //JLB 201406 //var nestedAlternative = Global.ChoiceModelSession.Get<WorkTourModeModel>().RunNested(personDay.Person, personDay.Person.Household.ResidenceParcel, personDay.Person.UsualWorkParcel, Global.Settings.Times.EightAM, Global.Settings.Times.FivePM, personDay.Person.Household.HouseholdTotals.DrivingAgeMembers); //JLB 201602 //var nestedAlternative = Global.ChoiceModelSession.Get<WorkTourModeTimeModel>().RunNested(personDay, personDay.Person.Household.ResidenceParcel, personDay.Person.UsualWorkParcel, Global.Settings.Times.EightAM, Global.Settings.Times.FivePM, personDay.Person.Household.HouseholdTotals.DrivingAgeMembers); ChoiceProbabilityCalculator.Alternative nestedAlternative = Global.ChoiceModelSession.Get <TourModeTimeModel>().RunNested(personDay, personDay.Person.Household.ResidenceParcel, personDay.Person.UsualWorkParcel, Global.Settings.Times.EightAM, Global.Settings.Times.FivePM, personDay.Person.Household.HouseholdTotals.DrivingAgeMembers, Global.Settings.Purposes.Work); workTourLogsum = nestedAlternative == null ? 0 : nestedAlternative.ComputeLogsum(); } else { workTourLogsum = 0; } if (personDay.Person.UsualSchoolParcelId != Constants.DEFAULT_VALUE && personDay.Person.UsualSchoolParcelId != Global.Settings.OutOfRegionParcelId) { //JLB 201406 //var nestedAlternative = Global.ChoiceModelSession.Get<SchoolTourModeModel>().RunNested(personDay.Person, personDay.Person.Household.ResidenceParcel, personDay.Person.UsualSchoolParcel, Global.Settings.Times.EightAM, Global.Settings.Times.FivePM, personDay.Person.Household.HouseholdTotals.DrivingAgeMembers); //JLB 201602 //var nestedAlternative = Global.ChoiceModelSession.Get<SchoolTourModeTimeModel>().RunNested(personDay, personDay.Person.Household.ResidenceParcel, personDay.Person.UsualSchoolParcel, Global.Settings.Times.EightAM, Global.Settings.Times.FivePM, personDay.Person.Household.HouseholdTotals.DrivingAgeMembers); ChoiceProbabilityCalculator.Alternative nestedAlternative = Global.ChoiceModelSession.Get <TourModeTimeModel>().RunNested(personDay, personDay.Person.Household.ResidenceParcel, personDay.Person.UsualSchoolParcel, Global.Settings.Times.EightAM, Global.Settings.Times.FivePM, personDay.Person.Household.HouseholdTotals.DrivingAgeMembers, Global.Settings.Purposes.School); schoolTourLogsum = nestedAlternative == null ? 0 : nestedAlternative.ComputeLogsum(); } else { schoolTourLogsum = 0; } } 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 youngestAge = 999; foreach (PersonWrapper person in householdDay.Household.Persons) { // set characteristics here that depend on person characteristics if (person.Age < youngestAge) { youngestAge = person.Age; } } // NONE_OR_HOME ChoiceProbabilityCalculator.Alternative alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.NoneOrHome, available[0], choice == Global.Settings.Purposes.NoneOrHome); alternative.Choice = Global.Settings.Purposes.NoneOrHome; alternative.AddUtilityTerm(1, (nCallsForTour > 1).ToFlag()); alternative.AddUtilityTerm(2, householdDay.Household.HasChildrenUnder5.ToFlag()); alternative.AddUtilityTerm(3, householdDay.Household.HasChildrenAge5Through15.ToFlag()); alternative.AddUtilityTerm(4, (householdDay.Household.Size == 2 && householdDay.AdultsInSharedHomeStay == 2).ToFlag()); alternative.AddUtilityTerm(5, (householdDay.AdultsInSharedHomeStay == 1 && householdDay.Household.HasChildrenUnder16).ToFlag()); alternative.AddUtilityTerm(6, (householdDay.AdultsInSharedHomeStay == 2 && householdDay.Household.HouseholdTotals.FullAndPartTimeWorkers >= 2).ToFlag()); //alternative.AddUtilityTerm(7, (householdDay.AdultsInSharedHomeStay == 2 && hasAdultEducLevel12 == 1).ToFlag()); //alternative.AddUtilityTerm(8, (youngestAge >= 40).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(15, householdDay.PrimaryPriorityTimeFlag); //alternative.AddUtilityTerm(21, personDay.Person.IsPartTimeWorker.ToFlag()); //GV - Aks John to include peson.Day in the model //alternative.AddUtilityTerm(2, personDay.Person.IsFulltimeWorker.ToFlag()); //GV - Aks John to include peson.Day in the model //alternative.AddUtilityTerm(22, (personDay.Person.Gender == 1).ToFlag()); //GV - Aks John to include peson.Day in the model //alternative.AddUtilityTerm(23, (hasAdultEducLevel12 == 1).ToFlag()); //GV - Aks John to include peson.Day in the model //alternative.AddUtilityTerm(24, MandatoryTourDay); //GV - Aks John to include peson.Day in the model //alternative.AddUtilityTerm(25, nonMandatoryTourDay); //GV - Aks John to include peson.Day in the model //alternative.AddUtilityTerm(26, atHomeDay); //GV - Aks John to include peson.Day in the model alternative.AddUtilityTerm(7, (householdDay.Household.VehiclesAvailable == 1 && household.Has2Drivers).ToFlag()); alternative.AddUtilityTerm(8, (householdDay.Household.VehiclesAvailable >= 2 && household.Has2Drivers).ToFlag()); alternative.AddUtilityTerm(9, (householdDay.Household.Size == 3).ToFlag()); alternative.AddUtilityTerm(10, (householdDay.Household.Size >= 4).ToFlag()); // FULL PAIRED alternative = choiceProbabilityCalculator.GetAlternative(1, available[1], choice == 1); alternative.Choice = 1; alternative.AddUtilityTerm(11, 1); //alternative.AddUtilityTerm(12, workTourLogsum); alternative.AddUtilityTerm(13, schoolTourLogsum); //alternative.AddUtilityTerm(13, householdDay.PrimaryPriorityTimeFlag); //alternative.AddNestedAlternative(12, 1, 70); // FULL HalfTour 1 alternative = choiceProbabilityCalculator.GetAlternative(2, available[2], choice == 2); alternative.Choice = 2; alternative.AddUtilityTerm(21, 1); alternative.AddUtilityTerm(12, workTourLogsum); //alternative.AddUtilityTerm(13, schoolTourLogsum); //alternative.AddUtilityTerm(23, householdDay.PrimaryPriorityTimeFlag); //alternative.AddNestedAlternative(12, 1, 70); // Full HalfTour 2 alternative = choiceProbabilityCalculator.GetAlternative(3, available[3], choice == 3); alternative.Choice = 3; alternative.AddUtilityTerm(31, 1); alternative.AddUtilityTerm(12, workTourLogsum); //alternative.AddUtilityTerm(13, schoolTourLogsum); //alternative.AddUtilityTerm(33, householdDay.PrimaryPriorityTimeFlag); //alternative.AddNestedAlternative(12, 1, 70); // PARTIAL PAIRED alternative = choiceProbabilityCalculator.GetAlternative(4, available[4], choice == 4); alternative.Choice = 4; alternative.AddUtilityTerm(41, 1); alternative.AddUtilityTerm(42, workTourLogsum); //GV: 14. june 2016 - not sign. and wrong sign //alternative.AddUtilityTerm(43, schoolTourLogsum); alternative.AddUtilityTerm(44, householdDay.PrimaryPriorityTimeFlag); //alternative.AddNestedAlternative(12, 1, 70); // PARTIAL HalfTour 1 alternative = choiceProbabilityCalculator.GetAlternative(5, available[5], choice == 5); alternative.Choice = 5; alternative.AddUtilityTerm(51, 1); alternative.AddUtilityTerm(42, workTourLogsum); //alternative.AddUtilityTerm(43, schoolTourLogsum); alternative.AddUtilityTerm(54, householdDay.PrimaryPriorityTimeFlag); //alternative.AddNestedAlternative(12, 1, 70); // PARTIAL HalfTour 2 alternative = choiceProbabilityCalculator.GetAlternative(6, available[6], choice == 6); alternative.Choice = 6; alternative.AddUtilityTerm(61, 1); alternative.AddUtilityTerm(42, workTourLogsum); //alternative.AddUtilityTerm(43, schoolTourLogsum); alternative.AddUtilityTerm(64, householdDay.PrimaryPriorityTimeFlag); //alternative.AddNestedAlternative(12, 1, 70); }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, PersonDayWrapper personDay, HouseholdDayWrapper householdDay, int nCallsForTour, int[] simulatedMandatoryTours, int choice = Constants.DEFAULT_VALUE) { Framework.DomainModels.Wrappers.IHouseholdWrapper household = personDay.Household; double workTourLogsum; if (personDay.Person.UsualWorkParcelId != Constants.DEFAULT_VALUE && personDay.Person.UsualWorkParcelId != Global.Settings.OutOfRegionParcelId) { //JLB 201406 //var nestedAlternative = Global.ChoiceModelSession.Get<WorkTourModeModel>().RunNested(personDay.Person, personDay.Person.Household.ResidenceParcel, personDay.Person.UsualWorkParcel, Global.Settings.Times.EightAM, Global.Settings.Times.FivePM, personDay.Person.Household.HouseholdTotals.DrivingAgeMembers); //JLB 201602 //var nestedAlternative = Global.ChoiceModelSession.Get<WorkTourModeTimeModel>().RunNested(personDay, personDay.Person.Household.ResidenceParcel, personDay.Person.UsualWorkParcel, Global.Settings.Times.EightAM, Global.Settings.Times.FivePM, personDay.Person.Household.HouseholdTotals.DrivingAgeMembers); ChoiceProbabilityCalculator.Alternative nestedAlternative = Global.ChoiceModelSession.Get <TourModeTimeModel>().RunNested(personDay, personDay.Person.Household.ResidenceParcel, personDay.Person.UsualWorkParcel, Global.Settings.Times.EightAM, Global.Settings.Times.FivePM, personDay.Person.Household.HouseholdTotals.DrivingAgeMembers, Global.Settings.Purposes.Work); workTourLogsum = nestedAlternative == null ? 0 : nestedAlternative.ComputeLogsum(); } else { workTourLogsum = 0; } double schoolTourLogsum; if (personDay.Person.UsualSchoolParcelId != Constants.DEFAULT_VALUE && personDay.Person.UsualSchoolParcelId != Global.Settings.OutOfRegionParcelId) { //JLB //var nestedAlternative = Global.ChoiceModelSession.Get<SchoolTourModeModel>().RunNested(personDay.Person, personDay.Person.Household.ResidenceParcel, personDay.Person.UsualSchoolParcel, Global.Settings.Times.EightAM, Global.Settings.Times.FivePM, personDay.Person.Household.HouseholdTotals.DrivingAgeMembers); //JLB 201602 //var nestedAlternative = Global.ChoiceModelSession.Get<SchoolTourModeTimeModel>().RunNested(personDay, personDay.Person.Household.ResidenceParcel, personDay.Person.UsualSchoolParcel, Global.Settings.Times.EightAM, Global.Settings.Times.FivePM, personDay.Person.Household.HouseholdTotals.DrivingAgeMembers); ChoiceProbabilityCalculator.Alternative nestedAlternative = Global.ChoiceModelSession.Get <TourModeTimeModel>().RunNested(personDay, personDay.Person.Household.ResidenceParcel, personDay.Person.UsualSchoolParcel, Global.Settings.Times.EightAM, Global.Settings.Times.FivePM, personDay.Person.Household.HouseholdTotals.DrivingAgeMembers, Global.Settings.Purposes.School); schoolTourLogsum = nestedAlternative == null ? 0 : nestedAlternative.ComputeLogsum(); } else { schoolTourLogsum = 0; } 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 hasAdultEducLevel12 = 0; //int allAdultEducLevel12 = 1; int youngestAge = 999; foreach (PersonWrapper person in personDay.Household.Persons) { // set characteristics here that depend on person characteristics //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; } } bool schoolAvailableFlag = true; if ((!personDay.Person.IsStudent) || (!Global.Configuration.IsInEstimationMode && personDay.Person.UsualSchoolParcel == null)) { schoolAvailableFlag = false; } // NONE_OR_HOME ChoiceProbabilityCalculator.Alternative alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.NoneOrHome, nCallsForTour > 1, choice == Global.Settings.Purposes.NoneOrHome); alternative.Choice = Global.Settings.Purposes.NoneOrHome; //alternative.AddUtilityTerm(1, (nCallsForTour > 2).ToFlag()); // GV; 16.april 2013 - cannot be estimated //alternative.AddUtilityTerm(2, householdDay.Household.HasChildren.ToFlag()); alternative.AddUtilityTerm(3, householdDay.Household.HasChildrenUnder5.ToFlag()); alternative.AddUtilityTerm(4, householdDay.Household.HasChildrenAge5Through15.ToFlag()); //alternative.AddUtilityTerm(6, householdDay.Household.HasChildrenUnder16.ToFlag()); //alternative.AddUtilityTerm(10, (householdDay.Household.Size == 2).ToFlag()); // GV; 16. april 2013 - cannot be estimated alternative.AddUtilityTerm(11, (householdDay.Household.Size == 3).ToFlag()); alternative.AddUtilityTerm(12, (householdDay.Household.Size >= 4).ToFlag()); //alternative.AddUtilityTerm(14, (householdDay.Household.Income >= 300000 && householdDay.Household.Income < 600000).ToFlag()); //alternative.AddUtilityTerm(15, (householdDay.Household.Income >= 600000 && householdDay.Household.Income < 900000).ToFlag()); //alternative.AddUtilityTerm(16, (householdDay.Household.Income >= 900000).ToFlag()); //alternative.AddNestedAlternative(11, 0, 60); // USUAL WORK alternative = choiceProbabilityCalculator.GetAlternative(1, (personDay.Person.UsualWorkParcelId > 0 && simulatedMandatoryTours[2] == 0), choice == 1); alternative.Choice = 1; alternative.AddUtilityTerm(21, 1); //alternative.AddUtilityTerm(22, personDay.Person.IsChildUnder5.ToFlag()); alternative.AddUtilityTerm(23, personDay.Person.WorksAtHome.ToFlag()); alternative.AddUtilityTerm(24, personDay.Person.IsFulltimeWorker.ToFlag()); alternative.AddUtilityTerm(25, personDay.Person.IsMale.ToFlag()); //alternative.AddUtilityTerm(4, person.IsPartTimeWorker.ToFlag()); alternative.AddUtilityTerm(26, (householdDay.AdultsInSharedHomeStay == 2 && householdDay.Household.HouseholdTotals.FullAndPartTimeWorkers >= 2).ToFlag()); //alternative.AddUtilityTerm(14, (householdDay.AdultsInSharedHomeStay == 2).ToFlag()); //alternative.AddUtilityTerm(15, (householdDay.Household.HouseholdTotals.FullAndPartTimeWorkers >= 2).ToFlag()); alternative.AddUtilityTerm(27, (householdDay.AdultsInSharedHomeStay == 1 && householdDay.Household.HasChildren).ToFlag()); alternative.AddUtilityTerm(28, workTourLogsum); //alternative.AddUtilityTerm(28, (householdDay.Household.VehiclesAvailable == 1 && household.Has2Drivers).ToFlag()); alternative.AddUtilityTerm(29, (householdDay.Household.VehiclesAvailable >= 2 && household.Has2Drivers).ToFlag()); alternative.AddUtilityTerm(30, householdDay.PrimaryPriorityTimeFlag); //alternative.AddNestedAlternative(12, 1, 60); // BUSINESS alternative = choiceProbabilityCalculator.GetAlternative(2, (personDay.Person.IsWorker && simulatedMandatoryTours[3] == 0), choice == 2); alternative.Choice = 2; alternative.AddUtilityTerm(31, 1); //alternative.AddUtilityTerm(32, personDay.Person.IsChildUnder5.ToFlag()); alternative.AddUtilityTerm(33, personDay.Person.WorksAtHome.ToFlag()); alternative.AddUtilityTerm(34, personDay.Person.IsFulltimeWorker.ToFlag()); alternative.AddUtilityTerm(35, personDay.Person.IsMale.ToFlag()); //alternative.AddUtilityTerm(4, person.IsPartTimeWorker.ToFlag()); alternative.AddUtilityTerm(36, (householdDay.AdultsInSharedHomeStay == 2 && householdDay.Household.HouseholdTotals.FullAndPartTimeWorkers >= 2).ToFlag()); //alternative.AddUtilityTerm(14, (householdDay.AdultsInSharedHomeStay == 2).ToFlag()); //alternative.AddUtilityTerm(15, (householdDay.Household.HouseholdTotals.FullAndPartTimeWorkers >= 2).ToFlag()); //GV: 13. june 2016, not sign. //alternative.AddUtilityTerm(37, (householdDay.AdultsInSharedHomeStay == 1 && householdDay.Household.HasChildren).ToFlag()); alternative.AddUtilityTerm(38, workTourLogsum); //alternative.AddUtilityTerm(38, (householdDay.Household.VehiclesAvailable == 1 && household.Has2Drivers).ToFlag()); alternative.AddUtilityTerm(39, (householdDay.Household.VehiclesAvailable >= 2 && household.Has2Drivers).ToFlag()); alternative.AddUtilityTerm(40, householdDay.PrimaryPriorityTimeFlag); //alternative.AddNestedAlternative(12, 1, 60); // SCHOOL alternative = choiceProbabilityCalculator.GetAlternative(3, schoolAvailableFlag, choice == 3); alternative.Choice = 3; alternative.AddUtilityTerm(41, 1); //GV: 13. june 2016, not sign. //alternative.AddUtilityTerm(42, personDay.Person.IsNonworkingAdult.ToFlag()); //alternative.AddUtilityTerm(43, personDay.Person.IsPartTimeWorker.ToFlag()); alternative.AddUtilityTerm(43, personDay.Person.IsYouth.ToFlag()); //alternative.AddUtilityTerm(46, (householdDay.AdultsInSharedHomeStay == 2 && householdDay.Household.HouseholdTotals.FullAndPartTimeWorkers >= 2).ToFlag()); //alternative.AddUtilityTerm(14, (householdDay.AdultsInSharedHomeStay == 2).ToFlag()); //alternative.AddUtilityTerm(15, (householdDay.Household.HouseholdTotals.FullAndPartTimeWorkers >= 2).ToFlag()); //alternative.AddUtilityTerm(47, (householdDay.AdultsInSharedHomeStay == 1 && householdDay.Household.HasChildren).ToFlag()); alternative.AddUtilityTerm(48, workTourLogsum); //GV: 13. june 2016, not sign. //alternative.AddUtilityTerm(49, schoolTourLogsum); //alternative.AddUtilityTerm(48, (householdDay.Household.VehiclesAvailable == 1 && household.Has2Drivers).ToFlag()); //alternative.AddUtilityTerm(49, (householdDay.Household.VehiclesAvailable >= 2 && household.Has2Drivers).ToFlag()); alternative.AddUtilityTerm(50, householdDay.PrimaryPriorityTimeFlag); //alternative.AddNestedAlternative(12, 1, 60); }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, PersonDayWrapper personDay, HouseholdDayWrapper householdDay, int choice = Constants.DEFAULT_VALUE) { Framework.DomainModels.Wrappers.IHouseholdWrapper household = personDay.Household; Framework.DomainModels.Wrappers.IPersonWrapper person = personDay.Person; double workTourLogsum; if (personDay.Person.UsualWorkParcelId != Constants.DEFAULT_VALUE && personDay.Person.UsualWorkParcelId != Global.Settings.OutOfRegionParcelId) { //JLB 201406 //var nestedAlternative = Global.ChoiceModelSession.Get<WorkTourModeModel>().RunNested(personDay.Person, personDay.Person.Household.ResidenceParcel, personDay.Person.UsualWorkParcel, Global.Settings.Times.EightAM, Global.Settings.Times.FivePM, personDay.Person.Household.HouseholdTotals.DrivingAgeMembers); //JLB 201602 //var nestedAlternative = Global.ChoiceModelSession.Get<WorkTourModeTimeModel>().RunNested(personDay, personDay.Person.Household.ResidenceParcel, personDay.Person.UsualWorkParcel, Global.Settings.Times.EightAM, Global.Settings.Times.FivePM, personDay.Person.Household.HouseholdTotals.DrivingAgeMembers); ChoiceProbabilityCalculator.Alternative nestedAlternative = Global.ChoiceModelSession.Get <TourModeTimeModel>().RunNested(personDay, personDay.Person.Household.ResidenceParcel, personDay.Person.UsualWorkParcel, Global.Settings.Times.EightAM, Global.Settings.Times.FivePM, personDay.Person.Household.HouseholdTotals.DrivingAgeMembers, Global.Settings.Purposes.Work); workTourLogsum = nestedAlternative == null ? 0 : nestedAlternative.ComputeLogsum(); workTourLogsum = nestedAlternative == null ? 0 : nestedAlternative.ComputeLogsum(); } else { workTourLogsum = 0; } double schoolTourLogsum; if (personDay.Person.UsualSchoolParcelId != Constants.DEFAULT_VALUE && personDay.Person.UsualSchoolParcelId != Global.Settings.OutOfRegionParcelId) { //JLB 201406 //var nestedAlternative = Global.ChoiceModelSession.Get<SchoolTourModeModel>().RunNested(personDay.Person, personDay.Person.Household.ResidenceParcel, personDay.Person.UsualSchoolParcel, Global.Settings.Times.EightAM, Global.Settings.Times.FivePM, personDay.Person.Household.HouseholdTotals.DrivingAgeMembers); //JLB 201602 //var nestedAlternative = Global.ChoiceModelSession.Get<SchoolTourModeTimeModel>().RunNested(personDay, personDay.Person.Household.ResidenceParcel, personDay.Person.UsualSchoolParcel, Global.Settings.Times.EightAM, Global.Settings.Times.FivePM, personDay.Person.Household.HouseholdTotals.DrivingAgeMembers); ChoiceProbabilityCalculator.Alternative nestedAlternative = Global.ChoiceModelSession.Get <TourModeTimeModel>().RunNested(personDay, personDay.Person.Household.ResidenceParcel, personDay.Person.UsualSchoolParcel, Global.Settings.Times.EightAM, Global.Settings.Times.FivePM, personDay.Person.Household.HouseholdTotals.DrivingAgeMembers, Global.Settings.Purposes.School); schoolTourLogsum = nestedAlternative == null ? 0 : nestedAlternative.ComputeLogsum(); } else { schoolTourLogsum = 0; } // No mandatory stops ChoiceProbabilityCalculator.Alternative alternative = choiceProbabilityCalculator.GetAlternative(0, true, choice == 0); alternative.Choice = 0; //alternative.AddUtilityTerm(2, householdDay.Household.HasChildren.ToFlag()); alternative.AddUtilityTerm(3, householdDay.Household.HasChildrenUnder5.ToFlag()); //alternative.AddUtilityTerm(4, householdDay.Household.HasChildrenAge5Through15.ToFlag()); //alternative.AddUtilityTerm(6, householdDay.Household.HasChildrenUnder16.ToFlag()); //alternative.AddNestedAlternative(11, 0, 60); //GV: added 14. june 2016 alternative.AddUtilityTerm(4, householdDay.PrimaryPriorityTimeFlag); //alternative.AddUtilityTerm(5, (householdDay.Household.VehiclesAvailable >= 1).ToFlag()); // Business stop(s) alternative = choiceProbabilityCalculator.GetAlternative(1, personDay.Person.IsWorker, choice == 1); alternative.Choice = 1; alternative.AddUtilityTerm(21, 1); //alternative.AddUtilityTerm(22, personDay.Person.IsChildUnder5.ToFlag()); alternative.AddUtilityTerm(23, personDay.Person.WorksAtHome.ToFlag()); alternative.AddUtilityTerm(24, personDay.Person.IsFulltimeWorker.ToFlag()); //alternative.AddUtilityTerm(25, personDay.Person.IsPartTimeWorker.ToFlag()); alternative.AddUtilityTerm(25, personDay.Person.IsMale.ToFlag()); //alternative.AddUtilityTerm(4, person.IsPartTimeWorker.ToFlag()); //GV: 15. june 2016, not sign. //alternative.AddUtilityTerm(26, (householdDay.AdultsInSharedHomeStay == 2 && householdDay.Household.HouseholdTotals.FullAndPartTimeWorkers >= 2).ToFlag()); //alternative.AddUtilityTerm(14, (householdDay.AdultsInSharedHomeStay == 2).ToFlag()); //alternative.AddUtilityTerm(15, (householdDay.Household.HouseholdTotals.FullAndPartTimeWorkers >= 2).ToFlag()); alternative.AddUtilityTerm(27, (householdDay.AdultsInSharedHomeStay == 1 && householdDay.Household.HasChildren).ToFlag()); alternative.AddUtilityTerm(28, workTourLogsum); //alternative.AddUtilityTerm(28, (householdDay.Household.VehiclesAvailable == 1 && household.Has2Drivers).ToFlag()); alternative.AddUtilityTerm(29, (householdDay.Household.VehiclesAvailable >= 2 && household.Has2Drivers).ToFlag()); // School stop(s) alternative = choiceProbabilityCalculator.GetAlternative(2, personDay.Person.IsStudent, choice == 2); alternative.Choice = 2; alternative.AddUtilityTerm(41, 1); //alternative.AddUtilityTerm(43, personDay.Person.WorksAtHome.ToFlag()); //alternative.AddUtilityTerm(44, personDay.Person.IsFulltimeWorker.ToFlag()); //alternative.AddUtilityTerm(45, personDay.Person.IsPartTimeWorker.ToFlag()); //alternative.AddUtilityTerm(46, personDay.Person.IsMale.ToFlag()); alternative.AddUtilityTerm(47, personDay.Person.IsYouth.ToFlag()); //GV: 15. june 2016, not sign. //alternative.AddUtilityTerm(48, schoolTourLogsum); // Business and school stops alternative = choiceProbabilityCalculator.GetAlternative(3, (personDay.Person.IsWorker && personDay.Person.IsStudent), choice == 3); alternative.Choice = 3; alternative.AddUtilityTerm(61, 1); alternative.AddUtilityTerm(28, workTourLogsum); //GV: 15. june 2016, not sign. //alternative.AddUtilityTerm(48, schoolTourLogsum); }
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>(); Framework.DomainModels.Wrappers.IHouseholdWrapper household = householdDay.Household; Framework.DomainModels.Wrappers.IParcelWrapper residenceParcel = household.ResidenceParcel; 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 = household.GetVotALSegment(); 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][Global.Settings.CarOwnerships.NoCars][votALSegment][transitAccessSegment]; //var 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]; double 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]; double compositeLogsum = Global.AggregateLogsums[household.ResidenceZoneId][Global.Settings.Purposes.HomeBasedComposite][Global.Settings.CarOwnerships.NoCars][votALSegment][transitAccessSegment]; int countNonMandatory = 0; int countMandatory = 0; int countWorkingAtHome = 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) { Framework.DomainModels.Wrappers.IPersonWrapper 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 { 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(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); ChoiceProbabilityCalculator.Alternative 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 { int destinationArrivalTime = ChoiceModelUtility.GetDestinationArrivalTime(Global.Settings.Models.SchoolTourModeModel); int 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); ChoiceProbabilityCalculator.Alternative 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 ChoiceProbabilityCalculator.Alternative 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, 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, PersonDayWrapper personDay, HouseholdDayWrapper householdDay, DayPattern[] dayPatterns, DayPattern choice = null) { Framework.DomainModels.Wrappers.IHouseholdWrapper household = personDay.Household; Framework.DomainModels.Wrappers.IParcelWrapper residenceParcel = household.ResidenceParcel; Framework.DomainModels.Wrappers.IPersonWrapper person = personDay.Person; int carsPerDriver = household.GetCarsPerDriver(); double mixedDensity = residenceParcel.MixedUse3Index2(); double intersectionDensity = residenceParcel.IntersectionDensity34Minus1Buffer2(); double[] purposeLogsums = new double[Global.Settings.Purposes.TotalPurposes + 2]; double[] atUsualLogsums = new double[3]; //var carOwnership = person.CarOwnershipSegment; //GV: sat car ownership not to impact logsums int carOwnership = 0; int votSegment = person.Household.GetVotALSegment(); int transitAccess = residenceParcel.TransitAccessSegment(); //GV: input 26. july 2013 // household inputs //var childrenUnder5 = householdTotals.ChildrenUnder5; //var childrenAge5Through15 = householdTotals.ChildrenAge5Through15; //var nonworkingAdults = householdTotals.NonworkingAdults; //var retiredAdults = householdTotals.RetiredAdults; int onePersonHouseholdFlag = household.IsOnePersonHousehold.ToFlag(); int twoPersonHouseholdFlag = household.IsTwoPersonHousehold.ToFlag(); int householdCars = household.VehiclesAvailable; //var noCarsInHouseholdFlag = HouseholdWrapper.GetNoCarsInHouseholdFlag(householdCars); //var carsLessThanDriversFlag = household.GetCarsLessThanDriversFlag(householdCars); //var carsLessThanWorkersFlag = household.GetCarsLessThanWorkersFlag(householdCars); int HHwithChildrenFlag = household.HasChildren.ToFlag(); int HHwithSmallChildrenFlag = household.HasChildrenUnder5.ToFlag(); int HHwithLowIncomeFlag = (household.Income >= 300000 && household.Income < 600000).ToFlag(); int HHwithMidleIncomeFlag = (household.Income >= 600000 && household.Income < 900000).ToFlag(); int HHwithHighIncomeFlag = (household.Income >= 900000).ToFlag(); int primaryFamilyTimeFlag = householdDay.PrimaryPriorityTimeFlag; //GV: input 26. july 2013 // person inputs int partTimeWorkerFlag = person.IsPartTimeWorker.ToFlag(); int nonworkingAdultFlag = person.IsNonworkingAdult.ToFlag(); int universityStudentFlag = person.IsUniversityStudent.ToFlag(); int retiredAdultFlag = person.IsRetiredAdult.ToFlag(); int fullTimeWorkerFlag = person.IsFulltimeWorker.ToFlag(); int childAge5Through15Flag = person.IsChildAge5Through15.ToFlag(); int childUnder5Flag = person.IsChildUnder5.ToFlag(); int adultFlag = person.IsAdult.ToFlag(); int maleFlag = person.IsMale.ToFlag(); int femaleFlag = person.IsFemale.ToFlag(); if (person.UsualWorkParcel == null || person.UsualWorkParcelId == household.ResidenceParcelId) { purposeLogsums[Global.Settings.Purposes.Work] = 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<WorkTourModeTimeModel>().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); 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 { int destinationArrivalTime = ChoiceModelUtility.GetDestinationArrivalTime(Global.Settings.Models.SchoolTourModeModel); int destinationDepartureTime = ChoiceModelUtility.GetDestinationDepartureTime(Global.Settings.Models.SchoolTourModeModel); //JLB 201406 //var nestedAlternative = Global.ChoiceModelSession.Get<SchoolTourModeModel>().RunNested(personDay, residenceParcel, person.UsualSchoolParcel, destinationArrivalTime, destinationDepartureTime, household.VehiclesAvailable); //JLB 201602 //var nestedAlternative = Global.ChoiceModelSession.Get<SchoolTourModeTimeModel>().RunNested(personDay, residenceParcel, person.UsualSchoolParcel, destinationArrivalTime, destinationDepartureTime, household.VehiclesAvailable); ChoiceProbabilityCalculator.Alternative nestedAlternative = Global.ChoiceModelSession.Get <TourModeTimeModel>().RunNested(personDay, residenceParcel, person.UsualSchoolParcel, destinationArrivalTime, destinationDepartureTime, household.VehiclesAvailable, Global.Settings.Purposes.School); 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()]; } double 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.Social] = Global.AggregateLogsums[household.ResidenceZoneId][Global.Settings.Purposes.Social][carOwnership][votSegment][transitAccess]; for (int xPurpose = Global.Settings.Purposes.Escort; 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 int 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. double 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); ChoiceProbabilityCalculator.Component component = choiceProbabilityCalculator.GetUtilityComponent(xPurpose); component.AddUtilityTerm(100 * purpose + 1, 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 * HHwithLowIncomeFlag); component.AddUtilityTerm(100 * purpose + 10, xMultiplier * HHwithMidleIncomeFlag); component.AddUtilityTerm(100 * purpose + 11, xMultiplier * HHwithHighIncomeFlag); //component.AddUtilityTerm(100 * purpose + 12, xMultiplier * carsPerDriver); component.AddUtilityTerm(100 * purpose + 12, xMultiplier * householdCars); 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 * primaryFamilyTimeFlag); //GV: wrong sign //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]); //GV: 17.08.2013, the logsums are wrong //component.AddUtilityTerm(100 * purpose + 28, xMultiplier * person.TransitPassOwnershipFlag); } // tour utility const int tourComponentIndex = 18; choiceProbabilityCalculator.CreateUtilityComponent(tourComponentIndex); ChoiceProbabilityCalculator.Component tourComponent = choiceProbabilityCalculator.GetUtilityComponent(tourComponentIndex); //tourComponent.AddUtilityTerm(1701, carsPerDriver); tourComponent.AddUtilityTerm(1701, householdCars); tourComponent.AddUtilityTerm(1702, person.WorksAtHome().ToFlag()); tourComponent.AddUtilityTerm(1703, mixedDensity); tourComponent.AddUtilityTerm(1704, mixedDensity * person.IsChildAge5Through15.ToFlag()); tourComponent.AddUtilityTerm(1705, compositeLogsum); //tourComponent.AddUtilityTerm(1706, person.TransitPassOwnershipFlag); tourComponent.AddUtilityTerm(1706, primaryFamilyTimeFlag); // stop utility const int stopComponentIndex = 19; choiceProbabilityCalculator.CreateUtilityComponent(stopComponentIndex); ChoiceProbabilityCalculator.Component stopComponent = choiceProbabilityCalculator.GetUtilityComponent(stopComponentIndex); //stopComponent.AddUtilityTerm(1711, carsPerDriver); stopComponent.AddUtilityTerm(1711, householdCars); stopComponent.AddUtilityTerm(1712, person.WorksAtHome().ToFlag()); stopComponent.AddUtilityTerm(1713, mixedDensity); stopComponent.AddUtilityTerm(1714, mixedDensity * person.IsChildAge5Through15.ToFlag()); stopComponent.AddUtilityTerm(1715, compositeLogsum); //stopComponent.AddUtilityTerm(1716, person.TransitPassOwnershipFlag); //stopComponent.AddUtilityTerm(1716, primaryFamilyTimeFlag); //GV: 17.08.2013, the logsums are wrong for (int alternativeIndex = 0; alternativeIndex < TOTAL_ALTERNATIVES; alternativeIndex++) { DayPattern dayPattern = dayPatterns[alternativeIndex]; bool available = dayPattern.Available; ChoiceProbabilityCalculator.Alternative 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 (int purpose = Global.Settings.Purposes.Escort; 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 + 50, 1); // tour purpose ASC //alternative.AddUtilityTerm(100 * purpose + 51, purposeLogsums[purpose]); // tour purpose logsum GV: 17.08.2013, the logsums are wrong } if (dayPattern.Stops[purpose] > 0) { alternative.AddUtilityTerm(100 * purpose + 60, 1); // stop purpose ASC //alternative.AddUtilityTerm(100 * purpose + 61, purposeLogsums[purpose]); // stop purpose logsum GV: 17.08.2013, the logsums are wrong } if (Global.Configuration.IsInEstimationMode) { //GV commented out //alternative.AddUtilityTerm(100 * purpose + 70, 1 - person.PaperDiary); //GV commented out //alternative.AddUtilityTerm(100 * purpose + 71, person.ProxyResponse); } } } // multiple tour purposes component if (dayPattern.TotalTourPurposes > 1) { alternative.AddUtilityComponent(choiceProbabilityCalculator.GetUtilityComponent(Global.Settings.Purposes.Social + (dayPattern.TotalTourPurposes - 1))); } // multiple stop purposes component if (dayPattern.TotalStopPurposes > 1) { alternative.AddUtilityComponent(choiceProbabilityCalculator.GetUtilityComponent(Global.Settings.Purposes.Social + 5 + (dayPattern.TotalStopPurposes - 1))); } for (int tourPurpose = Global.Settings.Purposes.Work; tourPurpose <= Global.Settings.Purposes.Social; tourPurpose++) { for (int 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(1200 + 10 * tourPurpose + stopPurpose, 1); // tour-stop comb. utility } } } for (int tourPurpose = Global.Settings.Purposes.Work; tourPurpose <= Global.Settings.Purposes.School; tourPurpose++) { if (dayPattern.Tours[tourPurpose] == 1 && dayPattern.TotalStopPurposes >= 1) { alternative.AddUtilityTerm(1300 + 10 * tourPurpose, purposeLogsums[tourPurpose]); // usual location logsum x presence of stops in work or school pattern alternative.AddUtilityTerm(1300 + 10 * tourPurpose + 1, compositeLogsum); // home aggregate logsum x presence of stops in work or school pattern //alternative.AddUtilityTerm(1300 + 10 * tourPurpose + 2, atUsualLogsums[tourPurpose]); // at usual location aggregate logsum x presence of stops in work or school pattern GV: commented out as the sign is wrong } } for (int tourPurpose = Global.Settings.Purposes.Work; tourPurpose <= Global.Settings.Purposes.Social - 2; tourPurpose++) { for (int tourPurpose2 = tourPurpose + 1; tourPurpose2 <= Global.Settings.Purposes.Social; tourPurpose2++) { if (dayPattern.Tours[tourPurpose] > 0 && dayPattern.Tours[tourPurpose2] > 0) { alternative.AddUtilityTerm(1400 + 10 * tourPurpose + tourPurpose2, 1); // tour-tour comb. utility } } } for (int tourPurpose = Global.Settings.Purposes.Business; tourPurpose <= Global.Settings.Purposes.Business; tourPurpose++) { for (int tourPurpose2 = Global.Settings.Purposes.Escort; tourPurpose2 <= Global.Settings.Purposes.Social; tourPurpose2++) { if (dayPattern.Tours[tourPurpose] > 0 && dayPattern.Tours[tourPurpose2] > 0) { alternative.AddUtilityTerm(1461, 1); // tour-tour comb. utility for business combos } } } for (int stopPurpose = Global.Settings.Purposes.Work; stopPurpose <= Global.Settings.Purposes.Social - 2; stopPurpose++) { for (int stopPurpose2 = stopPurpose + 1; stopPurpose2 <= Global.Settings.Purposes.Social; stopPurpose2++) { if (dayPattern.Stops[stopPurpose] > 0 && dayPattern.Stops[stopPurpose2] > 0) { alternative.AddUtilityTerm(1500 + 10 * stopPurpose + stopPurpose2, 1); // stop-stop comb. utility } } } if (dayPattern.TotalTourPurposes > 0 && dayPattern.TotalStopPurposes > 0) { int totalStopPurposes = dayPattern.TotalStopPurposes; if (totalStopPurposes > 3) { totalStopPurposes = 3; } alternative.AddUtilityTerm(1600 + 10 * dayPattern.TotalTourPurposes + totalStopPurposes, 1); // nttour-ntstop utility } if (dayPattern.TotalTourPurposes - dayPattern.Tours[Global.Settings.Purposes.Work] - dayPattern.Tours[Global.Settings.Purposes.Business] - dayPattern.Tours[Global.Settings.Purposes.School] > 0) { // tour utility alternative.AddUtilityComponent(choiceProbabilityCalculator.GetUtilityComponent(tourComponentIndex)); } if (dayPattern.TotalStopPurposes - dayPattern.Stops[Global.Settings.Purposes.Work] - dayPattern.Stops[Global.Settings.Purposes.Business] - dayPattern.Stops[Global.Settings.Purposes.School] > 0) { // stop utility alternative.AddUtilityComponent(choiceProbabilityCalculator.GetUtilityComponent(stopComponentIndex)); } } }