1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
|
/*
* Copyright (C) 2013-2015, 2019 by the Konclude Developer Team.
*
* This file is part of the reasoning system Konclude.
* For details and support, see <http://konclude.com/>.
*
* Konclude is free software: you can redistribute it and/or modify
* it under the terms of version 3 of the GNU Lesser General Public
* License (LGPLv3) as published by the Free Software Foundation.
*
* Konclude is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU (Lesser) General Public License for more details.
*
* You should have received a copy of the GNU (Lesser) General Public
* License along with Konclude. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include "CConfigDependedSubsumptionClassifierFactory.h"
namespace Konclude {
namespace Reasoner {
namespace Classifier {
CConfigDependedSubsumptionClassifierFactory::CConfigDependedSubsumptionClassifierFactory(CReasonerManager *reasonerManager) {
reasonerMan = reasonerManager;
}
CConfigDependedSubsumptionClassifierFactory::~CConfigDependedSubsumptionClassifierFactory() {
}
CSubsumptionClassifier *CConfigDependedSubsumptionClassifierFactory::createClassifier(CConcreteOntology *ontology, CConfigurationBase *config) {
CSubsumptionClassifier *classifier = 0;
bool automatedClassifierSelection = CConfigDataReader::readConfigBoolean(config,"Konclude.Calculation.Classification.AutomatedOptimizedClassifierSelection",true);
if (automatedClassifierSelection) {
bool onlyChangedABoxAxioms = ontology->getIncrementalRevisionData()->getAxiomChangeData()->hasOnlyChangedABoxAxioms();
bool previousClassifiedOntologyVersion = ontology->getIncrementalRevisionData()->getPreviousClassesClassifiedOntology() != nullptr;
if (previousClassifiedOntologyVersion && onlyChangedABoxAxioms) {
classifier = new CIncrementalKPSetClassSubsumptionClassifierThread(reasonerMan);
} else if (isClassificationBySaturationCalculationSufficient(ontology,config)) {
LOG(INFO,"::Konclude::Reasoner::Classifier::Factory",logTr("Ontology '%1' has been sufficiently saturated, extracting data for classification.").arg(ontology->getOntologyName()),this);
classifier = new COptimizedClassExtractedSaturationSubsumptionClassifierThread(reasonerMan);
} else if (isClassificationBySatisfiableCalculationSufficient(ontology,config)) {
LOG(INFO,"::Konclude::Reasoner::Classifier::Factory",logTr("Ontology '%1' is deterministic, using satisfiable tests for classification.").arg(ontology->getOntologyName()),this);
classifier = new COptimizedSubClassSubsumptionClassifierThread(reasonerMan);
}
}
if (!classifier) {
QString classifierName = CConfigDataReader::readConfigString(config,"Konclude.Calculation.Classification.Classifier","Konclude.Calculation.Classification.Classifier.OptimizedKPSetClassClassifier");
if (classifierName == "Konclude.Calculation.Classification.Classifier.OptimizedSubClassClassifier") {
classifier = new COptimizedSubClassSubsumptionClassifierThread(reasonerMan);
} else if (classifierName == "Konclude.Calculation.Classification.Classifier.OptimizedKPSetClassClassifier") {
classifier = new COptimizedKPSetClassSubsumptionClassifierThread(reasonerMan);
} else if (classifierName == "Konclude.Calculation.Classification.Classifier.OptimizedClassExtractedSaturationClassifier") {
classifier = new COptimizedClassExtractedSaturationSubsumptionClassifierThread(reasonerMan);
}
}
return classifier;
}
CSubsumptionClassifier *CConfigDependedSubsumptionClassifierFactory::createBackgroundClassifier(CConcreteOntology *ontology, CConfigurationBase *config) {
CSubsumptionClassifier *classifier = createClassifier(ontology,config);
return classifier;
}
bool CConfigDependedSubsumptionClassifierFactory::isClassificationBySatisfiableCalculationSufficient(CConcreteOntology *ontology, CConfigurationBase *config) {
COntologyStructureSummary* ontoStrSum = ontology->getStructureSummary();
if (ontoStrSum) {
return ontoStrSum->hasOnlyDeterministicConceptClasses();
} else {
return false;
}
}
bool CConfigDependedSubsumptionClassifierFactory::isClassificationBySaturationCalculationSufficient(CConcreteOntology *ontology, CConfigurationBase *config) {
bool subsumerSaturationExtraction = CConfigDataReader::readConfigBoolean(config,"Konclude.Calculation.Classification.SaturationSubsumerExtraction",true);
if (!subsumerSaturationExtraction) {
return false;
}
CSaturationData* satData = ontology->getPrecomputation()->getSaturationModelData();
if (satData) {
CSaturationTaskData* satTaskData = dynamic_cast<CSaturationTaskData*>(satData);
if (satTaskData) {
CSatisfiableCalculationTask* satCalcTask = satTaskData->getSaturationTask();
if (!satCalcTask->getProcessingDataBox()->isInsufficientNodeOccured() && !satCalcTask->getProcessingDataBox()->isProblematicEQCandidateOccured()) {
CBOXSET<CConcept*>* eqConceptNonCandSet = ontology->getTBox()->getEquivalentConceptNonCandidateSet(false);
if (!eqConceptNonCandSet || eqConceptNonCandSet->isEmpty()) {
return true;
}
}
}
}
return false;
}
CSubsumptionClassifier* CConfigDependedSubsumptionClassifierFactory::getDataPropertyClassifier(CConcreteOntology *ontology, CConfigurationBase *config) {
return new COptimizedKPSetRoleSubsumptionClassifierThread(reasonerMan,true);
}
CSubsumptionClassifier* CConfigDependedSubsumptionClassifierFactory::getObjectPropertyClassifier(CConcreteOntology *ontology, CConfigurationBase *config) {
return new COptimizedKPSetRoleSubsumptionClassifierThread(reasonerMan,false);
}
}; // end namespace Classifier
}; // end namespace Reasoner
}; // end namespace Konclude
|