package GeDBIT.parallel.rmi; import java.io.IOException; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import GeDBIT.dist.Metric; import GeDBIT.index.Index; import GeDBIT.index.RangeQuery; import GeDBIT.index.TableManager; import GeDBIT.index.VPRangeCursor; import GeDBIT.type.DNATable; import GeDBIT.type.DoubleVectorTable; import GeDBIT.type.ImageTable; import GeDBIT.type.IndexObject; import GeDBIT.type.PeptideTable; import GeDBIT.type.SpectraWithPrecursorMassTable; import GeDBIT.type.Table; import GeDBIT.util.MckoiObjectIOManager; import GeDBIT.util.ObjectIOManager; public class GlobalIndexImpl extends UnicastRemoteObject implements GlobalIndex { private static final long serialVersionUID = -6189007607283310933L; public static List<? extends IndexObject> queries; public static ObjectIOManager oiom; public static int pathLength = 0; public static boolean printResults = false; public static boolean verify = false; public static List<IndexObject> linearIndex = null; public GlobalIndexImpl() throws RemoteException { super(); } public void initialize(String[] args, int serverID) { String queryFileName = ""; String indexPrefix = ""; String dataType = "sequence"; int firstQuery = 0; int lastQuery = 1; int frag = 6; int dim = 2; for (int i = 0; i < args.length; i = i + 2) { if (args[i].equalsIgnoreCase("-q")) queryFileName = args[i + 1]; else if (args[i].equalsIgnoreCase("-t")) dataType = args[i + 1]; else if (args[i].equalsIgnoreCase("-f")) firstQuery = Integer.parseInt(args[i + 1]); else if (args[i].equalsIgnoreCase("-l")) lastQuery = Integer.parseInt(args[i + 1]); else if (args[i].equalsIgnoreCase("-p")) pathLength = Integer.parseInt(args[i + 1]); else if (args[i].equalsIgnoreCase("-frag")) frag = Integer.parseInt(args[i + 1]); else if (args[i].equalsIgnoreCase("-dim")) dim = Integer.parseInt(args[i + 1]); else if (args[i].equalsIgnoreCase("-v")) verify = (Integer.parseInt(args[i + 1]) == 1) ? true : false; else if (args[i].equalsIgnoreCase("-pr")) printResults = (Integer.parseInt(args[i + 1]) == 1) ? true : false; else if (args[i].equalsIgnoreCase("-d")) indexPrefix = args[i + 1]; else continue; } if (verify) { Table dataTable = TableManager.getTableManager(indexPrefix) .getTable(indexPrefix); Index index; if (dataTable != null) index = dataTable.getIndex(); else throw new Error("index: " + indexPrefix + " does not exist"); linearIndex = index.getAllPoints(); } Table queryTable = null; try { if (dataType.equalsIgnoreCase("protein")) queryTable = new PeptideTable(queryFileName, "", lastQuery, frag); else if (dataType.equalsIgnoreCase("vector")) queryTable = new DoubleVectorTable(queryFileName, "", lastQuery, dim); else if (dataType.equalsIgnoreCase("dna")) queryTable = new DNATable(queryFileName, "", lastQuery, frag); else if (dataType.equalsIgnoreCase("image")) queryTable = new ImageTable(queryFileName, "", lastQuery); else if (dataType.equalsIgnoreCase("msms")) queryTable = new SpectraWithPrecursorMassTable(queryFileName, "", lastQuery); else System.err.println("data type not supported! " + dataType); } catch (IOException e) { e.printStackTrace(); } List<? extends IndexObject> allQuery = queryTable.getData(); queries = allQuery.subList((firstQuery < 0) ? 0 : firstQuery, (lastQuery > allQuery.size()) ? allQuery.size() : lastQuery); oiom = new MckoiObjectIOManager(indexPrefix + "-" + serverID, "000", 1024 * 1024 * 1024, "Java IO", 4, 128 * 1024, true); try { if (!oiom.open()) { throw new Error("Cannot open store!"); } } catch (Exception e) { e.printStackTrace(); } } public void queryResult(String forprint) { if (printResults) { System.out.println(forprint); } } public void query(Metric metric, long rootAddress, double[] distList, int counter, double radius, String forprint) { // System.out.println("Step counter: " + counter); int queryCounter = 0; RangeQuery query = null; Iterator<? extends IndexObject> queryObjects = queries.iterator(); while (queryObjects.hasNext()) { if (queryCounter != counter) { queryCounter++; queryObjects.next(); continue; } else { query = new RangeQuery((IndexObject) queryObjects.next(), radius, pathLength); break; } } try { if (query == null) { throw new Error("Can't find IndexObject!"); } } catch (Exception e) { e.printStackTrace(); } VPRangeCursor cursor = new VPRangeCursor(query, oiom, metric, rootAddress); List<IndexObject> result = cursor.searchRangeQuery(distList); if (verify) { if (!verifyResult(result, query, linearIndex, metric)) { System.out.println("Inconsistent search results! query: " + queryCounter + ", radius: " + radius + " !"); System.exit(-1); } } StringBuffer buffer = new StringBuffer(forprint); for (IndexObject obj : result) { buffer.append(obj.toString()); } if (printResults) { System.out.println(buffer.toString()); } } public boolean verifyResult(List<IndexObject> resultList, RangeQuery q, List<IndexObject> linearIndex, Metric metric) { if (resultList == null) resultList = new ArrayList<IndexObject>(0); Iterator<IndexObject> p = linearIndex.iterator(); IndexObject data; while (p.hasNext()) { data = p.next(); if (metric.getDistance(data, q.getQueryObject()) <= q.getRadius()) { if (!resultList.remove(data)) { System.out .println("Found: linearscan result not in index resultset: " + data.toString() + ", query=" + q.getQueryObject()); return false; } } } if (resultList.size() != 0) { System.out .println("Found: index result not returned by linear scan. Query =" + q.getQueryObject()); for (IndexObject o : resultList) System.out.println(o); return false; } else return true; } }