Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] f16 feature #4032

Closed

Conversation

charles-r-earp
Copy link

/claim #3333

Tasks

  • Add f16 feature to segment crate, which switches VectorElementType to half::f16.
  • Resolve test failures.
    • filtrable_hnsw_test::test_filterable_hnsw::case_1_nearest
    • filtrable_hnsw_test::test_filterable_hnsw::case_2_discovery
    • filtrable_hnsw_test::test_filterable_hnsw::case_3_recommend
    • multivector_filtrable_hnsw_test::test_multi_filterable_hnsw::case_2_nearest_multi
    • multivector_filtrable_hnsw_test::test_multi_filterable_hnsw::case_4_discovery_multi
    • segment_builder_test::test_building_cancellation
    • segment_tests::test_update_named_vector
  • Add f16 feature to qdrant.

Test Failures

cargo test -p segment --features f16

failures:

---- filtrable_hnsw_test::test_filterable_hnsw::case_2_discovery stdout ----
blocks.len() = 18
thread 'filtrable_hnsw_test::test_filterable_hnsw::case_2_discovery' panicked at lib/segment/tests/integration/filtrable_hnsw_test.rs:248:9:
assertion `left == right` failed
  left: 0
 right: 1
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

---- filtrable_hnsw_test::test_filterable_hnsw::case_1_nearest stdout ----
blocks.len() = 18
thread 'filtrable_hnsw_test::test_filterable_hnsw::case_1_nearest' panicked at lib/segment/tests/integration/filtrable_hnsw_test.rs:248:9:
assertion `left == right` failed
  left: 0
 right: 1

---- filtrable_hnsw_test::test_filterable_hnsw::case_3_recommend stdout ----
blocks.len() = 18
thread 'filtrable_hnsw_test::test_filterable_hnsw::case_3_recommend' panicked at lib/segment/tests/integration/filtrable_hnsw_test.rs:248:9:
assertion `left == right` failed
  left: 0
 right: 1

---- segment_tests::test_update_named_vector stdout ----
thread 'segment_tests::test_update_named_vector' panicked at lib/segment/tests/integration/segment_tests.rs:290:13:
assertion failed: (sqrt_distance(v) - 1.).abs() < 1e-5

---- segment_builder_test::test_building_cancellation stdout ----
thread 'segment_builder_test::test_building_cancellation' panicked at lib/segment/tests/integration/segment_builder_test.rs:181:5:
assertion failed: !was_cancelled_baseline

---- multivector_filtrable_hnsw_test::test_multi_filterable_hnsw::case_2_nearest_multi stdout ----
Attempt 3/100
Different results for query Nearest(MultiDense(MultiDenseVector { inner_vector: [0.92578125, 0.68408203, 0.20483398, 0.89453125, 0.48217773, 0.30444336, 0.45922852, 0.45776367], dim: 8 }))
plain_result = [
    [
        ScoredPointOffset {
            idx: 1916,
            score: 0.9917515,
        },
        ScoredPointOffset {
            idx: 3431,
            score: 0.98301303,
        },
        ScoredPointOffset {
            idx: 2349,
            score: 0.98189694,
        },
    ],
]
index_result = [
    [
        ScoredPointOffset {
            idx: 1916,
            score: 0.9917515,
        },
        ScoredPointOffset {
            idx: 3431,
            score: 0.98301303,
        },
        ScoredPointOffset {
            idx: 1478,
            score: 0.98171514,
        },
    ],
]
Attempt 6/100
Different results for query Nearest(MultiDense(MultiDenseVector { inner_vector: [0.04348755, 0.8286133, 0.18395996, 0.86328125, 0.77783203, 0.6123047, 0.9169922, 0.1149292], dim: 8 }))
plain_result = [
    [
        ScoredPointOffset {
            idx: 1491,
            score: 0.9825874,
        },
        ScoredPointOffset {
            idx: 233,
            score: 0.96947604,
        },
        ScoredPointOffset {
            idx: 1038,
            score: 0.96300656,
        },
    ],
]
index_result = [
    [
        ScoredPointOffset {
            idx: 233,
            score: 0.96947604,
        },
        ScoredPointOffset {
            idx: 3134,
            score: 0.9600835,
        },
        ScoredPointOffset {
            idx: 3107,
            score: 0.9590519,
        },
    ],
]
Attempt 7/100
Different results for query Nearest(MultiDense(MultiDenseVector { inner_vector: [0.77441406, 0.23168945, 0.86328125, 0.8276367, 0.76123047, 0.6357422, 0.7080078, 0.7241211, 0.53808594, 0.94873047, 0.97216797, 0.19494629, 0.4152832, 0.095703125, 0.15136719, 0.54345703], dim: 8 }))
plain_result = [
    [
        ScoredPointOffset {
            idx: 1115,
            score: 1.9487588,
        },
        ScoredPointOffset {
            idx: 2029,
            score: 1.9158313,
        },
        ScoredPointOffset {
            idx: 2686,
            score: 1.8882769,
        },
    ],
]
index_result = [
    [
        ScoredPointOffset {
            idx: 1115,
            score: 1.9487588,
        },
        ScoredPointOffset {
            idx: 2029,
            score: 1.9158313,
        },
        ScoredPointOffset {
            idx: 1846,
            score: 1.8861184,
        },
    ],
]
Attempt 13/100
Different results for query Nearest(MultiDense(MultiDenseVector { inner_vector: [0.3005371, 0.72509766, 0.6430664, 0.42358398, 0.8935547, 0.33984375, 0.63183594, 0.57470703], dim: 8 }))
plain_result = [
    [
        ScoredPointOffset {
            idx: 215,
            score: 0.9882299,
        },
        ScoredPointOffset {
            idx: 2181,
            score: 0.9811982,
        },
        ScoredPointOffset {
            idx: 384,
            score: 0.97959745,
        },
    ],
]
index_result = [
    [
        ScoredPointOffset {
            idx: 2181,
            score: 0.9811982,
        },
        ScoredPointOffset {
            idx: 384,
            score: 0.97959745,
        },
        ScoredPointOffset {
            idx: 1780,
            score: 0.9761457,
        },
    ],
]
Attempt 16/100
Different results for query Nearest(MultiDense(MultiDenseVector { inner_vector: [0.6743164, 0.6455078, 0.99121094, 0.15930176, 0.14648438, 0.9916992, 0.7163086, 0.24401855], dim: 8 }))
plain_result = [
    [
        ScoredPointOffset {
            idx: 4233,
            score: 0.98106664,
        },
        ScoredPointOffset {
            idx: 1458,
            score: 0.9804243,
        },
        ScoredPointOffset {
            idx: 4560,
            score: 0.97228,
        },
    ],
]
index_result = [
    [
        ScoredPointOffset {
            idx: 4233,
            score: 0.98106664,
        },
        ScoredPointOffset {
            idx: 4845,
            score: 0.96632034,
        },
        ScoredPointOffset {
            idx: 2956,
            score: 0.9654189,
        },
    ],
]
Attempt 33/100
Different results for query Nearest(MultiDense(MultiDenseVector { inner_vector: [0.7392578, 0.072265625, 0.64208984, 0.9248047, 0.29711914, 0.47631836, 0.5888672, 0.82714844, 0.056518555, 0.41381836, 0.44555664, 0.21801758, 0.6455078, 0.84375, 0.2319336, 0.16540527, 0.43164063, 0.7265625, 0.8408203, 0.32495117, 0.28930664, 0.28979492, 0.12054443, 0.06756592], dim: 8 }))
plain_result = [
    [
        ScoredPointOffset {
            idx: 173,
            score: 2.7520924,
        },
        ScoredPointOffset {
            idx: 2087,
            score: 2.747139,
        },
        ScoredPointOffset {
            idx: 3264,
            score: 2.7018836,
        },
    ],
]
index_result = [
    [
        ScoredPointOffset {
            idx: 173,
            score: 2.7520924,
        },
        ScoredPointOffset {
            idx: 2087,
            score: 2.747139,
        },
        ScoredPointOffset {
            idx: 1905,
            score: 2.6956024,
        },
    ],
]
Attempt 37/100
Different results for query Nearest(MultiDense(MultiDenseVector { inner_vector: [0.14208984, 0.8310547, 0.19116211, 0.70996094, 0.3659668, 0.51708984, 0.20825195, 0.60791016], dim: 8 }))
plain_result = [
    [
        ScoredPointOffset {
            idx: 2228,
            score: 0.9885031,
        },
        ScoredPointOffset {
            idx: 153,
            score: 0.97726184,
        },
        ScoredPointOffset {
            idx: 1919,
            score: 0.9710682,
        },
    ],
]
index_result = [
    [
        ScoredPointOffset {
            idx: 153,
            score: 0.97726184,
        },
        ScoredPointOffset {
            idx: 1919,
            score: 0.9710682,
        },
        ScoredPointOffset {
            idx: 2835,
            score: 0.9691406,
        },
    ],
]
Attempt 39/100
Different results for query Nearest(MultiDense(MultiDenseVector { inner_vector: [0.45117188, 0.45507813, 0.74902344, 0.46191406, 0.33740234, 0.85791016, 0.2421875, 0.15612793], dim: 8 }))
plain_result = [
    [
        ScoredPointOffset {
            idx: 2653,
            score: 0.9724084,
        },
        ScoredPointOffset {
            idx: 2757,
            score: 0.97194386,
        },
        ScoredPointOffset {
            idx: 2634,
            score: 0.97160864,
        },
    ],
]
index_result = [
    [
        ScoredPointOffset {
            idx: 2634,
            score: 0.97160864,
        },
        ScoredPointOffset {
            idx: 2377,
            score: 0.97126937,
        },
        ScoredPointOffset {
            idx: 91,
            score: 0.971093,
        },
    ],
]
Attempt 40/100
Different results for query Nearest(MultiDense(MultiDenseVector { inner_vector: [0.30566406, 0.33032227, 0.3227539, 0.3256836, 0.32177734, 0.31201172, 0.034484863, 0.23071289], dim: 8 }))
plain_result = [
    [
        ScoredPointOffset {
            idx: 4719,
            score: 0.9927658,
        },
        ScoredPointOffset {
            idx: 324,
            score: 0.97780704,
        },
        ScoredPointOffset {
            idx: 3645,
            score: 0.9729758,
        },
    ],
]
index_result = [
    [
        ScoredPointOffset {
            idx: 324,
            score: 0.97780704,
        },
        ScoredPointOffset {
            idx: 3645,
            score: 0.9729758,
        },
        ScoredPointOffset {
            idx: 2940,
            score: 0.9724297,
        },
    ],
]
Attempt 41/100
Different results for query Nearest(MultiDense(MultiDenseVector { inner_vector: [0.2479248, 0.14318848, 0.5678711, 0.016052246, 0.31811523, 0.88671875, 0.8149414, 0.3425293], dim: 8 }))
plain_result = [
    [
        ScoredPointOffset {
            idx: 4677,
            score: 0.98409367,
        },
        ScoredPointOffset {
            idx: 392,
            score: 0.97073275,
        },
        ScoredPointOffset {
            idx: 2797,
            score: 0.9611107,
        },
    ],
]
index_result = [
    [
        ScoredPointOffset {
            idx: 392,
            score: 0.97073275,
        },
        ScoredPointOffset {
            idx: 2797,
            score: 0.9611107,
        },
        ScoredPointOffset {
            idx: 4707,
            score: 0.95511127,
        },
    ],
]
Attempt 50/100
Different results for query Nearest(MultiDense(MultiDenseVector { inner_vector: [0.7138672, 0.83935547, 0.029037476, 0.31176758, 0.99902344, 0.77685547, 0.17248535, 0.43310547], dim: 8 }))
plain_result = [
    [
        ScoredPointOffset {
            idx: 4441,
            score: 0.9564389,
        },
        ScoredPointOffset {
            idx: 3937,
            score: 0.9531616,
        },
        ScoredPointOffset {
            idx: 4725,
            score: 0.95130134,
        },
    ],
]
index_result = [
    [
        ScoredPointOffset {
            idx: 3937,
            score: 0.9531616,
        },
        ScoredPointOffset {
            idx: 4725,
            score: 0.95130134,
        },
        ScoredPointOffset {
            idx: 3714,
            score: 0.9504344,
        },
    ],
]
Attempt 55/100
Different results for query Nearest(MultiDense(MultiDenseVector { inner_vector: [0.859375, 0.4729004, 0.98583984, 0.9580078, 0.021484375, 0.94091797, 0.15466309, 0.59277344, 0.7260742, 0.55371094, 0.15454102, 0.5761719, 0.29174805, 0.25805664, 0.9667969, 0.10064697, 6.365776e-5, 0.36816406, 0.5390625, 0.114746094, 0.9477539, 0.89941406, 0.7416992, 0.6928711], dim: 8 }))
plain_result = [
    [
        ScoredPointOffset {
            idx: 4245,
            score: 2.7471116,
        },
        ScoredPointOffset {
            idx: 4439,
            score: 2.7394595,
        },
        ScoredPointOffset {
            idx: 991,
            score: 2.7184794,
        },
    ],
]
index_result = [
    [
        ScoredPointOffset {
            idx: 4245,
            score: 2.7471116,
        },
        ScoredPointOffset {
            idx: 4439,
            score: 2.7394595,
        },
        ScoredPointOffset {
            idx: 380,
            score: 2.71755,
        },
    ],
]
Attempt 58/100
Different results for query Nearest(MultiDense(MultiDenseVector { inner_vector: [0.37670898, 0.29370117, 0.93896484, 0.88623047, 0.051818848, 0.18640137, 0.9238281, 0.79248047, 0.45922852, 0.87890625, 0.8364258, 0.9121094, 0.88183594, 0.40649414, 0.1430664, 0.7480469], dim: 8 }))
plain_result = [
    [
        ScoredPointOffset {
            idx: 2058,
            score: 1.904221,
        },
        ScoredPointOffset {
            idx: 4938,
            score: 1.9023893,
        },
        ScoredPointOffset {
            idx: 4893,
            score: 1.8658946,
        },
    ],
]
index_result = [
    [
        ScoredPointOffset {
            idx: 4938,
            score: 1.9023893,
        },
        ScoredPointOffset {
            idx: 4893,
            score: 1.8658946,
        },
        ScoredPointOffset {
            idx: 4368,
            score: 1.8546026,
        },
    ],
]
Attempt 65/100
Different results for query Nearest(MultiDense(MultiDenseVector { inner_vector: [0.13513184, 0.30639648, 0.59521484, 0.17883301, 0.23840332, 0.4970703, 0.8330078, 0.40942383, 0.98046875, 0.8076172, 0.35717773, 0.82714844, 0.81152344, 0.26879883, 0.2861328, 0.2619629], dim: 8 }))
plain_result = [
    [
        ScoredPointOffset {
            idx: 4088,
            score: 1.8684545,
        },
        ScoredPointOffset {
            idx: 2048,
            score: 1.8681743,
        },
        ScoredPointOffset {
            idx: 4096,
            score: 1.856564,
        },
    ],
]
index_result = [
    [
        ScoredPointOffset {
            idx: 4088,
            score: 1.8684545,
        },
        ScoredPointOffset {
            idx: 2048,
            score: 1.8681743,
        },
        ScoredPointOffset {
            idx: 2899,
            score: 1.8541797,
        },
    ],
]
Attempt 66/100
Different results for query Nearest(MultiDense(MultiDenseVector { inner_vector: [0.6855469, 0.53515625, 0.5678711, 0.33642578, 0.5786133, 0.85595703, 0.7636719, 0.7338867, 0.8798828, 0.8432617, 0.3034668, 0.66259766, 0.61376953, 0.7651367, 0.16027832, 0.28930664, 0.8984375, 0.3359375, 0.12756348, 0.79052734, 0.66015625, 0.5678711, 0.5527344, 0.5541992], dim: 8 }))
plain_result = [
    [
        ScoredPointOffset {
            idx: 2514,
            score: 2.8699865,
        },
        ScoredPointOffset {
            idx: 2786,
            score: 2.8505325,
        },
        ScoredPointOffset {
            idx: 921,
            score: 2.8490894,
        },
    ],
]
index_result = [
    [
        ScoredPointOffset {
            idx: 2786,
            score: 2.8505325,
        },
        ScoredPointOffset {
            idx: 921,
            score: 2.8490894,
        },
        ScoredPointOffset {
            idx: 652,
            score: 2.8434973,
        },
    ],
]
Attempt 72/100
Different results for query Nearest(MultiDense(MultiDenseVector { inner_vector: [0.5805664, 0.31298828, 0.84375, 0.4501953, 0.95654297, 0.8383789, 0.5151367, 0.38745117, 0.6152344, 0.3684082, 0.92822266, 0.31274414, 0.72998047, 0.026260376, 0.40649414, 0.12365723, 0.59521484, 0.7363281, 0.96728516, 0.66845703, 0.9526367, 0.36547852, 0.74902344, 0.6269531], dim: 8 }))
plain_result = [
    [
        ScoredPointOffset {
            idx: 3301,
            score: 2.8761802,
        },
        ScoredPointOffset {
            idx: 3343,
            score: 2.8659706,
        },
        ScoredPointOffset {
            idx: 3162,
            score: 2.8596756,
        },
    ],
]
index_result = [
    [
        ScoredPointOffset {
            idx: 3301,
            score: 2.8761802,
        },
        ScoredPointOffset {
            idx: 3162,
            score: 2.8596756,
        },
        ScoredPointOffset {
            idx: 4868,
            score: 2.8552175,
        },
    ],
]
Attempt 73/100
Different results for query Nearest(MultiDense(MultiDenseVector { inner_vector: [0.5786133, 0.3178711, 0.13366699, 0.055419922, 0.35107422, 0.43310547, 0.34814453, 0.93066406, 0.6152344, 0.26904297, 0.9160156, 0.39892578, 0.09942627, 0.8754883, 0.35302734, 0.5683594, 0.32348633, 0.7817383, 0.50341797, 0.4868164, 0.90771484, 0.9321289, 0.0026111603, 0.39233398], dim: 8 }))
plain_result = [
    [
        ScoredPointOffset {
            idx: 663,
            score: 2.7315269,
        },
        ScoredPointOffset {
            idx: 4420,
            score: 2.7252853,
        },
        ScoredPointOffset {
            idx: 1003,
            score: 2.7221532,
        },
    ],
]
index_result = [
    [
        ScoredPointOffset {
            idx: 4420,
            score: 2.7252853,
        },
        ScoredPointOffset {
            idx: 1003,
            score: 2.7221532,
        },
        ScoredPointOffset {
            idx: 2100,
            score: 2.7196643,
        },
    ],
]
Attempt 74/100
Different results for query Nearest(MultiDense(MultiDenseVector { inner_vector: [0.09844971, 0.11846924, 0.36328125, 0.5419922, 0.8515625, 0.7758789, 0.8769531, 0.48266602], dim: 8 }))
plain_result = [
    [
        ScoredPointOffset {
            idx: 1866,
            score: 0.9925824,
        },
        ScoredPointOffset {
            idx: 3966,
            score: 0.9693217,
        },
        ScoredPointOffset {
            idx: 2309,
            score: 0.9677066,
        },
    ],
]
index_result = [
    [
        ScoredPointOffset {
            idx: 1866,
            score: 0.9925824,
        },
        ScoredPointOffset {
            idx: 2309,
            score: 0.9677066,
        },
        ScoredPointOffset {
            idx: 2144,
            score: 0.96745735,
        },
    ],
]
Attempt 80/100
Different results for query Nearest(MultiDense(MultiDenseVector { inner_vector: [0.0793457, 0.8457031, 0.8310547, 0.79248047, 0.54541016, 0.3569336, 0.33984375, 0.7207031, 0.1303711, 0.105407715, 0.010925293, 0.6542969, 0.15966797, 0.32299805, 0.9589844, 0.099609375], dim: 8 }))
plain_result = [
    [
        ScoredPointOffset {
            idx: 676,
            score: 1.8166734,
        },
        ScoredPointOffset {
            idx: 1019,
            score: 1.803344,
        },
        ScoredPointOffset {
            idx: 3779,
            score: 1.8014495,
        },
    ],
]
index_result = [
    [
        ScoredPointOffset {
            idx: 676,
            score: 1.8166734,
        },
        ScoredPointOffset {
            idx: 3779,
            score: 1.8014495,
        },
        ScoredPointOffset {
            idx: 2969,
            score: 1.7952074,
        },
    ],
]
Attempt 81/100
Different results for query Nearest(MultiDense(MultiDenseVector { inner_vector: [0.19250488, 0.0007147789, 0.46972656, 0.99853516, 0.95703125, 0.26611328, 0.7324219, 0.88623047, 0.4165039, 0.5083008, 0.6743164, 0.6894531, 0.25390625, 0.24951172, 0.71484375, 0.060424805], dim: 8 }))
plain_result = [
    [
        ScoredPointOffset {
            idx: 969,
            score: 1.8702811,
        },
        ScoredPointOffset {
            idx: 248,
            score: 1.8697289,
        },
        ScoredPointOffset {
            idx: 2413,
            score: 1.8559461,
        },
    ],
]
index_result = [
    [
        ScoredPointOffset {
            idx: 969,
            score: 1.8702811,
        },
        ScoredPointOffset {
            idx: 2413,
            score: 1.8559461,
        },
        ScoredPointOffset {
            idx: 4258,
            score: 1.8542054,
        },
    ],
]
Attempt 95/100
Different results for query Nearest(MultiDense(MultiDenseVector { inner_vector: [0.08282471, 0.484375, 0.42919922, 0.25439453, 0.9116211, 0.41479492, 0.90185547, 0.57958984, 0.0982666, 0.56689453, 0.93310547, 0.71240234, 0.27905273, 0.1616211, 0.45898438, 0.07409668], dim: 8 }))
plain_result = [
    [
        ScoredPointOffset {
            idx: 2778,
            score: 1.8759599,
        },
        ScoredPointOffset {
            idx: 2277,
            score: 1.842542,
        },
        ScoredPointOffset {
            idx: 1232,
            score: 1.838277,
        },
    ],
]
index_result = [
    [
        ScoredPointOffset {
            idx: 2277,
            score: 1.842542,
        },
        ScoredPointOffset {
            idx: 1232,
            score: 1.838277,
        },
        ScoredPointOffset {
            idx: 3427,
            score: 1.8320321,
        },
    ],
]
Attempt 96/100
Different results for query Nearest(MultiDense(MultiDenseVector { inner_vector: [0.027359009, 0.97216797, 0.6635742, 0.45288086, 0.80908203, 0.93115234, 0.15222168, 0.52246094, 0.0040245056, 0.0063552856, 0.7363281, 0.29711914, 0.71728516, 0.6347656, 0.7788086, 0.5234375, 0.78027344, 0.49023438, 0.24621582, 0.45751953, 0.5551758, 0.5341797, 0.09307861, 0.62841797], dim: 8 }))
plain_result = [
    [
        ScoredPointOffset {
            idx: 3637,
            score: 2.792126,
        },
        ScoredPointOffset {
            idx: 527,
            score: 2.7825103,
        },
        ScoredPointOffset {
            idx: 2211,
            score: 2.7713032,
        },
    ],
]
index_result = [
    [
        ScoredPointOffset {
            idx: 3637,
            score: 2.792126,
        },
        ScoredPointOffset {
            idx: 527,
            score: 2.7825103,
        },
        ScoredPointOffset {
            idx: 483,
            score: 2.7536678,
        },
    ],
]
thread 'multivector_filtrable_hnsw_test::test_multi_filterable_hnsw::case_2_nearest_multi' panicked at lib/segment/tests/integration/multivector_filtrable_hnsw_test.rs:266:5:
hits: 78 of 100

---- multivector_filtrable_hnsw_test::test_multi_filterable_hnsw::case_4_discovery_multi stdout ----
Attempt 1/100
Different results for query Discovery(DiscoveryQuery { target: MultiDense(MultiDenseVector { inner_vector: [0.4873047, 0.55908203, 0.86376953, 0.079956055, 0.92578125, 0.68408203, 0.20483398, 0.89453125], dim: 8 }), pairs: [ContextPair { positive: MultiDense(MultiDenseVector { inner_vector: [0.48217773, 0.30444336, 0.45922852, 0.45776367, 0.7055664, 0.9379883, 0.32983398, 0.7060547], dim: 8 }), negative: MultiDense(MultiDenseVector { inner_vector: [0.45629883, 0.13317871, 0.6508789, 0.42285156, 0.13061523, 0.9433594, 0.20117188, 0.5810547], dim: 8 }) }, ContextPair { positive: MultiDense(MultiDenseVector { inner_vector: [0.9189453, 0.57177734, 0.3010254, 0.072387695, 0.77197266, 0.92626953, 0.8847656, 0.21533203], dim: 8 }), negative: MultiDense(MultiDenseVector { inner_vector: [0.8745117, 0.20471191, 0.37353516, 0.92871094, 0.8173828, 0.13183594, 0.7290039, 0.6855469], dim: 8 }) }, ContextPair { positive: MultiDense(MultiDenseVector { inner_vector: [0.10723877, 0.72265625, 0.9980469, 0.5527344, 0.6196289, 0.5834961, 0.67822266, 0.0024738312], dim: 8 }), negative: MultiDense(MultiDenseVector { inner_vector: [0.031799316, 0.39404297, 0.49023438, 0.12878418, 0.18945313, 0.9902344, 0.5131836, 0.17480469], dim: 8 }) }] })
plain_result = [
    [
        ScoredPointOffset {
            idx: 3438,
            score: 3.7462113,
        },
        ScoredPointOffset {
            idx: 1135,
            score: 3.7461221,
        },
        ScoredPointOffset {
            idx: 3975,
            score: 3.7454176,
        },
    ],
]
index_result = [
    [
        ScoredPointOffset {
            idx: 3438,
            score: 3.7462113,
        },
        ScoredPointOffset {
            idx: 3975,
            score: 3.7454176,
        },
        ScoredPointOffset {
            idx: 1950,
            score: 3.7443066,
        },
    ],
]
Attempt 6/100
Different results for query Discovery(DiscoveryQuery { target: MultiDense(MultiDenseVector { inner_vector: [0.9746094, 0.7919922, 0.69921875, 0.3581543, 0.6323242, 0.29956055, 0.5864258, 0.9819336, 0.58740234, 0.53564453, 0.23730469, 0.16015625, 0.6303711, 0.7402344, 0.45239258, 0.21520996, 0.80615234, 0.9604492, 0.9614258, 0.39624023, 0.55810547, 0.11651611, 0.42333984, 0.0063056946], dim: 8 }), pairs: [ContextPair { positive: MultiDense(MultiDenseVector { inner_vector: [0.9663086, 0.47729492, 0.6323242, 0.359375, 0.875, 0.49316406, 0.17700195, 0.45483398, 0.1361084, 0.09655762, 0.26611328, 0.5732422, 0.88916016, 0.8544922, 0.101989746, 0.7236328, 0.1451416, 0.7753906, 0.12408447, 0.19384766, 0.27148438, 0.16088867, 0.060455322, 0.5830078], dim: 8 }), negative: MultiDense(MultiDenseVector { inner_vector: [0.6044922, 0.55859375, 0.8774414, 0.6191406, 0.52197266, 0.38549805, 0.6010742, 0.8774414, 0.65283203, 0.65283203, 0.21838379, 0.3942871, 0.79248047, 0.27319336, 0.87060547, 0.7363281, 0.033966064, 0.47875977, 0.703125, 0.5214844, 0.48461914, 0.4807129, 0.3864746, 0.85253906], dim: 8 }) }, ContextPair { positive: MultiDense(MultiDenseVector { inner_vector: [0.2878418, 0.60839844, 0.43554688, 0.94628906, 0.32348633, 0.9394531, 0.84521484, 0.62060547, 0.61328125, 0.73876953, 0.74902344, 0.4428711, 0.46118164, 0.10357666, 0.74365234, 0.8535156, 0.43139648, 0.11968994, 0.43481445, 0.18225098, 0.7104492, 0.52978516, 0.83496094, 0.9951172], dim: 8 }), negative: MultiDense(MultiDenseVector { inner_vector: [0.70166016, 0.4963379, 0.9423828, 0.8989258, 0.7363281, 0.7158203, 0.09686279, 0.93652344, 0.20605469, 0.58496094, 0.06036377, 0.25439453, 0.33740234, 0.41967773, 0.22302246, 0.9116211, 0.5961914, 0.36254883, 0.9116211, 0.2421875, 0.4975586, 0.7392578, 0.031677246, 0.45410156], dim: 8 }) }, ContextPair { positive: MultiDense(MultiDenseVector { inner_vector: [0.77734375, 0.14379883, 0.024124146, 0.17602539, 0.47802734, 0.75634766, 0.5595703, 0.34106445, 0.33935547, 0.68896484, 0.7392578, 0.072265625, 0.64208984, 0.9248047, 0.29711914, 0.47631836, 0.5888672, 0.82714844, 0.056518555, 0.41381836, 0.44555664, 0.21801758, 0.6455078, 0.84375], dim: 8 }), negative: MultiDense(MultiDenseVector { inner_vector: [0.2319336, 0.16540527, 0.43164063, 0.7265625, 0.8408203, 0.32495117, 0.28930664, 0.28979492, 0.12054443, 0.06756592, 0.76416016, 0.22521973, 0.06958008, 0.9296875, 0.7841797, 0.23828125, 0.101379395, 0.8676758, 0.07470703, 0.7573242, 0.10888672, 0.11047363, 0.48339844, 0.92871094], dim: 8 }) }] })
plain_result = [
    [
        ScoredPointOffset {
            idx: 4540,
            score: 3.8636541,
        },
        ScoredPointOffset {
            idx: 2227,
            score: 3.862636,
        },
        ScoredPointOffset {
            idx: 4859,
            score: 3.8622217,
        },
    ],
]
index_result = [
    [
        ScoredPointOffset {
            idx: 4540,
            score: 3.8636541,
        },
        ScoredPointOffset {
            idx: 4859,
            score: 3.8622217,
        },
        ScoredPointOffset {
            idx: 2583,
            score: 3.8615427,
        },
    ],
]
Attempt 25/100
Different results for query Discovery(DiscoveryQuery { target: MultiDense(MultiDenseVector { inner_vector: [0.60546875, 0.41723633, 0.71533203, 0.20446777, 0.80566406, 0.57177734, 0.99365234, 0.43554688], dim: 8 }), pairs: [ContextPair { positive: MultiDense(MultiDenseVector { inner_vector: [0.004737854, 0.2536621, 0.4152832, 0.52246094, 0.066345215, 0.24890137, 0.023345947, 0.051696777], dim: 8 }), negative: MultiDense(MultiDenseVector { inner_vector: [0.80078125, 0.43188477, 0.7421875, 0.56591797, 0.04333496, 0.90527344, 0.95751953, 0.38110352], dim: 8 }) }, ContextPair { positive: MultiDense(MultiDenseVector { inner_vector: [0.45654297, 0.5019531, 0.75634766, 0.48510742, 0.75878906, 0.8129883, 0.37841797, 0.7319336], dim: 8 }), negative: MultiDense(MultiDenseVector { inner_vector: [0.45483398, 0.44458008, 0.13171387, 0.33911133, 0.828125, 0.5600586, 0.37524414, 0.984375], dim: 8 }) }] })
plain_result = [
    [
        ScoredPointOffset {
            idx: 2683,
            score: 2.7393134,
        },
        ScoredPointOffset {
            idx: 4477,
            score: 2.7390223,
        },
        ScoredPointOffset {
            idx: 2779,
            score: 2.7387056,
        },
    ],
]
index_result = [
    [
        ScoredPointOffset {
            idx: 4477,
            score: 2.7390223,
        },
        ScoredPointOffset {
            idx: 2779,
            score: 2.7387056,
        },
        ScoredPointOffset {
            idx: 4355,
            score: 2.7386222,
        },
    ],
]
Attempt 38/100
Different results for query Discovery(DiscoveryQuery { target: MultiDense(MultiDenseVector { inner_vector: [0.73779297, 0.041992188, 0.27001953, 0.6279297, 0.7548828, 0.90722656, 0.5566406, 0.8935547], dim: 8 }), pairs: [ContextPair { positive: MultiDense(MultiDenseVector { inner_vector: [0.6533203, 0.90185547, 0.22705078, 0.7167969, 0.3317871, 0.06536865, 0.64404297, 0.17590332], dim: 8 }), negative: MultiDense(MultiDenseVector { inner_vector: [0.7260742, 0.3557129, 0.56689453, 0.18920898, 0.94091797, 0.82421875, 0.9477539, 0.7294922], dim: 8 }) }] })
plain_result = [
    [
        ScoredPointOffset {
            idx: 1690,
            score: 1.7440016,
        },
        ScoredPointOffset {
            idx: 2783,
            score: 1.7424791,
        },
        ScoredPointOffset {
            idx: 1775,
            score: 1.7423124,
        },
    ],
]
index_result = [
    [
        ScoredPointOffset {
            idx: 1690,
            score: 1.7440016,
        },
        ScoredPointOffset {
            idx: 2783,
            score: 1.7424791,
        },
        ScoredPointOffset {
            idx: 376,
            score: 1.7409067,
        },
    ],
]
Attempt 57/100
Different results for query Discovery(DiscoveryQuery { target: MultiDense(MultiDenseVector { inner_vector: [0.034942627, 0.45507813, 0.21411133, 0.4411621, 0.76953125, 0.22705078, 0.6225586, 0.049804688, 0.20324707, 0.05154419, 0.8105469, 0.8574219, 0.070739746, 0.84716797, 0.0803833, 0.08770752], dim: 8 }), pairs: [ContextPair { positive: MultiDense(MultiDenseVector { inner_vector: [0.33325195, 0.41137695, 0.16430664, 0.6152344, 0.044281006, 0.030700684, 0.96728516, 0.31591797, 0.56884766, 0.10180664, 0.625, 0.91796875, 0.26391602, 0.91015625, 0.1697998, 0.48632813], dim: 8 }), negative: MultiDense(MultiDenseVector { inner_vector: [0.6567383, 0.6953125, 0.93847656, 0.4362793, 0.7832031, 0.9453125, 0.45288086, 0.15161133, 0.13745117, 0.65185547, 0.67626953, 0.8569336, 0.44677734, 0.40893555, 0.12670898, 0.24975586], dim: 8 }) }] })
plain_result = [
    [
        ScoredPointOffset {
            idx: 2778,
            score: 1.8203627,
        },
        ScoredPointOffset {
            idx: 237,
            score: 1.8201244,
        },
        ScoredPointOffset {
            idx: 3095,
            score: 1.8164982,
        },
    ],
]
index_result = [
    [
        ScoredPointOffset {
            idx: 237,
            score: 1.8201244,
        },
        ScoredPointOffset {
            idx: 3095,
            score: 1.8164982,
        },
        ScoredPointOffset {
            idx: 1909,
            score: 1.8158437,
        },
    ],
]
Attempt 60/100
Different results for query Discovery(DiscoveryQuery { target: MultiDense(MultiDenseVector { inner_vector: [0.38061523, 0.6201172, 0.79541016, 0.7597656, 0.64501953, 0.46411133, 0.36010742, 0.92871094], dim: 8 }), pairs: [ContextPair { positive: MultiDense(MultiDenseVector { inner_vector: [0.008354187, 0.10662842, 0.9135742, 0.53125, 0.39013672, 0.7480469, 0.15856934, 0.9082031], dim: 8 }), negative: MultiDense(MultiDenseVector { inner_vector: [0.58447266, 0.88623047, 0.82958984, 0.0005412102, 0.7055664, 0.52978516, 0.7026367, 0.38916016], dim: 8 }) }] })
plain_result = [
    [
        ScoredPointOffset {
            idx: 923,
            score: 1.7490454,
        },
        ScoredPointOffset {
            idx: 3287,
            score: 1.7488823,
        },
        ScoredPointOffset {
            idx: 2837,
            score: 1.7477505,
        },
    ],
]
index_result = [
    [
        ScoredPointOffset {
            idx: 923,
            score: 1.7490454,
        },
        ScoredPointOffset {
            idx: 3287,
            score: 1.7488823,
        },
        ScoredPointOffset {
            idx: 1086,
            score: 1.7472086,
        },
    ],
]
Attempt 64/100
Different results for query Discovery(DiscoveryQuery { target: MultiDense(MultiDenseVector { inner_vector: [0.6088867, 0.91552734, 0.2890625, 0.28100586, 0.49780273, 0.17211914, 0.7963867, 0.81103516, 0.62841797, 0.4868164, 0.7705078, 0.9472656, 0.15454102, 0.45947266, 0.16955566, 0.36254883], dim: 8 }), pairs: [ContextPair { positive: MultiDense(MultiDenseVector { inner_vector: [0.6074219, 0.8857422, 0.46313477, 0.23876953, 0.8803711, 0.8027344, 0.3876953, 0.7260742, 0.088256836, 0.83984375, 0.013572693, 0.75683594, 0.72802734, 0.48583984, 0.3334961, 0.59277344], dim: 8 }), negative: MultiDense(MultiDenseVector { inner_vector: [0.4169922, 0.64990234, 0.6323242, 0.28125, 0.4345703, 0.4296875, 0.16589355, 0.41967773, 0.19873047, 0.0803833, 0.072631836, 0.12438965, 0.9892578, 0.51708984, 0.53564453, 0.7944336], dim: 8 }) }, ContextPair { positive: MultiDense(MultiDenseVector { inner_vector: [0.6972656, 0.7910156, 0.13696289, 0.72216797, 0.11505127, 0.0993042, 0.9482422, 0.32617188, 0.4128418, 0.078308105, 0.92529297, 0.7993164, 0.7260742, 0.84472656, 0.3671875, 0.03756714], dim: 8 }), negative: MultiDense(MultiDenseVector { inner_vector: [0.33764648, 0.14001465, 0.42456055, 0.10583496, 0.3479004, 0.88378906, 0.9765625, 0.73291016, 0.69921875, 0.91259766, 0.31518555, 0.0635376, 0.28295898, 0.12841797, 0.78808594, 0.20373535], dim: 8 }) }, ContextPair { positive: MultiDense(MultiDenseVector { inner_vector: [0.9277344, 0.012054443, 0.9824219, 0.2397461, 0.4091797, 0.07312012, 0.3659668, 0.9453125, 0.31958008, 0.36279297, 0.67822266, 0.82128906, 0.8496094, 0.49487305, 0.99316406, 0.4345703], dim: 8 }), negative: MultiDense(MultiDenseVector { inner_vector: [0.7211914, 0.6660156, 0.76660156, 0.28735352, 0.82714844, 0.024169922, 0.67089844, 0.44335938, 0.91796875, 0.3232422, 0.05581665, 0.86328125, 0.064819336, 0.5263672, 0.7109375, 0.18652344], dim: 8 }) }] })
plain_result = [
    [
        ScoredPointOffset {
            idx: 665,
            score: 3.8275838,
        },
        ScoredPointOffset {
            idx: 2156,
            score: 3.8259776,
        },
        ScoredPointOffset {
            idx: 4381,
            score: 3.8242846,
        },
    ],
]
index_result = [
    [
        ScoredPointOffset {
            idx: 665,
            score: 3.8275838,
        },
        ScoredPointOffset {
            idx: 4381,
            score: 3.8242846,
        },
        ScoredPointOffset {
            idx: 190,
            score: 3.8241706,
        },
    ],
]
Attempt 65/100
Different results for query Discovery(DiscoveryQuery { target: MultiDense(MultiDenseVector { inner_vector: [0.36743164, 0.5732422, 0.97021484, 0.6777344, 0.0040664673, 0.07092285, 0.1907959, 0.034118652], dim: 8 }), pairs: [ContextPair { positive: MultiDense(MultiDenseVector { inner_vector: [0.15039063, 0.1239624, 0.32226563, 0.98095703, 0.89941406, 0.28710938, 0.7915039, 0.45922852], dim: 8 }), negative: MultiDense(MultiDenseVector { inner_vector: [0.8359375, 0.5527344, 0.66552734, 0.12854004, 0.16052246, 0.54785156, 0.2319336, 0.16564941], dim: 8 }) }, ContextPair { positive: MultiDense(MultiDenseVector { inner_vector: [0.6357422, 0.54052734, 0.59277344, 0.14978027, 0.5258789, 0.7265625, 0.23852539, 0.65185547], dim: 8 }), negative: MultiDense(MultiDenseVector { inner_vector: [0.95654297, 0.22192383, 0.6894531, 0.9926758, 0.6713867, 0.36279297, 0.2734375, 0.5131836], dim: 8 }) }] })
plain_result = [
    [
        ScoredPointOffset {
            idx: 1232,
            score: 2.7387373,
        },
        ScoredPointOffset {
            idx: 3427,
            score: 2.73557,
        },
        ScoredPointOffset {
            idx: 120,
            score: 2.7323992,
        },
    ],
]
index_result = [
    [
        ScoredPointOffset {
            idx: 1232,
            score: 2.7387373,
        },
        ScoredPointOffset {
            idx: 120,
            score: 2.7323992,
        },
        ScoredPointOffset {
            idx: 573,
            score: 2.7322698,
        },
    ],
]
Attempt 67/100
Different results for query Discovery(DiscoveryQuery { target: MultiDense(MultiDenseVector { inner_vector: [0.82421875, 0.38305664, 0.19787598, 0.7475586, 0.44384766, 0.17614746, 0.97216797, 0.39770508], dim: 8 }), pairs: [ContextPair { positive: MultiDense(MultiDenseVector { inner_vector: [0.37280273, 0.08905029, 0.64990234, 0.94091797, 0.20288086, 0.5097656, 0.043884277, 0.5859375], dim: 8 }), negative: MultiDense(MultiDenseVector { inner_vector: [0.17224121, 0.9296875, 0.16430664, 0.5136719, 0.22644043, 0.43603516, 0.30566406, 0.4819336], dim: 8 }) }, ContextPair { positive: MultiDense(MultiDenseVector { inner_vector: [0.83154297, 0.5576172, 0.3322754, 0.5888672, 0.17687988, 0.05493164, 0.15539551, 0.4008789], dim: 8 }), negative: MultiDense(MultiDenseVector { inner_vector: [0.4477539, 0.6743164, 0.5834961, 0.9555664, 0.4814453, 0.7548828, 0.65966797, 0.57666016], dim: 8 }) }, ContextPair { positive: MultiDense(MultiDenseVector { inner_vector: [0.7504883, 0.31274414, 0.46191406, 0.5107422, 0.7324219, 0.8881836, 0.2290039, 0.10461426], dim: 8 }), negative: MultiDense(MultiDenseVector { inner_vector: [0.4794922, 0.13122559, 0.6074219, 0.3774414, 0.7182617, 0.55566406, 0.87841797, 0.12866211], dim: 8 }) }] })
plain_result = [
    [
        ScoredPointOffset {
            idx: 3523,
            score: 3.7398002,
        },
        ScoredPointOffset {
            idx: 4688,
            score: 3.7387486,
        },
        ScoredPointOffset {
            idx: 4283,
            score: 3.7387264,
        },
    ],
]
index_result = [
    [
        ScoredPointOffset {
            idx: 3523,
            score: 3.7398002,
        },
        ScoredPointOffset {
            idx: 4688,
            score: 3.7387486,
        },
        ScoredPointOffset {
            idx: 3922,
            score: 3.738053,
        },
    ],
]
Attempt 70/100
Different results for query Discovery(DiscoveryQuery { target: MultiDense(MultiDenseVector { inner_vector: [0.35180664, 0.31030273, 0.59521484, 0.7084961, 0.07598877, 0.60058594, 0.1772461, 0.7451172, 0.70410156, 0.90478516, 0.67041016, 0.6699219, 0.5942383, 0.94677734, 0.17346191, 0.77246094], dim: 8 }), pairs: [ContextPair { positive: MultiDense(MultiDenseVector { inner_vector: [0.19958496, 0.11401367, 0.30444336, 0.16748047, 0.38989258, 0.65966797, 0.95458984, 0.23730469, 0.9628906, 0.90185547, 0.97216797, 0.017120361, 0.24169922, 0.50683594, 0.75927734, 0.34887695], dim: 8 }), negative: MultiDense(MultiDenseVector { inner_vector: [0.65234375, 0.9736328, 0.23730469, 0.47509766, 0.51904297, 0.24987793, 0.7314453, 0.62060547, 0.70947266, 0.22241211, 0.26464844, 0.44555664, 0.25268555, 0.22375488, 0.14221191, 0.3857422], dim: 8 }) }, ContextPair { positive: MultiDense(MultiDenseVector { inner_vector: [0.47143555, 0.52978516, 0.85595703, 0.5161133, 0.019042969, 0.3413086, 0.9008789, 0.18737793, 0.49902344, 0.8803711, 0.040161133, 0.875, 0.50439453, 0.21166992, 0.6044922, 0.60546875], dim: 8 }), negative: MultiDense(MultiDenseVector { inner_vector: [0.4892578, 0.8989258, 0.11212158, 0.25683594, 0.47216797, 0.47143555, 0.17687988, 0.828125, 0.37451172, 0.20397949, 0.6743164, 0.8666992, 0.93408203, 0.3059082, 0.2397461, 0.08679199], dim: 8 }) }] })
plain_result = [
    [
        ScoredPointOffset {
            idx: 4030,
            score: 2.827286,
        },
        ScoredPointOffset {
            idx: 2344,
            score: 2.826961,
        },
        ScoredPointOffset {
            idx: 185,
            score: 2.8254824,
        },
    ],
]
index_result = [
    [
        ScoredPointOffset {
            idx: 2344,
            score: 2.826961,
        },
        ScoredPointOffset {
            idx: 185,
            score: 2.8254824,
        },
        ScoredPointOffset {
            idx: 3391,
            score: 2.8248582,
        },
    ],
]
Attempt 76/100
Different results for query Discovery(DiscoveryQuery { target: MultiDense(MultiDenseVector { inner_vector: [0.15881348, 0.9296875, 0.06628418, 0.9902344, 0.6196289, 0.056152344, 0.87353516, 0.89404297], dim: 8 }), pairs: [ContextPair { positive: MultiDense(MultiDenseVector { inner_vector: [0.6616211, 0.17871094, 0.01890564, 0.78027344, 0.26367188, 0.09887695, 0.14111328, 0.55371094], dim: 8 }), negative: MultiDense(MultiDenseVector { inner_vector: [0.44213867, 0.8515625, 0.73535156, 0.38208008, 0.91259766, 0.37963867, 0.20483398, 0.87890625], dim: 8 }) }, ContextPair { positive: MultiDense(MultiDenseVector { inner_vector: [0.62060547, 0.7373047, 0.038635254, 0.5800781, 0.22521973, 0.42407227, 0.03491211, 0.33569336], dim: 8 }), negative: MultiDense(MultiDenseVector { inner_vector: [0.10357666, 0.6435547, 0.47143555, 0.10876465, 0.25048828, 0.87890625, 0.018615723, 0.93115234], dim: 8 }) }, ContextPair { positive: MultiDense(MultiDenseVector { inner_vector: [0.7290039, 0.42871094, 0.04675293, 0.41333008, 0.9736328, 0.5625, 0.39746094, 0.67578125], dim: 8 }), negative: MultiDense(MultiDenseVector { inner_vector: [0.66796875, 0.21557617, 0.6640625, 0.25, 0.09710693, 0.13110352, 0.12561035, 0.62060547], dim: 8 }) }] })
plain_result = [
    [
        ScoredPointOffset {
            idx: 668,
            score: 3.7445383,
        },
        ScoredPointOffset {
            idx: 1679,
            score: 3.7424307,
        },
        ScoredPointOffset {
            idx: 2139,
            score: 3.7423935,
        },
    ],
]
index_result = [
    [
        ScoredPointOffset {
            idx: 1679,
            score: 3.7424307,
        },
        ScoredPointOffset {
            idx: 2139,
            score: 3.7423935,
        },
        ScoredPointOffset {
            idx: 3311,
            score: 3.7419176,
        },
    ],
]
Attempt 85/100
Different results for query Discovery(DiscoveryQuery { target: MultiDense(MultiDenseVector { inner_vector: [0.38330078, 0.5493164, 0.51904297, 0.24804688, 0.41577148, 0.80371094, 0.6923828, 0.105773926], dim: 8 }), pairs: [ContextPair { positive: MultiDense(MultiDenseVector { inner_vector: [0.98095703, 0.2758789, 0.80126953, 0.9238281, 0.5058594, 0.034332275, 0.6958008, 0.3630371], dim: 8 }), negative: MultiDense(MultiDenseVector { inner_vector: [0.8383789, 0.28686523, 0.45410156, 0.81689453, 0.9663086, 0.43286133, 0.85839844, 0.9111328], dim: 8 }) }, ContextPair { positive: MultiDense(MultiDenseVector { inner_vector: [0.4868164, 0.8876953, 0.17504883, 0.96435547, 0.4519043, 0.5810547, 0.4494629, 0.81689453], dim: 8 }), negative: MultiDense(MultiDenseVector { inner_vector: [0.53515625, 0.29663086, 0.12670898, 0.050750732, 0.8120117, 0.40307617, 0.12573242, 0.41918945], dim: 8 }) }] })
plain_result = [
    [
        ScoredPointOffset {
            idx: 1800,
            score: 2.7446353,
        },
        ScoredPointOffset {
            idx: 3170,
            score: 2.744042,
        },
        ScoredPointOffset {
            idx: 627,
            score: 2.74342,
        },
    ],
]
index_result = [
    [
        ScoredPointOffset {
            idx: 1800,
            score: 2.7446353,
        },
        ScoredPointOffset {
            idx: 3170,
            score: 2.744042,
        },
        ScoredPointOffset {
            idx: 3145,
            score: 2.7432115,
        },
    ],
]
thread 'multivector_filtrable_hnsw_test::test_multi_filterable_hnsw::case_4_discovery_multi' panicked at lib/segment/tests/integration/multivector_filtrable_hnsw_test.rs:266:5:
hits: 88 of 100


failures:
    filtrable_hnsw_test::test_filterable_hnsw::case_1_nearest
    filtrable_hnsw_test::test_filterable_hnsw::case_2_discovery
    filtrable_hnsw_test::test_filterable_hnsw::case_3_recommend
    multivector_filtrable_hnsw_test::test_multi_filterable_hnsw::case_2_nearest_multi
    multivector_filtrable_hnsw_test::test_multi_filterable_hnsw::case_4_discovery_multi
    segment_builder_test::test_building_cancellation
    segment_tests::test_update_named_vector

Copy link

algora-pbc bot commented Apr 12, 2024

💵 To receive payouts, sign up on Algora, link your Github account and connect with Stripe/Alipay.

@generall
Copy link
Member

Hey @charles-r-earp, thanks for the PR!
It seems that this PR changes a lot of internals, it might be quite complicated to review. Would you consider to make it smaller and maybe keep only minimal useful changes?

Also, I noticed that you decided to change VectorElementType, which have large impact on the code of the whole project. We have already tried it here #3373 and it proved to be problematic.

But recently we introduced the generic support over just vector storage #3900 which might me a more desirable approach after all.

P.S.

We are hiring

@charles-r-earp
Copy link
Author

It seems that this PR changes a lot of internals, it might be quite complicated to review. Would you consider to make it smaller and maybe keep only minimal useful changes?

The primary change is adding the f16 feature which switches VectorElementType to f16. Many operations require converting to f32 or u8 which inspired additional traits to ease implementation. For example, many tests use float literals like vec![1.0, 0.0, 0.0, 0.0], which I replaced with [1.0, 0.0, 0.0, 0.0].into_dense_vector().

Also, I noticed that you decided to change VectorElementType, which have large impact on the code of the whole project. We have already tried it here #3373 and it proved to be problematic.

I interpreted #3333 to mean implement exactly that.

But recently we introduced the generic support over just vector storage #3900 which might me a more desirable approach after all.

It seems possible to limit f16 to only segment::vector_storage instead of segment::data_types::vectors::DenseVector, via PrimitiveVectorElement.

Runtime flexibility between storage types is nice. May require refactoring to test both f16 and f32, which is not as easy as a feature gate (though a feature gate might have a lot of redundant tests).

In theory there is a cache advantage to f16, even if it requires conversion to f32 for numerical operations. As you mentioned, this has a large impact that may not be worth it, especially without an initial proof of concept.

It looks like the storage type is hard coded as VectorElementType in several places, for example segment::vector_storage::simple_dense_vector_storage:

pub fn open_simple_dense_vector_storage(
    database: Arc<RwLock<DB>>,
    database_column_name: &str,
    dim: usize,
    distance: Distance,
    stopped: &AtomicBool,
) -> OperationResult<Arc<AtomicRefCell<VectorStorageEnum>>> {
    let storage = open_simple_dense_vector_storage_impl::<VectorElementType>( // <-- could be replaced with a feature gate for f16
        database,
        database_column_name,
        dim,
        distance,
        stopped,
    )?;

    Ok(Arc::new(AtomicRefCell::new(
        VectorStorageEnum::DenseSimple(storage),
    )))
}

Initially it might be easier to feature gate the storage type. Then it could be exposed as a generic function or have an additional argument for selecting the type.

There are still going to be conflicts, as DenseVector and SimpleDenseVectorStorage are defined with VectorElementType. So conversions would be required when inserting or accessing vectors. This should be handled via PrimitiveVectorElement, but doesn't appear to be fully utilized yet.

@generall
Copy link
Member

There are still going to be conflicts, as DenseVector and SimpleDenseVectorStorage are defined with VectorElementType. So conversions would be required when inserting or accessing vectors. This should be handled via PrimitiveVectorElement, but doesn't appear to be fully utilized yet.

my intention was to not expose internal storage type into the interface. So we only do the conversion from f32 into f16 once, when we put the vector into the storage. The main challenge here is to be able to compute distances over f16 vectors directly, avoiding back conversion to f32

@generall
Copy link
Member

closing in favor of #4122

@generall generall closed this May 16, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants