Skip to main content

vortex_alp/alp/
ops.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use vortex_array::ArrayView;
5use vortex_array::ExecutionCtx;
6use vortex_array::scalar::Scalar;
7use vortex_array::vtable::OperationsVTable;
8use vortex_error::VortexExpect;
9use vortex_error::VortexResult;
10
11use crate::ALP;
12use crate::ALPArrayExt;
13use crate::ALPArraySlotsExt;
14use crate::ALPFloat;
15use crate::match_each_alp_float_ptype;
16
17impl OperationsVTable<ALP> for ALP {
18    type ProbeState = ();
19
20    fn scalar_at(
21        array: ArrayView<'_, ALP>,
22        index: usize,
23        ctx: &mut ExecutionCtx,
24    ) -> VortexResult<Scalar> {
25        if let Some(patches) = array.patches()
26            && let Some(patch) = patches.get_patched(index)?
27        {
28            return patch.cast(array.dtype());
29        }
30
31        let encoded_val = array.encoded().execute_scalar(index, ctx)?;
32
33        Ok(match_each_alp_float_ptype!(array.dtype().as_ptype(), |T| {
34            let encoded_val: <T as ALPFloat>::ALPInt =
35                (&encoded_val).try_into().vortex_expect("invalid ALPInt");
36            Scalar::primitive(
37                <T as ALPFloat>::decode_single(encoded_val, array.exponents()),
38                array.dtype().nullability(),
39            )
40        }))
41    }
42}