Skip to main content

ppocr_rs/
compat.rs

1//! Compat shim per la differenza API `try_extract_tensor` tra ort
2//! 2.0.0-rc.9 (qui pinnato) e 2.0.0-rc.11 (paddle-ocr-rs upstream).
3//!
4//! ## Differenza API
5//!
6//! In **rc.11** la firma di `Value::try_extract_tensor::<T>()` ritorna una
7//! tupla `(Vec<i64>, &[T])` con shape e raw slice — pratico ma rotto rispetto
8//! a rc.9.
9//!
10//! In **rc.9** la firma ritorna `Result<ArrayViewD<T>, ort::Error>`. Per
11//! ottenere shape e dati separatamente serve `view.shape().to_vec()` +
12//! `view.iter().copied().collect()` o `into_owned().into_raw_vec()`.
13//!
14//! Questo modulo isola la differenza in un unico punto. `ort rc.9` è la
15//! versione target permanente del workspace (rc.11+ si blocca su ARM64
16//! Snapdragon X Elite), quindi questo shim è stabile e non verrà rimosso.
17
18use ort::value::Value;
19use crate::ocr_error::OcrError;
20
21/// Estrae un tensore f32 come `Vec<f32>`, scartando la shape.
22/// Equivalente al `try_extract_tensor::<f32>()?.1.to_vec()` di rc.11.
23pub fn tensor_to_vec_f32(value: &Value) -> Result<Vec<f32>, OcrError> {
24    let view = value.try_extract_tensor::<f32>()?;
25    Ok(view.iter().copied().collect())
26}
27
28/// Estrae un tensore f32 con la shape (per output di shape variabile).
29/// Equivalente al `let (shape, data) = try_extract_tensor::<f32>()?;` di rc.11.
30///
31/// Ritorna `(shape, data)` con shape già copiata in `Vec<i64>`.
32pub fn tensor_extract_with_shape_f32(value: &Value) -> Result<(Vec<i64>, Vec<f32>), OcrError> {
33    let view = value.try_extract_tensor::<f32>()?;
34    let shape: Vec<i64> = view.shape().iter().map(|&d| d as i64).collect();
35    let data:  Vec<f32> = view.iter().copied().collect();
36    Ok((shape, data))
37}