BicSPAM makes available a set of pattern-based approaches for order-preserving biclustering.
BicSPAM approaches are proposed to perform flexible and exhaustive biclustering based on sequential patterns.
BicSPAM approaches are easily parameterizable, allowing the selection of different strategies with varying levels of noise and missing values, underlying SPM methods, pattern representations (simple, condensed and approximate), and discretization options. Flexible structures and quality criteria can be easily defined through extension-merging-filtering steps without the need to adapt the core task.
Finally, BicSPAM allows for order-preserving biclusters with symmetries, useful for instance to capture activation and regulatory mechanisms in biological processes.

Authors: Rui Henriques and Sara Madeira
	title={BicSPAM: Flexible Biclustering using Sequential Patterns}, 
	booktitle={BMC Bioinformatics}, 
	author={Rui Henriques and Sara Madeira}, 
	publisher={BioMed Central Ltd},

Synthetic datasets (non-exhaustive set of 6 data instances with background values following Uniform or Normal):

Real datasets:


Example on how to use BicSPAM:
public class SyntheticTests {

	//mining methods
	static FIM[] pminers = new FIM[]{new ClosedIndexSpan(), new IndexSpan(), new BIDEPlus(), new PrefixSpan()};

	//mapping options
	static Itemizer itemizer = new Itemizer(20, //nr of items
				FillingCriteria.Replace, //missings handler
	//closing options
	Biclusterizer bichandler = new Biclusterizer(
				new BiclusterExtender(0.25,0.25), //criteria for the default extender
				new BiclusterIntraFilter(0.8), 
				new BiclusterBicFilter(0.4), 
				new BiclusterMerger(0.7));

	//Generator properties
	static Background background = Background.Random;
	static String distRowsBics = "Uniform", distColsBics = "Uniform";
	static double noise = 0.05; //5% of noise
	static double missings = 0.02; //2% of missing values
	static int[] alphabets = new int[]{10,20,40};
	static int[] numRows = new int[]{500,1000,2000};
	static int[] numColumns = new int[]{50,75,100};
	static int[] numBics = new int[]{4,7,10};
	static int[] minRowsBics = new int[]{40,100,200}, maxRowsBics = new int[]{70,150,300};
	static int[] minColsBics = new int[]{6,7,8}, maxColsBics = new int[]{8,9,10};
	public static void main(String[] args) throws Exception{
		for(int alphabet : alphabets){	  
			for(int i = 0, l = numRows.length; i<l; i++){
				BicGenerator generator = new BicGenerator(numRows[i],numColumns[i],numBics[i],background,alphabet);

				Biclusters trueBics = generator.generateKBiclustersWithCoherentEvolutionOnColumns(type,
						distRowsBics, minRowsBics[i], maxRowsBics[i], distColsBics, minColsBics[i], maxColsBics[i]);
				int[][] dataset = generator.getSymbolicExpressionMatrix();
				dataset = generator.putNoise(dataset,noise);
				dataset = generator.putMissings(dataset,missings);
				Dataset data = new Dataset(dataset,true);

				for(FIM pminer : pminers){
					double minRowsSup = findMinRowsSupExpectations(data);
					double minColsSup = findMinColsSupExpectations(data);

					BiclusterMiner bicminer = new OrderPreservingBiclusterMiner(data,pminer,bichandler,itemizer);

	private static void core(BiclusterMiner bicminer, Biclusters trueBics) throws Exception {
		Biclusters bics = bicminer.mineBiclusters();
		System.out.println("True Bics: " + trueBics.toShortString());
		System.out.println("Foung Bics: " + bics.toShortString());
		System.out.println(, trueBics));