vortex-alp 0.88.0

Vortex ALP array
Documentation
// SPDX-License-Identifier: Apache-2.0
// SPDX-FileCopyrightText: Copyright the Vortex contributors

use vortex_array::ArrayView;
use vortex_array::ExecutionCtx;
use vortex_array::ProbeState;
use vortex_array::scalar::Scalar;
use vortex_array::vtable::OperationsVTable;
use vortex_error::VortexExpect;
use vortex_error::VortexResult;
use vortex_error::vortex_err;

use crate::ALP;
use crate::ALPArrayExt;
use crate::ALPFloat;
use crate::ALPSlots;
use crate::match_each_alp_float_ptype;

impl OperationsVTable<ALP> for ALP {
    type ProbeState = ();

    fn probe_scalar(
        state: &mut ProbeState<'_, ALP>,
        index: usize,
        ctx: &mut ExecutionCtx,
    ) -> VortexResult<Scalar> {
        if !state.is_valid(index, ctx)? {
            return Ok(Scalar::null(state.array().dtype().clone()));
        }
        let array = state.array();
        if let Some(patches) = array.patches()
            && let Some(patch) = patches.get_patched(index)?
        {
            return patch.cast(array.dtype());
        }

        let encoded_val = state
            .slot(ALPSlots::ENCODED)?
            .ok_or_else(|| vortex_err!("ALP encoded slot is missing"))?
            .execute_scalar(index, ctx)?;

        Ok(match_each_alp_float_ptype!(array.dtype().as_ptype(), |T| {
            let encoded_val: <T as ALPFloat>::ALPInt =
                (&encoded_val).try_into().vortex_expect("invalid ALPInt");
            Scalar::primitive(
                <T as ALPFloat>::decode_single(encoded_val, array.exponents()),
                array.dtype().nullability(),
            )
        }))
    }

    fn scalar_at(
        array: ArrayView<'_, ALP>,
        index: usize,
        ctx: &mut ExecutionCtx,
    ) -> VortexResult<Scalar> {
        Self::probe_scalar(&mut ProbeState::once(array), index, ctx)
    }
}