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: }