Skip to main content

tract_core/
lib.rs

1#![allow(clippy::len_zero)]
2#![allow(clippy::missing_safety_doc)]
3#![allow(clippy::redundant_closure_call)]
4#![allow(clippy::cloned_ref_to_slice_refs)]
5//! # Tract
6//!
7//! Tiny, no-nonsense, self contained, portable TensorFlow and ONNX inference.
8//!
9//! ## Example
10//!
11//! ```
12//! # extern crate tract_core;
13//! # fn main() {
14//! use tract_core::internal::*;
15//!
16//! // build a simple model that just add 3 to each input component
17//! let mut model = TypedModel::default();
18//!
19//! let input_fact = f32::fact(&[3]);
20//! let input = model.add_source("input", input_fact).unwrap();
21//! let three = model.add_const("three".to_string(), tensor1(&[3f32])).unwrap();
22//! let add = model.wire_node("add".to_string(),
23//!     tract_core::ops::math::add(),
24//!     [input, three].as_ref()
25//!     ).unwrap();
26//!
27//! model.auto_outputs().unwrap();
28//!
29//! // We build an execution plan. Default inputs and outputs are inferred from
30//! // the model graph.
31//! let plan = SimplePlan::new(&model).unwrap();
32//!
33//! // run the computation.
34//! let input = tensor1(&[1.0f32, 2.5, 5.0]);
35//! let mut outputs = plan.run(tvec![input.into()]).unwrap();
36//!
37//! // take the first and only output tensor
38//! let mut tensor = outputs.pop().unwrap();
39//!
40//! assert_eq!(tensor, tensor1(&[4.0f32, 5.5, 8.0]).into());
41//! # }
42//! ```
43//!
44//! While creating a model from Rust code is useful for testing the library,
45//! real-life use-cases will usually load a TensorFlow or ONNX model using
46//! tract-tensorflow or tract-onnx crates.
47//!
48
49#[cfg(feature = "accelerate")]
50extern crate accelerate_src;
51#[cfg(feature = "blis")]
52extern crate blis_src;
53#[cfg(feature = "blas")]
54extern crate cblas;
55#[cfg(feature = "openblas")]
56extern crate openblas_src;
57
58extern crate bit_set;
59#[macro_use]
60extern crate derive_new;
61#[macro_use]
62pub extern crate downcast_rs;
63#[allow(unused_imports)]
64#[macro_use]
65extern crate log;
66#[allow(unused_imports)]
67#[macro_use]
68pub extern crate ndarray;
69#[cfg(test)]
70extern crate env_logger;
71pub extern crate num_traits;
72#[cfg(test)]
73extern crate proptest;
74
75pub extern crate tract_data;
76pub extern crate tract_linalg;
77
78#[macro_use]
79pub mod macros;
80#[macro_use]
81pub mod ops;
82
83pub mod axes;
84pub mod broadcast;
85pub mod floats;
86pub mod framework;
87pub mod model;
88pub mod optim;
89pub mod plan;
90pub mod runtime;
91pub mod transform;
92pub mod value;
93
94pub use dyn_clone;
95
96mod late_bind;
97
98/// This prelude is meant for code using tract.
99pub mod prelude {
100    pub use crate::framework::Framework;
101    pub use crate::model::*;
102    pub use crate::plan::{PlanOptions, SimplePlan, SimpleState};
103    pub use crate::value::{IntoTValue, TValue};
104    pub use std::sync::Arc;
105    pub use tract_data::prelude::*;
106
107    pub use ndarray as tract_ndarray;
108    pub use num_traits as tract_num_traits;
109    pub use tract_data;
110    pub use tract_linalg;
111    pub use tract_linalg::multithread;
112}
113
114/// This prelude is meant for code extending tract (like implementing new ops).
115pub mod internal {
116    pub use crate::axes::{AxesMapping, Axis};
117    pub use crate::late_bind::*;
118    pub use crate::model::*;
119    pub use crate::ops::change_axes::*;
120    pub use crate::ops::element_wise::ElementWiseMiniOp;
121    pub use crate::ops::{Cost, EvalOp, FrozenOpState, Op, OpState, Validation};
122    pub use crate::plan::{SessionState, SessionStateHandler};
123    pub use crate::prelude::*;
124    pub use crate::runtime::{DefaultRuntime, Runnable, Runtime, State};
125    pub use dims;
126    pub use downcast_rs as tract_downcast_rs;
127    pub use std::borrow::Cow;
128    pub use std::collections::HashMap;
129    pub use std::hash::Hash;
130    pub use std::marker::PhantomData;
131    pub use tract_data::internal::*;
132    pub use tract_data::{
133        dispatch_copy, dispatch_datum, dispatch_datum_by_size, dispatch_floatlike, dispatch_numbers,
134    };
135    pub use tvec;
136    pub use {args_1, args_2, args_3, args_4, args_5, args_6, args_7, args_8};
137    pub use {as_op, impl_op_same_as, not_a_typed_op, op_as_typed_op};
138    pub use {bin_to_super_type, element_wise, element_wise_oop};
139}
140
141#[cfg(test)]
142#[allow(dead_code)]
143fn setup_test_logger() {
144    let _ = env_logger::Builder::from_env("TRACT_LOG").try_init();
145}