acyclib 0.3.0

ML library for directed acyclic tensor graphs.
Documentation
mod exchange;
mod fuse;

use std::{fmt::Debug, rc::Rc};

pub use exchange::*;
pub use fuse::*;

use crate::{
    dag::NodeId,
    graph::ir::{BackendMarker, GraphIR, GraphIRError, operation::GraphIROperationCompilable},
};

pub trait GraphIRPass<B: BackendMarker>: Debug {
    fn try_pass(&self, ir: &mut GraphIR<B>) -> Result<bool, GraphIRError>;
}

pub trait GraphIRSimplePass<B: BackendMarker>: Debug {
    fn try_pass_on_node(&self, ir: &mut GraphIR<B>, node: NodeId) -> Result<bool, GraphIRError>;
}

impl<B: BackendMarker, T: GraphIRSimplePass<B>> GraphIRPass<B> for T {
    fn try_pass(&self, ir: &mut GraphIR<B>) -> Result<bool, GraphIRError> {
        for node in ir.topo_order()? {
            if self.try_pass_on_node(ir, node)? {
                return Ok(true);
            }
        }

        Ok(false)
    }
}

pub fn downcast<B: BackendMarker, T: Clone + 'static>(op: &Rc<dyn GraphIROperationCompilable<B>>) -> Option<T> {
    let op: &dyn std::any::Any = op.as_ref();
    op.downcast_ref().cloned()
}