use super::NodeRef;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Requirement {
Grad,
GradInBackward,
None,
}
impl Requirement {
pub fn is_none(&self) -> bool {
matches!(self, Self::None)
}
pub fn from_nodes(nodes: &[NodeRef]) -> Self {
if nodes.len() == 1 {
return nodes[0].requirement.infer(&Requirement::None);
}
nodes
.iter()
.map(|node| node.requirement)
.reduce(|acc, requirement| requirement.infer(&acc))
.unwrap_or(Requirement::None)
}
fn infer(&self, other: &Self) -> Self {
match self.is_none() && other.is_none() {
true => Self::None,
false => Self::GradInBackward,
}
}
}