use std::collections::HashMap;
use uni_cypher::ast::{Clause, Expr, Pattern, Query};
use uni_cypher::locy_ast::{
AbduceQuery, AlongBinding, BestByClause, DeriveCommand, ExplainRule, FoldBinding, GoalQuery,
RuleCondition, RuleOutput,
};
#[derive(Debug, Clone)]
pub struct CompiledProgram {
pub strata: Vec<Stratum>,
pub rule_catalog: HashMap<String, CompiledRule>,
pub model_catalog: HashMap<String, CompiledModel>,
pub warnings: Vec<CompilerWarning>,
pub commands: Vec<CompiledCommand>,
}
#[derive(Debug, Clone)]
pub struct CompiledModel {
pub name: String,
pub inputs: Vec<CompiledInputBinding>,
pub features: Vec<uni_cypher::ast::Expr>,
pub path_context: Option<uni_cypher::locy_ast::PathContextFeature>,
pub output_type: uni_cypher::locy_ast::OutputType,
pub output_name: String,
pub xervo_alias: String,
pub embedder_alias: Option<String>,
pub calibration: Option<uni_cypher::locy_ast::CalibrationMethod>,
pub version: Option<String>,
pub annotations: uni_cypher::locy_ast::ModelAnnotations,
}
#[derive(Debug, Clone)]
pub struct CompiledInputBinding {
pub variable: String,
pub label: Option<String>,
}
#[derive(Debug, Clone)]
pub enum CompiledCommand {
GoalQuery(GoalQuery),
Assume(CompiledAssume),
Abduce(AbduceQuery),
ExplainRule(ExplainRule),
DeriveCommand(DeriveCommand),
Cypher(Query),
Calibrate(CompiledCalibrate),
Validate(CompiledValidate),
}
#[derive(Debug, Clone)]
pub struct CompiledCalibrate {
pub model_name: String,
pub pattern: uni_cypher::ast::Pattern,
pub where_expr: Option<uni_cypher::ast::Expr>,
pub target_expr: uni_cypher::ast::Expr,
pub method: uni_cypher::locy_ast::CalibrationMethod,
pub holdout: f64,
}
#[derive(Debug, Clone)]
pub struct CompiledValidate {
pub rule_name: String,
pub pattern: uni_cypher::ast::Pattern,
pub where_expr: Option<uni_cypher::ast::Expr>,
pub target_expr: uni_cypher::ast::Expr,
pub metrics: Vec<uni_cypher::locy_ast::ValidationMetric>,
pub prob_column: String,
}
#[derive(Debug, Clone)]
pub struct CompiledAssume {
pub mutations: Vec<Clause>,
pub body_program: CompiledProgram,
pub body_commands: Vec<CompiledCommand>,
}
#[derive(Debug, Clone)]
pub struct Stratum {
pub id: usize,
pub rules: Vec<CompiledRule>,
pub is_recursive: bool,
pub depends_on: Vec<usize>,
}
#[derive(Debug, Clone)]
pub struct CompiledRule {
pub name: String,
pub clauses: Vec<CompiledClause>,
pub yield_schema: Vec<YieldColumn>,
pub priority: Option<i64>,
}
#[derive(Debug, Clone)]
pub struct CompiledClause {
pub match_pattern: Pattern,
pub where_conditions: Vec<RuleCondition>,
pub along: Vec<AlongBinding>,
pub fold: Vec<FoldBinding>,
pub having: Vec<Expr>,
pub best_by: Option<BestByClause>,
pub output: RuleOutput,
pub priority: Option<i64>,
pub model_invocations: Vec<ModelInvocation>,
pub hidden_yield_cols: Vec<String>,
}
#[derive(Debug, Clone)]
pub struct ModelInvocation {
pub model_name: String,
pub output_column: String,
pub feature_exprs: Vec<Expr>,
pub feature_names: Vec<String>,
pub feature_property_refs: Vec<(String, String)>,
pub yield_alias: Option<String>,
pub original_feature_exprs: Vec<Expr>,
pub path_context: Option<uni_cypher::locy_ast::PathContextFeature>,
pub embedder_alias: Option<String>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct YieldColumn {
pub name: String,
pub is_key: bool,
pub is_prob: bool,
}
#[derive(Debug, Clone)]
pub struct CompilerWarning {
pub code: WarningCode,
pub message: String,
pub rule_name: String,
}
#[derive(Debug, Clone, PartialEq)]
pub enum WarningCode {
MsumNonNegativity,
ProbabilityDomainViolation,
FoldInRecursivePath,
EceBinningBias,
UncalibratedLLMLogprobs,
UncalibratedNeuralPredicate,
SharedNeuralInputArgument,
SharedNeuralFeatureValue,
PositiveComplementCorrelation,
CrossPredicateCorrelation,
SharedRetrievalContext,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
#[non_exhaustive]
pub enum SemiringKind {
#[default]
AddMultProb,
MaxMinProb,
BddExact,
TopKProofs {
k: u32,
},
}
#[derive(Debug, Clone, PartialEq)]
pub enum RuntimeWarningCode {
SharedProbabilisticDependency,
BddLimitExceeded,
CrossGroupCorrelationNotExact,
FuzzyNotProbabilistic,
TopKPruningCrossedDependency,
}
#[derive(Debug, Clone)]
pub struct RuntimeWarning {
pub code: RuntimeWarningCode,
pub message: String,
pub rule_name: String,
pub variable_count: Option<usize>,
pub key_group: Option<String>,
}