/*
   * for both
   */
  public static double calc_info_attr(CondClassDistribution instances_by_attr) {
    // Collection<Object> attributeValues = instances_by_attr.getAttributes();
    double data_size = instances_by_attr.getTotal();
    double sum = 0.0;
    if (data_size > 0)
      for (int attr_idx = 0; attr_idx < instances_by_attr.getNumCondClasses(); attr_idx++) {
        Object attr_category = instances_by_attr.getCondClass(attr_idx);
        double total_num_attr = instances_by_attr.getTotal_AttrCategory(attr_category);

        if (total_num_attr > 0) {
          double prob = total_num_attr / data_size;
          // flog.debug("{("+total_num_attr +"/"+data_size +":"+prob +")* [");
          double info = calc_info(instances_by_attr.getDistributionOf(attr_category));

          sum += prob * info;
          // flog.debug("]} ");
        }
      }
    // flog.debug("\n == "+sum);
    return sum;
  }