private bool CheckForOverlap(ref string error, SparseArray <Range> sparseArray)
        {
            var flatData = sparseArray.GetFlatData();

            for (int i = 0; i < flatData.Length; i++)
            {
                for (int j = i + 1; j < flatData.Length; j++)
                {
                    if (flatData[i].Start < flatData[j].Start)
                    {
                        if (flatData[i].Stop >= flatData[j].Start)
                        {
                            error = "In '" + Name + "' there is an overlap in age category '" + sparseArray.GetSparseIndex(i)
                                    + "' and '" + sparseArray.GetSparseIndex(j);
                            return(true);
                        }
                    }
                    else
                    {
                        if (flatData[j].Stop >= flatData[i].Start)
                        {
                            error = "In '" + Name + "' there is an overlap in age category '" + sparseArray.GetSparseIndex(i)
                                    + "' and '" + sparseArray.GetSparseIndex(j);
                            return(true);
                        }
                    }
                }
            }
            return(false);
        }
        public void IterationFinished(int iteration)
        {
            var flatPD    = _householdsByPD.GetFlatData();
            var zoneArray = Root.ZoneSystem.ZoneArray;
            var zones     = zoneArray.GetFlatData();

            List <KeyValuePair <int, int> >[] results = new List <KeyValuePair <int, int> > [flatPD.Length];
            Parallel.For(0, flatPD.Length, i =>
            {
                var pd          = _householdsByPD.GetSparseIndex(i);
                var zoneIndexes = (from zone in zones
                                   where zone.PlanningDistrict == pd
                                   select zoneArray.GetFlatIndex(zone.ZoneNumber)).ToArray();
                // make sure we don't generate persons for the external zones
                results[i] = _householdsByPD.GetSparseIndex(i) == 0 ? new List <KeyValuePair <int, int> >() : flatPD[i].ProcessPD(RandomSeed, zones, HouseholdExpansionFactor, zoneIndexes);
            });
            Save(results, flatPD);
        }
 private void Pass2(IZone[] zones, int[] zonalDifferences, List <KeyValuePair <int, int> >[] results, List <ITashaHousehold>[] remainingHouseholds, List <int>[] lookupsForRegion)
 {
     foreach (var regionRemaining in lookupsForRegion)
     {
         Console.WriteLine(regionRemaining.Count);
     }
     Console.WriteLine("Starting Pass 2");
     //Step 2 do intra-regional redistribution
     Parallel.For(0, remainingHouseholds.Length, (int regionIndex) =>
     {
         if (regionIndex != 0)
         {
             var regionNumber     = HouseholdsByRegion.GetSparseIndex(regionIndex);
             int remainingIndex   = 0;
             var remainingList    = remainingHouseholds[regionIndex];
             var resultsForRegion = results[regionIndex];
             if (remainingList.Count <= 0)
             {
                 return;
             }
             var lookup         = lookupsForRegion[regionIndex];
             var zonesToProcess = zones.Where(z => z.RegionNumber == regionNumber).ToArray();
             // for each zone in the set of zones that belong to the region
             for (int zone = 0; zone < zonesToProcess.Length; zone++)
             {
                 var zoneIndex = Array.IndexOf(zones, zonesToProcess[zone]);
                 for (int pop = 0; pop < zonalDifferences[zoneIndex];)
                 {
                     var hhld   = remainingList[remainingIndex];
                     var newPop = hhld.Persons.Length + pop;
                     if (newPop <= zonalDifferences[zoneIndex])
                     {
                         pop = newPop;
                         resultsForRegion.Add(new KeyValuePair <int, int>(zoneIndex, lookup[remainingIndex]));
                     }
                     if (++remainingIndex >= remainingList.Count)
                     {
                         remainingIndex = 0;
                     }
                 }
             }
         }
     });
 }
        public void IterationStarting(int iteration)
        {
            // initialize data structures
            _householdsByPD = ZoneSystemHelper.CreatePdArray <PDData>(Root.ZoneSystem.ZoneArray);
            var flat = _householdsByPD.GetFlatData();

            for (int i = 0; i < flat.Length; i++)
            {
                flat[i] = new PDData(_householdsByPD.GetSparseIndex(i));
            }
        }
Example #5
0
        private void FillRatioIntraZonalTravelTime(int districtNumber, IZone[] flatZones, SparseTwinIndex <float> matrix, SparseArray <float> radius)
        {
            var validDistricts = radius.ValidIndexArray();
            var flatRadius     = radius.GetFlatData();

            for (int otherDistrict = 0; otherDistrict < validDistricts.Length; otherDistrict++)
            {
                var sparseOther = radius.GetSparseIndex(otherDistrict);
                if (sparseOther == districtNumber)
                {
                    continue;
                }
                if (this.AnyTripIntraDistrict(otherDistrict, flatZones, matrix))
                {
                    var distanceRatio        = radius[districtNumber] / flatRadius[otherDistrict];
                    var data                 = matrix.GetFlatData();
                    var averageTT            = GetAverageIntraDistrictNonIntraZonalTravelTime(sparseOther, flatZones, data);
                    var averageIntraZonealTT = GetAverageIntraZonalTravelTime(sparseOther, flatZones, data);
                    var zoneRatio            = GetNumberOfZonesRatio(flatZones, districtNumber, sparseOther);
                    averageTT            *= distanceRatio * zoneRatio;
                    averageIntraZonealTT *= distanceRatio * zoneRatio;
                    for (int i = 0; i < flatZones.Length; i++)
                    {
                        if (flatZones[i].PlanningDistrict != districtNumber)
                        {
                            continue;
                        }
                        for (int j = 0; j < flatZones.Length; j++)
                        {
                            if (flatZones[j].PlanningDistrict != districtNumber)
                            {
                                continue;
                            }
                            if (i == j)
                            {
                                data[i][j] = averageIntraZonealTT;
                            }
                            else
                            {
                                data[i][j] = averageTT;
                            }
                        }
                    }
                    break;
                }
            }
        }
Example #6
0
        private void InitializeFriction(int length)
        {
            Friction = Productions.CreateSquareTwinArray <float>();
            var flatFriction = Friction.GetFlatData();

            Parallel.For(0, length, new ParallelOptions()
            {
                MaxDegreeOfParallelism = Environment.ProcessorCount
            },
                         delegate(int i)
            {
                for (int j = 0; j < length; j++)
                {
                    flatFriction[i][j] = (float)FrictionFunction(Productions.GetSparseIndex(i), Attractions.GetSparseIndex(j));
                }
            });
        }
Example #7
0
 protected bool TryGetAgeCat(int age, out int ageCat)
 {
     if (AgeCategories == null)
     {
         var temp = Root.Demographics.AgeCategories;
         FlatAges      = temp.GetFlatData();
         AgeCategories = temp;
     }
     for (int i = 0; i < FlatAges.Length; i++)
     {
         if (FlatAges[i].ContainsInclusive(age))
         {
             ageCat = AgeCategories.GetSparseIndex(i);
             return(true);
         }
     }
     ageCat = -1;
     return(false);
 }
Example #8
0
        private void WriteAttractionFile(SparseArray <float> productions, SparseArray <float> attractions)
        {
            if (!this.AttractionFileName.ContainsFileName())
            {
                return;
            }
            var           flatAttractions = attractions.GetFlatData();
            var           flatProduction  = productions.GetFlatData();
            bool          first           = !File.Exists(this.AttractionFileName.GetFileName());
            StringBuilder buildInside     = new StringBuilder();

            buildInside.Append(',');
            buildInside.Append(this.AgeCategoryRange.ToString());
            buildInside.Append(',');
            buildInside.Append(this.EmploymentStatusCategory.ToString());
            buildInside.Append(',');
            buildInside.Append(this.OccupationCategory.ToString());
            buildInside.Append(',');
            string categoryData = buildInside.ToString();

            using (StreamWriter writer = new StreamWriter(this.AttractionFileName.GetFileName(), true))
            {
                if (first)
                {
                    // if we are the first thing to generate, then write the header as well
                    writer.WriteLine("Zone,Age,Employment,Occupation,Production,Attraction");
                }
                for (int i = 0; i < flatAttractions.Length; i++)
                {
                    writer.Write(attractions.GetSparseIndex(i));
                    writer.Write(categoryData);
                    writer.Write(flatProduction[i]);
                    writer.Write(',');
                    writer.WriteLine(flatAttractions[i]);
                }
            }
        }
 public void IterationStarting(int iteration)
 {
     // initialize data structures
     HouseholdsByPD = ZoneSystemHelper.CreatePDArray<PDData>(Root.ZoneSystem.ZoneArray);
     var flat = HouseholdsByPD.GetFlatData();
     for(int i = 0; i < flat.Length; i++)
     {
         flat[i] = new PDData(HouseholdsByPD.GetSparseIndex(i));
     }
 }
Example #10
0
 private void FillRatioIntraZonalTravelTime(int districtNumber, IZone[] flatZones, SparseTwinIndex<float> matrix, SparseArray<float> radius)
 {
     var validDistricts = radius.ValidIndexArray();
     var flatRadius = radius.GetFlatData();
     for ( int otherDistrict = 0; otherDistrict < validDistricts.Length; otherDistrict++ )
     {
         var sparseOther = radius.GetSparseIndex( otherDistrict );
         if ( sparseOther == districtNumber ) continue;
         if ( this.AnyTripIntraDistrict( otherDistrict, flatZones, matrix ) )
         {
             var distanceRatio = radius[districtNumber] / flatRadius[otherDistrict];
             var data = matrix.GetFlatData();
             var averageTT = GetAverageIntraDistrictNonIntraZonalTravelTime( sparseOther, flatZones, data );
             var averageIntraZonealTT = GetAverageIntraZonalTravelTime( sparseOther, flatZones, data );
             var zoneRatio = GetNumberOfZonesRatio( flatZones, districtNumber, sparseOther );
             averageTT *= distanceRatio * zoneRatio;
             averageIntraZonealTT *= distanceRatio * zoneRatio;
             for ( int i = 0; i < flatZones.Length; i++ )
             {
                 if ( flatZones[i].PlanningDistrict != districtNumber ) continue;
                 for ( int j = 0; j < flatZones.Length; j++ )
                 {
                     if ( flatZones[j].PlanningDistrict != districtNumber ) continue;
                     if ( i == j )
                     {
                         data[i][j] = averageIntraZonealTT;
                     }
                     else
                     {
                         data[i][j] = averageTT;
                     }
                 }
             }
             break;
         }
     }
 }
 private bool CheckForOverlap(ref string error, SparseArray<Range> sparseArray)
 {
     var flatData = sparseArray.GetFlatData();
     for ( int i = 0; i < flatData.Length; i++ )
     {
         for ( int j = i + 1; j < flatData.Length; j++ )
         {
             if ( flatData[i].Start < flatData[j].Start )
             {
                 if ( flatData[i].Stop >= flatData[j].Start )
                 {
                     error = "In '" + this.Name + "' there is an overlap in age category '" + sparseArray.GetSparseIndex( i )
                         + "' and '" + sparseArray.GetSparseIndex( j );
                     return true;
                 }
             }
             else
             {
                 if ( flatData[j].Stop >= flatData[i].Start )
                 {
                     error = "In '" + this.Name + "' there is an overlap in age category '" + sparseArray.GetSparseIndex( i )
                         + "' and '" + sparseArray.GetSparseIndex( j );
                     return true;
                 }
             }
         }
     }
     return false;
 }
Example #12
0
 private void WriteAttractionFile(SparseArray<float> attractions)
 {
     if(!AttractionFileName.ContainsFileName())
     {
         return;
     }
     var flatAttractions = attractions.GetFlatData();
     bool first = !File.Exists(AttractionFileName.GetFileName());
     StringBuilder buildInside = new StringBuilder();
     buildInside.Append(',');
     buildInside.Append(AgeCategoryRange.ToString());
     buildInside.Append(',');
     buildInside.Append(EmploymentStatusCategory.ToString());
     buildInside.Append(',');
     buildInside.Append(OccupationCategory.ToString());
     buildInside.Append(',');
     buildInside.Append(Mobility.ToString());
     buildInside.Append(',');
     string categoryData = buildInside.ToString();
     using (StreamWriter writer = new StreamWriter(AttractionFileName.GetFileName(), true))
     {
         if(first)
         {
             // if we are the first thing to generate, then write the header as well
             writer.WriteLine("Zone,Age,Employment,Occupation,Mobility,Attraction");
         }
         for(int i = 0; i < flatAttractions.Length; i++)
         {
             writer.Write(attractions.GetSparseIndex(i));
             writer.Write(categoryData);
             writer.WriteLine(flatAttractions[i]);
         }
     }
 }