pub mod domains;
pub mod framework;
#[cfg(test)]
mod framework_tests;
pub use domains::{
AbstractDomain,
AbstractDomainFactory,
AbstractDomainType,
AbstractValue,
BinaryAbstractOp,
ConstantDomain,
ConstantValue,
IntervalDomain,
LinearConstraint,
OctagonConstraints,
OctagonDomain,
PolyhedralDomain,
SignDomain,
SignValue,
UnaryAbstractOp,
};
pub use framework::{
AbstractAnalysisResult,
AbstractFunctionResult,
AbstractInterpretationConfig,
AbstractInterpreter,
AbstractIrResult,
AnalysisCache,
AnalysisStatistics,
BackwardAnalysisResult,
BottleneckType,
ComplexityMetrics,
FixpointEngine,
ForwardAnalysisResult,
FunctionBackwardResult,
FunctionForwardResult,
FunctionInvariant,
InterproceduralAnalysisResult,
Invariant,
InvariantDetector,
InvariantType,
ModuleInvariant,
OptimizationOpportunity,
OptimizationType,
PerformanceAnalysis,
PerformanceBottleneck,
PrecisionAnalysis,
Property,
PropertyChecker,
PropertyResult,
SafetyCheck,
SafetyCheckResult,
};
pub type AnalysisResult<T> = crate::JitResult<T>;
pub type NodeId = crate::NodeId;
pub fn new_interpreter() -> AbstractInterpreter {
AbstractInterpreter::with_defaults()
}
pub fn new_interval_interpreter(
max_iterations: usize,
enable_backward: bool,
) -> AbstractInterpreter {
let config = AbstractInterpretationConfig {
domain_type: AbstractDomainType::Intervals,
max_iterations,
enable_backward_analysis: enable_backward,
..Default::default()
};
AbstractInterpreter::new(config)
}
pub fn new_sign_interpreter(properties: Vec<Property>) -> AbstractInterpreter {
let config = AbstractInterpretationConfig {
domain_type: AbstractDomainType::Signs,
properties,
max_iterations: 50, ..Default::default()
};
AbstractInterpreter::new(config)
}
pub fn new_constant_interpreter() -> AbstractInterpreter {
let config = AbstractInterpretationConfig {
domain_type: AbstractDomainType::Constants,
max_iterations: 30, ..Default::default()
};
AbstractInterpreter::new(config)
}
pub fn speed_optimized_config() -> AbstractInterpretationConfig {
AbstractInterpretationConfig {
domain_type: AbstractDomainType::Signs,
max_iterations: 20,
widening_delay: 1,
enable_narrowing: false,
enable_backward_analysis: false,
properties: Vec::new(),
precision_threshold: 0.6,
}
}
pub fn precision_optimized_config() -> AbstractInterpretationConfig {
AbstractInterpretationConfig {
domain_type: AbstractDomainType::Intervals,
max_iterations: 200,
widening_delay: 5,
enable_narrowing: true,
enable_backward_analysis: true,
properties: Vec::new(),
precision_threshold: 0.95,
}
}
pub fn balanced_config() -> AbstractInterpretationConfig {
AbstractInterpretationConfig::default()
}
pub fn common_safety_properties(node_ids: Vec<NodeId>) -> Vec<Property> {
let mut properties = Vec::new();
for &node_id in &node_ids {
properties.push(Property::NonNegative(node_id));
properties.push(Property::NoDivisionByZero(node_id));
properties.push(Property::NoOverflow(node_id));
}
properties
}
pub fn bounds_checking_properties(bounds: Vec<(NodeId, f64, f64)>) -> Vec<Property> {
bounds
.into_iter()
.map(|(node_id, min, max)| Property::BoundedValue(node_id, min, max))
.collect()
}
pub fn analyze_graph_default(
graph: &crate::ComputationGraph,
) -> AnalysisResult<AbstractAnalysisResult> {
let mut interpreter = new_interpreter();
interpreter.analyze_graph(graph)
}
pub fn analyze_graph_with_config(
graph: &crate::ComputationGraph,
config: AbstractInterpretationConfig,
) -> AnalysisResult<AbstractAnalysisResult> {
let mut interpreter = AbstractInterpreter::new(config);
interpreter.analyze_graph(graph)
}
pub fn analyze_ir_default(ir_module: &crate::ir::IrModule) -> AnalysisResult<AbstractIrResult> {
let mut interpreter = new_interpreter();
interpreter.analyze_ir(ir_module)
}
pub mod prelude {
pub use super::{
analyze_graph_default,
analyze_graph_with_config,
balanced_config,
bounds_checking_properties,
common_safety_properties,
new_constant_interpreter,
new_interpreter,
new_interval_interpreter,
new_sign_interpreter,
precision_optimized_config,
speed_optimized_config,
AbstractAnalysisResult,
AbstractDomain,
AbstractDomainType,
AbstractInterpretationConfig,
AbstractInterpreter,
AbstractValue,
ConstantDomain,
IntervalDomain,
Property,
SafetyCheck,
SafetyCheckResult,
SignDomain,
};
}
pub mod theory {
pub struct LatticeProperties;
pub struct GaloisConnection;
pub struct FixpointTheorem;
}
pub mod examples {
pub fn interval_analysis_example() {
}
pub fn sign_analysis_safety_example() {
}
pub fn property_verification_example() {
}
}