#![allow(dead_code)]
use std::path::PathBuf;
pub fn load_onnx(model_name: &str) -> onnx_ir::ir::OnnxGraph {
load_onnx_with_simplify(model_name, false)
}
pub fn load_onnx_simplified(model_name: &str) -> onnx_ir::ir::OnnxGraph {
load_onnx_with_simplify(model_name, true)
}
fn load_onnx_with_simplify(model_name: &str, simplify: bool) -> onnx_ir::ir::OnnxGraph {
let model_path = get_model_path(model_name);
onnx_ir::OnnxGraphBuilder::new()
.simplify(simplify)
.parse_file(&model_path)
.unwrap_or_else(|e| {
panic!(
"Failed to parse ONNX model '{}': {}",
model_path.display(),
e
)
})
}
pub fn get_model_path(model_name: &str) -> PathBuf {
PathBuf::from(env!("CARGO_MANIFEST_DIR"))
.join("tests")
.join("fixtures")
.join(model_name)
}
pub fn count_nodes<F>(graph: &onnx_ir::ir::OnnxGraph, predicate: F) -> usize
where
F: Fn(&onnx_ir::ir::Node) -> bool,
{
graph.nodes.iter().filter(|n| predicate(n)).count()
}
pub fn count_constant_nodes(graph: &onnx_ir::ir::OnnxGraph) -> usize {
count_nodes(graph, |n| matches!(n, onnx_ir::ir::Node::Constant { .. }))
}
pub fn count_operation_nodes(graph: &onnx_ir::ir::OnnxGraph) -> usize {
graph
.nodes
.iter()
.filter(|n| !matches!(n, onnx_ir::ir::Node::Constant { .. }))
.count()
}
pub fn has_node_type<F>(graph: &onnx_ir::ir::OnnxGraph, predicate: F) -> bool
where
F: Fn(&onnx_ir::ir::Node) -> bool,
{
graph.nodes.iter().any(predicate)
}
pub fn get_input_dtypes(graph: &onnx_ir::ir::OnnxGraph) -> Vec<burn_tensor::DType> {
graph.inputs.iter().map(|inp| inp.ty.elem_type()).collect()
}
pub fn count_outputs_by_type(graph: &onnx_ir::ir::OnnxGraph) -> (usize, usize, usize) {
use onnx_ir::ir::ArgType;
let scalars = graph
.outputs
.iter()
.filter(|out| matches!(out.ty, ArgType::ScalarTensor(_) | ArgType::ScalarNative(_)))
.count();
let shapes = graph
.outputs
.iter()
.filter(|out| matches!(out.ty, ArgType::Shape(_)))
.count();
let tensors = graph
.outputs
.iter()
.filter(|out| matches!(out.ty, ArgType::Tensor(_)))
.count();
(scalars, shapes, tensors)
}