aether_plan/
lib.rs

1use aether_ast::{AttributeId, ExtensionalFact, PhaseGraph, PredicateId, RuleAst, RuleId};
2use indexmap::IndexMap;
3use serde::{Deserialize, Serialize};
4
5#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
6pub struct DependencyGraph {
7    pub edges: IndexMap<PredicateId, Vec<PredicateId>>,
8}
9
10impl DependencyGraph {
11    pub fn add_edge(&mut self, head: PredicateId, dependency: PredicateId) {
12        self.edges.entry(head).or_default().push(dependency);
13    }
14}
15
16#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
17pub struct StronglyConnectedComponent {
18    pub id: usize,
19    pub predicates: Vec<PredicateId>,
20}
21
22#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
23pub struct DeltaRulePlan {
24    pub rule_id: RuleId,
25    pub target_predicate: PredicateId,
26    pub source_predicates: Vec<PredicateId>,
27}
28
29#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
30pub struct PhasePlan {
31    pub phase_graph: PhaseGraph,
32    pub sccs: Vec<StronglyConnectedComponent>,
33}
34
35#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
36pub struct CompiledProgram {
37    pub dependency_graph: DependencyGraph,
38    pub sccs: Vec<StronglyConnectedComponent>,
39    pub phase_graph: PhaseGraph,
40    pub delta_plans: Vec<DeltaRulePlan>,
41    pub materialized: Vec<PredicateId>,
42    pub rules: Vec<RuleAst>,
43    pub extensional_bindings: IndexMap<PredicateId, AttributeId>,
44    pub facts: Vec<ExtensionalFact>,
45    pub predicate_strata: IndexMap<PredicateId, usize>,
46}