tenferro-runtime 0.6.0

Concrete tensor helpers, traced tensors, graph execution, and extension runtime support for tenferro.
Documentation
use std::cell::Cell;

thread_local! {
    static GRAPH_ANALYSIS_VISITS: Cell<Option<(usize, usize)>> = const { Cell::new(None) };
    static PARENT_OWNER_INDEX_VISITS: Cell<Option<(usize, usize)>> = const { Cell::new(None) };
}

pub(crate) fn with_parent_owner_index_count<T>(f: impl FnOnce() -> T) -> (T, usize, usize) {
    PARENT_OWNER_INDEX_VISITS.with(|visits| visits.set(Some((0, 0))));
    let result = f();
    let (builds, value_visits) =
        PARENT_OWNER_INDEX_VISITS.with(|visits| visits.replace(None).unwrap_or_default());
    (result, builds, value_visits)
}

pub(super) fn record_parent_owner_index_build() {
    PARENT_OWNER_INDEX_VISITS.with(|visits| {
        if let Some((builds, value_visits)) = visits.get() {
            visits.set(Some((builds + 1, value_visits)));
        }
    });
}

pub(super) fn record_parent_value_visit() {
    PARENT_OWNER_INDEX_VISITS.with(|visits| {
        if let Some((builds, value_visits)) = visits.get() {
            visits.set(Some((builds, value_visits + 1)));
        }
    });
}

pub(crate) fn with_visit_count<T>(f: impl FnOnce() -> T) -> (T, usize, usize) {
    GRAPH_ANALYSIS_VISITS.with(|visits| visits.set(Some((0, 0))));
    let result = f();
    let (graph_visits, operation_visits) =
        GRAPH_ANALYSIS_VISITS.with(|visits| visits.replace(None).unwrap_or_default());
    (result, graph_visits, operation_visits)
}

pub(super) fn record_graph_visit() {
    GRAPH_ANALYSIS_VISITS.with(|visits| {
        if let Some((graph_visits, operation_visits)) = visits.get() {
            visits.set(Some((graph_visits + 1, operation_visits)));
        }
    });
}

pub(super) fn record_operation_visit() {
    GRAPH_ANALYSIS_VISITS.with(|visits| {
        if let Some((graph_visits, operation_visits)) = visits.get() {
            visits.set(Some((graph_visits, operation_visits + 1)));
        }
    });
}