docs: public List<DataPointPair<Double>> getAsDPPList()
      {
          ArrayList<DataPointPair<Double>> list = new ArrayList<>(size());
          for(int i = 0; i < size(); i++)
              list.add(new DataPointPair<>(getDataPoint(i).clone(), targets.get(i)));
          return list;
      }
      
      /**
       * Returns a new list containing the data points in this data set, paired with 
       * their regression target values. Modifications to the list will not effect 
       * the data set, but modifying the points will. For a copy of the points, use
       * the {@link #getAsDPPList() } method. 
       * 
       * @return a list of the data points in this set
       */
      public List<DataPointPair<Double>> getDPPList()
      {
          ArrayList<DataPointPair<Double>> list = new ArrayList<>(size());
          for(int i = 0; i < size(); i++)
              list.add(getDataPointPair(i));
          return list;
      }
      
      /**
       * Sets the target regression value associated with a given data point
       * @param i the index in the data set
       * @param val the new target value
       * @throws ArithmeticException if <tt>val</tt> is infinite or NaN
       */
      public void setTargetValue(int i, double val)
      {
          if(Double.isInfinite(val) || Double.isNaN(val))
              throw new ArithmeticException("Can not predict a " + val + " value");
          targets.set(i, val);
      }
  
      @Override
      protected RegressionDataSet getSubset(List<Integer> indicies)
      {
          RegressionDataSet newData = new RegressionDataSet(numNumerVals, categories);
          for (int i : indicies)
              newData.addDataPoint(getDataPoint(i), getTargetValue(i));
          return newData;
      }
      
      /**
       * Returns a vector containing the target regression values for each 
       * data point. The vector is a copy, and modifications to it will not
       * effect the data set. 
       * 
       * @return a vector containing the target values for each data point
       */
      public Vec getTargetValues()
      {
          DenseVector vals = new DenseVector(size());
          
          for(int i = 0; i < size(); i++)
              vals.set(i, targets.getD(i));
          
          return vals;
      }
      
      /**
       * Returns the target regression value for the <tt>i</tt>'th data point in the data set. 
       * 
       * @param i the data point to get the regression value of 
       * @return the target regression value
       */
      public double getTargetValue(int i)
      {
          return targets.getD(i);
      }
      
      /**
       * Creates a new data set that uses the given list as its backing list. 
       * No copying is done, and changes to this list will be reflected in 
       * this data set, and the other way. 
       * 
       * @param list the list of datapoint to back a new data set with
       * @return a new data set
       */
      public static RegressionDataSet usingDPPList(List<DataPointPair<Double>> list)
      {
          return new RegressionDataSet(list);
      }
  
      @Override
      public RegressionDataSet shallowClone()
      {
          RegressionDataSet clone = new RegressionDataSet(numNumerVals, categories);
          for(int i = 0; i < size(); i++)
              clone.addDataPointPair(getDataPointPair(i));
          return clone;
      }
  
      @Override
      public RegressionDataSet emptyClone()
      {
  	return new RegressionDataSet(numNumerVals, categories);
      }
  
      @Override
      public RegressionDataSet getTwiceShallowClone()
      {
          return (RegressionDataSet) super.getTwiceShallowClone(); //To change body of generated methods, choose Tools | Templates.
      }
  }