/** Creates a new holder for sliding-window instances. */
 public CompactCandidateSegmentGroup(FeatureFactory factory, CandidateSegmentGroup group) {
   // The length of the original sequence
   this.sequenceLength = group.getSequenceLength();
   // The maximum length of any sliding window
   this.maxWindowSize = group.getMaxWindowSize();
   this.totalSize = group.size();
   this.classNameSet = group.classNameSet();
   this.subPopId = group.getSubpopulationId();
   unitInstance = new Instance[sequenceLength];
   delta = new Delta[sequenceLength][maxWindowSize];
   label = new ClassLabel[sequenceLength][maxWindowSize];
   segmentSource = new Object[sequenceLength][maxWindowSize];
   for (int i = 0; i < sequenceLength; i++) {
     unitInstance[i] = factory.compress(group.getSubsequenceInstance(i, i + 1));
   }
   for (int i = 0; i < sequenceLength; i++) {
     for (int j = i + 1; j - i <= maxWindowSize; j++) {
       if (group.getSubsequenceInstance(i, j) != null) {
         label[i][j - i - 1] = group.getSubsequenceLabel(i, j);
         segmentSource[i][j - i - 1] = group.getSubsequenceInstance(i, j).getSource();
         delta[i][j - i - 1] = new Delta(factory, i, j, group.getSubsequenceInstance(i, j));
       }
     }
   }
 }
 /**
  * Collect the correct segments for this example. These are defined as all segments with
  * non-NEGATIVE labels, and all unit-length negative labels not inside a positives label.
  */
 private Segmentation correctSegments(
     CandidateSegmentGroup g, ExampleSchema schema, int maxSegmentSize) {
   Segmentation result = new Segmentation(schema);
   int pos, len;
   for (pos = 0; pos < g.getSequenceLength(); ) {
     boolean addedASegmentStartingAtPos = false;
     for (len = 1; !addedASegmentStartingAtPos && len <= maxSegmentSize; len++) {
       Instance inst = g.getSubsequenceInstance(pos, pos + len);
       ClassLabel label = g.getSubsequenceLabel(pos, pos + len);
       if (inst != null && !label.isNegative()) {
         result.add(
             new Segmentation.Segment(
                 pos, pos + len, schema.getClassIndex(label.bestClassName())));
         addedASegmentStartingAtPos = true;
         pos += len;
       }
     }
     if (!addedASegmentStartingAtPos) {
       //				Instance inst = g.getSubsequenceInstance(pos,pos+1);
       //				ClassLabel label = g.getSubsequenceLabel(pos,pos+1);
       result.add(
           new Segmentation.Segment(
               pos, pos + 1, schema.getClassIndex(ExampleSchema.NEG_CLASS_NAME)));
       pos += 1;
     }
   }
   return result;
 }