Skip to main content

runmat_analysis_core/
field.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
4pub struct DeviceFieldRef {
5    pub backend: String,
6    pub token: String,
7    pub element_count: usize,
8}
9
10#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
11#[serde(rename_all = "snake_case")]
12pub enum AnalysisFieldValues {
13    HostF64(Vec<f64>),
14    DeviceRef(DeviceFieldRef),
15}
16
17#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
18pub struct AnalysisField {
19    pub field_id: String,
20    pub shape: Vec<usize>,
21    pub values: AnalysisFieldValues,
22}
23
24impl AnalysisField {
25    pub fn host_f64(field_id: impl Into<String>, shape: Vec<usize>, values: Vec<f64>) -> Self {
26        Self {
27            field_id: field_id.into(),
28            shape,
29            values: AnalysisFieldValues::HostF64(values),
30        }
31    }
32
33    pub fn element_count(&self) -> usize {
34        self.shape.iter().product()
35    }
36
37    pub fn is_empty(&self) -> bool {
38        self.element_count() == 0
39    }
40
41    pub fn as_host_f64(&self) -> Option<&[f64]> {
42        match &self.values {
43            AnalysisFieldValues::HostF64(values) => Some(values.as_slice()),
44            AnalysisFieldValues::DeviceRef(_) => None,
45        }
46    }
47}