private void CreateHighPerformanceLookup(SparseArray <IZone> zoneArray)
 {
     if (HighPerformanceMap == null)
     {
         var pds       = ZoneSystemHelper.CreatePdArray <int>(zoneArray);
         var pdIndexes = pds.ValidIndexArray();
         HighPerformanceMap = new int[pdIndexes.Max() + 1][];
         Parallel.For(0, HighPerformanceMap.Length, i =>
         {
             var row = HighPerformanceMap[i] = new int[HighPerformanceMap.Length];
             for (int j = 0; j < row.Length; j++)
             {
                 int index = -1;
                 for (int k = 0; k < Segments.Length; k++)
                 {
                     if (Segments[k].OriginPDs.Contains(i) && Segments[k].DestinationPDs.Contains(j))
                     {
                         index = k;
                         break;
                     }
                 }
                 row[j] = index;
             }
         });
     }
 }
Exemplo n.º 2
0
        public void IterationStarting(int iteration)
        {
            var zoneSystem    = _zones = Root.ZoneSystem.ZoneArray;
            var pdMap         = _pds = ZoneSystemHelper.CreatePdArray <float>(zoneSystem);
            var numberOfPds   = pdMap.GetFlatData().Length;
            var numberOfZones = zoneSystem.GetFlatData().Length;

            // 4 employment statuses
            _zonalResidence        = new float[4][][];
            _zonalWorkerCategories = new float[4][][][][];
            _zonalEmployment       = new float[4][][];
            for (int emp = 0; emp < _zonalWorkerCategories.Length; emp++)
            {
                // 4 occupation categories
                _zonalResidence[emp]        = new float[4][];
                _zonalEmployment[emp]       = new float[4][];
                _zonalWorkerCategories[emp] = new float[4][][][];
                for (int occ = 0; occ < _zonalWorkerCategories[emp].Length; occ++)
                {
                    _zonalResidence[emp][occ]        = new float[numberOfZones];
                    _zonalEmployment[emp][occ]       = new float[numberOfZones];
                    _zonalWorkerCategories[emp][occ] = new float[numberOfZones][][];
                    for (int i = 0; i < _zonalWorkerCategories[emp][occ].Length; i++)
                    {
                        _zonalWorkerCategories[emp][occ][i] = new float[numberOfZones][];
                        for (int j = 0; j < _zonalWorkerCategories[emp][occ][i].Length; j++)
                        {
                            _zonalWorkerCategories[emp][occ][i][j] = new float[3];
                        }
                    }
                }
            }
        }
        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));
            }
        }
Exemplo n.º 4
0
        public void BuildMatrix()
        {
            //build the region constants
            var planningDistricts = ZoneSystemHelper.CreatePdArray <float>(Root.ZoneSystem.ZoneArray);
            var pdIndexes         = planningDistricts.ValidIndexArray();

            PlanningDistrictConstants = planningDistricts.CreateSquareTwinArray <float>();
            var data = PlanningDistrictConstants.GetFlatData();

            for (int i = 0; i < data.Length; i++)
            {
                for (int j = 0; j < data[i].Length; j++)
                {
                    data[i][j] = GetPDConstant(pdIndexes[i], pdIndexes[j]);
                }
            }
        }
Exemplo n.º 5
0
 public void Load()
 {
     _zoneSystem        = Root.ZoneSystem.ZoneArray;
     _planningDistricts = ZoneSystemHelper.CreatePdArray <float>(_zoneSystem);
     Zones = _zoneSystem.GetFlatData();
     if (SaveWorkerCategory != null)
     {
         WorkerResults = new float[3][];
         for (int i = 0; i < WorkerResults.Length; i++)
         {
             WorkerResults[i] = new float[Zones.Length];
         }
     }
     _linkages = Linkages.AcquireResource <SparseTriIndex <float> >();
     CopyLinkages(_linkages);
     SaveLinkagesToFile(_linkages.GetFlatData());
     Linkages.ReleaseResource();
 }
Exemplo n.º 6
0
        public void LoadData()
        {
            var zoneArray = Root.ZoneSystem.ZoneArray;
            var resources = ResourcesToAdd.Select(resource => resource.AcquireResource <SparseArray <float> >().GetFlatData()).Union(
                ResourcesToAddRaw.Select(source =>
            {
                source.LoadData();
                var ret = source.GiveData();
                source.UnloadData();
                return(ret.GetFlatData());
            })
                ).ToArray();
            SparseArray <float> data;

            data = SaveRatesBasedOnPD ? ZoneSystemHelper.CreatePdArray <float>(zoneArray) : zoneArray.CreateSimilarArray <float>();
            var flatData = data.GetFlatData();

            for (int j = 0; j < resources.Length; j++)
            {
                VectorHelper.Add(flatData, 0, flatData, 0, resources[j], 0, flatData.Length);
            }
            Data = data;
        }
        /// <summary>
        /// Gather the data for each PD from the database
        /// </summary>
        /// <param name="employmentStatusChar">The employment code we want to look at</param>
        /// <param name="command">The command / connection to use</param>
        /// <param name="zones">The zone system to extract PD's for</param>
        /// <returns>The occupation data stored per PD</returns>
        private SparseArray <float[]> Execute(char employmentStatusChar, IDbCommand command, SparseArray <IZone> zones)
        {
            var pds = ZoneSystemHelper.CreatePdArray <float[]>(zones);

            command.CommandText = @"
SELECT Persons.EmploymentStatus, PlanningDistrict.PD, Persons.Occupation, SUM(Persons.ExpansionFactor) AS ExpandedPersons
FROM (((Households INNER JOIN Persons ON Households.TTSYear = Persons.TTSYear AND Households.HouseholdId = Persons.HouseholdId)
	INNER JOIN HouseholdZones ON Households.TTSYear = HouseholdZones.TTSYear AND Households.HouseholdId = HouseholdZones.HouseholdId)
	INNER JOIN PlanningDistrict ON HouseholdZones.ZoneSystem = PlanningDistrict.ZoneSystem AND HouseholdZones.Zone = PlanningDistrict.Zone)
" + "WHERE Households.TTSYear = " + TTSYear + " AND HouseholdZones.ZoneSystem = " + ZoneSystemNumber + " AND (Persons.EmploymentStatus = '" + employmentStatusChar + "' )"
                                  + @" AND Persons.Occupation <> '9'
GROUP BY Persons.EmploymentStatus, PlanningDistrict.PD, Persons.Occupation
ORDER BY Persons.EmploymentStatus ASC, PlanningDistrict.PD ASC, Persons.Occupation ASC;
";
            using (var reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    var  pd     = reader.GetInt32(1);
                    var  occ    = reader.GetString(2);
                    bool exists = true;
                    var  data   = pds[pd];
                    if (data == null)
                    {
                        if (pds.ContainsIndex(pd))
                        {
                            exists = false;
                            data   = new float[4];
                        }
                        else
                        {
                            continue;
                        }
                    }
                    int index;
                    switch (occ)
                    {
                    case "P":
                        index = 0;
                        break;

                    case "G":
                        index = 1;
                        break;

                    case "S":
                        index = 2;
                        break;

                    case "M":
                        index = 3;
                        break;

                    default:
                        continue;
                    }
                    data[index] = (float)reader.GetDouble(3);
                    if (!exists)
                    {
                        pds[pd] = data;
                    }
                }
            }
            return(pds);
        }