protected double cacluateGroupRSquare(
      DataSet dataSet,
      String tableName,
      String labelName,
      LinearRegressionModelDB model,
      String groupValue,
      StringBuilder sb_notNull)
      throws OperatorException {
    //		String notnull=sb_notNull.toString().substring(beginIndex, endIndex);
    //		notnull.replace("where", " and ");
    double RSquare = 0.0;
    StringBuffer RSquareSQL = new StringBuffer();
    StringBuffer avgSQL = new StringBuffer();
    avgSQL
        .append(" select avg(")
        .append(labelName)
        .append(")  from ")
        .append(tableName)
        .append(sb_notNull)
        .append(" and ")
        .append(StringHandler.doubleQ(groupbyColumn))
        .append("=")
        .append(StringHandler.singleQ(groupValue));
    double avg = 0.0;
    try {
      itsLogger.debug(classLogInfo + ".cacluateRSquare():sql=" + avgSQL);
      ResultSet rs = st.executeQuery(avgSQL.toString());
      if (rs.next()) {
        avg = rs.getDouble(1);
      }
    } catch (SQLException e) {
      itsLogger.error(e.getMessage(), e);
      return Double.NaN;
    }

    StringBuffer predictedValueSQL = new StringBuffer();
    predictedValueSQL.append(model.generatePredictedString(dataSet));
    RSquareSQL.append("select 1 - sum((")
        .append(predictedValueSQL)
        .append("-")
        .append(labelName)
        .append(")*(")
        .append(predictedValueSQL)
        .append("-")
        .append(labelName)
        .append("))*1.0/sum((")
        .append(labelName)
        .append("-(")
        .append(avg)
        .append("))*(")
        .append(labelName)
        .append("-(")
        .append(avg)
        .append("))) from ")
        .append(tableName)
        .append(sb_notNull)
        .append(" and ")
        .append(StringHandler.doubleQ(groupbyColumn))
        .append("=")
        .append(StringHandler.singleQ(groupValue));
    try {
      itsLogger.debug("LinearRegressionImpPGGP.cacluateRSquare():sql=" + RSquareSQL);
      ResultSet rs = st.executeQuery(RSquareSQL.toString());
      if (rs.next()) {
        RSquare = rs.getDouble(1);
      }
    } catch (SQLException e) {
      itsLogger.error(e.getMessage(), e);
      return Double.NaN;
    }
    return RSquare;
  }
  protected void getCoefficientAndR2Group(
      String columNames,
      DataSet dataSet,
      String labelName,
      String tableName,
      String newTableName,
      Columns atts,
      String[] columnNames,
      StringBuilder sb_notNull)
      throws OperatorException {
    Iterator<Column> atts_i;
    StringBuffer columnNamesArray = new StringBuffer();
    columnNamesArray.append("array[1.0,");

    atts_i = atts.iterator();
    int i = 0;
    while (atts_i.hasNext()) {
      Column att = atts_i.next();
      if (i != 0) {
        columnNamesArray.append(",");
      }
      columnNamesArray.append(StringHandler.doubleQ(att.getName())).append("::float");
      i++;
    }
    columnNamesArray.append("]");
    String sql = null;
    sql =
        "select alpine_miner_mregr_coef("
            + labelName
            + "::float,"
            + columnNamesArray
            + ") , "
            + StringHandler.doubleQ(groupbyColumn)
            + " from "
            + newTableName
            + sb_notNull
            + "     group by "
            + StringHandler.doubleQ(groupbyColumn);
    itsLogger.debug(classLogInfo + ".getCoefficientAndR2():sql=" + sql);
    HashMap<String, Matrix> XY = new HashMap<String, Matrix>();
    try {
      Object[] object = null;
      ResultSet rs = st.executeQuery(sql.toString());
      while (rs.next()) {
        Matrix tempXY = new Matrix(columnNames.length + 1, 1);

        Matrix tempHessian = new Matrix(columnNames.length + 1, columnNames.length + 1);
        String groupValue = rs.getString(2);
        object = (Object[]) rs.getArray(1).getArray();
        for (int x = 0; x < columnNames.length + 1; x++) {
          int y = x + 1;
          double doubleValue = 0.0;
          if (object[y] != null) {
            if (object[y] instanceof BigDecimal) {
              doubleValue = ((BigDecimal) object[y]).doubleValue();
            } else if (object[y] instanceof Double) {
              doubleValue = ((Double) object[y]).doubleValue();
            } else if (object[y] instanceof Integer) {
              doubleValue = ((Integer) object[y]).doubleValue();
            } else {
              doubleValue = ((Number) object[y]).doubleValue();
            }
          }
          tempXY.set(x, 0, doubleValue);
        }
        XY.put(groupValue, tempXY);
        double[] arrayarrayResult =
            getHessian(
                object,
                columnNames.length + 2,
                (columnNames.length + 1)
                    * (columnNames.length + 2)
                    / 2); // new double[sbAllArray.size()];
        i = 0;

        for (int x = 0; x < columnNames.length + 1; x++) {
          for (int y = x; y < columnNames.length + 1; y++) {
            {
              double h = 0.0;
              if (!Double.isNaN(arrayarrayResult[i])) {
                h = arrayarrayResult[i];
              }
              tempHessian.set(x, y, h);
              if (x != y) {
                tempHessian.set(y, x, h);
              }
              i++;
            }
          }
        }
        hessian.put(groupValue, tempHessian);
      }
    } catch (SQLException e) {
      itsLogger.error(e.getMessage(), e);
      throw new OperatorException(e.getLocalizedMessage());
    }
    boolean first = true;
    for (String tempString : hessian.keySet()) {
      Matrix beta = null;
      Matrix varianceCovarianceMatrix = null;
      Double[] tempCoefficients = new Double[columnNames.length + 1];
      for (i = 0; i < tempCoefficients.length; i++) {
        tempCoefficients[i] = 0.0;
      }

      try {
        varianceCovarianceMatrix = hessian.get(tempString).SVDInverse();
        beta = varianceCovarianceMatrix.times(XY.get(tempString));

        for (i = 0; i < beta.getRowDimension(); i++) {
          if (i == 0) {
            tempCoefficients[beta.getRowDimension() - 1] = beta.get(i, 0);
          } else {
            tempCoefficients[i - 1] = beta.get(i, 0);
          }
        }
        coefficients.put(tempString, tempCoefficients);

        double r2 = 0;
        getGroupCoefficientMap(columnNames, tempString);
        if (first == true) {
          model =
              new LinearRegressionGroupGPModel(
                  dataSet,
                  columnNames,
                  columNames,
                  tempCoefficients,
                  coefficientmap.get(tempString));
          first = false;
        }
        LinearRegressionModelDB tempModel =
            new LinearRegressionModelDB(
                dataSet, columnNames, columNames, tempCoefficients, coefficientmap.get(tempString));
        if (!this.newDataSet.equals(this.dataSet)) {
          tempModel.setAllTransformMap_valueKey(transformer.getAllTransformMap_valueKey());
        }
        tempModel.setInteractionColumnExpMap(transformer.getInteractionColumnExpMap());
        tempModel.setInteractionColumnColumnMap(transformer.getInteractionColumnColumnMap());
        r2 = cacluateGroupRSquare(dataSet, tableName, labelName, tempModel, tempString, sb_notNull);
        tempModel.setR2(r2);
        model.addOneModel(tempModel, tempString);
      } catch (Exception e) {
        itsLogger.error(e.getMessage(), e);
      }
    }
  }