1use super::*;
2use crate::internal::*;
3use crate::ops::Op;
4use tract_itertools::Itertools;
5use std::fmt;
6use std::fmt::{Debug, Display};
7
8#[derive(Debug, Clone)]
13pub struct Node<F: Fact , O> {
14 pub id: usize,
18 pub name: String,
23 pub inputs: Vec<OutletId>,
26 pub op: O,
28 pub outputs: TVec<Outlet<F>>,
30}
31
32impl<F: Fact , O: std::fmt::Display> fmt::Display for Node<F, O> {
33 fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
34 write!(fmt, "#{} \"{}\" {}", self.id, self.name, self.op)
35 }
36}
37
38impl<F, NodeOp> Node<F, NodeOp>
39where
40 F: Fact ,
41 NodeOp: Debug + Display + AsRef<dyn Op> + AsMut<dyn Op> + AsMut<dyn Op> ,
42{
43 pub fn op(&self) -> &dyn Op {
45 self.op.as_ref()
46 }
47
48 pub fn op_as<O: Op>(&self) -> Option<&O> {
50 self.op().downcast_ref::<O>()
51 }
52
53 pub fn op_as_mut<O: Op>(&mut self) -> Option<&mut O> {
55 self.op.as_mut().downcast_mut::<O>()
56 }
57
58 pub fn op_is<O: Op>(&self) -> bool {
60 self.op_as::<O>().is_some()
61 }
62
63 pub fn same_as(&self, other: &Node<F, NodeOp>) -> bool {
65 self.inputs == other.inputs && self.op().same_as(other.op())
66 }
67}
68
69#[derive(Clone, Default)]
71pub struct Outlet<F: Fact > {
72 pub fact: F,
74 pub successors: TVec<InletId>,
76}
77
78impl<F: Fact > fmt::Debug for Outlet<F> {
79 fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
80 write!(
81 fmt,
82 "{:?} {}",
83 self.fact,
84 self.successors.iter().map(|o| format!("{o:?}")).join(" ")
85 )
86 }
87}
88
89#[derive(Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, new)]
95pub struct OutletId {
96 pub node: usize,
98 pub slot: usize,
100}
101
102impl fmt::Debug for OutletId {
103 fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
104 write!(fmt, "{}/{}>", self.node, self.slot)
105 }
106}
107
108impl From<usize> for OutletId {
109 fn from(node: usize) -> OutletId {
110 OutletId::new(node, 0)
111 }
112}
113
114impl From<(usize, usize)> for OutletId {
115 fn from(pair: (usize, usize)) -> OutletId {
116 OutletId::new(pair.0, pair.1)
117 }
118}
119
120#[derive(Clone, Copy, PartialEq, Eq, Hash, new, Ord, PartialOrd)]
122pub struct InletId {
123 pub node: usize,
125 pub slot: usize,
127}
128
129impl fmt::Debug for InletId {
130 fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
131 write!(fmt, ">{}/{}", self.node, self.slot)
132 }
133}