use crate::arena::ArenaKey;
use crate::device::DeviceId;
use crate::dtype::DataType;
use crate::layout::TensorLayout;
use crate::node::NodeId;
use crate::shape::Shape;
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
pub struct ValueId(pub u32);
impl ArenaKey for ValueId {
fn from_raw(raw: u32) -> Self {
ValueId(raw)
}
fn to_raw(self) -> u32 {
self.0
}
}
#[derive(Clone, Debug, PartialEq)]
pub struct Value {
pub id: ValueId,
pub name: Option<String>,
pub dtype: DataType,
pub shape: Shape,
pub layout: TensorLayout,
pub device: Option<DeviceId>,
pub producer: Option<NodeId>,
pub consumers: Vec<NodeId>,
}
impl Value {
pub fn new(id: ValueId, dtype: DataType, shape: Shape) -> Self {
Self {
id,
name: None,
dtype,
shape,
layout: TensorLayout::contiguous(),
device: None,
producer: None,
consumers: Vec::new(),
}
}
pub fn is_source(&self) -> bool {
self.producer.is_none()
}
pub fn rank(&self) -> usize {
self.shape.len()
}
}