Generate brute force results by processing dataset in chunks
(dataset_name, quick_test=False)
| 317 | |
| 318 | |
| 319 | def generate_brute_force_results(dataset_name, quick_test=False): |
| 320 | """Generate brute force results by processing dataset in chunks""" |
| 321 | print("Generating brute force results using chunk processing...") |
| 322 | |
| 323 | dataset_config = datasets[dataset_name] |
| 324 | dataset_dir = os.path.join("datasets", dataset_name) |
| 325 | |
| 326 | # Determine sample size |
| 327 | k = 10 if quick_test else 100 |
| 328 | reservoir = [] |
| 329 | total_vectors = 0 |
| 330 | file_count = 0 |
| 331 | |
| 332 | # Pass 1: Reservoir sampling to select query vectors |
| 333 | random.seed(42) |
| 334 | while True: |
| 335 | path = os.path.join(dataset_dir, f"test{file_count}.parquet") |
| 336 | if not os.path.exists(path): |
| 337 | break |
| 338 | |
| 339 | df = pd.read_parquet(path) |
| 340 | for index, row in df.iterrows(): |
| 341 | total_vectors += 1 |
| 342 | # Get vector data |
| 343 | id_val = row[dataset_config["id"]] if dataset_config["id"] else index |
| 344 | embedding = row[dataset_config["embeddings"]] |
| 345 | vector = pre_process_vector(id_val, embedding) |
| 346 | |
| 347 | # Reservoir sampling |
| 348 | if len(reservoir) < k: |
| 349 | reservoir.append((vector["id"], vector["dense_values"])) |
| 350 | else: |
| 351 | j = random.randint(0, total_vectors-1) |
| 352 | if j < k: |
| 353 | reservoir[j] = (vector["id"], vector["dense_values"]) |
| 354 | file_count += 1 |
| 355 | |
| 356 | # Prepare query data |
| 357 | query_ids = [item[0] for item in reservoir] |
| 358 | query_vectors = np.array([item[1] for item in reservoir], dtype=np.float32) |
| 359 | |
| 360 | # Initialize heaps for each query (min-heap for top-k) |
| 361 | heaps = [[] for _ in range(len(query_vectors))] |
| 362 | |
| 363 | # Pass 2: Process dataset in chunks to find top matches |
| 364 | file_count = 0 |
| 365 | while True: |
| 366 | path = os.path.join(dataset_dir, f"test{file_count}.parquet") |
| 367 | if not os.path.exists(path): |
| 368 | break |
| 369 | |
| 370 | df = pd.read_parquet(path) |
| 371 | chunk_vectors = [] |
| 372 | chunk_ids = [] |
| 373 | |
| 374 | for index, row in df.iterrows(): |
| 375 | id_val = row[dataset_config["id"]] if dataset_config["id"] else index |
| 376 | embedding = row[dataset_config["embeddings"]] |
no test coverage detected