private IEnumerable<SparseTwinIndex<float>> GPUDoublyConstrained(IZone[] zones, IEnumerator<SparseArray<float>> ep, IEnumerator<SparseArray<float>> ea, IEnumerator<IDemographicCategory> ec) { using ( MultiRunGPUGravityModel gm = new MultiRunGPUGravityModel( zones.Length, ( p => this.Progress = p ), this.Epsilon, this.MaxIterations ) ) { float[] friction = null; while ( ep.MoveNext() && ea.MoveNext() && ec.MoveNext() ) { var production = ep.Current; var attraction = ea.Current; var cat = ec.Current; var ret = production.CreateSquareTwinArray<float>(); friction = this.ComputeFriction( zones, cat, production.GetFlatData(), attraction.GetFlatData(), friction ); yield return gm.ProcessFlow( friction, production, attraction ); } } }
public IEnumerable<SparseTwinIndex<float>> Distribute(IEnumerable<SparseArray<float>> productions, IEnumerable<SparseArray<float>> attractions, IEnumerable<IDemographicCategory> cat) { var productionEnum = productions.GetEnumerator(); var attractionEnum = attractions.GetEnumerator(); var catEnum = cat.GetEnumerator(); var numberOfZones = this.Root.ZoneSystem.ZoneArray.GetFlatData().Length; using ( MultiRunGPUGravityModel multiDist = new MultiRunGPUGravityModel( numberOfZones, ( (p) => this.Progress = p ), this.Epsilon, this.MaxIterations ) ) { var zoneArray = this.Root.ZoneSystem.ZoneArray; float[] friction = null; while ( productionEnum.MoveNext() && attractionEnum.MoveNext() && catEnum.MoveNext() ) { yield return multiDist.ProcessFlow( ( friction = this.ComputeFriction( zoneArray.GetFlatData(), catEnum.Current, friction ) ), productionEnum.Current, attractionEnum.Current ); } friction = null; } }