code: package resa.evaluation.scheduler.plan;
  
  import org.junit.Before;
  import org.junit.Test;
  
  import java.io.IOException;
  import java.nio.file.Files;
  import java.nio.file.Paths;
  import java.util.Map;
  import java.util.TreeMap;
  import java.util.stream.IntStream;
  
  /**
   * Created by ding on 14-9-3.
   */
  public class MetricsGenerater {
  
      private int[] workloads;
      private int[] states = new int[]{8, 10, 12, 14, 16};
  
      @Before
      public void loadWorkloads() throws IOException {
          workloads = Files.readAllLines(Paths.get("/Volumes/Data/work/doctor/resa/exp/metrics-load.txt")).stream()
                  .map(String::trim).filter(s -> !s.isEmpty()).mapToInt(Integer::parseInt).toArray();
          System.out.println("min: " + IntStream.of(workloads).min().getAsInt());
          System.out.println("max: " + IntStream.of(workloads).max().getAsInt());
      }
  
      @Test
      public void generateMetrics() {
          Map<String, Integer> migrations = new TreeMap<>();
          for (int i = 1; i < workloads.length; i++) {
              int prev = findState(workloads[i - 1]);
              int curr = findState(workloads[i]);
              if (prev != curr) {
                  System.out.println(states[curr]);
                  migrations.compute(states[prev] + ":" + states[curr], (k, v) -> v == null ? 1 : v + 1);
              }
          }
          int totalCount = migrations.values().stream().mapToInt(i -> i).sum();
          migrations.forEach((k, v) -> System.out.println(k + ":" + ((double) v / totalCount)));
      }
  
      private int findState(int load) {
          if (load < 50000) {
              return 0;
          } else if (load < 60000) {
              return 1;
          } else if (load < 70000) {
              return 2;
          } else if (load < 80000) {
              return 3;
          }
          return 4;
      }
  
  }
  