semitone 0.0.28

SeMiTONE is a Satisfiability Modulo TheOries NEtwork, allowing the creation of variables and constraints in different underlying theories.
Documentation
use crate::rational::InfRational;
use rustc_hash::FxHashMap;
use std::collections::HashMap;

pub struct ProxyRegistry {
    pub proxy_to_constraint: FxHashMap<usize, TheoryConstraint>,
    pub constraint_to_proxy: FxHashMap<TheoryConstraint, usize>,
}

impl ProxyRegistry {
    pub fn new() -> Self {
        Self { proxy_to_constraint: HashMap::default(), constraint_to_proxy: HashMap::default() }
    }

    pub fn get_proxy(&self, constraint: &TheoryConstraint) -> Option<usize> {
        self.constraint_to_proxy.get(constraint).copied()
    }

    pub fn get_constraint(&self, lit: usize) -> Option<&TheoryConstraint> {
        self.proxy_to_constraint.get(&lit)
    }

    pub fn register(&mut self, constraint: TheoryConstraint, lit: usize) {
        self.proxy_to_constraint.insert(lit, constraint.clone());
        self.constraint_to_proxy.insert(constraint, lit);
    }
}

#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub(super) enum TheoryConstraint {
    LraLb(usize, InfRational),
    LraUb(usize, InfRational),
    EnumEq(usize, i32),
    DlLeq(usize, usize, InfRational),
    EufEq(usize, usize),
}