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
use crate::infer::*; use std::fmt; pub fn incorporate() -> Vec<Box<dyn IncorporatePass>> { vec![Box::new(IncorporateOps)] } pub trait IncorporatePass: fmt::Debug + Send + Sync { fn pass(&self, model: &mut InferenceModel) -> TractResult<bool>; } #[derive(Debug)] pub struct IncorporateOps; impl IncorporatePass for IncorporateOps { fn pass(&self, model: &mut InferenceModel) -> TractResult<bool> { let mut done_something = false; loop { let mut done_something_this_time = false; for id in model.eval_order()? { let reduced = { let node = &model.nodes()[id]; trace!("Incorporate {}", node); node.op .incorporate(model, node) .with_context(|| format!("{:?} node {}", self, node))? }; if let Some(red) = reduced { { let node = &model.nodes()[id]; debug!("Apply a model patch for {:?}: {}", self, node); } red.apply(model)?; if cfg!(debug_assertions) { model.check_edges()?; } done_something_this_time = true; } } done_something = done_something || done_something_this_time; if !done_something_this_time { break; } } Ok(done_something) } }