CrossTable implements Iterable<CrossTable.Row> { public static CrossTable directProduct(final CrossTable that, final CrossTable other) { CrossTable product = CrossTable.verticalSum(that, other); for(long i = that.nrow; i < product.nrow; i++) { product.getRow((int) i).intent.set(0, that.ncol); } return product; } 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 testDirectProduct() { CrossTable sum = CrossTable.directProduct(table, other); assertEquals(sum.getNumberOfRows(), 6); assertEquals(sum.getNumberOfColumns(), 6); assertEquals(sum.getRow(0).intent, bits(1, 2, 3, 4, 5)); assertEquals(sum.getRow(3).intent, bits(0, 1, 2, 4, 5)); assertEquals(sum.getRow(5).intent, bits(0, 1, 2)); assertEquals(table.getNumberOfRows(), 3); assertEquals(table.getRow(0).intent, bits(1, 2)); }