@Override
 public int compare(Schedulable s1, Schedulable s2) {
   double minShareRatio1, minShareRatio2;
   double useToWeightRatio1, useToWeightRatio2;
   Resource minShare1 =
       Resources.min(RESOURCE_CALCULATOR, null, s1.getMinShare(), s1.getDemand());
   Resource minShare2 =
       Resources.min(RESOURCE_CALCULATOR, null, s2.getMinShare(), s2.getDemand());
   boolean s1Needy =
       Resources.lessThan(RESOURCE_CALCULATOR, null, s1.getResourceUsage(), minShare1);
   boolean s2Needy =
       Resources.lessThan(RESOURCE_CALCULATOR, null, s2.getResourceUsage(), minShare2);
   Resource one = Resources.createResource(1);
   minShareRatio1 =
       (double) s1.getResourceUsage().getMemory()
           / Resources.max(RESOURCE_CALCULATOR, null, minShare1, one).getMemory();
   minShareRatio2 =
       (double) s2.getResourceUsage().getMemory()
           / Resources.max(RESOURCE_CALCULATOR, null, minShare2, one).getMemory();
   useToWeightRatio1 =
       s1.getResourceUsage().getMemory() / s1.getWeights().getWeight(ResourceType.MEMORY);
   useToWeightRatio2 =
       s2.getResourceUsage().getMemory() / s2.getWeights().getWeight(ResourceType.MEMORY);
   int res = 0;
   if (s1Needy && !s2Needy) res = -1;
   else if (s2Needy && !s1Needy) res = 1;
   else if (s1Needy && s2Needy) res = (int) Math.signum(minShareRatio1 - minShareRatio2);
   else
     // Neither schedulable is needy
     res = (int) Math.signum(useToWeightRatio1 - useToWeightRatio2);
   if (res == 0) {
     // Apps are tied in fairness ratio. Break the tie by submit time and job
     // name to get a deterministic ordering, which is useful for unit tests.
     res = (int) Math.signum(s1.getStartTime() - s2.getStartTime());
     if (res == 0) res = s1.getName().compareTo(s2.getName());
   }
   return res;
 }