Esempio n. 1
0
        public void LoadData()
        {
            var production = GetData(Production, UnloadProduction);
            var attraction = GetData(Attraction, UnloadAttraction);
            var friction   = GetData(Friction, UnloadFriction);

            ApplyBalance(ref production, ref attraction);
            var model = new GravityModel(friction, (p) => Progress = p, MaximumError, MaxIterations);

            Data = model.ProcessFlow(production, attraction, production.ValidIndexArray());
        }
Esempio n. 2
0
        public void TestSimpleGravityModelSolution()
        {
            var data = CreateData();
            var gm   = new GravityModel(data, null, 0.0f, 300);
            var o    = SparseArray <float> .CreateSparseArray(new[] { 1, 2 }, new float[] { 2, 2 });

            var d = SparseArray <float> .CreateSparseArray(new[] { 1, 2 }, new[] { 1.5f, 2.5f });

            var ret    = gm.ProcessFlow(o, d, new[] { 1, 2 });
            var result = ret.GetFlatData();

            Assert.AreEqual(0.5f, result[0][0], 0.0001f);
            Assert.AreEqual(1.5f, result[0][1], 0.0001f);
            Assert.AreEqual(1f, result[1][0], 0.0001f);
            Assert.AreEqual(1f, result[1][1], 0.0001f);
        }
Esempio n. 3
0
        private void InitializeFlows()
        {
            Progress = 0;
            // we are going to need to split based on this information
            ZoneArray = Root.ZoneSystem.ZoneArray;
            var validZones = ZoneArray.ValidIndexies().ToArray();
            //Generate the place of work place of residence OD's
            SparseArray <float> o = ZoneArray.CreateSimilarArray <float>();
            SparseArray <float> d = ZoneArray.CreateSimilarArray <float>();
            var numCat            = Categories.Count;

            // Start burning that CPU
            Thread.CurrentThread.Priority = ThreadPriority.Highest;
            SparseTwinIndex <float> workplaceDistribution     = null;
            SparseTwinIndex <float> prevWorkplaceDistribution = null;

            float[] friction;
            float[] nextFriction = null;
            for (int i = 0; i < numCat; i++)
            {
                CurrentOccupationIndex = i;
                Task assignToPopulation = null;
                if (i > 0)
                {
                    assignToPopulation = new Task(delegate
                    {
                        if (prevWorkplaceDistribution != null)
                        {
                            // We actually are assigning to the previous category with this data so we need i - 1
                            AssignToWorkers(prevWorkplaceDistribution, Categories[i - 1]);
                            prevWorkplaceDistribution = null;
                        }
                    });
                    assignToPopulation.Start();
                }
                Task computeNextFriction = null;
                if (i + 1 < numCat)
                {
                    computeNextFriction = new Task(delegate
                    {
                        nextFriction = ComputeFriction(ZoneArray.GetFlatData(), Categories[i + 1], nextFriction);
                    });
                    computeNextFriction.Start();
                }

                Categories[i].Generate(o, d);
                GravityModel gravityModel = new GravityModel(ImpedenceFunction, (progress => Progress = (progress / numCat) + ((float)i / numCat)), Epsilon, MaxIterations);
                workplaceDistribution = gravityModel.ProcessFlow(o, d, validZones);
                Progress = ((float)(i + 1) / numCat);
                if (assignToPopulation != null)
                {
                    assignToPopulation.Wait();
                    assignToPopulation.Dispose();
                }
                if (computeNextFriction != null)
                {
                    computeNextFriction.Wait();
                    computeNextFriction.Dispose();
                }
                prevWorkplaceDistribution = workplaceDistribution;
                friction     = nextFriction;
                nextFriction = friction;
            }
            nextFriction = null;
            prevWorkplaceDistribution = null;
            AssignToWorkers(workplaceDistribution, Categories[numCat - 1]);
            // ok now we can relax
            Thread.CurrentThread.Priority = ThreadPriority.Normal;
            GC.Collect();
        }
Esempio n. 4
0
        private void InitializeFlows()
        {
            this.Progress = 0;
            // we are going to need to split based on this information
            this.ZoneArray = this.Root.ZoneSystem.ZoneArray;
            var occupations   = this.Root.Demographics.OccupationCategories;
            var validZones    = this.ZoneArray.ValidIndexies().ToArray();
            var numberOfZones = validZones.Length;
            //[Occupation][O , D]
            var distribution = occupations.CreateSimilarArray <SparseTwinIndex <float> >();
            //Generate the place of work place of residence OD's
            SparseArray <float> O = this.ZoneArray.CreateSimilarArray <float>();
            SparseArray <float> D = this.ZoneArray.CreateSimilarArray <float>();
            var occupationIndexes = occupations.ValidIndexies().ToArray();
            var numCat            = Categories.Count;

            // Start burning that CPU
            Thread.CurrentThread.Priority = ThreadPriority.Highest;
            SparseTwinIndex <float> workplaceDistribution     = null;
            SparseTwinIndex <float> prevWorkplaceDistribution = null;

            float[] friction     = null;
            float[] nextFriction = null;
            MultiRunGPUGravityModel multiRunGPU = null;

            for (int i = 0; i < numCat; i++)
            {
                this.CurrentOccupationIndex = i;
                Task assignToPopulation = null;
                if (i > 0)
                {
                    assignToPopulation = new Task(delegate()
                    {
                        if (prevWorkplaceDistribution != null)
                        {
                            // We actually are assigning to the previous category with this data so we need i - 1
                            AssignToWorkers(prevWorkplaceDistribution, this.Categories[i - 1]);
                            prevWorkplaceDistribution = null;
                        }
                    });
                    assignToPopulation.Start();
                }
                Task computeNextFriction = null;
                if (i + 1 < numCat)
                {
                    computeNextFriction = new Task(delegate()
                    {
                        nextFriction = this.ComputeFriction(ZoneArray.GetFlatData(), this.Categories[i + 1], nextFriction);
                    });
                    computeNextFriction.Start();
                }

                this.Categories[i].Generate(O, D);
                if (this.UseGPU)
                {
                    if (i == 0)
                    {
                        try
                        {
                            Parallel.Invoke(() => friction    = this.ComputeFriction(ZoneArray.GetFlatData(), this.Categories[i], friction),
                                            () => multiRunGPU = new MultiRunGPUGravityModel(O.GetFlatData().Length, (progress => this.Progress = (progress / numCat) + ((float)i / numCat)), this.Epsilon, this.MaxIterations));
                        }
                        catch (AggregateException e)
                        {
                            throw new XTMFRuntimeException(e.InnerException.Message + "\r\n" + e.InnerException.StackTrace);
                        }
                    }
                    workplaceDistribution = multiRunGPU.ProcessFlow(friction, O, D);
                }
                else
                {
                    GravityModel gravityModel = new GravityModel(ImpedenceFunction, (progress => this.Progress = (progress / numCat) + ((float)i / numCat)), this.Epsilon, this.MaxIterations);
                    workplaceDistribution = gravityModel.ProcessFlow(O, D, validZones);
                }
                this.Progress = ((float)(i + 1) / numCat);
                if (assignToPopulation != null)
                {
                    try
                    {
                        assignToPopulation.Wait();
                        assignToPopulation.Dispose();
                        assignToPopulation = null;
                    }
                    catch (AggregateException e)
                    {
                        throw new XTMFRuntimeException(e.InnerException.Message + "\r\n" + e.InnerException.StackTrace);
                    }
                }
                if (computeNextFriction != null)
                {
                    try
                    {
                        computeNextFriction.Wait();
                        computeNextFriction.Dispose();
                        computeNextFriction = null;
                    }
                    catch (AggregateException e)
                    {
                        throw new XTMFRuntimeException(e.InnerException.Message + "\r\n" + e.InnerException.StackTrace);
                    }
                }
                prevWorkplaceDistribution = workplaceDistribution;
                var frictionTemp = friction;
                friction     = nextFriction;
                nextFriction = friction;
            }
            friction     = null;
            nextFriction = null;
            prevWorkplaceDistribution = null;
            if (multiRunGPU != null)
            {
                multiRunGPU.Dispose();
                multiRunGPU = null;
            }
            AssignToWorkers(workplaceDistribution, this.Categories[numCat - 1]);
            workplaceDistribution = null;
            // ok now we can relax
            Thread.CurrentThread.Priority = ThreadPriority.Normal;
            GC.Collect();
        }