public void Run(TourWrapper subtour) { if (subtour == null) { throw new ArgumentNullException("subtour"); } TourTime.InitializeTourTimes(); subtour.PersonDay.ResetRandom(50 + subtour.Sequence - 1); if (subtour == null) { throw new ArgumentNullException("subtour"); } if (Global.Configuration.IsInEstimationMode) { if (Global.Configuration.EstimationModel != CHOICE_MODEL_NAME) { return; } } var choiceProbabilityCalculator = _helpers[ParallelUtility.threadLocalAssignedIndex.Value].GetChoiceProbabilityCalculator(subtour.Id); if (_helpers[ParallelUtility.threadLocalAssignedIndex.Value].ModelIsInEstimationMode) { if (subtour.DestinationParcel == null || subtour.OriginParcel == null || subtour.Mode <= Global.Settings.Modes.None || subtour.Mode >= Global.Settings.Modes.ParkAndRide) { return; } RunModel(choiceProbabilityCalculator, subtour, new TourTime(subtour.DestinationArrivalTime, subtour.DestinationDepartureTime)); choiceProbabilityCalculator.WriteObservation(); } else { RunModel(choiceProbabilityCalculator, subtour); var chosenAlternative = choiceProbabilityCalculator.SimulateChoice(subtour.Household.RandomUtility); if (chosenAlternative == null) { Global.PrintFile.WriteNoAlternativesAvailableWarning(CHOICE_MODEL_NAME, "Run", subtour.PersonDay.Id); if (!Global.Configuration.IsInEstimationMode) { subtour.PersonDay.IsValid = false; } return; } var choice = (TourTime)chosenAlternative.Choice; var destinationTimes = choice.GetDestinationTimes(subtour); subtour.DestinationArrivalTime = destinationTimes.Start; subtour.DestinationDepartureTime = destinationTimes.End; } }
public void Run(TourWrapper tour, int knownArrivalTime = 0, int knownDepartureTime = 0) { if (tour == null) { throw new ArgumentNullException("tour"); } TourTime.InitializeTourTimes(); tour.PersonDay.ResetRandom(50 + tour.Sequence - 1); if (Global.Configuration.IsInEstimationMode) { if (Global.Configuration.EstimationModel != CHOICE_MODEL_NAME) { return; } } var choiceProbabilityCalculator = _helpers[ParallelUtility.GetBatchFromThreadId()].GetChoiceProbabilityCalculator(tour.Id); if (_helpers[ParallelUtility.GetBatchFromThreadId()].ModelIsInEstimationMode) { if (tour.DestinationParcel == null || tour.OriginParcel == null || tour.Mode <= Global.Settings.Modes.None || tour.Mode >= Global.Settings.Modes.SchoolBus) { return; } RunModel(choiceProbabilityCalculator, tour, knownArrivalTime, knownDepartureTime, new TourTime(tour.DestinationArrivalTime, tour.DestinationDepartureTime)); choiceProbabilityCalculator.WriteObservation(); } else { RunModel(choiceProbabilityCalculator, tour, knownArrivalTime, knownDepartureTime); var chosenAlternative = choiceProbabilityCalculator.SimulateChoice(tour.Household.RandomUtility); if (chosenAlternative == null) { Global.PrintFile.WriteNoAlternativesAvailableWarning(CHOICE_MODEL_NAME, "Run", tour.PersonDay.Id); if (!Global.Configuration.IsInEstimationMode) { tour.PersonDay.IsValid = false; } return; } var choice = (TourTime)chosenAlternative.Choice; var destinationTimes = choice.GetDestinationTimes(tour); tour.DestinationArrivalTime = knownArrivalTime == 0 ? destinationTimes.Start : knownArrivalTime; tour.DestinationDepartureTime = knownDepartureTime == 0 ? destinationTimes.End : knownDepartureTime; } }
/// <summary> /// Valida los datos /// </summary> /// <typeparam name="T"></typeparam> /// <param name="Entity"></param> /// <returns></returns> /// <history> /// [vku] 28/Jun/2016 Created /// </history> public bool Validate <T>(T Entity) { bool blnValid = true; switch (_enumTourTimes) { case EnumTourTimesSchema.ttsByLeadSourceSalesRoom: TourTime ttbylssr = Entity as TourTime; if (ttbylssr.ttT == DateTime.MinValue) { ShowMessage(1); blnValid = false; } else if (ttbylssr.ttPickUpT == DateTime.MinValue) { ShowMessage(2); blnValid = false; } else if (ttbylssr.ttMaxBooks.ToString() == "") { ShowMessage(3); blnValid = false; } break; case EnumTourTimesSchema.ttsByLeadSourceSalesRoomWeekDay: TourTimeByDay ttbylssrwd = Entity as TourTimeByDay; if (ttbylssrwd.ttT == DateTime.MinValue) { ShowMessage(1); blnValid = false; } else if (ttbylssrwd.ttPickUpT == DateTime.MinValue) { ShowMessage(2); blnValid = false; } else if (ttbylssrwd.ttMaxBooks.ToString() == "") { ShowMessage(3); blnValid = false; } break; case EnumTourTimesSchema.ttsBySalesRoomWeekDay: TourTimeBySalesRoomWeekDay ttbysrwd = Entity as TourTimeBySalesRoomWeekDay; if (ttbysrwd.ttT == DateTime.MinValue) { ShowMessage(1); blnValid = false; } else if (ttbysrwd.ttPickUpT == DateTime.MinValue) { ShowMessage(2); blnValid = false; } else if (ttbysrwd.ttMaxBooks.ToString() == "") { ShowMessage(3); blnValid = false; } break; } return(blnValid); }
public bool Equals(TourTime other) { if (ReferenceEquals(null, other)) { return(false); } if (ReferenceEquals(this, other)) { return(true); } return(other.Index == Index); }
private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, TourWrapper tour, int knownArrivalTime = 0, int knownDepartureTime = 0, TourTime choice = null) { var household = tour.Household; var person = tour.Person; var personDay = tour.PersonDay; // household inputs var income0To25KFlag = household.Has0To25KIncome.ToFlag(); var income100KPlusFlag = household.Has100KPlusIncome.ToFlag(); // person inputs var partTimeWorkerFlag = person.IsPartTimeWorker.ToFlag(); var nonworkingAdultFlag = person.IsNonworkingAdult.ToFlag(); var universityStudentFlag = person.IsUniversityStudent.ToFlag(); var retiredAdultFlag = person.IsRetiredAdult.ToFlag(); var drivingAgeStudentFlag = person.IsDrivingAgeStudent.ToFlag(); var fulltimeWorkerFlag = person.IsFulltimeWorker.ToFlag(); var childAge5Through15Flag = person.IsChildAge5Through15.ToFlag(); var childUnder5Flag = person.IsChildUnder5.ToFlag(); // person-day inputs var homeBasedToursOnlyFlag = personDay.OnlyHomeBasedToursExist().ToFlag(); var firstSimulatedHomeBasedTourFlag = personDay.IsFirstSimulatedHomeBasedTour().ToFlag(); var laterSimulatedHomeBasedTourFlag = personDay.IsLaterSimulatedHomeBasedTour().ToFlag(); var totalStops = personDay.GetTotalStops(); var totalSimulatedStops = personDay.GetTotalSimulatedStops(); var escortStops = personDay.EscortStops; var homeBasedTours = personDay.HomeBasedTours; var simulatedHomeBasedTours = personDay.SimulatedHomeBasedTours; // tour inputs var escortTourFlag = tour.IsEscortPurpose().ToFlag(); var shoppingTourFlag = tour.IsShoppingPurpose().ToFlag(); var mealTourFlag = tour.IsMealPurpose().ToFlag(); var socialTourFlag = tour.IsSocialPurpose().ToFlag(); var personalBusinessTourFlag = tour.IsPersonalBusinessPurpose().ToFlag(); var sovOrHovTourFlag = tour.IsAnAutoMode().ToFlag(); var transitTourFlag = tour.UsesTransitModes().ToFlag(); // remaining inputs // Higher priority tour of 2+ tours for the same purpose var highPrioritySameFlag = (tour.GetTotalToursByPurpose() > tour.GetTotalSimulatedToursByPurpose() && tour.GetTotalSimulatedToursByPurpose() == 1).ToFlag(); // Lower priority tour(s) of 2+ tours for the same purpose var lowPrioritySameFlag = (tour.GetTotalSimulatedToursByPurpose() > 1).ToFlag(); // Higher priority tour of 2+ tours for different purposes var highPriorityDifferentFlag = (personDay.IsFirstSimulatedHomeBasedTour() && personDay.HomeBasedToursExist()).ToFlag() * (1 - highPrioritySameFlag); // Lower priority tour of 2+ tours for different purposes var lowPriorityDifferentFlag = (personDay.IsLaterSimulatedHomeBasedTour() && personDay.HomeBasedToursExist()).ToFlag() * (1 - lowPrioritySameFlag); var timeWindow = tour.ParentTour == null ? personDay.TimeWindow : tour.ParentTour.TimeWindow; var impedances = tour.GetTourModeImpedances(); var period1Middle = 15; var smallPeriodCount = DayPeriod.SmallDayPeriods.Count(); for (var periodIndex = 0; periodIndex < smallPeriodCount; periodIndex++) { // set arrival period component var arrivalPeriodIndex = periodIndex; var arrivalPeriodShift = arrivalPeriodIndex * (48.0 / DayPeriod.SMALL_DAY_PERIOD_TOTAL_TRIP_TIMES); //adjust shift amount if period lengths change var arrivalPeriod = DayPeriod.SmallDayPeriods[arrivalPeriodIndex]; var earlyArriveFlag = arrivalPeriod.Middle.IsBetween(Global.Settings.Times.ThreeAM, Global.Settings.Times.SevenAM).ToFlag(); var arrivalImpedance = impedances[arrivalPeriodIndex]; var arrivalPeriodAvailableMinutes = timeWindow.TotalAvailableMinutes(arrivalPeriod.Start, arrivalPeriod.End); choiceProbabilityCalculator.CreateUtilityComponent(3 * periodIndex + 0); var arrivalComponent = choiceProbabilityCalculator.GetUtilityComponent(3 * periodIndex + 0); if (arrivalPeriodAvailableMinutes > 0) { arrivalComponent.AddUtilityTerm(11, arrivalPeriod.Middle.IsBetween(Global.Settings.Times.ThreeAM, Global.Settings.Times.SixAM).ToFlag()); arrivalComponent.AddUtilityTerm(12, arrivalPeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.SixAM, Global.Settings.Times.SevenAM).ToFlag()); arrivalComponent.AddUtilityTerm(13, arrivalPeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.SevenAM, Global.Settings.Times.EightAM).ToFlag()); arrivalComponent.AddUtilityTerm(14, arrivalPeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.EightAM, Global.Settings.Times.NineAM).ToFlag()); arrivalComponent.AddUtilityTerm(15, arrivalPeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.NineAM, Global.Settings.Times.TenAM).ToFlag()); arrivalComponent.AddUtilityTerm(16, arrivalPeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.TenAM, Global.Settings.Times.OnePM).ToFlag()); arrivalComponent.AddUtilityTerm(17, arrivalPeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.OnePM, Global.Settings.Times.FourPM).ToFlag()); arrivalComponent.AddUtilityTerm(18, arrivalPeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.FourPM, Global.Settings.Times.SevenPM).ToFlag()); arrivalComponent.AddUtilityTerm(19, arrivalPeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.SevenPM, Global.Settings.Times.TenPM).ToFlag()); arrivalComponent.AddUtilityTerm(20, arrivalPeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.TenPM, Global.Settings.Times.MinutesInADay).ToFlag()); arrivalComponent.AddUtilityTerm(41, partTimeWorkerFlag * arrivalPeriodShift); arrivalComponent.AddUtilityTerm(43, nonworkingAdultFlag * arrivalPeriodShift); arrivalComponent.AddUtilityTerm(45, universityStudentFlag * arrivalPeriodShift); arrivalComponent.AddUtilityTerm(47, retiredAdultFlag * arrivalPeriodShift); arrivalComponent.AddUtilityTerm(49, drivingAgeStudentFlag * arrivalPeriodShift); arrivalComponent.AddUtilityTerm(139, fulltimeWorkerFlag * arrivalPeriodShift); arrivalComponent.AddUtilityTerm(141, childAge5Through15Flag * arrivalPeriodShift); arrivalComponent.AddUtilityTerm(143, childUnder5Flag * arrivalPeriodShift); arrivalComponent.AddUtilityTerm(145, escortTourFlag * arrivalPeriodShift); arrivalComponent.AddUtilityTerm(147, shoppingTourFlag * arrivalPeriodShift); arrivalComponent.AddUtilityTerm(149, mealTourFlag * arrivalPeriodShift); arrivalComponent.AddUtilityTerm(151, socialTourFlag * arrivalPeriodShift); arrivalComponent.AddUtilityTerm(153, personalBusinessTourFlag * arrivalPeriodShift); arrivalComponent.AddUtilityTerm(51, income0To25KFlag * arrivalPeriodShift); arrivalComponent.AddUtilityTerm(53, income100KPlusFlag * arrivalPeriodShift); arrivalComponent.AddUtilityTerm(55, highPrioritySameFlag * arrivalPeriodShift); arrivalComponent.AddUtilityTerm(57, lowPrioritySameFlag * arrivalPeriodShift); arrivalComponent.AddUtilityTerm(155, highPriorityDifferentFlag * arrivalPeriodShift); arrivalComponent.AddUtilityTerm(157, lowPriorityDifferentFlag * arrivalPeriodShift); arrivalComponent.AddUtilityTerm(59, homeBasedToursOnlyFlag * arrivalPeriodShift); arrivalComponent.AddUtilityTerm(61, totalStops * homeBasedToursOnlyFlag * arrivalPeriodShift); arrivalComponent.AddUtilityTerm(63, totalStops * (1 - homeBasedToursOnlyFlag) * arrivalPeriodShift); arrivalComponent.AddUtilityTerm(65, (totalStops - totalSimulatedStops) * (1 - homeBasedToursOnlyFlag) * arrivalPeriodShift); arrivalComponent.AddUtilityTerm(67, escortStops * arrivalPeriodShift); arrivalComponent.AddUtilityTerm(69, tour.TotalSubtours * arrivalPeriodShift); arrivalComponent.AddUtilityTerm(72, income100KPlusFlag * earlyArriveFlag); arrivalComponent.AddUtilityTerm(175, escortTourFlag * earlyArriveFlag); arrivalComponent.AddUtilityTerm(176, shoppingTourFlag * earlyArriveFlag); arrivalComponent.AddUtilityTerm(177, mealTourFlag * earlyArriveFlag); arrivalComponent.AddUtilityTerm(85, sovOrHovTourFlag * arrivalImpedance.GeneralizedTimeFromOrigin * tour.TimeCoefficient); arrivalComponent.AddUtilityTerm(87, transitTourFlag * Math.Max(0, arrivalImpedance.GeneralizedTimeFromOrigin) * tour.TimeCoefficient); arrivalComponent.AddUtilityTerm(89, transitTourFlag * (arrivalImpedance.GeneralizedTimeFromOrigin < 0).ToFlag()); arrivalComponent.AddUtilityTerm(91, Math.Log(arrivalPeriodAvailableMinutes)); arrivalComponent.AddUtilityTerm(93, arrivalImpedance.AdjacentMinutesBefore * firstSimulatedHomeBasedTourFlag); arrivalComponent.AddUtilityTerm(95, arrivalImpedance.AdjacentMinutesBefore * laterSimulatedHomeBasedTourFlag); arrivalComponent.AddUtilityTerm(99, (totalStops - totalSimulatedStops) / (1D + arrivalImpedance.AdjacentMinutesBefore)); } // set departure period component var departurePeriodIndex = periodIndex; var departurePeriod = DayPeriod.SmallDayPeriods[departurePeriodIndex]; var lateDepartFlag = departurePeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.NinePM, Global.Settings.Times.MinutesInADay).ToFlag(); var departureImpedance = impedances[departurePeriodIndex]; var departurePeriodAvailableMinutes = timeWindow.TotalAvailableMinutes(departurePeriod.Start, departurePeriod.End); choiceProbabilityCalculator.CreateUtilityComponent(3 * periodIndex + 1); var departureComponent = choiceProbabilityCalculator.GetUtilityComponent(3 * periodIndex + 1); if (departurePeriodAvailableMinutes > 0) { departureComponent.AddUtilityTerm(21, departurePeriod.Middle.IsBetween(Global.Settings.Times.ThreeAM, Global.Settings.Times.SevenAM).ToFlag()); departureComponent.AddUtilityTerm(22, departurePeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.SevenAM, Global.Settings.Times.TenAM).ToFlag()); departureComponent.AddUtilityTerm(23, departurePeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.TenAM, Global.Settings.Times.OnePM).ToFlag()); departureComponent.AddUtilityTerm(24, departurePeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.OnePM, Global.Settings.Times.ThreePM).ToFlag()); departureComponent.AddUtilityTerm(124, departurePeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.ThreePM, Global.Settings.Times.FourPM).ToFlag()); departureComponent.AddUtilityTerm(25, departurePeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.FourPM, Global.Settings.Times.FivePM).ToFlag()); departureComponent.AddUtilityTerm(26, departurePeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.FivePM, Global.Settings.Times.SixPM).ToFlag()); departureComponent.AddUtilityTerm(27, departurePeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.SixPM, Global.Settings.Times.SevenPM).ToFlag()); departureComponent.AddUtilityTerm(28, departurePeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.SevenPM, Global.Settings.Times.NinePM).ToFlag()); departureComponent.AddUtilityTerm(29, departurePeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.NinePM, Global.Settings.Times.Midnight).ToFlag()); departureComponent.AddUtilityTerm(30, departurePeriod.Middle.IsLeftExclusiveBetween(Global.Settings.Times.Midnight, Global.Settings.Times.MinutesInADay).ToFlag()); departureComponent.AddUtilityTerm(73, income100KPlusFlag * lateDepartFlag); departureComponent.AddUtilityTerm(178, escortTourFlag * lateDepartFlag); departureComponent.AddUtilityTerm(179, shoppingTourFlag * lateDepartFlag); departureComponent.AddUtilityTerm(180, mealTourFlag * lateDepartFlag); departureComponent.AddUtilityTerm(86, sovOrHovTourFlag * departureImpedance.GeneralizedTimeFromDestination * tour.TimeCoefficient); departureComponent.AddUtilityTerm(88, transitTourFlag * Math.Max(0, departureImpedance.GeneralizedTimeFromDestination) * tour.TimeCoefficient); departureComponent.AddUtilityTerm(89, transitTourFlag * (departureImpedance.GeneralizedTimeFromDestination < 0).ToFlag()); departureComponent.AddUtilityTerm(92, Math.Log(departurePeriodAvailableMinutes)); departureComponent.AddUtilityTerm(94, departureImpedance.AdjacentMinutesAfter * firstSimulatedHomeBasedTourFlag); departureComponent.AddUtilityTerm(96, departureImpedance.AdjacentMinutesAfter * laterSimulatedHomeBasedTourFlag); departureComponent.AddUtilityTerm(100, (totalStops - totalSimulatedStops) / (1D + departureImpedance.AdjacentMinutesAfter)); } // set duration component (relative to period 1) var periodSpan = periodIndex * (48.0 / DayPeriod.SMALL_DAY_PERIOD_TOTAL_TRIP_TIMES); //adjust shift amount if period lengths change; if (arrivalPeriodIndex == 0) { period1Middle = arrivalPeriod.Middle; } var duration = departurePeriod.Middle - period1Middle; var durationUnder1HourFlag = ChoiceModelUtility.GetDurationUnder1HourFlag(duration); var duration1To2HoursFlag = ChoiceModelUtility.GetDuration1To2HoursFlag(duration); var durationUnder4HoursFlag = ChoiceModelUtility.GetDurationUnder4HoursFlag(duration); var durationUnder8HoursFlag = ChoiceModelUtility.GetDurationUnder8HoursFlag(duration); var durationUnder9HoursFlag = ChoiceModelUtility.GetDurationUnder9HoursFlag(duration); choiceProbabilityCalculator.CreateUtilityComponent(3 * periodIndex + 2); var durationComponent = choiceProbabilityCalculator.GetUtilityComponent(3 * periodIndex + 2); if (tour.IsWorkPurpose() || tour.IsSchoolPurpose()) { durationComponent.AddUtilityTerm(31, duration.IsRightExclusiveBetween(Global.Settings.Times.ZeroHours, Global.Settings.Times.ThreeHours).ToFlag()); durationComponent.AddUtilityTerm(32, duration.IsRightExclusiveBetween(Global.Settings.Times.ThreeHours, Global.Settings.Times.FiveHours).ToFlag()); durationComponent.AddUtilityTerm(33, duration.IsRightExclusiveBetween(Global.Settings.Times.FiveHours, Global.Settings.Times.SevenHours).ToFlag()); durationComponent.AddUtilityTerm(34, duration.IsRightExclusiveBetween(Global.Settings.Times.SevenHours, Global.Settings.Times.NineHours).ToFlag()); durationComponent.AddUtilityTerm(35, duration.IsRightExclusiveBetween(Global.Settings.Times.NineHours, Global.Settings.Times.TenHours).ToFlag()); durationComponent.AddUtilityTerm(36, duration.IsRightExclusiveBetween(Global.Settings.Times.TenHours, Global.Settings.Times.ElevenHours).ToFlag()); durationComponent.AddUtilityTerm(37, duration.IsRightExclusiveBetween(Global.Settings.Times.ElevenHours, Global.Settings.Times.TwelveHours).ToFlag()); durationComponent.AddUtilityTerm(38, duration.IsRightExclusiveBetween(Global.Settings.Times.TwelveHours, Global.Settings.Times.FourteenHours).ToFlag()); durationComponent.AddUtilityTerm(39, duration.IsRightExclusiveBetween(Global.Settings.Times.FourteenHours, Global.Settings.Times.EighteenHours).ToFlag()); durationComponent.AddUtilityTerm(40, (duration >= Global.Settings.Times.EighteenHours).ToFlag()); } else { durationComponent.AddUtilityTerm(31, duration.IsRightExclusiveBetween(Global.Settings.Times.ZeroHours, Global.Settings.Times.OneHour).ToFlag()); durationComponent.AddUtilityTerm(32, duration.IsRightExclusiveBetween(Global.Settings.Times.OneHour, Global.Settings.Times.TwoHours).ToFlag()); durationComponent.AddUtilityTerm(33, duration.IsRightExclusiveBetween(Global.Settings.Times.TwoHours, Global.Settings.Times.ThreeHours).ToFlag()); durationComponent.AddUtilityTerm(34, duration.IsRightExclusiveBetween(Global.Settings.Times.ThreeHours, Global.Settings.Times.FiveHours).ToFlag()); durationComponent.AddUtilityTerm(35, duration.IsRightExclusiveBetween(Global.Settings.Times.FiveHours, Global.Settings.Times.SevenHours).ToFlag()); durationComponent.AddUtilityTerm(36, duration.IsRightExclusiveBetween(Global.Settings.Times.SevenHours, Global.Settings.Times.NineHours).ToFlag()); durationComponent.AddUtilityTerm(37, duration.IsRightExclusiveBetween(Global.Settings.Times.NineHours, Global.Settings.Times.TwelveHours).ToFlag()); durationComponent.AddUtilityTerm(38, duration.IsRightExclusiveBetween(Global.Settings.Times.TwelveHours, Global.Settings.Times.FourteenHours).ToFlag()); durationComponent.AddUtilityTerm(39, duration.IsRightExclusiveBetween(Global.Settings.Times.FourteenHours, Global.Settings.Times.EighteenHours).ToFlag()); durationComponent.AddUtilityTerm(40, (duration >= Global.Settings.Times.EighteenHours).ToFlag()); } durationComponent.AddUtilityTerm(42, partTimeWorkerFlag * periodSpan); durationComponent.AddUtilityTerm(44, nonworkingAdultFlag * periodSpan); durationComponent.AddUtilityTerm(46, universityStudentFlag * periodSpan); durationComponent.AddUtilityTerm(48, retiredAdultFlag * periodSpan); durationComponent.AddUtilityTerm(50, drivingAgeStudentFlag * periodSpan); durationComponent.AddUtilityTerm(140, fulltimeWorkerFlag * periodSpan); durationComponent.AddUtilityTerm(142, childAge5Through15Flag * periodSpan); durationComponent.AddUtilityTerm(144, childUnder5Flag * periodSpan); durationComponent.AddUtilityTerm(146, escortTourFlag * periodSpan); durationComponent.AddUtilityTerm(148, shoppingTourFlag * periodSpan); durationComponent.AddUtilityTerm(150, mealTourFlag * periodSpan); durationComponent.AddUtilityTerm(152, socialTourFlag * periodSpan); durationComponent.AddUtilityTerm(154, personalBusinessTourFlag * periodSpan); durationComponent.AddUtilityTerm(52, income0To25KFlag * periodSpan); durationComponent.AddUtilityTerm(54, income100KPlusFlag * periodSpan); durationComponent.AddUtilityTerm(56, highPrioritySameFlag * periodSpan); durationComponent.AddUtilityTerm(58, lowPrioritySameFlag * periodSpan); durationComponent.AddUtilityTerm(156, highPriorityDifferentFlag * periodSpan); durationComponent.AddUtilityTerm(158, lowPriorityDifferentFlag * periodSpan); durationComponent.AddUtilityTerm(60, homeBasedToursOnlyFlag * periodSpan); durationComponent.AddUtilityTerm(62, totalStops * homeBasedToursOnlyFlag * periodSpan); durationComponent.AddUtilityTerm(64, totalStops * (1 - homeBasedToursOnlyFlag) * periodSpan); durationComponent.AddUtilityTerm(66, (totalStops - totalSimulatedStops) * (1 - homeBasedToursOnlyFlag) * periodSpan); durationComponent.AddUtilityTerm(68, escortStops * periodSpan); durationComponent.AddUtilityTerm(70, tour.TotalSubtours * periodSpan); durationComponent.AddUtilityTerm(71, fulltimeWorkerFlag * durationUnder9HoursFlag); durationComponent.AddUtilityTerm(169, escortTourFlag * durationUnder1HourFlag); durationComponent.AddUtilityTerm(170, shoppingTourFlag * durationUnder1HourFlag); durationComponent.AddUtilityTerm(171, mealTourFlag * durationUnder1HourFlag); durationComponent.AddUtilityTerm(172, escortTourFlag * duration1To2HoursFlag); durationComponent.AddUtilityTerm(173, shoppingTourFlag * duration1To2HoursFlag); durationComponent.AddUtilityTerm(174, mealTourFlag * duration1To2HoursFlag); durationComponent.AddUtilityTerm(81, highPrioritySameFlag * durationUnder8HoursFlag); durationComponent.AddUtilityTerm(82, lowPrioritySameFlag * durationUnder8HoursFlag); durationComponent.AddUtilityTerm(83, highPriorityDifferentFlag * durationUnder8HoursFlag); durationComponent.AddUtilityTerm(84, lowPriorityDifferentFlag * durationUnder4HoursFlag); } foreach (var time in TourTime.Times) { var available = ((time.ArrivalPeriod.Index < time.DeparturePeriod.Index && timeWindow.EntireSpanIsAvailable(time.ArrivalPeriod.End, time.DeparturePeriod.Start)) || (time.ArrivalPeriod.Index == time.DeparturePeriod.Index && timeWindow.TotalAvailableMinutes(time.ArrivalPeriod.Start, time.ArrivalPeriod.End) > 1)) && (knownArrivalTime == 0 || (time.ArrivalPeriod.Start <= knownArrivalTime && time.ArrivalPeriod.End >= knownArrivalTime)) && (knownDepartureTime == 0 || (time.DeparturePeriod.Start <= knownDepartureTime && time.DeparturePeriod.End >= knownDepartureTime)); var alternative = choiceProbabilityCalculator.GetAlternative(time.Index, available, choice != null && choice.Equals(time)); if (!alternative.Available) { continue; } var arrivalPeriodIndex = time.ArrivalPeriod.Index; var arrivalImpedance = impedances[arrivalPeriodIndex]; var departurePeriodIndex = time.DeparturePeriod.Index; var departureImpedance = impedances[departurePeriodIndex]; alternative.Choice = time; // arrival period utility component alternative.AddUtilityComponent(choiceProbabilityCalculator.GetUtilityComponent(3 * time.ArrivalPeriod.Index + 0)); // departure period utility component alternative.AddUtilityComponent(choiceProbabilityCalculator.GetUtilityComponent(3 * time.DeparturePeriod.Index + 1)); // duration utility components alternative.AddUtilityComponent(choiceProbabilityCalculator.GetUtilityComponent(3 * (time.DeparturePeriod.Index - time.ArrivalPeriod.Index) + 2)); alternative.AddUtilityTerm(97, Math.Min(0.3, (homeBasedTours - simulatedHomeBasedTours) / (1.0 + arrivalImpedance.TotalMinutesBefore + departureImpedance.TotalMinutesAfter))); alternative.AddUtilityTerm(98, Math.Min(0.3, (homeBasedTours - simulatedHomeBasedTours) / (1.0 + Math.Max(arrivalImpedance.MaxMinutesBefore, departureImpedance.MaxMinutesAfter)))); } }
/// <summary> /// Evento que se dispara cuando se empieza a editar un registro del datagrid /// </summary> /// <param name="sender"></param> /// <param name="e"></param> /// <history> /// [vku] 24/Jun/2016 Created /// </history> private void dgrTourTimes_BeginningEdit(object sender, DataGridBeginningEditEventArgs e) { DataGrid dg = sender as DataGrid; if (_blnEdit) { if ((e.Column.Header.ToString() == "Tour Time" || e.Column.Header.ToString() == "Pickup Time") && !e.Row.IsNewItem) { e.Cancel = true; } else { if (e.Column.Header.ToString() == "Pickup Time" && e.Row.IsNewItem) { switch (_enumTourTimes) { case EnumTourTimesSchema.ttsByLeadSourceSalesRoom: TourTime rowlssr = (TourTime)dgrTourTimes.SelectedItem; if (rowlssr.ttT != DateTime.MinValue) { rowlssr.ttPickUpT = rowlssr.ttT; } else { e.Cancel = true; } break; case EnumTourTimesSchema.ttsByLeadSourceSalesRoomWeekDay: TourTimeByDay rowlssrwd = (TourTimeByDay)dgrTourTimes.SelectedItem; if (rowlssrwd.ttT != DateTime.MinValue) { rowlssrwd.ttPickUpT = rowlssrwd.ttT; } else { e.Cancel = true; } break; case EnumTourTimesSchema.ttsBySalesRoomWeekDay: TourTimeBySalesRoomWeekDay rowttbysrwd = (TourTimeBySalesRoomWeekDay)dgrTourTimes.SelectedItem; if (rowttbysrwd.ttT != DateTime.MinValue) { rowttbysrwd.ttPickUpT = rowttbysrwd.ttT; } else { e.Cancel = true; } break; } } else { if (e.Column.Header.ToString() == "Max Books" && e.Row.IsNewItem) { switch (_enumTourTimes) { case EnumTourTimesSchema.ttsByLeadSourceSalesRoom: TourTime rowlssr = (TourTime)dgrTourTimes.SelectedItem; if (rowlssr.ttT != DateTime.MinValue && rowlssr.ttPickUpT != DateTime.MinValue) { rowlssr.ttMaxBooks = 1; } else { e.Cancel = true; } break; case EnumTourTimesSchema.ttsByLeadSourceSalesRoomWeekDay: TourTimeByDay rowlssrwd = (TourTimeByDay)dgrTourTimes.SelectedItem; if (rowlssrwd.ttT != DateTime.MinValue && rowlssrwd.ttPickUpT != DateTime.MinValue) { rowlssrwd.ttMaxBooks = 1; } else { e.Cancel = true; } break; case EnumTourTimesSchema.ttsBySalesRoomWeekDay: TourTimeBySalesRoomWeekDay rowsrwd = (TourTimeBySalesRoomWeekDay)dgrTourTimes.SelectedItem; if (rowsrwd.ttT != DateTime.MinValue && rowsrwd.ttPickUpT != DateTime.MinValue) { rowsrwd.ttMaxBooks = 1; } else { e.Cancel = true; } break; } } } } } else { e.Cancel = true; } }
/// <summary> /// Guarda o modifica los horarios de tour despues de editar el datagrid /// </summary> /// <param name="sender"></param> /// <param name="e"></param> /// <history> /// [vku] 27/Jun/2016 Created /// </history> private async void dgrTourTimes_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e) { DataGrid dgr = sender as DataGrid; dgr.RowEditEnding -= dgrTourTimes_RowEditEnding; if (isCancel) { dgr.CancelEdit(); dgr.RowEditEnding += dgrTourTimes_RowEditEnding; } else { int nRes = 0; switch (_enumTourTimes) { #region TourTime case EnumTourTimesSchema.ttsByLeadSourceSalesRoom: TourTime ttbylssr = e.Row.DataContext as TourTime; if (isInsert) { if (Validate(ttbylssr)) { if (UIHelper.ShowMessage("Are you sure you want add new Tour Time?", MessageBoxImage.Question) == MessageBoxResult.Yes) { dgr.CommitEdit(); status.Visibility = Visibility.Visible; txtStatus.Text = "Saving Data..."; ttbylssr.ttls = cboLeadSource.SelectedValue.ToString(); ttbylssr.ttsr = cboSalesRoom.SelectedValue.ToString(); nRes = await BREntities.OperationEntity(ttbylssr, EnumMode.Add); dgr.Items.Refresh(); dgr.RowEditEnding += dgrTourTimes_RowEditEnding; } else { dgr.CancelEdit(); dgr.RowEditEnding += dgrTourTimes_RowEditEnding; } } else { e.Cancel = true; dgr.RowEditEnding += dgrTourTimes_RowEditEnding; } } else { status.Visibility = Visibility.Visible; txtStatus.Text = "Saving Data..."; nRes = await BREntities.OperationEntity(ttbylssr, EnumMode.Edit); dgr.RowEditEnding += dgrTourTimes_RowEditEnding; } break; #endregion #region TourTimesByDay case EnumTourTimesSchema.ttsByLeadSourceSalesRoomWeekDay: TourTimeByDay ttbylssrwd = e.Row.DataContext as TourTimeByDay; if (isInsert) { if (Validate(ttbylssrwd)) { if (UIHelper.ShowMessage("Are you sure you want add new Tour Time?", MessageBoxImage.Question) == MessageBoxResult.Yes) { dgr.CommitEdit(); status.Visibility = Visibility.Visible; txtStatus.Text = "Saving Data..."; ttbylssrwd.ttls = cboLeadSource.SelectedValue.ToString(); ttbylssrwd.ttsr = cboSalesRoom.SelectedValue.ToString(); ttbylssrwd.ttDay = Convert.ToByte(cboWeekDay.SelectedValue.ToString()); nRes = await BREntities.OperationEntity(ttbylssrwd, EnumMode.Add); dgr.Items.Refresh(); dgr.RowEditEnding += dgrTourTimes_RowEditEnding; } else { dgr.CancelEdit(); dgr.RowEditEnding += dgrTourTimes_RowEditEnding; } } else { e.Cancel = true; dgr.RowEditEnding += dgrTourTimes_RowEditEnding; } } else { status.Visibility = Visibility.Visible; txtStatus.Text = "Saving Data..."; nRes = await BREntities.OperationEntity(ttbylssrwd, EnumMode.Edit); dgr.RowEditEnding += dgrTourTimes_RowEditEnding; } break; #endregion #region TourTimeBySalesRoomWeekDay case EnumTourTimesSchema.ttsBySalesRoomWeekDay: TourTimeBySalesRoomWeekDay ttbysrwd = e.Row.DataContext as TourTimeBySalesRoomWeekDay; if (isInsert) { if (Validate(ttbysrwd)) { if (UIHelper.ShowMessage("Are you sure you want add new Tour Time?", MessageBoxImage.Question) == MessageBoxResult.Yes) { dgr.CommitEdit(); status.Visibility = Visibility.Visible; txtStatus.Text = "Saving Data..."; ttbysrwd.ttsr = cboSalesRoom.SelectedValue.ToString(); ttbysrwd.ttDay = Convert.ToByte(cboWeekDay.SelectedValue.ToString()); nRes = await BREntities.OperationEntity(ttbysrwd, EnumMode.Add); dgr.Items.Refresh(); dgr.RowEditEnding += dgrTourTimes_RowEditEnding; } else { dgr.CancelEdit(); dgr.RowEditEnding += dgrTourTimes_RowEditEnding; } } else { e.Cancel = true; dgr.RowEditEnding += dgrTourTimes_RowEditEnding; } } else { status.Visibility = Visibility.Visible; txtStatus.Text = "Saving Data..."; nRes = await BREntities.OperationEntity(ttbysrwd, EnumMode.Edit); dgr.RowEditEnding += dgrTourTimes_RowEditEnding; } break; #endregion } status.Visibility = Visibility.Collapsed; StatusBarReg.Content = dgrTourTimes.Items.Count - 1 + " Tour Times."; } }