001package org.dllearner.cli;
002
003import org.apache.log4j.Level;
004import org.dllearner.core.*;
005import org.dllearner.learningproblems.EvaluatedDescriptionPosNeg;
006import org.dllearner.utilities.OWLAPIUtils;
007import org.semanticweb.owlapi.model.OWLClassExpression;
008import org.semanticweb.owlapi.model.OWLDataFactory;
009import org.slf4j.Logger;
010import org.slf4j.LoggerFactory;
011import uk.ac.manchester.cs.owl.owlapi.OWLDataFactoryImpl;
012
013import java.io.IOException;
014
015/**
016 * Evaluate a class expression on a PosNegLP
017 */
018@ComponentAnn(name = "Expression validator", version = 0, shortName = "")
019public class ExpressionValidation extends CLIBase2 {
020
021        private static Logger logger = LoggerFactory.getLogger(ExpressionValidation.class);
022
023        private KnowledgeSource knowledgeSource;
024        private AbstractReasonerComponent rs;
025        private AbstractClassExpressionLearningProblem lp;
026        private OWLDataFactory dataFactory = new OWLDataFactoryImpl();
027
028        public OWLClassExpression getExpression() {
029                return expression;
030        }
031
032        public void setExpression(OWLClassExpression expression) {
033                this.expression = expression;
034        }
035
036        private OWLClassExpression expression;
037
038        @Override
039        public void init() throws IOException {
040                if (context == null) {
041                        super.init();
042
043            knowledgeSource = context.getBean(KnowledgeSource.class);
044            rs = getMainReasonerComponent();
045                lp = context.getBean(AbstractClassExpressionLearningProblem.class);
046                }
047        }
048
049        @Override
050        public void run() {
051        try {
052                        org.apache.log4j.Logger.getLogger("org.dllearner").setLevel(Level.toLevel(logLevel.toUpperCase()));
053                } catch (Exception e) {
054                        logger.warn("Error setting log level to " + logLevel);
055                }
056                lp = context.getBean(AbstractClassExpressionLearningProblem.class);
057                rs = lp.getReasoner();
058
059                expression = OWLAPIUtils.classExpressionPropertyExpanderChecked(this.expression, rs, dataFactory, true, logger);
060                if (expression != null) {
061                        EvaluatedHypothesis ev = lp.evaluate(expression);
062                        if (ev instanceof EvaluatedDescriptionPosNeg) {
063                                logger.info("#EVAL# tp: " + ((EvaluatedDescriptionPosNeg) ev).getCoveredPositives().size());
064                                logger.info("#EVAL# fp: " + ((EvaluatedDescriptionPosNeg) ev).getCoveredNegatives().size());
065                                logger.info("#EVAL# tn: " + ((EvaluatedDescriptionPosNeg) ev).getNotCoveredNegatives().size());
066                                logger.info("#EVAL# fn: " + ((EvaluatedDescriptionPosNeg) ev).getNotCoveredPositives().size());
067                        }
068                } else {
069                        logger.error("Expression is empty.");
070                        throw new RuntimeException("Expression is empty.");
071                }
072        }
073}