laddu-compile 0.21.4

Amplitude analysis tools for Rust
Documentation
use super::*;

#[test]
fn compile_option_constructors_select_explicit_normalization_boundaries() {
    assert_eq!(
        CompileOptions::default().normalization_analysis,
        NormalizationAnalysisMode::BeforeExecutionLowering
    );
    assert_eq!(
        CompileOptions::without_optimizations().normalization_analysis,
        NormalizationAnalysisMode::ExecutionGraph
    );
    assert_eq!(
        CompileOptions::with_pipeline(OptimizationPipeline::new()).normalization_analysis,
        NormalizationAnalysisMode::ExecutionGraph
    );
}

#[test]
fn compiler_phase_methods_keep_normalization_and_execution_inputs_distinct() {
    let source = (Expr::from(Parameter::fixed("scale", 2.0)) * event_scalar("x")).to_graph();
    let parameter_baked = Compiler::bake_parameters(&source);
    assert!(
        !parameter_baked
            .nodes()
            .iter()
            .any(|node| matches!(node, ExprNode::ScalarParam(_)))
    );

    let prepared = Compiler::prepare_normalization(
        parameter_baked,
        NormalizationRecipe::AnalyzeBeforeExecution(OptimizationPipeline::new()),
    )
    .unwrap();
    assert!(matches!(prepared.plan, PreparedNormalizationPlan::Ready(_)));
    assert!(!matches!(
        prepared
            .execution_input
            .node(prepared.execution_input.root()),
        Some(ExprNode::Unary {
            op: UnaryOp::Exp,
            ..
        })
    ));

    let execution_pipeline = OptimizationPipeline::new().with_pass(WrapRootInExp);
    let execution_graph =
        Compiler::lower_execution(prepared.execution_input, &execution_pipeline).unwrap();
    assert!(matches!(
        execution_graph.node(execution_graph.root()),
        Some(ExprNode::Unary {
            op: UnaryOp::Exp,
            ..
        })
    ));
}

#[test]
fn normalization_submodel_recipe_disables_analysis_after_execution_lowering() {
    let source = (event_scalar("x") + event_scalar("x")).to_graph();
    let compiled = CompiledModel::from_graph_without_normalization(source).unwrap();

    assert!(matches!(
        compiled.normalization_diagnostics().fallback_reason(),
        Some(
            crate::NormalizationFallbackReason::UnsupportedMixedOperation {
                operation: "normalization analysis disabled",
                ..
            }
        )
    ));
    assert_eq!(compiled.cache_plan().len(), 1);
}