ontocore-reasoner 0.14.0

OntoLogos-backed reasoner facade for OntoCore (ontocore-*)
Documentation
use crate::adapter::{ReasonerAdapter, ReasonerId, ReasonerProfile};
use crate::error::{ReasonerError, Result};
use crate::explain::explain_unsatisfiable_dl;
use crate::input::ReasonerInput;
use crate::result::{
    build_inferred_hierarchy, new_inferences, taxonomy_to_iri_edges, unsatisfiable_iris,
    ClassificationResult, ExplanationRequest, ExplanationResult,
};
use ontologos_dl::DlClassifier;
use std::time::Instant;

pub struct DlAdapter;

impl ReasonerAdapter for DlAdapter {
    fn id(&self) -> ReasonerId {
        ReasonerId::Dl
    }

    fn profile(&self) -> ReasonerProfile {
        ReasonerProfile::OwlDl
    }

    fn classify(&self, input: &ReasonerInput) -> Result<ClassificationResult> {
        let started = Instant::now();
        let taxonomy = DlClassifier::new()
            .classify(&input.ontology)
            .map_err(|e| ReasonerError::Classify(e.to_string()))?;

        let iri_edges =
            taxonomy_to_iri_edges(&input.ontology, &taxonomy).map_err(ReasonerError::Classify)?;
        let unsatisfiable =
            unsatisfiable_iris(&input.ontology, &taxonomy).map_err(ReasonerError::Classify)?;
        let inferred =
            build_inferred_hierarchy(&iri_edges, &unsatisfiable, &input.asserted_hierarchy);
        let new_inferences = new_inferences(&input.asserted_hierarchy, &inferred.edges);

        Ok(ClassificationResult {
            profile_used: "dl".to_string(),
            consistent: unsatisfiable.is_empty(),
            unsatisfiable: unsatisfiable.clone(),
            inferred,
            new_inferences,
            warnings: Vec::new(),
            duration_ms: started.elapsed().as_millis() as u64,
            subsumption_count: taxonomy.subsumption_count(),
            inferred_axiom_count: taxonomy.subsumption_count(),
        })
    }

    fn explain(
        &self,
        input: &ReasonerInput,
        request: &ExplanationRequest,
    ) -> Result<ExplanationResult> {
        explain_unsatisfiable_dl(&input.ontology, &request.class_iri)
    }
}