tract_hir/infer/
mod.rs

1use crate::internal::*;
2
3#[macro_use]
4pub mod helpers;
5#[macro_use]
6pub mod rules;
7
8mod analyser;
9mod fact;
10mod factoid;
11mod model;
12mod ops;
13mod optim;
14
15pub use self::fact::InferenceFact;
16pub use self::factoid::*;
17pub use self::model::InferenceModelExt;
18pub use self::ops::InferenceOp;
19pub use self::rules::expr::IntoExp;
20pub use self::rules::expr::ToDimExp;
21pub use self::rules::InferenceResult;
22pub use self::rules::InferenceRulesOp;
23pub use self::rules::Solver;
24pub use self::rules::TensorProxy;
25pub use wrap;
26
27pub fn check_input_arity(inputs: &[TensorProxy], expected: usize) -> TractResult<()> {
28    if inputs.len() != expected {
29        bail!("Wrong input number. Rules expect {}, node has {}.", expected, inputs.len())
30    } else {
31        Ok(())
32    }
33}
34
35pub fn check_output_arity(outputs: &[TensorProxy], expected: usize) -> TractResult<()> {
36    if outputs.len() != expected {
37        bail!("Wrong output number. Rules expect {}, node has {}.", expected, outputs.len())
38    } else {
39        Ok(())
40    }
41}
42
43/// A model with partially types and shapes, as produced by parsing ONNX or
44/// Tensorflow graphs.
45pub type InferenceModel = Graph<InferenceFact, Box<dyn InferenceOp>>;
46/// Node for InferenceModel graph
47pub type InferenceNode = Node<InferenceFact, Box<dyn InferenceOp>>;
48/// A ModelPatch for InferenceModel.
49pub type InferenceModelPatch = ModelPatch<InferenceFact, Box<dyn InferenceOp>>;
50/// An execution plan for InferenceModel.
51pub type InferenceSimplePlan<M> = SimplePlan<InferenceFact, Box<dyn InferenceOp>, M>;
52/// An execution state for InferenceModel.
53pub type InferenceSimpleState<M, P> = SimpleState<InferenceFact, Box<dyn InferenceOp>, M, P>;
54
55impl<'a> From<&'a Box<dyn InferenceOp>> for Box<dyn InferenceOp> {
56    fn from(it: &'a Box<dyn InferenceOp>) -> Box<dyn InferenceOp> {
57        tract_core::dyn_clone::clone_box(it.as_ref())
58    }
59}