Esempio n. 1
0
 private IEnumerable <SparseTwinIndex <float> > SolveSinglyConstrained(IZone[] zones, IEnumerator <SparseArray <float> > ep, IEnumerator <SparseArray <float> > ea, IEnumerator <IDemographicCategory> ec)
 {
     float[] friction = null;
     while (ep.MoveNext() && ea.MoveNext() && ec.MoveNext())
     {
         var production = ep.Current;
         var cat        = ec.Current;
         friction = ComputeFriction(zones, cat, production.GetFlatData(), null, friction);
         yield return(SinglyConstrainedGravityModel.Process(production, friction));
     }
 }
Esempio n. 2
0
        public IEnumerable <SparseTwinIndex <float> > Distribute(IEnumerable <SparseArray <float> > productions, IEnumerable <SparseArray <float> > attractions, IEnumerable <IDemographicCategory> category)
        {
            var ep    = productions.GetEnumerator();
            var ec    = category.GetEnumerator();
            var zones = this.Root.ZoneSystem.ZoneArray.GetFlatData();

            float[] friction = null;
            while (ep.MoveNext() && ec.MoveNext())
            {
                friction = this.ComputeFriction(zones, ec.Current, friction);
                yield return(SinglyConstrainedGravityModel.Process(ep.Current, friction));
            }
        }
Esempio n. 3
0
        public IEnumerable <SparseTwinIndex <float> > Distribute(IEnumerable <SparseArray <float> > eps, IEnumerable <SparseArray <float> > eas, IEnumerable <IDemographicCategory> ecs)
        {
            float[] friction    = null;
            var     zones       = Root.ZoneSystem.ZoneArray.GetFlatData();
            var     productions = new List <SparseArray <float> >();
            var     cats        = new List <IDemographicCategory>();

            using (var ep = eps.GetEnumerator())
                using (var ec = ecs.GetEnumerator())
                {
                    while (ep.MoveNext() && ec.MoveNext())
                    {
                        productions.Add(ep.Current);
                        cats.Add(ec.Current);
                    }
                }
            SparseArray <float> production = Root.ZoneSystem.ZoneArray.CreateSimilarArray <float>();

            TotalBlendSets = 0;
            for (int i = 0; i < BlendSets.Count; i++)
            {
                TotalBlendSets += BlendSets[i].Subsets.Count;
            }
            foreach (var multiset in BlendSets)
            {
                var setLength     = multiset.Subsets.Count;
                var productionSet = new float[setLength][][];
                var catSet        = new IDemographicCategory[setLength][];
                SetupFrictionData(productions, cats, multiset, productionSet, catSet);
                for (int subIndex = 0; subIndex < multiset.Subsets.Count; subIndex++)
                {
                    friction = ComputeFriction(zones, catSet, productionSet, friction, production.GetFlatData(), subIndex);
                    var ret = SinglyConstrainedGravityModel.Process(production, friction);
                    if (Transpose)
                    {
                        TransposeMatrix(ret);
                    }
                    yield return(ret);
                }
            }
        }