stevenh@14: package org.qmul.eecs.c4dm.sia;
stevenh@14:
stevenh@14: import java.util.ArrayList;
stevenh@14: import java.util.Collections;
stevenh@14: import java.util.List;
stevenh@14:
stevenh@14: import org.qmul.eecs.c4dm.sia.exceptions.DimensionException;
stevenh@14: import org.qmul.eecs.c4dm.sia.model.Datapoint;
stevenh@14: import org.qmul.eecs.c4dm.sia.model.NDimensionalObject;
stevenh@14: import org.qmul.eecs.c4dm.sia.model.SiatecX;
stevenh@14: import org.qmul.eecs.c4dm.sia.model.VectorTable;
stevenh@14: import org.qmul.eecs.c4dm.sia.model.VectorTableElement;
stevenh@14: import org.qmul.eecs.c4dm.sia.utilities.Display;
stevenh@14:
stevenh@14: import com.hp.hpl.jena.ontology.OntModel;
stevenh@44: import com.hp.hpl.jena.ontology.OntModelSpec;
stevenh@44: import com.hp.hpl.jena.query.Dataset;
stevenh@44: import com.hp.hpl.jena.query.ReadWrite;
stevenh@14: import com.hp.hpl.jena.rdf.model.Model;
stevenh@14: import com.hp.hpl.jena.rdf.model.ModelFactory;
stevenh@44: import com.hp.hpl.jena.tdb.TDBFactory;
stevenh@44: import com.hp.hpl.jena.update.UpdateAction;
stevenh@14:
stevenh@14: /**
stevenh@14: *
stevenh@14: * Title: SiaTecMain
stevenh@14: *
stevenh@14: *
stevenh@14: * Description: An RDF/OWL/Java implementation of the SIATEC pattern discovery algorithm.
stevenh@14: * See "Algorithms for discovering repeated patterns in multidimensional representations of polyphonic music"
stevenh@14: * by Meredith, D. and Lemström, K. and Wiggins, G.A.
stevenh@14: *
stevenh@14: *
stevenh@14: * @author Steve Hargreaves, C4DM, Queen Mary University of London
stevenh@14: */
stevenh@14: public class SiaTecMain {
stevenh@14:
stevenh@44: // UPDATE queries
stevenh@44: private static final String insertSiatecVectorTableBNodesQuery = "file:src/sparql/insert_siatec_vector_table_bnodes.sparql";
stevenh@44: private static final String insertVectorTableDetailsQuery = "file:src/sparql/insert_vector_table_details.sparql";
stevenh@14:
stevenh@14: public void run() {
stevenh@14:
stevenh@44: // Obtain a dataset context
stevenh@44: Dataset dataset = TDBFactory.assembleDataset(SiaMain.assemblerFile);
stevenh@14:
stevenh@44: // Get the sia graph, as a model, from the dataset
stevenh@44: Model siaModel = dataset.getNamedModel(SiaMain.graph);
stevenh@14:
stevenh@44: OntModel ontModel = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM, siaModel);
stevenh@14:
stevenh@14: // Create custom sia Datapoint objects
stevenh@14: List datapoints = SiaDatapointFactory.create(ontModel);
stevenh@14:
stevenh@14: // STEP 1 - Order the datapoints
stevenh@14: Collections.sort(datapoints);
stevenh@14:
stevenh@14: // Add datapoint order info to model
stevenh@14: SiaDatapointFactory.assertOrder(ontModel, datapoints);
stevenh@14:
stevenh@44: // STEP 2 - Compute the vector table
stevenh@44: // Run all the UPDATE queries
stevenh@44: UpdateAction.readExecute(insertSiatecVectorTableBNodesQuery, ontModel);
stevenh@44: UpdateAction.readExecute(insertVectorTableDetailsQuery, ontModel);
stevenh@44:
stevenh@14: VectorTable vectorTableW = SiaVectorTableElementFactory.createW(ontModel, datapoints);
stevenh@14:
stevenh@14: // STEP 3 - Create custom SIATEC VectorTableElement objects (V)
stevenh@14: VectorTable vectorTableV = SiaVectorTableElementFactory.createV(ontModel, datapoints);
stevenh@14: List vteListV = vectorTableV.getVteList();
stevenh@14:
stevenh@14: // STEP 4 - Sort V
stevenh@14: Collections.sort(vteListV);
stevenh@14:
stevenh@14: // Add vector table element order info to model
stevenh@14: SiaVectorTableElementFactory.assertOrder(ontModel, vteListV);
stevenh@14:
stevenh@14: // STEP 5 - "Vectorize" the MTPs
stevenh@14: int m = vteListV.size();
stevenh@14: int i = 0;
stevenh@14: ArrayList x = new ArrayList();
stevenh@14:
stevenh@14: while (i < m)
stevenh@14: {
stevenh@14: ArrayList q = new ArrayList();
stevenh@14: int j = i + 1;
stevenh@14: while (j < m && (vteListV.get(i).compareToIgnoreDatapoints(vteListV.get(j)) == 0))
stevenh@14: {
stevenh@14: NDimensionalObject vector = vteListV.get(j).getFromDatapoint().subtract(vteListV.get(j - 1).getFromDatapoint());
stevenh@14: q.add(vector);
stevenh@14: j++;
stevenh@14: }
stevenh@14:
stevenh@14: SiatecX iq = new SiatecX();
stevenh@14: iq.setI(i+1);
stevenh@14: iq.setQ(q);
stevenh@14: x.add(iq);
stevenh@14: i = j;
stevenh@14: }
stevenh@14:
stevenh@14: // Sort the elements of x
stevenh@14: Collections.sort(x);
stevenh@14:
stevenh@14: // Rename as y to match algorithm description in paper
stevenh@14: ArrayList y = (ArrayList) x.clone();
stevenh@14:
stevenh@14: // Display results using algorithm figures 23, 24 and 25 of the research paper
stevenh@14: int r = y.size();
stevenh@14: m = vteListV.size();
stevenh@15: i = 0;
stevenh@14: System.out.println();
stevenh@14: System.out.print("{");
stevenh@15: if (r > 0)
stevenh@14: {
stevenh@14: do
stevenh@14: {
stevenh@15: int j = y.get(i).getI() - 1;
stevenh@14: List iList = new ArrayList();
stevenh@44: while (j < m && (vteListV.get(j).compareToIgnoreDatapoints(vteListV.get(y.get(i).getI() - 1)) == 0))
stevenh@14: {
stevenh@14: iList.add(vteListV.get(j).getFromDatapoint().getOrderedIndex());
stevenh@14: j++;
stevenh@14: }
stevenh@14: System.out.print("<");
stevenh@14: Display.printPattern(iList, datapoints);
stevenh@14: System.out.print(",");
stevenh@14: printSetOfTranslators(iList, datapoints, vectorTableW);
stevenh@14: System.out.print(">");
stevenh@14: do
stevenh@14: {
stevenh@14: i++;
stevenh@15: } while (i < r && (y.get(i).compareToIgnoreI(y.get(i - 1)) == 0));
stevenh@14:
stevenh@15: if (i < r)
stevenh@14: {
stevenh@14: System.out.print(",");
stevenh@14: System.out.println();
stevenh@14: }
stevenh@15: } while (i < r);
stevenh@14: }
stevenh@14: System.out.println("}");
stevenh@14:
stevenh@44: // Write the model to the TDB dataset
stevenh@44: dataset.begin(ReadWrite.WRITE) ;
stevenh@44: try {
stevenh@44: dataset.replaceNamedModel(SiaMain.graph, ontModel);
stevenh@44: dataset.commit();
stevenh@44: System.out.println("dataset.commit() done");
stevenh@44: } finally {
stevenh@44: dataset.end();
stevenh@44: System.out.println("dataset.end() done");
stevenh@44: }
stevenh@14:
stevenh@44: dataset.close();
stevenh@44: System.out.println("dataset.close() done");
stevenh@44:
stevenh@44: System.out.println("Number of Datapoints (n) = " + datapoints.size() + ", k = 3");
stevenh@14: }
stevenh@14:
stevenh@14: private void printSetOfTranslators(List iList, List datapoints, VectorTable vectorTableW) {
stevenh@14: int p = iList.size();
stevenh@14: int n = datapoints.size();
stevenh@14:
stevenh@14: if (p == 1)
stevenh@14: {
stevenh@14: System.out.print("{");
stevenh@14: Display.printVector(vectorTableW.getVector(iList.get(0), 1));
stevenh@14: for (int k = 2; k <= n; k++)
stevenh@14: {
stevenh@14: System.out.print(",");
stevenh@14: Display.printVector(vectorTableW.getVector(iList.get(0), k));
stevenh@14: }
stevenh@14: System.out.print("}");
stevenh@14: }
stevenh@14: else
stevenh@14: {
stevenh@14: System.out.print("{");
stevenh@14: List jList = new ArrayList();
stevenh@14: for (int k = 0; k < p; k++)
stevenh@14: {
stevenh@14: jList.add(1);
stevenh@14: }
stevenh@14: boolean finished = false;
stevenh@14: boolean first_vector = true;
stevenh@14: int k = 1;
stevenh@14:
stevenh@14: while (!finished)
stevenh@14: {
stevenh@14: if (jList.get(k) <= jList.get(k - 1))
stevenh@14: {
stevenh@14: jList.set(k, jList.get(k - 1) + 1);
stevenh@14: }
stevenh@14:
stevenh@14: while (jList.get(k) <= (n - p + k + 1)
stevenh@44: && (((VectorTableElement)vectorTableW.getVector(iList.get(k), jList.get(k))).compareToIgnoreDatapoints(((VectorTableElement)vectorTableW.getVector(iList.get(k - 1), jList.get(k - 1)))) < 0))
stevenh@14: {
stevenh@14: jList.set(k, jList.get(k) + 1);
stevenh@14: }
stevenh@14:
stevenh@14: if (jList.get(k) > n - p + k + 1)
stevenh@14: {
stevenh@14: finished = true;
stevenh@14: }
stevenh@44: else if (((VectorTableElement)vectorTableW.getVector(iList.get(k), jList.get(k))).compareToIgnoreDatapoints(((VectorTableElement)vectorTableW.getVector(iList.get(k - 1), jList.get(k - 1)))) > 0)
stevenh@14: {
stevenh@14: k = 1;
stevenh@14: jList.set(0, jList.get(0) + 1);
stevenh@14: if (jList.get(0) > n - p + 1)
stevenh@14: {
stevenh@14: finished = true;
stevenh@14: }
stevenh@14: }
stevenh@14: else if (k + 1 == p)
stevenh@14: {
stevenh@14: if (!first_vector)
stevenh@14: {
stevenh@14: System.out.print(",");
stevenh@14: }
stevenh@14: else
stevenh@14: {
stevenh@14: first_vector = false;
stevenh@14: }
stevenh@14:
stevenh@14: Display.printVector(vectorTableW.getVector(iList.get(k), jList.get(k)));
stevenh@14: k = 0;
stevenh@14:
stevenh@14: while (k < p)
stevenh@14: {
stevenh@14: jList.set(k, jList.get(k) + 1);
stevenh@14: if (jList.get(k) > n - p + k +1)
stevenh@14: {
stevenh@14: finished = true;
stevenh@14: k = p -1;
stevenh@14: }
stevenh@14: k++;
stevenh@14: }
stevenh@14: k = 1;
stevenh@14: }
stevenh@14: else
stevenh@14: {
stevenh@14: k++;
stevenh@14: }
stevenh@14: }
stevenh@14: System.out.print("}");
stevenh@14: }
stevenh@14: }
stevenh@14:
stevenh@14: private void printX(ArrayList x) {
stevenh@14: for (SiatecX iq : x)
stevenh@14: {
stevenh@14: System.out.print(iq.getI() + ",");
stevenh@14: for (NDimensionalObject q : iq.getQ())
stevenh@14: {
stevenh@14: System.out.print("<");
stevenh@14: int dimensions = q.getDimensionValues().size();
stevenh@14: for (int dim = 1; dim <= dimensions; dim++)
stevenh@14: {
stevenh@14: try {
stevenh@14: System.out.print(q.getDimensionValue(dim) + (dim == dimensions ? "" : ","));
stevenh@14: } catch (DimensionException e) {
stevenh@14: e.printStackTrace();
stevenh@14: System.exit(1);
stevenh@14: }
stevenh@14: }
stevenh@14: System.out.println(">");
stevenh@14: }
stevenh@14: System.out.println();
stevenh@14: }
stevenh@14: }
stevenh@14:
stevenh@14: /**
stevenh@14: * @param args
stevenh@14: */
stevenh@14: public static void main(String[] args) {
stevenh@44: long startTime = System.currentTimeMillis();
stevenh@14: SiaTecMain app = new SiaTecMain();
stevenh@14: app.run();
stevenh@44: long endTime = System.currentTimeMillis();
stevenh@44: long elapsedTime = endTime - startTime;
stevenh@44: System.out.println("Completed in " + elapsedTime + " ms");
stevenh@14: }
stevenh@14:
stevenh@14: }