hydro_lang/rewrites/
analyze_counter.rs
1use std::collections::HashMap;
2
3use regex::Regex;
4
5use crate::ir::*;
6pub use crate::runtime_support::resource_measurement::COUNTER_PREFIX;
7
8pub fn parse_counter_usage(measurement: String) -> (usize, usize) {
10 let regex = Regex::new(r"\((\d+)\): (\d+)").unwrap();
11 let matches = regex.captures_iter(&measurement).last().unwrap();
12 let op_id = matches[1].parse::<usize>().unwrap();
13 let count = matches[2].parse::<usize>().unwrap();
14 (op_id, count)
15}
16
17fn inject_count_node(
18 node: &mut HydroNode,
19 next_stmt_id: &mut usize,
20 op_to_count: &HashMap<usize, usize>,
21) {
22 if let Some(count) = op_to_count.get(next_stmt_id) {
23 let metadata = node.metadata_mut();
24 metadata.cardinality = Some(*count);
25 } else {
26 match node {
27 HydroNode::Tee { inner ,metadata, .. } => {
28 metadata.cardinality = inner.0.borrow().metadata().cardinality;
29 }
30 | HydroNode::Map { input, metadata, .. } | HydroNode::DeferTick { input, metadata, .. } | HydroNode::Enumerate { input, metadata, .. }
33 | HydroNode::Inspect { input, metadata, .. }
34 | HydroNode::Sort { input, metadata, .. }
35 | HydroNode::Counter { input, metadata, .. }
36 => {
37 metadata.cardinality = input.metadata().cardinality;
38 }
39 _ => {}
40 }
41 }
42}
43
44pub fn inject_count(ir: &mut [HydroLeaf], op_to_count: &HashMap<usize, usize>) {
45 traverse_dfir(
46 ir,
47 |_, _| {},
48 |node, next_stmt_id| {
49 inject_count_node(node, next_stmt_id, op_to_count);
50 },
51 );
52}