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;
            }
        }