Package org.openpixi.pixi.distributed.partitioning

Source Code of org.openpixi.pixi.distributed.partitioning.SimplePartitionerTest

package org.openpixi.pixi.distributed.partitioning;

import junit.framework.TestCase;
import org.junit.Assert;
import org.openpixi.pixi.distributed.partitioning.SimplePartitioner;
import org.openpixi.pixi.physics.util.IntBox;

/**
* General test for partitioning the simulation area in distributed simulation.
* Can be applied to check any partitioning.
* The test checks:
* - correct number of partitions
* - unique partitions (no two partitions with the same xmin, xmax, ymin, ymax)
* - complete partitions
*   1) largest xmax - smallest xmin = numCellsX; similarly for y
*   2) they do not interleave
* - no malformed partitions (xmax > xmin, ymax > ymin)
*/
public class SimplePartitionerTest extends TestCase {

  private static final int NUM_CELLS_X = 64;
  private static final int NUM_CELLS_Y = 32;
  private static final int NUM_PARTITIONS = 16;


  public void testPartition() throws Exception {
    SimplePartitioner partitioner = new SimplePartitioner();
    IntBox[] partitions = partitioner.partition(NUM_CELLS_X, NUM_CELLS_Y, NUM_PARTITIONS);

    Assert.assertEquals(NUM_PARTITIONS, partitions.length);

    int largestXmax = Integer.MIN_VALUE;
    int smallestXmin = Integer.MAX_VALUE;
    int largestYmax = Integer.MIN_VALUE;
    int smallestYmin = Integer.MAX_VALUE;

    for (int i = 0; i < partitions.length; ++i) {
      IntBox b = partitions[i];

      if (isMalformed(b)) {
        Assert.fail("Malformed partition! " + b);
      }

      if (b.xmax() > largestXmax) {
        largestXmax = b.xmax();
      }
      if (b.ymax() > largestYmax) {
        largestYmax = b.ymax();
      }
      if (b.xmin() < smallestXmin) {
        smallestXmin = b.xmin();
      }
      if (b.ymin() < smallestYmin) {
        smallestYmin = b.ymin();
      }

      for (int j = i + 1; j < partitions.length; ++j) {
        IntBox b2 = partitions[j];
        if (areEqual(b, b2)) {
          Assert.fail("Equal partitions: " + b + " " + b2);
        }
        if (interleave(b, b2)) {
          Assert.fail("Interleaving partitions: " + b + " " + b2);
        }
      }
    }

    int xsize = largestXmax - smallestXmin + 1;
    int ysize = largestYmax - smallestYmin + 1;
    if (xsize < NUM_CELLS_X || ysize < NUM_CELLS_Y) {
      Assert.fail("The created partitions do not fill the original area!");
    }
    else if (xsize > NUM_CELLS_X || ysize > NUM_CELLS_Y) {
      Assert.fail("The created partitions cross the original area!");
    }
  }


  private boolean areEqual(IntBox b1, IntBox b2) {
    if (
        b1.xmin() == b2.xmin() &&
        b1.xmax() == b2.xmax() &&
        b1.ymin() == b2.ymin() &&
        b1.ymax() == b2.ymax()) {
      return true;
    }
    else {
      return false;
    }
  }


  private boolean interleave(IntBox b1, IntBox b2) {
    if (
        b1.xmin() <= b2.xmax() &&
        b2.xmin() <= b1.xmax() &&
        b1.ymin() <= b2.ymax() &&
        b2.ymin() <= b1.ymax()) {
      return true;
    }
    else {
      return false;
    }
  }


  private boolean isMalformed(IntBox b) {
    if (b.xmin() < b.xmax() && b.ymin() < b.ymax()) {
      return false;
    }
    else {
      return  true;
    }
  }
}
TOP

Related Classes of org.openpixi.pixi.distributed.partitioning.SimplePartitionerTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.