// This function applies a strategy when the stored needed tile number equals to the current value of it // where we would like to have tiles (multiple of server number) which are close to delta. // This strategy will be prosperous for the next phase where the obtained tiles are divided between servers. private void applyMinDiffSumStrategy(int[] indicesArray, ref Coords[] partition, ref int neededTileNumber, Coords[] firstPartPartition, Coords[] secondPartPartition, int currentTileNO) { if (currentTileNO < neededTileNumber) { neededTileNumber = currentTileNO; partition = new Coords[neededTileNumber]; firstPartPartition.CopyTo(partition, 0); secondPartPartition.CopyTo(partition, firstPartPartition.Length); partitionArray.SetValue(partition, indicesArray); // when the needed tile number is decreased we should set the current value // to current indices array if (neededTileNumber >= serverNO) { double currentDiffSum = determineCurrentDiffSum(neededTileNumber, firstPartPartition, secondPartPartition); diffSumArray.SetValue(currentDiffSum, indicesArray); } } else if ((currentTileNO == neededTileNumber) && (neededTileNumber >= serverNO)) { double currentDiffSum = determineCurrentDiffSum(neededTileNumber, firstPartPartition, secondPartPartition); double diffSum = (double)diffSumArray.GetValue(indicesArray); if (currentDiffSum < diffSum) { diffSumArray.SetValue(currentDiffSum, indicesArray); partition = new Coords[neededTileNumber]; firstPartPartition.CopyTo(partition, 0); secondPartPartition.CopyTo(partition, firstPartPartition.Length); partitionArray.SetValue(partition, indicesArray); } } }
private void applySideDifferenceStrategy(int[] indicesArray, ref Coords[] partition, ref int neededTileNumber, Coords[] firstPartPartition, Coords[] secondPartPartition, int currentTileNO, int[] firstPartIndicesArray, int[] secondPartIndicesArray, int splitDimIdx, int[] movingIndicesArray) { if (currentTileNO < neededTileNumber) { neededTileNumber = currentTileNO; partition = new Coords[neededTileNumber]; firstPartPartition.CopyTo(partition, 0); secondPartPartition.CopyTo(partition, firstPartPartition.Length); partitionArray.SetValue(partition, indicesArray); } else if (currentTileNO == neededTileNumber) { double currentDiff = determineCurrentDiffOfSides(splitDimIdx, indicesArray, movingIndicesArray); double maxDiff = (double)maxDiffArray.GetValue(indicesArray); if (maxDiff < currentDiff) { maxDiffArray.SetValue(currentDiff, indicesArray); partition = new Coords[neededTileNumber]; firstPartPartition.CopyTo(partition, 0); secondPartPartition.CopyTo(partition, firstPartPartition.Length); partitionArray.SetValue(partition, indicesArray); } } }