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
8/// Returns (op_id, count)
9pub 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, .. } // Equal to parent cardinality
31            | HydroNode::DeferTick { input, metadata, .. } // Equal to parent cardinality
32            | 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}