001/**
002 * Copyright (C) 2007 - 2016, Jens Lehmann
003 *
004 * This file is part of DL-Learner.
005 *
006 * DL-Learner is free software; you can redistribute it and/or modify
007 * it under the terms of the GNU General Public License as published by
008 * the Free Software Foundation; either version 3 of the License, or
009 * (at your option) any later version.
010 *
011 * DL-Learner is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
014 * GNU General Public License for more details.
015 *
016 * You should have received a copy of the GNU General Public License
017 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
018 */
019package org.dllearner.core.ref;
020
021import java.util.HashSet;
022import java.util.Set;
023import java.util.SortedSet;
024import java.util.TreeSet;
025
026import org.semanticweb.owlapi.model.OWLClass;
027import org.semanticweb.owlapi.model.OWLClassExpression;
028import org.semanticweb.owlapi.model.OWLDataAllValuesFrom;
029import org.semanticweb.owlapi.model.OWLDataFactory;
030import org.semanticweb.owlapi.model.OWLDataProperty;
031import org.semanticweb.owlapi.model.OWLDataPropertyExpression;
032import org.semanticweb.owlapi.model.OWLDataRange;
033import org.semanticweb.owlapi.model.OWLDataSomeValuesFrom;
034import org.semanticweb.owlapi.model.OWLObjectAllValuesFrom;
035import org.semanticweb.owlapi.model.OWLObjectIntersectionOf;
036import org.semanticweb.owlapi.model.OWLObjectPropertyExpression;
037import org.semanticweb.owlapi.model.OWLObjectSomeValuesFrom;
038import org.semanticweb.owlapi.model.OWLObjectUnionOf;
039import org.semanticweb.owlapi.reasoner.OWLReasoner;
040
041/**
042 * @author Lorenz Buehmann
043 *
044 */
045public class RefinementOperatorALC extends ClassExpressionRefinementOperatorBase {
046        
047        public RefinementOperatorALC(OWLReasoner reasoner, OWLDataFactory dataFactory) {
048                super(reasoner, dataFactory);
049        }
050
051        /* (non-Javadoc)
052         * @see org.semanticweb.owlapi.util.OWLClassExpressionVisitorExAdapter#visit(org.semanticweb.owlapi.model.OWLClass)
053         */
054        @Override
055        public SortedSet<OWLClassExpression> visit(OWLClass ce) {
056                SortedSet<OWLClassExpression> refinements = new TreeSet<>();
057                
058                refinements.addAll(reasoner.getSubClasses(ce, true).getFlattened());
059                
060                return refinements;
061        }
062
063        /* (non-Javadoc)
064         * @see org.semanticweb.owlapi.util.OWLClassExpressionVisitorExAdapter#visit(org.semanticweb.owlapi.model.OWLObjectIntersectionOf)
065         */
066        @Override
067        public SortedSet<OWLClassExpression> visit(OWLObjectIntersectionOf ce) {
068                SortedSet<OWLClassExpression> refinements = new TreeSet<>();
069                
070                for (OWLClassExpression operand : ce.getOperands()) {
071                        // refine operand
072                        SortedSet<OWLClassExpression> operandRefinements = refineNode(operand);
073                        
074                        for (OWLClassExpression operandRefinement : operandRefinements) {
075                                Set<OWLClassExpression> newOperands = new HashSet<>(ce.getOperands());
076                                newOperands.remove(operand);
077                                newOperands.add(operandRefinement);
078                                
079                                refinements.add(dataFactory.getOWLObjectIntersectionOf(newOperands));
080                        }
081                }
082                
083                return refinements;
084        }
085
086        /* (non-Javadoc)
087         * @see org.semanticweb.owlapi.util.OWLClassExpressionVisitorExAdapter#visit(org.semanticweb.owlapi.model.OWLObjectUnionOf)
088         */
089        @Override
090        public SortedSet<OWLClassExpression> visit(OWLObjectUnionOf ce) {
091                SortedSet<OWLClassExpression> refinements = new TreeSet<>();
092
093                for (OWLClassExpression operand : ce.getOperands()) {
094                        // refine operand
095                        SortedSet<OWLClassExpression> operandRefinements = refineNode(operand);
096                        
097                        for (OWLClassExpression operandRefinement : operandRefinements) {
098                                Set<OWLClassExpression> newOperands = new HashSet<>(ce.getOperands());
099                                newOperands.remove(operand);
100                                newOperands.add(operandRefinement);
101                                
102                                refinements.add(dataFactory.getOWLObjectUnionOf(newOperands));
103                        }
104                }
105                
106                return refinements;
107        }
108        
109        /* (non-Javadoc)
110         * @see org.semanticweb.owlapi.util.OWLClassExpressionVisitorExAdapter#visit(org.semanticweb.owlapi.model.OWLObjectSomeValuesFrom)
111         */
112        @Override
113        public SortedSet<OWLClassExpression> visit(OWLObjectSomeValuesFrom ce) {
114                SortedSet<OWLClassExpression> refinements = new TreeSet<>();
115                
116                OWLObjectPropertyExpression property = ce.getProperty();
117                OWLClassExpression filler = ce.getFiller();
118                
119                // refine property
120                Set<OWLObjectPropertyExpression> subProperties = reasoner.getSubObjectProperties(property, true).getFlattened();
121                for (OWLObjectPropertyExpression subProperty : subProperties) {
122                        refinements.add(dataFactory.getOWLObjectSomeValuesFrom(subProperty, filler));
123                }
124                
125                // refine filler
126                SortedSet<OWLClassExpression> fillerRefinements = refineNode(filler);
127                for (OWLClassExpression fillerRefinement : fillerRefinements) {
128                        refinements.add(dataFactory.getOWLObjectSomeValuesFrom(property, fillerRefinement));
129                }
130                
131                return refinements;
132        }
133        
134        /* (non-Javadoc)
135         * @see org.semanticweb.owlapi.util.OWLClassExpressionVisitorExAdapter#visit(org.semanticweb.owlapi.model.OWLObjectAllValuesFrom)
136         */
137        @Override
138        public SortedSet<OWLClassExpression> visit(OWLObjectAllValuesFrom ce) {
139                SortedSet<OWLClassExpression> refinements = new TreeSet<>();
140                
141                OWLObjectPropertyExpression property = ce.getProperty();
142                OWLClassExpression filler = ce.getFiller();
143                
144                // refine property
145                Set<OWLObjectPropertyExpression> subProperties = reasoner.getSubObjectProperties(property, true).getFlattened();
146                for (OWLObjectPropertyExpression subProperty : subProperties) {
147                        refinements.add(dataFactory.getOWLObjectAllValuesFrom(subProperty, filler));
148                }
149                
150                // refine filler
151                SortedSet<OWLClassExpression> fillerRefinements = refineNode(filler);
152                for (OWLClassExpression fillerRefinement : fillerRefinements) {
153                        refinements.add(dataFactory.getOWLObjectAllValuesFrom(property, fillerRefinement));
154                }
155                
156                return refinements;
157        }
158        
159        /* (non-Javadoc)
160         * @see org.semanticweb.owlapi.util.OWLClassExpressionVisitorExAdapter#visit(org.semanticweb.owlapi.model.OWLDataSomeValuesFrom)
161         */
162        @Override
163        public SortedSet<OWLClassExpression> visit(OWLDataSomeValuesFrom ce) {
164                SortedSet<OWLClassExpression> refinements = new TreeSet<>();
165                
166                OWLDataPropertyExpression property = ce.getProperty();
167                OWLDataRange filler = ce.getFiller();
168                
169                // refine property
170                Set<OWLDataProperty> subProperties = reasoner.getSubDataProperties(property.asOWLDataProperty(), true).getFlattened();
171                for (OWLDataProperty subProperty : subProperties) {
172                        refinements.add(dataFactory.getOWLDataSomeValuesFrom(subProperty, filler));
173                }
174                
175                // refine filler
176                // TODO
177                
178                return refinements;
179        }
180        
181        /* (non-Javadoc)
182         * @see org.semanticweb.owlapi.util.OWLClassExpressionVisitorExAdapter#visit(org.semanticweb.owlapi.model.OWLDataAllValuesFrom)
183         */
184        @Override
185        public SortedSet<OWLClassExpression> visit(OWLDataAllValuesFrom ce) {
186                SortedSet<OWLClassExpression> refinements = new TreeSet<>();
187                
188                OWLDataPropertyExpression property = ce.getProperty();
189                OWLDataRange filler = ce.getFiller();
190                
191                // refine property
192                Set<OWLDataProperty> subProperties = reasoner.getSubDataProperties(property.asOWLDataProperty(), true).getFlattened();
193                for (OWLDataProperty subProperty : subProperties) {
194                        refinements.add(dataFactory.getOWLDataSomeValuesFrom(subProperty, filler));
195                }
196                
197                // refine filler
198                // TODO
199                
200                return refinements;
201        }
202
203}