package eu.europeana.creative.dataset.smk.indexing;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import it.cnr.isti.vir.features.IFeaturesCollector;
import it.cnr.isti.vir.features.mpeg7.LireObject;
import it.cnr.isti.vir.file.FeaturesCollectorsArchive;
import it.cnr.isti.vir.similarity.ISimilarityResults;
import it.cnr.isti.vir.similarity.knn.MultipleKNNPQueueID;
import it.cnr.isti.vir.similarity.knn.QueriesOrder3;
import it.cnr.isti.vir.similarity.metric.LireMetric;
import it.cnr.isti.vir.similarity.pqueues.SimPQueue_kNN;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import eu.europeana.api.client.thumbnails.ThumbnailAccessorUtils;
import eu.europeana.service.ir.image.api.PivotManagementService;
import eu.europeana.service.ir.image.api.PivotManagementServiceImpl;
public class SmkFeaturesArchiveTest extends ThumbnailAccessorUtils {
PivotManagementService pivotManager;
@Before
public void init() {
String dataset = "smk";
setDataset(dataset);
blockSize = 1000;
pivotManager = new PivotManagementServiceImpl(getDataset());
pivotManager.init();
}
// @Test
public void extractFeatures() throws Exception {
File pivotCsvFile = new File(pivotManager.getConfiguration()
.getPivotsCsvFile(getDataset()));
Map<String, String> pivotThumbnails = readThumbnailsMap(pivotCsvFile);
pivotManager.extractPivotFeatures(pivotThumbnails.keySet());
int pivots = ((PivotManagementServiceImpl) pivotManager)
.getPivotsFCArchive().size();
assertEquals(pivotThumbnails.size(), pivots);
System.out.println("successfully extracted features for pivots: "
+ pivots);
List<IFeaturesCollector> features = ((PivotManagementServiceImpl) pivotManager)
.getPivotsFCArchive().getAll();
assertEquals(pivotThumbnails.size(), features.size());
// copyPivotsFeaturesArchive();
}
// @Test
public void generateLireObjectPivotsArchive() throws Exception {
// test copy FeatureArchives
File inFile = new File(pivotManager.getConfiguration()
.getPivotsFCArchive(getDataset()));
assertTrue(inFile.exists());
pivotManager.generateLireObjectPivotsBin();
checkTopNPivots();
}
// @Test
// public void generateLireObjectPivotsArchiveWithOrder() throws Exception {
// // test copy FeatureArchives
// File inFile = new File(pivotManager.getConfiguration()
// .getPivotsFCArchive(getDataset()));
// assertTrue(inFile.exists());
// Integer[] order = new Integer[] { 8, 46, 19, 4, 32, 42, 38, 33, 5, 28,
// 29, 14, 34, 39, 30, 0, 47, 41, 11, 18, 48, 20, 15, 44, 27, 7,
// 35, 9, 10, 40, 49, 2, 26, 31, 25, 12, 3, 24, 6, 16, 13, 23, 1,
// 43, 36, 37, 45, 21, 17, 61, 56, 62, 53, 66, 70, 51, 64, 58, 60,
// 54, 67, 63, 69, 52, 59, 55, 57, 50, 68, 22, 71, 65 };
//
// pivotManager.generateLireObjectPivots(order);
//
// checkTopNPivots();
//
// }
// @Test
public void checkTopNPivots() throws FileNotFoundException, IOException {
File outFile = ((PivotManagementServiceImpl) pivotManager)
.getPivotsFCArchiveFile();
// readTop5 pivots
int topN = 5;
LireObject[] pivots = readTopNPivots(outFile, topN);
for (int i = 0; i < pivots.length; i++) {
LireObject lireObject = pivots[i];
assertNotNull(lireObject);
System.out.println(lireObject);
System.out.println(lireObject.getFeatures());
}
}
protected LireObject[] readTopNPivots(File outFile, int topN)
throws FileNotFoundException, IOException {
DataInputStream in = null;
in = new DataInputStream(new BufferedInputStream(new FileInputStream(
outFile)));
// ObjectInputStream ros_file=new ObjectInputStream(new
// FileInputStream(filename));
LireObject[] pivots = new LireObject[5];
for (int i = 0; i < topN; i++) {
pivots[i] = new LireObject(in);
}
in.close();
return pivots;
}
@Test
public void generatePivotOrder() throws SecurityException,
IllegalArgumentException, IOException, NoSuchMethodException,
InstantiationException, IllegalAccessException,
InvocationTargetException {
// public MultipleKNNPQueueID( Collection queryColl,
// Integer k,
// Metric comp,
// Class pQueueClass
// ) {
//
// this (queryColl, k, comp, false, null, null, true, false,
// pQueueClass, true );
// }
// TODO: test also with lire pivots archive
File inFile = new File(pivotManager.getConfiguration()
.getPivotsFCArchive(getDataset()));
List<IFeaturesCollector> featuresCollection = FeaturesCollectorsArchive
.getAll(inFile);
// FeaturesCollectorsArchive.
final int k = 50;
final int tries = 40;
@SuppressWarnings("rawtypes")
MultipleKNNPQueueID multipleKnnQueue = new MultipleKNNPQueueID(
featuresCollection, // Collection queryColl,
k, // Integer k,
new LireMetric(), // Metric comp,
true, // boolean useInterDistances,
new QueriesOrder3(tries, k), // (available Queriesorder1-3)
// IQueriesOrdering ordering,
-1, // (not used) - Integer nRecents,
false, // (distance overflow) boolean distET,
false, // (search by ID or features?) boolean storeID,
SimPQueue_kNN.class, // (same as SimPQueueDMax) Class
// pQueueClass,
false /* boolean silent */);
System.out.println(multipleKnnQueue.getAvgIntDist());
// System.out.println(multipleKnnQueue.getAvgLastDist());
@SuppressWarnings("rawtypes")
ISimilarityResults[] results = multipleKnnQueue.getResults();
// multipleKnnQueue.writeResultsIDs();
for (int i = 0; i < results.length; i++) {
System.out.println("ISimilarityResult [" + i + "]: " + results[i]);
}
// System.out.println("Top k results : " + multipleKnnQueue.get(k));
// for (int i = 0; i < k; i++) {
// System.out.println("Top k results : " + multipleKnnQueue.get(k));
// }
// multipleKnnQueue.get(index);
}
}