use crate::canonical::AffineModel;
use crate::graph_builder::{assemble_model, make_node, make_tensor, make_value_info, Dimension};
use crate::proto::{GraphProto, ModelProto};
use crate::{IR_VERSION, OPSET_VERSION};
#[must_use]
pub fn export_affine(model: &AffineModel) -> ModelProto {
let matrix = model.matrix.mapv(|value| value as f32);
let bias = model.bias.mapv(|value| value as f32);
let graph = GraphProto {
node: vec![make_node(
"Gemm",
["X", "matrix", "bias"],
["Y"],
Vec::new(),
)],
name: "affine_transform".into(),
initializer: vec![
make_tensor("matrix", &matrix.into_dyn()),
make_tensor("bias", &bias.into_dyn()),
],
doc_string: String::new(),
input: vec![make_value_info(
"X",
&[
Dimension::Symbolic("batch".into()),
Dimension::Fixed(model.n_features()),
],
)],
output: vec![make_value_info(
"Y",
&[
Dimension::Symbolic("batch".into()),
Dimension::Fixed(model.n_outputs()),
],
)],
value_info: Vec::new(),
};
assemble_model(graph, OPSET_VERSION, IR_VERSION)
}