package eu.europeana.creative.dataset.culturecam.v2;
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.apache.commons.io.FileUtils;
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 CultureCamV2PivotsTest extends ThumbnailAccessorUtils {
PivotManagementService pivotManager;
@Before
public void init() {
String dataset = "culturecam";
setDataset(dataset);
blockSize = 1000;
pivotManager = new PivotManagementServiceImpl(getDataset());
pivotManager.init();
}
@Test
public void extractPivotFeatures() throws Exception {
// File pivotCsvFile = new File(pivotManager.getConfiguration()
// .getPivotsCsvFile(getDataset()));
File pivotCsvFile = pivotManager.getConfiguration().getDatasetFile(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);
System.out.println("Fivot features writen to archive: " + pivotManager.getPivotsFCArchiveFile());
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(pivotManager.getTopN());
}
@Test
public void generateLireObjectPivotsBinWithOrder() 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 };
//FileUtils
File orderCsvFile = new File("/tmp/pivotorder/pivots_positions_350.csv");
pivotManager.generateLirePivotsBinWithOrder(orderCsvFile);
pivotManager.getPivotsFCArchiveFile();
checkTopNPivots(350);
}
// @Test
public void checkTopNPivots(int topK) throws FileNotFoundException, IOException {
File pivotBinFile = ((PivotManagementServiceImpl) pivotManager)
.getLireObjectPivotsFile(topK);
// readTop5 pivots
int topN = 5;
LireObject[] pivots = readTopNPivots(pivotBinFile, 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 = 350;
final int tries = 13;
System.out.println("Starting pivot order generation! Pivot archive size = " + featuresCollection.size());
@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();
StringBuffer buf = new StringBuffer();
for (int i = 0; i < results.length; i++) {
if(i == k)
System.out.println(buf.toString());
buf.append("ISimilarityResult [").append(i).append("]: ").append(results[i]).append("\n");
}
final File outFile = new File("/tmp/pivotorder/"+getDataset()+".txt");
if(outFile.exists())
outFile.delete();
FileUtils.write(outFile, buf.toString());
System.out.println();
// 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);
// final File similarityFile = new File("/tmp/pivotorder/"+getDataset()+"_similarity.txt");
// FileUtils.write(outFile, "Isimilarity");
//
// for (int i = 0; i < results.length; i++) {
// FileUtils.write(similarityFile, results[i].getResultsIDs().);
// }
//
//public Collection<IFeaturesCollector_Labeled_HasID> getFCs(FeaturesCollectorsArchives archive) throws ArchiveException;
}
protected File getImageFile(String id) {
return pivotManager.getConfiguration().getImageFile(getDataset(), id);
}
}