use vortex_array::ArrayRef;
use vortex_array::Canonical;
use vortex_array::ExecutionCtx;
use vortex_array::IntoArray;
use vortex_compressor::estimate::CompressionEstimate;
use vortex_compressor::estimate::DeferredEstimate;
use vortex_error::VortexResult;
use crate::ArrayAndStats;
use crate::CascadingCompressor;
use crate::CompressorContext;
use crate::Scheme;
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub struct PcoScheme;
impl Scheme for PcoScheme {
fn scheme_name(&self) -> &'static str {
"vortex.float.pco"
}
fn matches(&self, canonical: &Canonical) -> bool {
canonical.dtype().is_float()
}
fn expected_compression_ratio(
&self,
_data: &ArrayAndStats,
_compress_ctx: CompressorContext,
_exec_ctx: &mut ExecutionCtx,
) -> CompressionEstimate {
CompressionEstimate::Deferred(DeferredEstimate::Sample)
}
fn compress(
&self,
_compressor: &CascadingCompressor,
data: &ArrayAndStats,
_compress_ctx: CompressorContext,
exec_ctx: &mut ExecutionCtx,
) -> VortexResult<ArrayRef> {
Ok(vortex_pco::Pco::from_primitive(
data.array_as_primitive(),
pco::DEFAULT_COMPRESSION_LEVEL,
8192,
exec_ctx,
)?
.into_array())
}
}