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)
}
}