import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
+import jalview.analysis.AnnotationSorter.SortOrder;
import jalview.datamodel.Alignment;
import jalview.datamodel.AlignmentAnnotation;
import jalview.datamodel.Sequence;
// @formatter:on
AnnotationSorter testee = new AnnotationSorter(al);
- testee.sortBySequenceAndType(anns);
+ testee.sort(anns, SortOrder.SEQUENCE_AND_TYPE);
assertEquals("label5", anns[0].label); // for sequence 0
assertEquals("label0", anns[1].label); // for sequence 1
assertEquals("iron", anns[2].label); // sequence 3 /iron
// @formatter:on
AnnotationSorter testee = new AnnotationSorter(al);
- testee.sortByTypeAndSequence(anns);
+ testee.sort(anns, SortOrder.TYPE_AND_SEQUENCE);
assertEquals("IRON", anns[0].label); // IRON / sequence 0
assertEquals("iron", anns[1].label); // iron / sequence 3
assertEquals("label0", anns[2].label); // label0 / sequence 1
}
@Test
- public void testSortBySequenceAndType_timing()
+ public void testSort_timingPresorted()
{
- final long targetTime = 300; // ms
+ final long targetTime = 100; // ms
final int numSeqs = 10000;
final int numAnns = 20000;
al = buildAlignment(numSeqs);
anns = buildAnnotations(numAnns);
/*
- * Set the annotations in random order with respect to the sequences
+ * Set the annotations presorted by label
*/
Random r = new Random();
final SequenceI[] sequences = al.getSequencesArray();
{
SequenceI randomSequenceRef = sequences[r.nextInt(sequences.length)];
anns[i].sequenceRef = randomSequenceRef;
+ anns[i].label = "label" + i;
}
long startTime = System.currentTimeMillis();
AnnotationSorter testee = new AnnotationSorter(al);
- testee.sortByTypeAndSequence(anns);
+ testee.sort(anns, SortOrder.TYPE_AND_SEQUENCE);
long endTime = System.currentTimeMillis();
final long elapsed = endTime - startTime;
- System.out.println("Timing test for " + numSeqs + " sequences and "
+ System.out.println("Timing test for presorted " + numSeqs
+ + " sequences and "
+ numAnns + " annotations took " + elapsed + "ms");
assertTrue("Sort took more than " + targetTime + "ms",
elapsed <= targetTime);
}
+
+ /**
+ * Timing test for sorting randomly sorted annotations
+ */
+ @Test
+ public void testSort_timingUnsorted()
+ {
+ final int numSeqs = 2000;
+ final int numAnns = 4000;
+ al = buildAlignment(numSeqs);
+ anns = buildAnnotations(numAnns);
+
+ /*
+ * Set the annotations in random order with respect to the sequences
+ */
+ Random r = new Random();
+ final SequenceI[] sequences = al.getSequencesArray();
+ for (int i = 0; i < anns.length; i++)
+ {
+ SequenceI randomSequenceRef = sequences[r.nextInt(sequences.length)];
+ anns[i].sequenceRef = randomSequenceRef;
+ anns[i].label = "label" + i;
+ }
+ long startTime = System.currentTimeMillis();
+ AnnotationSorter testee = new AnnotationSorter(al);
+ testee.sort(anns, SortOrder.SEQUENCE_AND_TYPE);
+ long endTime = System.currentTimeMillis();
+ final long elapsed = endTime - startTime;
+ System.out.println("Timing test for unsorted " + numSeqs
+ + " sequences and "
+ + numAnns + " annotations took " + elapsed + "ms");
+ }
+
+ /**
+ * Timing test for sorting annotations with a limited range of types (labels).
+ */
+ @Test
+ public void testSort_timingSemisorted()
+ {
+ final int numSeqs = 2000;
+ final int numAnns = 4000;
+ al = buildAlignment(numSeqs);
+ anns = buildAnnotations(numAnns);
+
+ String[] labels = new String[]
+ { "label1", "label2", "label3", "label4", "label5", "label6" };
+
+ /*
+ * Set the annotations in sequence order with randomly assigned labels.
+ */
+ Random r = new Random();
+ final SequenceI[] sequences = al.getSequencesArray();
+ for (int i = 0; i < anns.length; i++)
+ {
+ SequenceI sequenceRef = sequences[i % sequences.length];
+ anns[i].sequenceRef = sequenceRef;
+ anns[i].label = labels[r.nextInt(labels.length)];
+ }
+ long startTime = System.currentTimeMillis();
+ AnnotationSorter testee = new AnnotationSorter(al);
+ testee.sort(anns, SortOrder.TYPE_AND_SEQUENCE);
+ long endTime = System.currentTimeMillis();
+ long elapsed = endTime - startTime;
+ System.out.println("Sort by type for semisorted " + numSeqs
+ + " sequences and "
+ + numAnns + " annotations took " + elapsed + "ms");
+
+ // now resort by sequence
+ startTime = System.currentTimeMillis();
+ testee.sort(anns, SortOrder.SEQUENCE_AND_TYPE);
+ endTime = System.currentTimeMillis();
+ elapsed = endTime - startTime;
+ System.out.println("Resort by sequence for semisorted " + numSeqs
+ + " sequences and " + numAnns + " annotations took " + elapsed
+ + "ms");
+
+ // now resort by type
+ startTime = System.currentTimeMillis();
+ testee.sort(anns, SortOrder.TYPE_AND_SEQUENCE);
+ endTime = System.currentTimeMillis();
+ elapsed = endTime - startTime;
+ System.out.println("Resort by type for semisorted " + numSeqs
+ + " sequences and " + numAnns + " annotations took " + elapsed
+ + "ms");
+ }
}