changeset 474:f9d86b1db21c

Fixed memory leaks, added WS --no_unit_norming, and removed capping of LSH_N_POINT_BITS to 15 bits, instead allow any number of bits to encode points, remaining bits encode tracks
author mas01mc
date Fri, 09 Jan 2009 18:05:32 +0000
parents add65705e655
children fd890d2b38da
files QueryADB.py audioDB.cpp audioDB.h create.cpp lshlib.cpp lshlib.h query.cpp
diffstat 7 files changed, 112 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/QueryADB.py	Tue Jan 06 07:02:11 2009 +0000
+++ b/QueryADB.py	Fri Jan 09 18:05:32 2009 +0000
@@ -15,7 +15,7 @@
 # From: http://www.informit.com/articles/article.aspx?p=686162&seqNum=2
 #serverHost = 'research-hm3.corp.sk1.yahoo.com'
 serverHost = 'localhost'
-serverPort = 14475
+serverPort = 14476
 
 # Start the server on serverHost with
 #	./audioDB -s 14475
@@ -117,6 +117,39 @@
 </SOAP-ENV:Envelope>
 """
 
+
+
+FEATURE_QUERY_TEMPLATE = """
+<?xml version="1.0" encoding="UTF-8"?>
+<SOAP-ENV:Envelope
+ xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
+ xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:adb="http://tempuri.org/adb.xsd">
+ <SOAP-ENV:Body>
+  <adb:query>
+   <dbName>%s</dbName>
+   <qKey>%s</qKey>
+   <keyList>%s</keyList>
+   <timesFileName>%s</timesFileName>
+   <powerFileName>%s</powerFileName>
+   <qType>%s</qType>
+   <qPos>%s</qPos>
+   <pointNN>%s</pointNN>
+   <segNN>%s</segNN>
+   <segLen>%s</segLen>
+   <radius>%s</radius>
+   <absolute-threshold>%s</absolute-threshold>
+   <relative-threshold>%s</relative-threshold>
+   <exhaustive>%s</exhaustive>
+   <lsh-exact>%s</lsh-exact>
+   <no-unit-norming>%s</no-unit-norming>
+  </adb:query>
+ </SOAP-ENV:Body>
+</SOAP-ENV:Envelope>
+"""
+
 ###############  List Query - Show the files in the database ###########
 # Return a list of (key identifier, frame length) pairs.
 def RunListQuery():
@@ -210,7 +243,7 @@
 		pointNN = '10'
 		trackNN = '5'
 		seqLen = argv[4]
-		queryRadius = '0.5'
+		queryRadius = '2'
 	else:
 		dbKey = 'tmp/3.chr'
 		qType = '32'			# nSequence
@@ -226,6 +259,51 @@
 	response = SendXMLCommand(message)
 	ParseShingleXML(response)
 
+###############  Sequence Query - Show the data closest to one query ###########
+def RunQuery(argv):
+#   <dbName>%s</dbName>
+#   <qKey>%s</qKey>
+#   <keyList>%s</keyList>
+#   <timesFileName>%s</timesFileName>
+#   <powerFileName>%s</powerFileName>
+#   <qType>%s</qType>
+#   <qPos>%s</qPos>
+#   <pointNN>%s</pointNN>
+#   <segNN>%s</segNN>
+#   <segLen>%s</segLen>
+#   <radius>%s</radius>
+#   <absolute-threshold>%s</absolute-threshold>
+#   <relative-threshold>%s</relative-threshold>
+#   <exhaustive>%s</exhaustive>
+#   <lsh-exact>%s</lsh-exact>
+#   <no-unit-norming>%s</no-unit-norming>
+	global debug, dbName
+	if len(argv) > 2:
+		featureFile = argv[2]
+		powerFile = argv[3]
+		qType = '32'			# nSequence
+		qPos = argv[4]
+		pointNN = '20'
+		trackNN = '5'
+		seqLen = argv[5]
+		queryRadius = '0.2'
+	else:
+		featureFile = 'foo.chr12'
+		powerFile = 'foo.power'
+		qType = '32'			# nSequence
+		qPos = '0'
+		pointNN = '3'
+		trackNN = '5'
+		seqLen = '10'
+		queryRadius = '0.2'
+
+	message = FEATURE_QUERY_TEMPLATE
+	message = FEATURE_QUERY_TEMPLATE%(dbName, featureFile, "", "", powerFile, qType, qPos, pointNN, trackNN, seqLen, queryRadius, '0.0', '0.0', '0', '1','0')
+
+	print message
+	response = SendXMLCommand(message)
+	ParseShingleXML(response)
+
 def ParseShingleXML(response):
 	# Grab all the responses
 	#	See http://diveintopython.org/xml_processing/parsing_xml.html
@@ -301,7 +379,7 @@
 if __name__=="__main__":
 	cmdname = sys.argv[0]
 	if len(sys.argv) == 1:
-		print "Syntax: " + sys.argv[0] + " -q feature_file pos len"
+		print "Syntax: " + sys.argv[0] + " -{s,q,f,l} feature_file [power_file] pos len"
 		sys.exit(1)
 
 	queryType = sys.argv[1]
@@ -311,6 +389,8 @@
 			print k, v
 	elif queryType == '-q' or queryType == 'query':
 		RunSequenceQuery(sys.argv)
+	elif queryType == '-f' or queryType == 'feature':
+		RunQuery(sys.argv)
 	elif queryType == '-l' or queryType == 'list':
 		response = RunListQuery()
 		# print response
--- a/audioDB.cpp	Tue Jan 06 07:02:11 2009 +0000
+++ b/audioDB.cpp	Fri Jan 09 18:05:32 2009 +0000
@@ -40,13 +40,15 @@
   if(dbName && adb_root)
     prefix_name((char** const)&dbName, adb_root);
 
-  if(O2_ACTION(COM_SERVER))
+  if(O2_ACTION(COM_SERVER)){
 #ifdef LIBRARY
     ;
 #else
     startServer();
+    if(SERVER_LSH_INDEX_SINGLETON)
+      delete lsh;
 #endif
-
+  }
   else  if(O2_ACTION(COM_CREATE))
     create(dbName);
 
--- a/audioDB.h	Tue Jan 06 07:02:11 2009 +0000
+++ b/audioDB.h	Fri Jan 09 18:05:32 2009 +0000
@@ -69,8 +69,6 @@
 // Because we work in Radius^2 units,
 // The sqrt of this number is the multiplier on the radius
 
-#define O2_LSH_EXACT_MULT 1
-
 #define O2_OLD_MAGIC ('O'|'2'<<8|'D'<<16|'B'<<24)
 #define O2_MAGIC ('o'|'2'<<8|'d'<<16|'b'<<24)
 #define O2_FORMAT_VERSION (4U)
--- a/create.cpp	Tue Jan 06 07:02:11 2009 +0000
+++ b/create.cpp	Fri Jan 09 18:05:32 2009 +0000
@@ -55,9 +55,9 @@
   // For backward-compatibility, Record the point-encoding parameter for LSH indexing in the adb header
   // If this value is 0 then it will be set to 14
 
-#if O2_LSH_N_POINT_BITS > 15
-#error "AudioDB Compile ERROR: consistency check of O2_LSH_POINT_BITS failed (>15)"
-#endif
+  //#if O2_LSH_N_POINT_BITS > 28
+  //#error "AudioDB Compile ERROR: consistency check of O2_LSH_POINT_BITS failed (>15)"
+  //#endif
   
   dbH->flags |= LSH_N_POINT_BITS << 28;
 
--- a/lshlib.cpp	Tue Jan 06 07:02:11 2009 +0000
+++ b/lshlib.cpp	Fri Jan 09 18:05:32 2009 +0000
@@ -252,9 +252,9 @@
       }
       delete[] H::h[ j ];
   }
-  delete[] H::r1;
-  delete[] H::r2;
-  delete[] H::h;
+    delete[] H::r1;
+    delete[] H::r2;
+    delete[] H::h;
 }
 
 
@@ -472,6 +472,7 @@
   calling_instance(0),
   add_point_callback(0)
 {
+  FILE* dbFile = 0;
   int dbfid = unserialize_lsh_header(filename);
   indexName = new char[O2_INDEX_MAXSTR];
   strncpy(indexName, filename, O2_INDEX_MAXSTR); // COPY THE CONTENTS TO THE NEW POINTER
@@ -485,16 +486,21 @@
 
   // Format2 always needs unserializing
   if(lshHeader->flags&O2_SERIAL_FILEFORMAT2 && lshInCoreFlag){
-    FILE* dbFile = fdopen(dbfid, "rb");
+    dbFile = fdopen(dbfid, "rb");
     if(!dbFile)
       error("Cannot open LSH file for reading", filename);
     unserialize_lsh_hashtables_format2(dbFile);
   }
   serial_close(dbfid);
+  if(dbFile){
+    fclose(dbFile);
+    dbFile = 0;
+  }
 }
 
 G::~G(){
   delete lshHeader;
+  delete[] indexName;
 }
 
 // single point insertion; inserted values are hash value and pointID
@@ -680,7 +686,7 @@
   int dbfid;
   char* db;
   int dbIsNew=0;
-
+  FILE* dbFile = 0;
   // Check requested serialFormat
   if(!(serialFormat==O2_SERIAL_FILEFORMAT1 || serialFormat==O2_SERIAL_FILEFORMAT2))
     error("Unrecognized serial file format request: ", "serialize()");
@@ -717,7 +723,7 @@
   if(serialFormat == O2_SERIAL_FILEFORMAT1)
     serialize_lsh_hashtables_format1(dbfid, !dbIsNew);
   else{
-    FILE* dbFile = fdopen(dbfid, "r+b");
+    dbFile = fdopen(dbfid, "r+b");
     if(!dbFile)
       error("Cannot open LSH file for writing",filename);
     serialize_lsh_hashtables_format2(dbFile, !dbIsNew);
@@ -736,6 +742,10 @@
     serial_munmap(db, O2_SERIAL_HEADER_SIZE); // drop mmap
   }  
     serial_close(dbfid);
+    if(dbFile){
+      fclose(dbFile);
+      dbFile = 0;
+    }
 }
 
 // Test to see if core structure and requested format is
--- a/lshlib.h	Tue Jan 06 07:02:11 2009 +0000
+++ b/lshlib.h	Fri Jan 09 18:05:32 2009 +0000
@@ -244,7 +244,7 @@
 
   H();
   H(Uns32T k, Uns32T m, Uns32T d, Uns32T N, Uns32T C, float w, float r);
-  ~H();
+  virtual ~H();
 
   float get_w(){return w;}
   float get_radius(){return radius;}  
@@ -341,7 +341,7 @@
  public:
   G(char* lshFile, bool lshInCore = false); // unserialize constructor
   G(float w, Uns32T k,Uns32T m, Uns32T d, Uns32T N, Uns32T C, float r); // core constructor
-  ~G();
+  virtual ~G();
 
   Uns32T insert_point(vector<float>&, Uns32T pointID);
   void insert_point_set(vector<vector<float> >& vv, Uns32T basePointID);
--- a/query.cpp	Tue Jan 06 07:02:11 2009 +0000
+++ b/query.cpp	Fri Jan 09 18:05:32 2009 +0000
@@ -589,12 +589,15 @@
 	  dist = qn*qn + sn*sn - 2*dist;
       // else
       // dist = dist;      
-      if((!radius) || dist <= (O2_LSH_EXACT_MULT*radius+O2_DISTANCE_TOLERANCE)) 
+      if((!radius) || dist <= (radius+O2_DISTANCE_TOLERANCE)) 
 	reporter->add_point(pp.trackID, pp.qpos, pp.spos, dist);    
     }
     exact_evaluation_queue->pop();
   }
+
+  
   // Cleanup
+  free(data_buffer);
   SAFE_DELETE_ARRAY(sNorm);
   SAFE_DELETE_ARRAY(sPower);
   SAFE_DELETE_ARRAY(meanDBdur);