private void RunModel(ChoiceProbabilityCalculator choiceProbabilityCalculator, ITripWrapper trip, int choice = Constants.DEFAULT_VALUE)
        {
            IHouseholdWrapper household = trip.Household;
            IPersonWrapper    person    = trip.Person;
            IPersonDayWrapper personDay = trip.PersonDay;
            ITourWrapper      tour      = trip.Tour;

            Framework.DomainModels.Models.IHalfTour halfTour = trip.HalfTour;

            // household inputs
            int childrenFlag           = household.HasChildren.ToFlag();
            int onePersonHouseholdFlag = household.IsOnePersonHousehold.ToFlag();

            // person inputs
            int adultMaleFlag          = person.IsAdultMale.ToFlag();
            int adultFemaleFlag        = person.IsAdultFemale.ToFlag();
            int partTimeWorkerFlag     = person.IsPartTimeWorker.ToFlag();
            int retiredAdultFlag       = person.IsRetiredAdult.ToFlag();
            int drivingAgeStudentFlag  = person.IsDrivingAgeStudent.ToFlag();
            int nonworkingAdultFlag    = person.IsNonworkingAdult.ToFlag();
            int childAge5Through15Flag = person.IsChildAge5Through15.ToFlag();
            int childUnder5Flag        = person.IsChildUnder5.ToFlag();

            // person-day inputs
            int homeBasedTours     = personDay.HomeBasedTours;
            int simulatedToursFlag = personDay.SimulatedToursExist().ToFlag();

            int simulatedWorkStops     = personDay.SimulatedWorkStops;
            int simulatedWorkStopsFlag = personDay.SimulatedWorkStopsExist().ToFlag();

            int simulatedSchoolStops = personDay.SimulatedSchoolStops;
            //            var simulatedSchoolStopsFlag = personDay.HasSimulatedSchoolStops.ToFlag();

            int simulatedEscortStops = personDay.SimulatedEscortStops;
            //            var simulatedEscortStopsFlag = personDay.HasSimulatedEscortStops.ToFlag();

            int simulatedPersonalBusinessStops = personDay.SimulatedPersonalBusinessStops;
            //            var simulatedPersonalBusinessStopsFlag = personDay.HasSimulatedPersonalBusinessStops.ToFlag();

            int simulatedShoppingStops = personDay.SimulatedShoppingStops;
            //            var simulatedShoppingStopsFlag = personDay.HasSimulatedShoppingStops.ToFlag();

            int simulatedMealStops = personDay.SimulatedMealStops;
            //            var simulatedMealStopsFlag = personDay.HasSimulatedMealStops.ToFlag();

            int simulatedSocialStops = personDay.SimulatedSocialStops;
            //            var simulatedSocialStopsFlag = personDay.HasSimulatedSocialStops.ToFlag();

            // tour inputs
            int hov2TourFlag         = tour.IsHov2Mode().ToFlag();
            int hov3TourFlag         = tour.IsHov3Mode().ToFlag();
            int transitTourFlag      = tour.IsTransitMode().ToFlag();
            int bikeTourFlag         = tour.IsBikeMode().ToFlag();
            int walkTourFlag         = tour.IsWalkMode().ToFlag();
            int notHomeBasedTourFlag = (!tour.IsHomeBasedTour).ToFlag();
            int workTourFlag         = tour.IsWorkPurpose().ToFlag();
            int personalBusinessOrMedicalTourFlag = tour.IsPersonalBusinessOrMedicalPurpose().ToFlag();
            int socialOrRecreationTourFlag        = tour.IsSocialOrRecreationPurpose().ToFlag();
            int schoolTourFlag   = tour.IsSchoolPurpose().ToFlag();
            int escortTourFlag   = tour.IsEscortPurpose().ToFlag();
            int shoppingTourFlag = tour.IsShoppingPurpose().ToFlag();
            int mealTourFlag     = tour.IsMealPurpose().ToFlag();

            // trip inputs
            int oneSimulatedTripFlag           = halfTour.OneSimulatedTripFlag;
            int twoSimulatedTripsFlag          = halfTour.TwoSimulatedTripsFlag;
            int threeSimulatedTripsFlag        = halfTour.ThreeSimulatedTripsFlag;
            int fourSimulatedTripsFlag         = halfTour.FourSimulatedTripsFlag;
            int fiveSimulatedTripsFlag         = halfTour.FiveSimulatedTripsFlag;
            int halfTourFromOriginFlag         = trip.IsHalfTourFromOrigin.ToFlag();
            int halfTourFromDestinationFlag    = (!trip.IsHalfTourFromOrigin).ToFlag();
            int beforeMandatoryDestinationFlag = trip.IsBeforeMandatoryDestination().ToFlag();

            // remaining inputs
            int time = trip.IsHalfTourFromOrigin ? tour.DestinationArrivalTime : tour.DestinationDepartureTime;

            int from7AMto9AMFlag  = (time >= Global.Settings.Times.SevenAM && time < Global.Settings.Times.NineAM).ToFlag();
            int from9AMto11AMFlag = (time >= Global.Settings.Times.NineAM && time < Global.Settings.Times.ElevenAM).ToFlag();
            int from11AMto1PMFlag = (time >= Global.Settings.Times.ElevenAM && time < Global.Settings.Times.OnePM).ToFlag();
            int from1PMto3PMFlag  = (time >= Global.Settings.Times.OnePM && time < Global.Settings.Times.ThreePM).ToFlag();
            int from3PMto5PMFlag  = (time >= Global.Settings.Times.ThreePM && time < Global.Settings.Times.FivePM).ToFlag();
            int from7PMto9PMFlag  = (time >= Global.Settings.Times.SevenPM && time < Global.Settings.Times.NinePM).ToFlag();
            int from9PMto11PMFlag = (time >= Global.Settings.Times.NinePM && time < Global.Settings.Times.ElevenPM).ToFlag();
            int from11PMto7AMFlag = (time >= Global.Settings.Times.ElevenPM).ToFlag();

            double foodRetailServiceMedicalQtrMileLog = household.ResidenceParcel.FoodRetailServiceMedicalLogBuffer1();
            int    remainingToursCount = personDay.HomeBasedTours - personDay.GetTotalSimulatedTours();

            // time-of-day for trip window calculations
            int startTime = trip.GetStartTime();

            // time window in minutes and in hours for yet unmodeled portion of half-tour, only consider persons on this trip
            int timeWindow =
                tour.IsHomeBasedTour
                    ? personDay.TimeWindow.AvailableWindow(startTime, Global.Settings.TimeDirections.Both)
                    : tour.ParentTour.TimeWindow.AvailableWindow(startTime, Global.Settings.TimeDirections.Both);

            double duration = timeWindow / 60D;

            // connectivity attributes
            double c34Ratio = trip.OriginParcel.C34RatioBuffer1();

            // 0 - NO MORE STOPS

            ChoiceProbabilityCalculator.Alternative alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.NoneOrHome, true, choice == Global.Settings.Purposes.NoneOrHome);

            alternative.Choice = Global.Settings.Purposes.NoneOrHome;

            alternative.AddUtilityTerm(1, twoSimulatedTripsFlag * halfTourFromOriginFlag);
            alternative.AddUtilityTerm(2, threeSimulatedTripsFlag * halfTourFromOriginFlag);
            alternative.AddUtilityTerm(3, fourSimulatedTripsFlag * halfTourFromOriginFlag);
            alternative.AddUtilityTerm(4, fiveSimulatedTripsFlag * halfTourFromOriginFlag);
            alternative.AddUtilityTerm(5, twoSimulatedTripsFlag * halfTourFromDestinationFlag);
            alternative.AddUtilityTerm(6, threeSimulatedTripsFlag * halfTourFromDestinationFlag);
            alternative.AddUtilityTerm(7, fourSimulatedTripsFlag * halfTourFromDestinationFlag);
            alternative.AddUtilityTerm(8, fiveSimulatedTripsFlag * halfTourFromDestinationFlag);
            alternative.AddUtilityTerm(9, homeBasedTours);
            alternative.AddUtilityTerm(10, simulatedToursFlag);
            alternative.AddUtilityTerm(11, notHomeBasedTourFlag);
            alternative.AddUtilityTerm(12, beforeMandatoryDestinationFlag);
            alternative.AddUtilityTerm(16, (transitTourFlag + walkTourFlag + bikeTourFlag) * c34Ratio * foodRetailServiceMedicalQtrMileLog);
            alternative.AddUtilityTerm(17, transitTourFlag);
            alternative.AddUtilityTerm(40, schoolTourFlag);

            // 1 - WORK STOP

            if (personDay.WorkStops > 0 && tour.DestinationPurpose <= Global.Settings.Purposes.School)
            {
                alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Work, true, choice == Global.Settings.Purposes.Work);

                alternative.Choice = Global.Settings.Purposes.Work;

                alternative.AddUtilityTerm(33, workTourFlag + schoolTourFlag);
                //                alternative.AddUtility(47, escortTourFlag);
                //                alternative.AddUtility(54, personalBusinessOrMedicalTourFlag);
                //                alternative.AddUtility(61, shoppingTourFlag);
                //                alternative.AddUtility(68, mealTourFlag);
                //                alternative.AddUtility(75, socialOrRecreationTourFlag);
                alternative.AddUtilityTerm(82, halfTourFromOriginFlag);
                alternative.AddUtilityTerm(89, simulatedWorkStops);
                alternative.AddUtilityTerm(96, simulatedWorkStopsFlag);
                alternative.AddUtilityTerm(103, remainingToursCount);
                alternative.AddUtilityTerm(110, duration);
                alternative.AddUtilityTerm(131, from9AMto11AMFlag + from11AMto1PMFlag + from1PMto3PMFlag + from3PMto5PMFlag);
                alternative.AddUtilityTerm(175, adultMaleFlag);
            }
            else
            {
                choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Work, false, choice == Global.Settings.Purposes.Work);
            }

            // 2 - SCHOOL STOP

            if (personDay.SchoolStops > 0 && tour.DestinationPurpose <= Global.Settings.Purposes.School)
            {
                alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.School, true, choice == Global.Settings.Purposes.School);

                alternative.Choice = Global.Settings.Purposes.School;

                alternative.AddUtilityTerm(34, workTourFlag + schoolTourFlag);
                //                alternative.AddUtility(48, escortTourFlag);
                //                alternative.AddUtility(55, personalBusinessOrMedicalTourFlag);
                //                alternative.AddUtility(62, shoppingTourFlag);
                //                alternative.AddUtility(69, mealTourFlag);
                //                alternative.AddUtility(76, socialOrRecreationTourFlag);
                alternative.AddUtilityTerm(83, halfTourFromOriginFlag);
                alternative.AddUtilityTerm(90, simulatedSchoolStops);
                //                alternative.AddUtility(97, simulatedSchoolStopsFlag);
                alternative.AddUtilityTerm(104, remainingToursCount);
                alternative.AddUtilityTerm(111, duration);
                alternative.AddUtilityTerm(138, from7AMto9AMFlag + from7PMto9PMFlag + from9PMto11PMFlag + from11PMto7AMFlag);
                alternative.AddUtilityTerm(237, oneSimulatedTripFlag);
            }
            else
            {
                choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.School, false, choice == Global.Settings.Purposes.School);
            }

            // 3 - ESCORT STOP

            if (personDay.EscortStops > 0 && tour.DestinationPurpose <= Global.Settings.Purposes.Escort)
            {
                alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Escort, true, choice == Global.Settings.Purposes.Escort);

                alternative.Choice = Global.Settings.Purposes.Escort;

                alternative.AddUtilityTerm(35, workTourFlag + schoolTourFlag);
                alternative.AddUtilityTerm(49, escortTourFlag);
                //                alternative.AddUtility(56, personalBusinessOrMedicalTourFlag);
                //                alternative.AddUtility(63, shoppingTourFlag);
                //                alternative.AddUtility(70, mealTourFlag);
                //                alternative.AddUtility(77, socialOrRecreationTourFlag);
                alternative.AddUtilityTerm(84, halfTourFromOriginFlag);
                alternative.AddUtilityTerm(91, simulatedEscortStops);
                //                alternative.AddUtility(98, simulatedEscortStopsFlag);
                alternative.AddUtilityTerm(105, remainingToursCount);
                alternative.AddUtilityTerm(112, duration);
                alternative.AddUtilityTerm(146, from7AMto9AMFlag);
                alternative.AddUtilityTerm(147, from9AMto11AMFlag + from11AMto1PMFlag + from1PMto3PMFlag + from3PMto5PMFlag);
                alternative.AddUtilityTerm(181, childrenFlag * adultFemaleFlag);
                alternative.AddUtilityTerm(183, hov2TourFlag);
                alternative.AddUtilityTerm(184, hov3TourFlag);
                alternative.AddUtilityTerm(238, oneSimulatedTripFlag);
            }
            else
            {
                choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Escort, false, choice == Global.Settings.Purposes.Escort);
            }

            // 4 - PERSONAL BUSINESS STOP

            if (personDay.PersonalBusinessStops > 0)
            {
                alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.PersonalBusiness, true, choice == Global.Settings.Purposes.PersonalBusiness);

                alternative.Choice = Global.Settings.Purposes.PersonalBusiness;

                alternative.AddUtilityTerm(36, workTourFlag + schoolTourFlag);
                alternative.AddUtilityTerm(50, escortTourFlag);
                alternative.AddUtilityTerm(57, personalBusinessOrMedicalTourFlag);
                alternative.AddUtilityTerm(64, shoppingTourFlag);
                alternative.AddUtilityTerm(71, mealTourFlag);
                alternative.AddUtilityTerm(78, socialOrRecreationTourFlag);
                alternative.AddUtilityTerm(85, halfTourFromOriginFlag);
                alternative.AddUtilityTerm(92, simulatedPersonalBusinessStops);
                //                alternative.AddUtility(99, simulatedPersonalBusinessStopsFlag);
                alternative.AddUtilityTerm(106, remainingToursCount);
                alternative.AddUtilityTerm(113, duration);
                alternative.AddUtilityTerm(154, from7AMto9AMFlag + from7PMto9PMFlag + from9PMto11PMFlag + from11PMto7AMFlag);
                alternative.AddUtilityTerm(155, from9AMto11AMFlag + from11AMto1PMFlag + from1PMto3PMFlag + from3PMto5PMFlag);
                alternative.AddUtilityTerm(195, onePersonHouseholdFlag);
                alternative.AddUtilityTerm(196, hov2TourFlag);
                alternative.AddUtilityTerm(197, hov3TourFlag);
            }
            else
            {
                choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.PersonalBusiness, false, choice == Global.Settings.Purposes.PersonalBusiness);
            }

            // 5 - SHOPPING STOP

            if (personDay.ShoppingStops > 0)
            {
                alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Shopping, true, choice == Global.Settings.Purposes.Shopping);

                alternative.Choice = Global.Settings.Purposes.Shopping;

                alternative.AddUtilityTerm(37, workTourFlag + schoolTourFlag);
                alternative.AddUtilityTerm(51, escortTourFlag);
                alternative.AddUtilityTerm(58, personalBusinessOrMedicalTourFlag);
                alternative.AddUtilityTerm(65, shoppingTourFlag);
                alternative.AddUtilityTerm(72, mealTourFlag);
                alternative.AddUtilityTerm(79, socialOrRecreationTourFlag);
                alternative.AddUtilityTerm(86, halfTourFromOriginFlag);
                alternative.AddUtilityTerm(93, simulatedShoppingStops);
                //                alternative.AddUtility(100, simulatedShoppingStopsFlag);
                alternative.AddUtilityTerm(107, remainingToursCount);
                alternative.AddUtilityTerm(114, duration);
                alternative.AddUtilityTerm(162, from7AMto9AMFlag + from9PMto11PMFlag + from11PMto7AMFlag);
                alternative.AddUtilityTerm(164, from11AMto1PMFlag + from1PMto3PMFlag + from3PMto5PMFlag);
                alternative.AddUtilityTerm(207, childrenFlag * adultFemaleFlag);
                alternative.AddUtilityTerm(209, hov2TourFlag);
                alternative.AddUtilityTerm(210, hov3TourFlag);
            }
            else
            {
                choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Shopping, false, choice == Global.Settings.Purposes.Shopping);
            }

            // 6 - MEAL STOP

            if (personDay.MealStops > 0)
            {
                alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Meal, true, choice == Global.Settings.Purposes.Meal);

                alternative.Choice = Global.Settings.Purposes.Meal;

                alternative.AddUtilityTerm(38, workTourFlag);
                alternative.AddUtilityTerm(46, schoolTourFlag);
                alternative.AddUtilityTerm(52, escortTourFlag);
                alternative.AddUtilityTerm(59, personalBusinessOrMedicalTourFlag);
                alternative.AddUtilityTerm(66, shoppingTourFlag);
                alternative.AddUtilityTerm(73, mealTourFlag);
                alternative.AddUtilityTerm(80, socialOrRecreationTourFlag);
                alternative.AddUtilityTerm(87, halfTourFromOriginFlag);
                alternative.AddUtilityTerm(94, simulatedMealStops);
                //                alternative.AddUtility(101, simulatedMealStopsFlag);
                alternative.AddUtilityTerm(108, remainingToursCount);
                alternative.AddUtilityTerm(115, duration);
                alternative.AddUtilityTerm(170, from7AMto9AMFlag + from11PMto7AMFlag);
                alternative.AddUtilityTerm(171, from11AMto1PMFlag + from1PMto3PMFlag);
                alternative.AddUtilityTerm(172, from7PMto9PMFlag);
                alternative.AddUtilityTerm(221, onePersonHouseholdFlag);
                alternative.AddUtilityTerm(222, hov2TourFlag);
                alternative.AddUtilityTerm(223, hov3TourFlag);
                alternative.AddUtilityTerm(226, partTimeWorkerFlag + retiredAdultFlag + drivingAgeStudentFlag);
                alternative.AddUtilityTerm(228, nonworkingAdultFlag + childAge5Through15Flag + childUnder5Flag);
                alternative.AddUtilityTerm(239, oneSimulatedTripFlag);
            }
            else
            {
                choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Meal, false, choice == Global.Settings.Purposes.Meal);
            }

            // 7 - SOCIAL (OR RECREATION) STOP

            if (personDay.SocialStops > 0)
            {
                alternative = choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Social, true, choice == Global.Settings.Purposes.Social);

                alternative.Choice = Global.Settings.Purposes.Social;

                alternative.AddUtilityTerm(39, workTourFlag + schoolTourFlag);
                alternative.AddUtilityTerm(53, escortTourFlag);
                alternative.AddUtilityTerm(60, personalBusinessOrMedicalTourFlag);
                alternative.AddUtilityTerm(67, shoppingTourFlag);
                alternative.AddUtilityTerm(74, mealTourFlag);
                alternative.AddUtilityTerm(81, socialOrRecreationTourFlag);
                alternative.AddUtilityTerm(88, halfTourFromOriginFlag);
                alternative.AddUtilityTerm(95, simulatedSocialStops);
                //                alternative.AddUtility(102, simulatedSocialStopsFlag);
                alternative.AddUtilityTerm(109, remainingToursCount);
                alternative.AddUtilityTerm(116, duration);
                alternative.AddUtilityTerm(173, from7AMto9AMFlag + from11PMto7AMFlag);
                alternative.AddUtilityTerm(174, from11AMto1PMFlag + from1PMto3PMFlag + from3PMto5PMFlag);
                alternative.AddUtilityTerm(235, hov2TourFlag);
                alternative.AddUtilityTerm(236, hov3TourFlag);
            }
            else
            {
                choiceProbabilityCalculator.GetAlternative(Global.Settings.Purposes.Social, false, choice == Global.Settings.Purposes.Social);
            }
        }