@@ -125,6 +125,10 @@ void ResidualQuantizer::initialize_from(
125
125
}
126
126
}
127
127
128
+ /* ***************************************************************
129
+ * Encoding steps, used both for training and search
130
+ */
131
+
128
132
void beam_search_encode_step (
129
133
size_t d,
130
134
size_t K,
@@ -277,6 +281,10 @@ void beam_search_encode_step(
277
281
}
278
282
}
279
283
284
+ /* ***************************************************************
285
+ * Training
286
+ ****************************************************************/
287
+
280
288
void ResidualQuantizer::train (size_t n, const float * x) {
281
289
codebooks.resize (d * codebook_offsets.back ());
282
290
@@ -568,7 +576,12 @@ size_t ResidualQuantizer::memory_per_point(int beam_size) const {
568
576
return mem;
569
577
}
570
578
571
- // a namespace full of preallocated buffers
579
+ /* ***************************************************************
580
+ * Encoding
581
+ ****************************************************************/
582
+
583
+ // a namespace full of preallocated buffers. This speeds up
584
+ // computations, instead of re-allocating them at every encoing step
572
585
namespace {
573
586
574
587
// Preallocated memory chunk for refine_beam_mp() call
@@ -609,8 +622,6 @@ struct ComputeCodesAddCentroidsLUT1MemoryPool {
609
622
RefineBeamLUTMemoryPool refine_beam_lut_pool;
610
623
};
611
624
612
- } // namespace
613
-
614
625
// forward declaration
615
626
void refine_beam_mp (
616
627
const ResidualQuantizer& rq,
@@ -743,6 +754,8 @@ void compute_codes_add_centroids_mp_lut1(
743
754
centroids);
744
755
}
745
756
757
+ } // namespace
758
+
746
759
void ResidualQuantizer::compute_codes_add_centroids (
747
760
const float * x,
748
761
uint8_t * codes_out,
@@ -769,11 +782,6 @@ void ResidualQuantizer::compute_codes_add_centroids(
769
782
cent = centroids + i0 * d;
770
783
}
771
784
772
- // compute_codes_add_centroids(
773
- // x + i0 * d,
774
- // codes_out + i0 * code_size,
775
- // i1 - i0,
776
- // cent);
777
785
if (use_beam_LUT == 0 ) {
778
786
compute_codes_add_centroids_mp_lut0 (
779
787
*this ,
@@ -794,6 +802,8 @@ void ResidualQuantizer::compute_codes_add_centroids(
794
802
}
795
803
}
796
804
805
+ namespace {
806
+
797
807
void refine_beam_mp (
798
808
const ResidualQuantizer& rq,
799
809
size_t n,
@@ -873,15 +883,11 @@ void refine_beam_mp(
873
883
codebooks_m,
874
884
n,
875
885
cur_beam_size,
876
- // residuals.data(),
877
886
residuals_ptr,
878
887
m,
879
- // codes.data(),
880
888
codes_ptr,
881
889
new_beam_size,
882
- // new_codes.data(),
883
890
new_codes_ptr,
884
- // new_residuals.data(),
885
891
new_residuals_ptr,
886
892
pool.distances .data (),
887
893
assign_index.get (),
@@ -896,9 +902,6 @@ void refine_beam_mp(
896
902
897
903
if (rq.verbose ) {
898
904
float sum_distances = 0 ;
899
- // for (int j = 0; j < distances.size(); j++) {
900
- // sum_distances += distances[j];
901
- // }
902
905
for (int j = 0 ; j < distances_size; j++) {
903
906
sum_distances += pool.distances [j];
904
907
}
@@ -914,27 +917,22 @@ void refine_beam_mp(
914
917
}
915
918
916
919
if (out_codes) {
917
- // memcpy(out_codes, codes.data(), codes.size() * sizeof(codes[0]));
918
920
memcpy (out_codes, codes_ptr, codes_size * sizeof (*codes_ptr));
919
921
}
920
922
if (out_residuals) {
921
- // memcpy(out_residuals,
922
- // residuals.data(),
923
- // residuals.size() * sizeof(residuals[0]));
924
923
memcpy (out_residuals,
925
924
residuals_ptr,
926
925
residuals_size * sizeof (*residuals_ptr));
927
926
}
928
927
if (out_distances) {
929
- // memcpy(out_distances,
930
- // distances.data(),
931
- // distances.size() * sizeof(distances[0]));
932
928
memcpy (out_distances,
933
929
pool.distances .data (),
934
930
distances_size * sizeof (pool.distances [0 ]));
935
931
}
936
932
}
937
933
934
+ } // anonymous namespace
935
+
938
936
void ResidualQuantizer::refine_beam (
939
937
size_t n,
940
938
size_t beam_size,
@@ -1165,7 +1163,7 @@ void accum_and_finalize_tab(
1165
1163
}
1166
1164
}
1167
1165
1168
- } // namespace
1166
+ } // anonymous namespace
1169
1167
1170
1168
void beam_search_encode_step_tab (
1171
1169
size_t K,
@@ -1390,6 +1388,8 @@ void beam_search_encode_step_tab(
1390
1388
}
1391
1389
}
1392
1390
1391
+ namespace {
1392
+
1393
1393
//
1394
1394
void refine_beam_LUT_mp (
1395
1395
const ResidualQuantizer& rq,
@@ -1443,13 +1443,9 @@ void refine_beam_LUT_mp(
1443
1443
for (int m = 0 ; m < rq.M ; m++) {
1444
1444
int K = 1 << rq.nbits [m];
1445
1445
1446
- // it is guaranteed that (new_beam_size <= than max_beam_size) ==
1447
- // true
1446
+ // it is guaranteed that (new_beam_size <= max_beam_size)
1448
1447
int new_beam_size = std::min (beam_size * K, out_beam_size);
1449
1448
1450
- // std::vector<int32_t> new_codes(n * new_beam_size * (m + 1));
1451
- // std::vector<float> new_distances(n * new_beam_size);
1452
-
1453
1449
codes_size = n * new_beam_size * (m + 1 );
1454
1450
distances_size = n * new_beam_size;
1455
1451
@@ -1464,29 +1460,20 @@ void refine_beam_LUT_mp(
1464
1460
rq.total_codebook_size ,
1465
1461
rq.cent_norms .data () + rq.codebook_offsets [m],
1466
1462
m,
1467
- // codes.data(),
1468
1463
codes_ptr,
1469
- // distances.data(),
1470
1464
distances_ptr,
1471
1465
new_beam_size,
1472
- // new_codes.data(),
1473
1466
new_codes_ptr,
1474
- // new_distances.data()
1475
1467
new_distances_ptr,
1476
1468
rq.approx_topk_mode );
1477
1469
1478
- // codes.swap(new_codes);
1479
1470
std::swap (codes_ptr, new_codes_ptr);
1480
- // distances.swap(new_distances);
1481
1471
std::swap (distances_ptr, new_distances_ptr);
1482
1472
1483
1473
beam_size = new_beam_size;
1484
1474
1485
1475
if (rq.verbose ) {
1486
1476
float sum_distances = 0 ;
1487
- // for (int j = 0; j < distances.size(); j++) {
1488
- // sum_distances += distances[j];
1489
- // }
1490
1477
for (int j = 0 ; j < distances_size; j++) {
1491
1478
sum_distances += distances_ptr[j];
1492
1479
}
@@ -1501,19 +1488,17 @@ void refine_beam_LUT_mp(
1501
1488
}
1502
1489
1503
1490
if (out_codes) {
1504
- // memcpy(out_codes, codes.data(), codes.size() * sizeof(codes[0]));
1505
1491
memcpy (out_codes, codes_ptr, codes_size * sizeof (*codes_ptr));
1506
1492
}
1507
1493
if (out_distances) {
1508
- // memcpy(out_distances,
1509
- // distances.data(),
1510
- // distances.size() * sizeof(distances[0]));
1511
1494
memcpy (out_distances,
1512
1495
distances_ptr,
1513
1496
distances_size * sizeof (*distances_ptr));
1514
1497
}
1515
1498
}
1516
1499
1500
+ } // namespace
1501
+
1517
1502
void ResidualQuantizer::refine_beam_LUT (
1518
1503
size_t n,
1519
1504
const float * query_norms, // size n
0 commit comments