hydro2_network/
network.rs1crate::ix!();
3
4#[derive(Default,Builder,MutGetters,Setters,Getters,Debug,Clone)]
6#[getset(get="pub",set = "pub", get_mut = "pub")]
7#[builder(setter(into))]
8pub struct Network<NetworkItem>
9where NetworkItem: Debug + Send + Sync
10{
11 nodes: Vec<NetworkNode<NetworkItem>>,
13 edges: Vec<NetworkEdge>,
15}
16
17impl<NetworkItem> Network<NetworkItem>
18where NetworkItem: Debug + Send + Sync
19{
20 pub fn clear(&mut self) {
21 self.nodes.clear();
22 self.edges.clear();
23 }
24}
25
26#[macro_export]
27macro_rules! network {
28 ($nodes:expr, $edges:expr) => {{
29 let mut net = NetworkBuilder::default()
30 .nodes($nodes)
31 .edges($edges)
32 .build()
33 .unwrap();
34
35 if let Err(e) = net.validate() {
37 panic!("network validation saw an error: {:#?}", e);
38 }
39
40 if let Err(e) = wire_up_network(&mut net) {
42 panic!("network wiring saw an error: {:#?}", e);
43 }
44
45 net
46 }};
47}
48
49#[cfg(test)]
50mod network_macro_tests {
51 use super::*;
52
53 #[test]
54 fn test_network_macro_basic() -> Result<(), NetworkError> {
55 let n0: NetworkNode<TestWireIO<i32>> = node!(0 => ConstantOp::new(100));
57 let n1: NetworkNode<TestWireIO<i32>> = node!(1 => AddOp::new(42));
58 let e0 = edge!(0:0 -> 1:0);
59
60 let net = network!(vec![n0, n1], vec![e0]);
62 assert_eq!(net.nodes().len(), 2);
69 assert_eq!(net.edges().len(), 1);
70
71 assert!(net.nodes()[0].outputs()[0].is_some());
73 assert!(net.nodes()[1].inputs()[0].is_some());
75
76 Ok(())
77 }
78
79 #[test]
80 fn test_network_macro_fanout() -> Result<(), NetworkError> {
81 let cst: NetworkNode<TestWireIO<i32>> = node!(0 => ConstantOp::new(10));
82 let aop: NetworkNode<TestWireIO<i32>> = node!(1 => AddOp::new(5));
83 let mop: NetworkNode<TestWireIO<i32>> = node!(2 => MultiplyOp::new(2));
84 let net = network!(
85 vec![cst, aop, mop],
86 vec![
87 edge!(0:0 -> 1:0),
88 edge!(0:0 -> 2:0),
89 ]
90 );
91 Ok(())
93 }
94
95 #[test]
96 #[should_panic(expected = "Cycle detected")]
97 fn test_network_macro_cycle_panics() {
98 let n0: NetworkNode<TestWireIO<i32>> = node!(0 => NoOpOperator::default());
100 let n1: NetworkNode<TestWireIO<i32>> = node!(1 => NoOpOperator::default());
101 let _ = network!(
103 vec![n0, n1],
104 vec![
105 edge!(0:0 -> 1:0),
106 edge!(1:0 -> 0:0),
107 ]
108 );
109 }
110}