@@ -48,6 +48,20 @@ int binaryToDecimal(int n)
4848
4949 return dec_value ;
5050}
51+
52+ int binaryArrayToDecimal (int s [],int size )
53+ {
54+ int n = 0 ;
55+ int i ;
56+
57+ for (i = 0 ; i < size ; ++ i ) {
58+ n <<= 1 ;
59+ n += s [i ];
60+ }
61+
62+ return n ;
63+ }
64+
5165/* H FUNCTIONS*/
5266
5367void generateH (h_function * hfun ){
@@ -124,3 +138,178 @@ void deleteHyperCube(HyperCube hc){
124138 htDelete (hc -> hypercube ,1 );
125139 free (hc );
126140}
141+
142+
143+ void searchForHammingDistance (HyperCube hc ,Vector v ,int * v_index ,int hammingDist ,int startFrom ,Vector * nearest ,double * nearestDist ,int * numOfSearched ,int maxToSearch ){
144+ if (hammingDist <=0 ){
145+ int new_index = binaryArrayToDecimal (v_index ,k );
146+ printf ("** HAMMING INDEX =%d\n" ,new_index );
147+ htFindNearestNeighborCube (hc -> hypercube ,new_index ,v ,nearest ,nearestDist ,d ,numOfSearched ,maxToSearch );
148+ return ;
149+ }
150+ for (int i = startFrom ;i < k ;i ++ ){
151+ v_index [i ] = v_index [i ]^1 ;
152+ searchForHammingDistance (hc ,v ,v_index ,hammingDist - 1 ,i + 1 ,nearest ,nearestDist ,numOfSearched ,maxToSearch );
153+ // search
154+ v_index [i ] = v_index [i ]^1 ;
155+ if ((* numOfSearched )>=maxToSearch ){
156+ break ;
157+ }
158+ }
159+ }
160+
161+ void nearestNeigbor (HyperCube hc ,Vector q ,int hammingDist ,int m ){
162+ printf ("ABOUT TO SEARCH NEAREST NEIGHBOR FOR : " );
163+ printVector (q );
164+ Vector nearest = NULL ;
165+ double nearestDist = -1 ;
166+ int index [k ];
167+ int searched = 0 ;
168+ for (int i = 0 ;i < k ;i ++ ){
169+ int h_result = computeH (hc -> h_functions [i ],q );
170+ int f_result = computeF (hc -> f_funs [i ],h_result );
171+ index [i ] = f_result ;
172+ }
173+ int index_decimal = binaryArrayToDecimal (index ,k );
174+ printf ("** INITIAL INDEX =%d\n" ,index_decimal );
175+ htFindNearestNeighborCube (hc -> hypercube ,index_decimal ,q ,& nearest ,& nearestDist ,d ,& searched ,m );
176+
177+ for (int i = 1 ;i <=hammingDist ;i ++ ){
178+ if (searched >=m ){
179+ break ;
180+ }
181+ searchForHammingDistance (hc ,q ,index ,i ,0 ,& nearest ,& nearestDist ,& searched ,m );
182+ }
183+
184+ if (nearestDist >=0 && nearest != NULL ){
185+ printf ("FOUND NEAREST NEIGHBOR " );
186+ printVector (nearest );
187+ printf ("WITH DISTANCE = %f\n" ,nearestDist );
188+ }else {
189+ printf ("- DID NOT FIND NEAREST NEIGHBOR\n" );
190+ }
191+ printf ("Checked: %d vectors\n" ,searched );
192+ }
193+
194+ void searchForHammingDistanceKNN (HyperCube hc ,Vector v ,int * v_index ,int hammingDist ,int startFrom ,Vector * nearest ,double * nearestDist ,int * numOfSearched ,int maxToSearch ,int knn ){
195+ if (hammingDist <=0 ){
196+ int new_index = binaryArrayToDecimal (v_index ,k );
197+ printf ("** HAMMING INDEX =%d\n" ,new_index );
198+ htKFindNearestNeighborsCube (hc -> hypercube ,new_index ,v ,nearest ,nearestDist ,d ,knn ,numOfSearched ,maxToSearch );
199+ return ;
200+ }
201+ for (int i = startFrom ;i < k ;i ++ ){
202+ v_index [i ] = v_index [i ]^1 ;
203+ searchForHammingDistanceKNN (hc ,v ,v_index ,hammingDist - 1 ,i + 1 ,nearest ,nearestDist ,numOfSearched ,maxToSearch ,knn );
204+ // search
205+ v_index [i ] = v_index [i ]^1 ;
206+ if ((* numOfSearched )>=maxToSearch ){
207+ break ;
208+ }
209+ }
210+ }
211+
212+ void kNearestNeigbors (HyperCube hc ,Vector q ,int knn ,int hammingDist ,int m ){
213+ printf ("ABOUT TO SEARCH %d NEAREST NEIGHBORS FOR : " ,knn );
214+ printVector (q );
215+ Vector nearest [knn ];
216+ double knearestDists [knn ];
217+ for (int i = 0 ; i < knn ; i ++ ){
218+ knearestDists [i ]= -1 ;
219+ nearest [i ]= NULL ;
220+ }
221+
222+ int index [k ];
223+ int searched = 0 ;
224+ for (int i = 0 ;i < k ;i ++ ){
225+ int h_result = computeH (hc -> h_functions [i ],q );
226+ int f_result = computeF (hc -> f_funs [i ],h_result );
227+ index [i ] = f_result ;
228+ }
229+ int index_decimal = binaryArrayToDecimal (index ,k );
230+ printf ("** INITIAL INDEX =%d\n" ,index_decimal );
231+ htKFindNearestNeighborsCube (hc -> hypercube ,index_decimal ,q ,nearest ,knearestDists ,d ,knn ,& searched ,m );
232+
233+ for (int i = 1 ;i <=hammingDist ;i ++ ){
234+ if (searched >=m ){
235+ break ;
236+ }
237+ printf ("--------*********--------------\n" );
238+ searchForHammingDistanceKNN (hc ,q ,index ,i ,0 ,nearest ,knearestDists ,& searched ,m ,knn );
239+ }
240+
241+ int flag = 1 ;
242+ for (int i = knn - 1 ; i >= 0 ; i -- ){
243+ if (knearestDists [i ] >= 0 && nearest [i ] != NULL ){
244+ printf ("FOUND %d NEAREST NEIGHBOR: " ,i );
245+ printVector (nearest [i ]);
246+ printf ("WITH DISTANCE = %f\n" , knearestDists [i ]);
247+ flag = 0 ;
248+ }
249+ }
250+ if (flag ){
251+ printf ("- DID NOT FIND NEAREST NEIGHBOR\n" );
252+ }
253+ }
254+
255+
256+
257+ void searchForHammingDistanceRadius (HyperCube hc ,Vector v ,int * v_index ,int hammingDist ,int startFrom ,HashTable vecsInRadius ,int * numOfSearched ,int maxToSearch ,int radius ){
258+ if (hammingDist <=0 ){
259+ int new_index = binaryArrayToDecimal (v_index ,k );
260+ printf ("** HAMMING INDEX =%d\n" ,new_index );
261+ htFindNeighborsInRadiusCube (hc -> hypercube ,new_index ,vecsInRadius ,v ,d ,radius ,numOfSearched ,maxToSearch );
262+ return ;
263+ }
264+ for (int i = startFrom ;i < k ;i ++ ){
265+ v_index [i ] = v_index [i ]^1 ;
266+ searchForHammingDistanceRadius (hc ,v ,v_index ,hammingDist - 1 ,i + 1 ,vecsInRadius ,numOfSearched ,maxToSearch ,radius );
267+ // search
268+ v_index [i ] = v_index [i ]^1 ;
269+ if ((* numOfSearched )>=maxToSearch ){
270+ break ;
271+ }
272+ }
273+ }
274+
275+
276+ void radiusNeigbor (HyperCube hc ,Vector q ,double radius ,int hammingDist ,int m ){
277+ printf ("ABOUT TO SEARCH FOR NEIGHBORS INSIDE RANGE : %f\n" ,radius );
278+ HashTable vecsInRadius = htInitialize (100 ); // TODO: CHANGE SIZE
279+
280+ int index [k ];
281+ int searched = 0 ;
282+ for (int i = 0 ;i < k ;i ++ ){
283+ int h_result = computeH (hc -> h_functions [i ],q );
284+ int f_result = computeF (hc -> f_funs [i ],h_result );
285+ index [i ] = f_result ;
286+ }
287+ int index_decimal = binaryArrayToDecimal (index ,k );
288+ printf ("** INITIAL INDEX =%d\n" ,index_decimal );
289+ htFindNeighborsInRadiusCube (hc -> hypercube ,index_decimal ,vecsInRadius ,q ,d ,radius ,& searched ,m );
290+
291+ for (int i = 1 ;i <=hammingDist ;i ++ ){
292+ if (searched >=m ){
293+ break ;
294+ }
295+ printf ("--------*********--------------\n" );
296+ searchForHammingDistanceRadius (hc ,q ,index ,i ,0 ,vecsInRadius ,& searched ,m ,radius );
297+ }
298+
299+ htRangePrint (vecsInRadius ,q ,d );
300+
301+ htDelete (vecsInRadius ,0 );
302+ }
303+
304+
305+
306+
307+
308+
309+
310+
311+
312+
313+
314+
315+ ///
0 commit comments