public override void Generate(Datastructure.SparseArray<float> production, Datastructure.SparseArray<float> attractions) { var flatProduction = production.GetFlatData(); var flatAttraction = attractions.GetFlatData(); var numberOfIndexes = flatAttraction.Length; // Compute the Production and Attractions float totalProduction = 0; float totalAttraction = 0; totalProduction = ComputeProduction( flatProduction, numberOfIndexes ); totalAttraction = ComputeAttraction( flatAttraction, this.Root.ZoneSystem.ZoneArray.GetFlatData(), numberOfIndexes ); // Normalize the attractions float productionAttractionRatio; if ( totalAttraction != 0 ) { productionAttractionRatio = totalProduction / totalAttraction; // inverse totalAttraction to save on divisions } else { productionAttractionRatio = totalProduction / numberOfIndexes; } for ( int i = 0; i < numberOfIndexes; i++ ) { flatAttraction[i] = flatAttraction[i] * productionAttractionRatio; } }