tract_core/
runtime.rs

1use std::fmt::Debug;
2
3use crate::internal::*;
4
5pub trait Runtime: Debug {
6    fn name(&self) -> Cow<str>;
7    fn prepare(&self, model: TypedModel) -> TractResult<Box<dyn Runnable>>;
8}
9
10pub trait Runnable: Debug {
11    fn run(&self, inputs: TVec<TValue>) -> TractResult<TVec<TValue>> {
12        self.spawn()?.run(inputs)
13    }
14    fn spawn(&self) -> TractResult<Box<dyn State>>;
15}
16
17pub trait State {
18    fn run(&mut self, inputs: TVec<TValue>) -> TractResult<TVec<TValue>>;
19}
20
21#[derive(Debug)]
22pub struct DefaultRuntime;
23
24impl Runtime for DefaultRuntime {
25    fn name(&self) -> Cow<str> {
26        Cow::Borrowed("default")
27    }
28
29    fn prepare(&self, model: TypedModel) -> TractResult<Box<dyn Runnable>> {
30        Ok(Box::new(Arc::new(model.into_optimized()?.into_runnable()?)))
31    }
32}
33
34impl Runnable for Arc<TypedRunnableModel<TypedModel>> {
35    fn spawn(&self) -> TractResult<Box<dyn State>> {
36        Ok(Box::new(SimpleState::new(self.clone())?))
37    }
38}
39
40impl State for TypedSimpleState<TypedModel, Arc<TypedRunnableModel<TypedModel>>> {
41    fn run(&mut self, inputs: TVec<TValue>) -> TractResult<TVec<TValue>> {
42        self.run(inputs)
43    }
44}