Esempio n. 1
0
        /// <summary>
        /// Funky function directly from Tasha original
        /// </summary>
        /// <param name="person"></param>
        /// <returns></returns>
        internal static PersonWorkSchoolProjectStatus GetWorkSchoolProjectStatus(ITashaPerson person)
        {
            //TashaTime workSchoolStartTime = (person["SData"] as SchedulerPersonData).;
            Time workSchoolStartTime = SchedulerPerson.GetWorkSchoolStartTime(person);
            Time workSchoolEndTime   = SchedulerPerson.GetWorkSchoolEndTime(person);

            PersonWorkSchoolProjectStatus workSchoolProjectStatus = PersonWorkSchoolProjectStatus.NoWorkOrSchool;

            if (workSchoolStartTime <= Time.StartOfDay)
            {
                workSchoolProjectStatus = PersonWorkSchoolProjectStatus.NoWorkOrSchool;
            }
            else if ((workSchoolEndTime - workSchoolStartTime) >= Scheduler.FullTimeActivity)
            {
                if (workSchoolEndTime <= new Time()
                {
                    Hours = 14
                })
                {
                    workSchoolProjectStatus = PersonWorkSchoolProjectStatus.FullTimeNoEveningWorkOrSchool;
                }
                else if (workSchoolStartTime >= new Time()
                {
                    Hours = 9
                })
                {
                    workSchoolProjectStatus = PersonWorkSchoolProjectStatus.FullTimeEveningWorkOrSchool;
                }
                else
                {
                    workSchoolProjectStatus = PersonWorkSchoolProjectStatus.FullTimeDayAndEveningWorkOrSchool;
                }
            }
            else if (workSchoolEndTime - workSchoolStartTime < Scheduler.FullTimeActivity)
            {
                if (workSchoolEndTime <= new Time()
                {
                    Hours = 9
                })
                {
                    workSchoolProjectStatus = PersonWorkSchoolProjectStatus.PartTimeDay;
                }
                else if (workSchoolEndTime <= new Time()
                {
                    Hours = 14
                })
                {
                    workSchoolProjectStatus = PersonWorkSchoolProjectStatus.PartTimeEvening;
                }
                else
                {
                    workSchoolProjectStatus = PersonWorkSchoolProjectStatus.Other;
                }
            }

            return(workSchoolProjectStatus);
        }
Esempio n. 2
0
        public static HouseholdWorkSchoolProjectStatus GetWorkSchoolProjectStatus(ITashaHousehold household)
        {
            bool evening_workschool = false;
            bool morning_workschool = false;
            bool any_workschool     = false;

            foreach (var person in household.Persons)
            {
                PersonWorkSchoolProjectStatus workschoolProjectStatus = SchedulerPerson.GetWorkSchoolProjectStatus(person);
                if (workschoolProjectStatus == PersonWorkSchoolProjectStatus.FullTimeEveningWorkOrSchool ||
                    workschoolProjectStatus == PersonWorkSchoolProjectStatus.FullTimeDayAndEveningWorkOrSchool ||
                    workschoolProjectStatus == PersonWorkSchoolProjectStatus.Other)
                {
                    evening_workschool = true;
                }
                if (workschoolProjectStatus == PersonWorkSchoolProjectStatus.FullTimeNoEveningWorkOrSchool ||
                    workschoolProjectStatus == PersonWorkSchoolProjectStatus.FullTimeDayAndEveningWorkOrSchool ||
                    workschoolProjectStatus == PersonWorkSchoolProjectStatus.PartTimeDay ||
                    workschoolProjectStatus == PersonWorkSchoolProjectStatus.PartTimeEvening)
                {
                    morning_workschool = true;
                }
                if (workschoolProjectStatus > 0)
                {
                    any_workschool = true;
                }
            }

            if (!any_workschool)
            {
                return(HouseholdWorkSchoolProjectStatus.NoWorkOrSchool);                  // noone in hhld works or attends school today
            }
            else if (!evening_workschool)
            {
                return(HouseholdWorkSchoolProjectStatus.NoEveningWorkOrSchool);                          //there is work/school, but none after 6:00pm
            }
            else if (!morning_workschool)
            {
                return(HouseholdWorkSchoolProjectStatus.EveningWorkOrSchool);                          //there is evening work/school, but no work/school before 1:00pm
            }
            else
            {
                return(HouseholdWorkSchoolProjectStatus.DayAndEveningWorkOrSchool); // there is work/school before 1pm and after 6pm
            }
        }
Esempio n. 3
0
        private void GraphTripPurpose(Distribution.DistributionInformation[] distributionData)
        {
            TashaHousehold Household   = new TashaHousehold();
            TashaPerson    person      = new TashaPerson();
            List <int>     primaryWork = new List <int>();

            person.Licence = false;
            person.Male    = GenderLocal;

            SchedulerHousehold.CreateHouseholdProjects(Household);
            SchedulerPerson.InitializePersonalProjects(person);
            SchedulerPerson.GenerateWorkSchoolSchedule(person, null);
            SchedulerTripChain.GetTripChain(person);
            var trip = SchedulerTrip.GetTrip(0);

            Occupation[] Occupations = { Occupation.Professional, Occupation.Manufacturing, Occupation.Retail, Occupation.Office, Occupation.Unknown, Occupation.NotEmployed };

            LoadDistributioNumbers(person, primaryWork, Occupations);

            float[] data = new float[this.StartTimeQuantums];
            foreach (int ID in primaryWork)
            {
                var table = distributionData[ID].StartTimeFrequency;
                for (int i = 0; i < this.StartTimeQuantums; i++)
                {
                    for (int j = 0; j < this.MaxFrequencyLocal; j++)
                    {
                        data[i] += table[i][j];
                    }
                }
            }

            // Make all data in terms of percentages of total.

            float sum = data.Sum();

            for (int number = 0; number < data.Length; number++)
            {
                data[number] = data[number] / sum * 100;
                Writer.WriteLine("{0}, {1}", (Time.FromMinutes((60 * 4) + number * (1440 / this.StartTimeQuantums))), data[number]);
            }

            GenerateChart(String.Format("OfficeDur.png"), data, "Time of Day", "Probability");
        }
Esempio n. 4
0
        private static bool GenerateJointOtherEpisodes(this ITashaHousehold household, Random random, GenerationAdjustment[] generationAdjustments)
        {
            var householdPD = household.HomeZone.PlanningDistrict;

            //make sure there at least 2 people and one adult
            if ((household.Persons.Length >= 2) & (household.NumberOfAdults > 0))
            {
                int freqJ            = TimeTable.GetFrequency(household, Activity.JointOther, random, householdPD, 0, generationAdjustments);
                int numEpisodeAdults = Distribution.GetNumAdultsJointEpisode(household, random,
                                                                             Activity.JointOther);

                for (int i = 0; i < freqJ; i++)
                {
                    bool success = false;
                    int  attempt = 0;
                    while (!success && attempt < Scheduler.EpisodeSchedulingAttempts)
                    {
                        if (!TimeTable.GetStartTime(household, Activity.JointOther, freqJ, random, out Time startTime))
                        {
                            attempt++;
                            continue;
                        }
                        if (!TimeTable.GetDuration(household, Activity.JointOther, startTime, random, out Time duration))
                        {
                            attempt++;
                            continue;
                        }

                        if (duration == Time.Zero || startTime == Time.Zero)
                        {
                            attempt++;
                        }
                        else
                        {
                            Time endTime = startTime + duration;
                            List <ITashaPerson> availableAdults = new List <ITashaPerson>();
                            foreach (ITashaPerson person in household.Persons)
                            {
                                Time workSchoolStartTime = SchedulerPerson.GetWorkSchoolStartTime(person);
                                Time workSchoolEndTime   = SchedulerPerson.GetWorkSchoolEndTime(person);
                                bool available           = false;
                                if (workSchoolStartTime > endTime ||
                                    workSchoolEndTime < startTime ||
                                    workSchoolStartTime == Time.Zero)
                                {
                                    available = true;
                                }
                                if (person.Age >= 16 && available)
                                {
                                    availableAdults.Add(person);
                                }
                            }

                            if (availableAdults.Count >= numEpisodeAdults && availableAdults.Count > 0)
                            {
                                Episode jointOtherEpisode;
                                var     owner = availableAdults[0];
                                jointOtherEpisode = new ActivityEpisode(new TimeWindow(startTime, endTime), Activity.JointOther, owner);

                                for (int j = 0; j < numEpisodeAdults; j++)
                                {
                                    jointOtherEpisode.AddPerson(availableAdults[j]);
                                }

                                Project  jointOtherProject  = household.GetJointOtherProject();
                                Schedule jointOtherSchedule = jointOtherProject.Schedule;
                                bool     inserted           = jointOtherSchedule.Insert(jointOtherEpisode, random);
                                success = true;

                                if (!inserted)
                                {
                                    success = false;
                                    attempt++;
                                }
                            }
                            else
                            {
                                attempt++;
                            }
                        }
                    }
                }
            }

            return(true);
        }
Esempio n. 5
0
        private static bool GenerateJointMarketEpisodes(this ITashaHousehold household, Random random, GenerationAdjustment[] generationAdjustment)
        {
            var householdPD = household.HomeZone.PlanningDistrict;
            // initialize available adults
            var availableAdults = new List <ITashaPerson>(household.Persons.Length);

            // We can only do this with households with more than one person
            if (household.Persons.Length >= 2 && household.NumberOfAdults > 0)
            {
                // Figure out how many times this home is going to go on a joint market trip
                int howManyTimes = TimeTable.GetFrequency(household, Activity.JointMarket, random, householdPD, 0, generationAdjustment);
                // Processes each of those trips
                for (int i = 0; i < howManyTimes; i++)
                {
                    int numEpisodeAdults = Distribution.GetNumAdultsJointEpisode(household, random,
                                                                                 Activity.JointMarket);
                    bool success = false;
                    // continue to try until either we get it to work or we fail to schedule this episode
                    for (int attempt = 0; !success && attempt < Scheduler.EpisodeSchedulingAttempts; attempt++)
                    {
                        if (!TimeTable.GetStartTime(household, Activity.JointMarket, random, out Time startTime))
                        {
                            continue;
                        }
                        if (!TimeTable.GetDuration(household, Activity.JointMarket, startTime, random, out Time duration))
                        {
                            continue;
                        }
                        // Now that we have our start time and duration, compute our end time
                        Time endTime = startTime + duration;
                        if (availableAdults.Count > 0)
                        {
                            availableAdults.Clear();
                        }
                        Time workSchoolStartTime, workSchoolEndTime;
                        bool available;
                        foreach (var person in household.Persons)
                        {
                            workSchoolStartTime = SchedulerPerson.GetWorkSchoolStartTime(person);
                            workSchoolEndTime   = SchedulerPerson.GetWorkSchoolEndTime(person);

                            // this person is available if
                            available = (workSchoolStartTime > endTime) | (workSchoolEndTime < startTime) | (workSchoolStartTime == Time.Zero);

                            if (person.Age >= 16 && available)
                            {
                                availableAdults.Add(person);
                            }
                        }

                        if ((availableAdults.Count > 0) & (availableAdults.Count >= numEpisodeAdults))
                        {
                            Episode jointMarketEpisode;
                            jointMarketEpisode = new ActivityEpisode(new TimeWindow(startTime, endTime), Activity.JointMarket,
                                                                     availableAdults[0]);

                            foreach (ITashaPerson adult in availableAdults)
                            {
                                jointMarketEpisode.AddPerson(adult);
                            }

                            Project  jointMarketProject  = household.GetJointMarketProject();
                            Schedule jointMarketSchedule = jointMarketProject.Schedule;
                            bool     insert = jointMarketSchedule.Insert(jointMarketEpisode, random);

                            success = insert;
                        }
                    }
                }
            }
            return(true);
        }
Esempio n. 6
0
        /// <summary>
        /// Returns the distribution ID that this person belongs to
        /// </summary>
        /// <param name="person"></param>
        /// <returns></returns>
        internal static int GetDistributionID(ITashaPerson person, Activity activity)
        {
            int baseOffset       = 0;
            int ageOffset        = 0;
            int occupationOffset = 0;
            int age = person.Age;

            switch (activity)
            {
            case Activity.School:
                baseOffset       = 84;
                ageOffset        = 0;
                occupationOffset = 0;
                //Now Calculate the occupation offset
                switch (person.StudentStatus)
                {
                case StudentStatus.FullTime:
                    occupationOffset = 0;
                    break;

                case StudentStatus.PartTime:
                    occupationOffset = 1;
                    break;

                default:
                    return(-1);
                }
                if (age < 11)
                {
                    return(-1);
                }
                //Calculate the ageOffset
                if (age <= 15)
                {
                    ageOffset = 0;
                }
                else if (age <= 18)
                {
                    ageOffset = 1;
                }
                else if (age <= 25)
                {
                    ageOffset = 2;
                }
                else if (age <= 30)
                {
                    ageOffset = 3;
                }
                else
                {
                    ageOffset = 4;
                }
                return(baseOffset + (ageOffset * 2) + occupationOffset);

            case Activity.WorkBasedBusiness:
                // We store the values from the person to improve performance
                baseOffset       = 40;
                ageOffset        = 0;
                occupationOffset = 0;
                Tasha.Common.Occupation occupation = person.Occupation;
                if (person.EmploymentStatus != TTSEmploymentStatus.FullTime &&
                    person.EmploymentStatus != TTSEmploymentStatus.PartTime)
                {
                    return(-1);
                }
                //Calculate the ageOffset
                if (age < 11)
                {
                    return(-1);
                }
                else if (age <= 18)
                {
                    ageOffset = 0;
                }
                else if (age <= 25)
                {
                    ageOffset = 1;
                }
                else if (age <= 64)
                {
                    ageOffset = 2;
                }
                else
                {
                    ageOffset = 3;
                }

                //Now Calculate the occupation offset
                if (occupation == Occupation.Office)
                {
                    occupationOffset = 0;
                }
                else if (occupation == Occupation.Manufacturing)
                {
                    occupationOffset = 1;
                }
                else if (occupation == Occupation.Professional)
                {
                    occupationOffset = 2;
                }
                else if (occupation == Occupation.Retail)
                {
                    occupationOffset = 3;
                }
                else
                {
                    return(-1);
                }

                return(baseOffset + (ageOffset * 8) + occupationOffset * 2
                       + (person.EmploymentStatus == TTSEmploymentStatus.FullTime ? 0 : 1));

            case Activity.PrimaryWork:
                // We store the values from the person to improve performance
                if (person.EmploymentZone == null)
                {
                    return(-1);
                }
                ageOffset        = 0;
                occupationOffset = 0;
                occupation       = person.Occupation;
                if (person.EmploymentStatus != TTSEmploymentStatus.FullTime &&
                    person.EmploymentStatus != TTSEmploymentStatus.PartTime)
                {
                    return(-1);
                }
                //Calculate the ageOffset
                if (age < 11)
                {
                    return(-1);
                }
                else if (age <= 18)
                {
                    ageOffset = 0;
                }
                else if (age <= 25)
                {
                    ageOffset = 1;
                }
                else if (age <= 64)
                {
                    ageOffset = 2;
                }
                else
                {
                    ageOffset = 3;
                }
                //Now Calculate the occupation offset
                if (occupation == Occupation.Office)
                {
                    occupationOffset = 0;
                }
                else if (occupation == Occupation.Manufacturing)
                {
                    occupationOffset = 1;
                }
                else if (occupation == Occupation.Professional)
                {
                    occupationOffset = 2;
                }
                else if (occupation == Occupation.Retail)
                {
                    occupationOffset = 3;
                }
                else
                {
                    return(-1);
                }

                return((ageOffset * 8) + occupationOffset * 2
                       + (person.EmploymentStatus == TTSEmploymentStatus.FullTime ? 0 : 1));

            case Activity.SecondaryWork:
                // We store the values from the person to improve performance
                baseOffset       = 32;
                occupationOffset = 0;
                occupation       = person.Occupation;
                if (person.EmploymentZone == null)
                {
                    return(-1);
                }
                if (person.EmploymentStatus != TTSEmploymentStatus.FullTime &&
                    person.EmploymentStatus != TTSEmploymentStatus.PartTime)
                {
                    return(-1);
                }
                if (person.Age < 11)
                {
                    return(-1);
                }
                //Now Calculate the occupation offset
                if (occupation == Occupation.Office)
                {
                    occupationOffset = 0;
                }
                else if (occupation == Occupation.Manufacturing)
                {
                    occupationOffset = 1;
                }
                else if (occupation == Occupation.Professional)
                {
                    occupationOffset = 2;
                }
                else if (occupation == Occupation.Retail)
                {
                    occupationOffset = 3;
                }
                else
                {
                    return(-1);
                }

                // Ok, here we do the math, there are 8 distros per age group [only 1 age group]
                // Each one is broken into 4 occupation types
                // Each of them are broken into first, full-time then part-time
                return
                    (baseOffset + occupationOffset * 2
                     + (person.EmploymentStatus == TTSEmploymentStatus.FullTime ? 0 : 1));

            case Activity.WorkAtHomeBusiness:
                // We store the values from the person to improve performance
                baseOffset       = 72;
                ageOffset        = 0;
                occupationOffset = 0;
                occupation       = person.Occupation;
                age = person.Age;
                if (person.EmploymentStatus != TTSEmploymentStatus.WorkAtHome_FullTime &&
                    person.EmploymentStatus != TTSEmploymentStatus.WorkAtHome_PartTime)
                {
                    return(-1);
                }
                //Calculate the ageOffset
                if (age < 19)
                {
                    return(-1);
                }
                else if (age <= 25)
                {
                    ageOffset = 0;
                }
                else if (age <= 64)
                {
                    ageOffset = 1;
                }
                else
                {
                    ageOffset = 2;
                }

                //Now Calculate the occupation offset
                if (occupation == Occupation.Office)
                {
                    occupationOffset = 0;
                }
                else if (occupation == Occupation.Manufacturing)
                {
                    occupationOffset = 1;
                }
                else if (occupation == Occupation.Professional)
                {
                    occupationOffset = 2;
                }
                else if (occupation == Occupation.Retail)
                {
                    occupationOffset = 3;
                }

                // Ok, here we do the math, there are 8 distros per age group
                // Each one is broken into 4 occupation types
                // Each of them are broken into first, full-time then part-time
                return(baseOffset + (ageOffset * 4) + occupationOffset);

            case Activity.ReturnFromWork:
                // We store the values from the person to improve performance
                baseOffset       = 94;
                occupationOffset = 0;
                occupation       = person.Occupation;
                if (person.EmploymentStatus != TTSEmploymentStatus.FullTime &&
                    person.EmploymentStatus != TTSEmploymentStatus.PartTime)
                {
                    return(-1);
                }
                //Now Calculate the occupation offset
                if (occupation == Occupation.Office)
                {
                    occupationOffset = 0;
                }
                else if (occupation == Occupation.Manufacturing)
                {
                    occupationOffset = 1;
                }
                else if (occupation == Occupation.Professional)
                {
                    occupationOffset = 2;
                }
                else if (occupation == Occupation.Retail)
                {
                    occupationOffset = 3;
                }

                // Ok, here we do the math, there are 8 distros per age group [only 1 age group]
                // Each one is broken into 4 occupation types
                // Each of them are broken into first, full-time then part-time
                return
                    (baseOffset + occupationOffset * 2 + (person.EmploymentStatus == TTSEmploymentStatus.FullTime ? 0 : 1));

            case Activity.IndividualOther:
                baseOffset       = 102;
                ageOffset        = 0;
                occupationOffset = 0;
                //||[0,6] ||==7
                PersonWorkSchoolProjectStatus workProjestStatus = SchedulerPerson.GetWorkSchoolProjectStatus(person);
                age = person.Age;

                //Calculate the ageOffset
                if (age < 11)
                {
                    return(-1);
                }
                else if (age < 16)
                {
                    ageOffset = 0;
                }
                else if (age < 25)
                {
                    ageOffset = 1;
                }
                else if (age < 65)
                {
                    ageOffset = 2;
                }
                else
                {
                    ageOffset = 3;
                }
                //
                return
                    (baseOffset + (ageOffset * 14) + (person.Female ? 7 : 0) + (int)workProjestStatus);

            case Activity.Market:
                baseOffset       = 182;
                ageOffset        = 0;
                occupationOffset = 0;
                //||[0,6] ||==7
                workProjestStatus = SchedulerPerson.GetWorkSchoolProjectStatus(person);
                age = person.Age;

                //Calculate the ageOffset
                if (age < 11)
                {
                    return(-1);
                }
                else if (age < 16)
                {
                    ageOffset = 0;
                }
                else if (age < 25)
                {
                    ageOffset = 1;
                }
                else if (age < 65)
                {
                    ageOffset = 2;
                }
                else
                {
                    ageOffset = 3;
                }
                // Ok, here we do the math, there are 8 distros per age group
                // Each one is broken into 4 occupation types
                // Each of them are broken into first, full-time then part-time
                return
                    (baseOffset + (ageOffset * 14) + (person.Female ? 7 : 0) + (int)workProjestStatus);

            default:
                return(-1);
            }
        }