tenferro-runtime 0.9.0

Concrete tensor helpers, traced tensors, graph execution, and extension runtime support for tenferro.
Documentation
use computegraph::types::ValueKey;

use super::*;
use crate::traced::next_input_key;

fn scope() -> Arc<GlobalMetadataScope> {
    Arc::new(
        register_scoped_value_metadata(
            ValueKey::Input(next_input_key()),
            TensorMeta::exact(DType::F64, vec![]),
        )
        .unwrap(),
    )
}

#[test]
fn metadata_scope_merge_reuses_single_parent_chain() {
    let parent = MetadataScopeChain::with_scope(scope(), []);
    let merged = MetadataScopeChain::merge([&parent]);

    assert!(merged.shares_root(&parent));
}

#[test]
fn metadata_scope_materialization_deduplicates_shared_nodes_and_scopes() {
    let shared = MetadataScopeChain::with_scope(scope(), []);
    let repeated_scope = scope();
    let left = MetadataScopeChain::with_scope(Arc::clone(&repeated_scope), [&shared]);
    let right = MetadataScopeChain::with_scope(repeated_scope, [&shared]);
    let merged = MetadataScopeChain::merge([&left, &right]);

    let (scopes, visited_nodes) = merged.materialize_with_visit_count();
    assert_eq!(scopes.len(), 2);
    assert_eq!(visited_nodes, 4);
}

#[test]
fn metadata_scope_shared_history_materializes_in_linear_node_visits() {
    let depth = 512;
    let mut chain = MetadataScopeChain::with_scope(scope(), []);
    for _ in 0..depth {
        chain = MetadataScopeChain::merge([&chain, &chain]);
    }

    let (scopes, visited_nodes) = chain.materialize_with_visit_count();
    assert_eq!(scopes.len(), 1);
    assert_eq!(visited_nodes, depth + 1);
}