private Map<ActivityId, ActivityPartitionDetails> computePartitionCounts(ActivityCluster ac)
     throws HyracksException {
   PartitionConstraintSolver solver = scheduler.getSolver();
   Set<LValueConstraintExpression> lValues = new HashSet<LValueConstraintExpression>();
   for (ActivityId anId : ac.getActivityMap().keySet()) {
     lValues.add(new PartitionCountExpression(anId.getOperatorDescriptorId()));
   }
   solver.solve(lValues);
   Map<OperatorDescriptorId, Integer> nPartMap = new HashMap<OperatorDescriptorId, Integer>();
   for (LValueConstraintExpression lv : lValues) {
     Object value = solver.getValue(lv);
     if (value == null) {
       throw new HyracksException("No value found for " + lv);
     }
     if (!(value instanceof Number)) {
       throw new HyracksException(
           "Unexpected type of value bound to "
               + lv
               + ": "
               + value.getClass()
               + "("
               + value
               + ")");
     }
     int nParts = ((Number) value).intValue();
     if (nParts <= 0) {
       throw new HyracksException("Unsatisfiable number of partitions for " + lv + ": " + nParts);
     }
     nPartMap.put(
         ((PartitionCountExpression) lv).getOperatorDescriptorId(), Integer.valueOf(nParts));
   }
   Map<ActivityId, ActivityPartitionDetails> activityPartsMap =
       new HashMap<ActivityId, ActivityPartitionDetails>();
   for (ActivityId anId : ac.getActivityMap().keySet()) {
     int nParts = nPartMap.get(anId.getOperatorDescriptorId());
     int[] nInputPartitions = null;
     List<IConnectorDescriptor> inputs = ac.getActivityInputMap().get(anId);
     if (inputs != null) {
       nInputPartitions = new int[inputs.size()];
       for (int i = 0; i < nInputPartitions.length; ++i) {
         ConnectorDescriptorId cdId = inputs.get(i).getConnectorId();
         ActivityId aid = ac.getProducerActivity(cdId);
         Integer nPartInt = nPartMap.get(aid.getOperatorDescriptorId());
         nInputPartitions[i] = nPartInt;
       }
     }
     int[] nOutputPartitions = null;
     List<IConnectorDescriptor> outputs = ac.getActivityOutputMap().get(anId);
     if (outputs != null) {
       nOutputPartitions = new int[outputs.size()];
       for (int i = 0; i < nOutputPartitions.length; ++i) {
         ConnectorDescriptorId cdId = outputs.get(i).getConnectorId();
         ActivityId aid = ac.getConsumerActivity(cdId);
         Integer nPartInt = nPartMap.get(aid.getOperatorDescriptorId());
         nOutputPartitions[i] = nPartInt;
       }
     }
     ActivityPartitionDetails apd =
         new ActivityPartitionDetails(nParts, nInputPartitions, nOutputPartitions);
     activityPartsMap.put(anId, apd);
   }
   return activityPartsMap;
 }