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}