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)); } }
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 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)); } }); }
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); }
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)); } }
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; }
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]); } } }