CrossTable implements Iterable<CrossTable.Row> { public static CrossTable complement(final CrossTable that) { checkNotNull(that); CrossTable complement = new CrossTable(); for(int i = 0; i < that.getNumberOfRows(); i++) { MutableBitSet ones = new MutableBitSet(that.ncol); ones.set(0, that.ncol); complement.addRow(new MutableBitSet().andNot(ones, that.getRow(i).intent)); } return complement; } CrossTable();  CrossTable(final CrossTable that);  CrossTable(final CrossTable that, long plus); static CrossTable fromContext(final Context<G, M> context); long getNumberOfRows(); long getNumberOfColumns(); void addRow(final MutableBitSet bits); Row getRow(int index); static CrossTable complement(final CrossTable that); static CrossTable horizontalSum(final CrossTable that,
                                           final CrossTable other); static CrossTable verticalSum(final CrossTable that,
                                         final CrossTable other); static CrossTable directProduct(final CrossTable that,
                                           final CrossTable other); Decomposition parallelDecomposition(); Decomposition seriesDecomposition(); ConceptLattice asConceptLattice(final Graph graph); @Override Iterator<Row> iterator(); @Override String toString(); @Override boolean equals(final Object right);  }
@Test public void testComplement() { CrossTable complement = CrossTable.complement(table); assertEquals(complement.getNumberOfRows(), 3); assertEquals(complement.getNumberOfColumns(), 3); assertEquals(complement.getRow(0).intent, bits(0)); assertEquals(CrossTable.complement(complement).getRow(0).intent, bits(1, 2)); }