1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
//! Rust binding for [Menoh](https://github.com/pfnet-research/menoh)
//!
//! ## Example
//!
//! ```
//! fn main() -> Result<(), menoh::Error> {
//! let mut model = menoh::Builder::from_onnx("MLP.onnx")?
//! .add_input::<f32>("input", &[2, 3])?
//! .add_output("fc2")?
//! .build("mkldnn", "")?;
//!
//! let (in_dims, in_buf) = model.get_variable_mut::<f32>("input")?;
//! in_buf.copy_from_slice(&[0., 1., 2., 3., 4., 5.]);
//! println!("in:");
//! # assert_eq!(in_dims, &[2, 3]);
//! println!(" dims: {:?}", in_dims);
//! println!(" buf: {:?}", in_buf);
//!
//! model.run()?;
//!
//! let (out_dims, out_buf) = model.get_variable::<f32>("fc2")?;
//! println!("out:");
//! # assert_eq!(out_dims, &[2, 5]);
//! println!(" dims: {:?}", out_dims);
//! println!(" buf: {:?}", out_buf);
//! # let expected = &[0., 0., 15., 96., 177., 0., 0., 51., 312., 573.];
//! # for i in 0..expected.len() {
//! # assert!((out_buf[i] - expected[i]).abs() < 1e-6);
//! # }
//! Ok(())
//! }
//! ```
//!
//! ## Usage
//!
//! ### 1. Build a `Model`.
//!
//! ```
//! # fn main() -> Result<(), menoh::Error> {
//! let mut model = menoh::Builder::from_onnx("MLP.onnx")?
//! // register `"input"` as input
//! // and specify its type (`f32`) and shape (`&[2, 3]`).
//! .add_input::<f32>("input", &[2, 3])?
//! // register `"fc2"` as output.
//! .add_output("fc2")?
//! // specify backend (`"mkldnn"`) and its configuration (`""`).
//! .build("mkldnn", "")?;
//! # Ok(())
//! # }
//! ```
//! Instead of `Builder`, we can use a combination of some low-level APIs.
//! ```
//! # fn main() -> Result<(), menoh::Error> {
//! let mut model_data = menoh::ModelData::from_onnx("MLP.onnx")?;
//!
//! let mut vpt_builder = menoh::VariableProfileTableBuilder::new()?;
//! vpt_builder.add_input::<f32>("input", &[2, 3])?;
//! vpt_builder.add_output("fc2")?;
//! let vpt = vpt_builder.build(&model_data)?;
//!
//! model_data.optimize(&vpt)?;
//! let model_builder = menoh::ModelBuilder::new(&vpt)?;
//! let mut model = model_builder.build(model_data, "mkldnn", "")?;
//! # Ok(())
//! # }
//! ```
//!
//! ### 2. Set data to input variable(s).
//!
//! ```
//! # fn main() -> Result<(), menoh::Error> {
//! # let mut model = menoh::Builder::from_onnx("MLP.onnx")?
//! # .add_input::<f32>("input", &[2, 3])?
//! # .add_output("fc2")?
//! # .build("mkldnn", "")?;
//! // fetch a read/write view of a variable.
//! let (in_dims, in_buf) = model.get_variable_mut::<f32>("input")?;
//! // set data to the variable.
//! in_buf.copy_from_slice(&[0., 1., 2., 3., 4., 5.]);
//! # Ok(())
//! # }
//! ```
//!
//! ### 3. Execute computation.
//!
//! ```
//! # fn main() -> Result<(), menoh::Error> {
//! # let mut model = menoh::Builder::from_onnx("MLP.onnx")?
//! # .add_input::<f32>("input", &[2, 3])?
//! # .add_output("fc2")?
//! # .build("mkldnn", "")?;
//! model.run()?;
//! # Ok(())
//! # }
//! ```
//!
//! ### 4. Fetch the result(s).
//!
//! ```
//! # fn main() -> Result<(), menoh::Error> {
//! # let mut model = menoh::Builder::from_onnx("MLP.onnx")?
//! # .add_input::<f32>("input", &[2, 3])?
//! # .add_output("fc2")?
//! # .build("mkldnn", "")?;
//! // fetch a read-only view of a variable.
//! let (out_dims, out_buf) = model.get_variable::<f32>("fc2")?;
//! // use the data (e.g. print them).
//! println!("{:?}", out_buf);
//! # Ok(())
//! # }
//! ```
pub use Builder;
pub use Dtype;
pub use Error;
pub use Model;
pub use ModelBuilder;
pub use ModelData;
pub use VariableProfileTable;
pub use VariableProfileTableBuilder;