/** Writes the example set into the given output stream. */
 public void writeSupportVectors(ObjectOutputStream out) throws IOException {
   out.writeInt(getNumberOfSupportVectors());
   out.writeDouble(b);
   out.writeInt(dim);
   if ((meanVarianceMap == null) || (meanVarianceMap.size() == 0)) {
     out.writeUTF("noscale");
   } else {
     out.writeUTF("scale");
     out.writeInt(meanVarianceMap.size());
     Iterator i = meanVarianceMap.keySet().iterator();
     while (i.hasNext()) {
       Integer index = (Integer) i.next();
       MeanVariance meanVariance = meanVarianceMap.get(index);
       out.writeInt(index.intValue());
       out.writeDouble(meanVariance.getMean());
       out.writeDouble(meanVariance.getVariance());
     }
   }
   for (int e = 0; e < train_size; e++) {
     if (alphas[e] != 0.0d) {
       out.writeInt(atts[e].length);
       for (int a = 0; a < atts[e].length; a++) {
         out.writeInt(index[e][a]);
         out.writeDouble(atts[e][a]);
       }
       out.writeDouble(alphas[e]);
       out.writeDouble(ys[e]);
     }
   }
 }
  /**
   * Creates a fresh example set of the given size from the RapidMiner example reader. The alpha
   * values and b are zero, the label will be set if it is known.
   */
  public SVMExamples(
      com.rapidminer.example.ExampleSet exampleSet,
      Attribute labelAttribute,
      Map<Integer, MeanVariance> meanVariances) {
    this(exampleSet.size(), 0.0d);
    this.meanVarianceMap = meanVariances;

    Iterator<com.rapidminer.example.Example> reader = exampleSet.iterator();
    Attribute idAttribute = exampleSet.getAttributes().getId();
    int exampleCounter = 0;
    while (reader.hasNext()) {
      com.rapidminer.example.Example current = reader.next();
      Map<Integer, Double> attributeMap = new LinkedHashMap<Integer, Double>();
      int a = 0;
      for (Attribute attribute : exampleSet.getAttributes()) {
        double value = current.getValue(attribute);
        if (!com.rapidminer.example.Tools.isDefault(attribute.getDefault(), value)) {
          attributeMap.put(a, value);
        }
        if ((a + 1) > dim) {
          dim = (a + 1);
        }
        a++;
      }
      atts[exampleCounter] = new double[attributeMap.size()];
      index[exampleCounter] = new int[attributeMap.size()];
      Iterator<Map.Entry<Integer, Double>> i = attributeMap.entrySet().iterator();
      int attributeCounter = 0;
      while (i.hasNext()) {
        Map.Entry<Integer, Double> e = i.next();
        Integer indexValue = e.getKey();
        Double attributeValue = e.getValue();
        index[exampleCounter][attributeCounter] = indexValue.intValue();
        double value = attributeValue.doubleValue();
        MeanVariance meanVariance = meanVarianceMap.get(indexValue);
        if (meanVariance != null) {
          if (meanVariance.getVariance() == 0.0d) {
            value = 0.0d;
          } else {
            value = (value - meanVariance.getMean()) / Math.sqrt(meanVariance.getVariance());
          }
        }
        atts[exampleCounter][attributeCounter] = value;
        attributeCounter++;
      }
      if (labelAttribute != null) {
        double label = current.getValue(labelAttribute);
        if (labelAttribute.isNominal()) {
          ys[exampleCounter] = (label == labelAttribute.getMapping().getPositiveIndex() ? 1 : -1);
        } else {
          ys[exampleCounter] = label;
        }
      }
      if (idAttribute != null) {
        ids[exampleCounter] = current.getValueAsString(idAttribute);
      }
      exampleCounter++;
    }
  }