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.utilities.owl;
020
021import org.semanticweb.owlapi.model.*;
022
023import javax.annotation.Nonnull;
024import java.util.List;
025import java.util.Set;
026
027/**
028 * Computes the length of a class expression.
029 * 
030 * @author Lorenz Buehmann
031 *
032 */
033public class OWLClassExpressionLengthCalculator implements
034                OWLClassExpressionVisitor, OWLPropertyExpressionVisitor,
035                OWLDataRangeVisitor {
036
037        private OWLClassExpressionLengthMetric metric;
038        private int length;
039
040        public OWLClassExpressionLengthCalculator(OWLClassExpressionLengthMetric metric) {
041                this.metric = metric;
042        }
043
044        public OWLClassExpressionLengthCalculator() {
045                this.metric = OWLClassExpressionLengthMetric.getDefaultMetric();
046        }
047
048        /**
049         * Computes the length of a class expression.
050         * 
051         * @param ce the class expression
052         * @return the length of the class expression
053         */
054        public int getLength(OWLClassExpression ce) {
055                ce.accept(this);
056                return length;
057        }
058
059        /*
060         * (non-Javadoc)
061         * 
062         * @see
063         * org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb
064         * .owlapi.model.OWLClass)
065         */
066        @Override
067        public void visit(OWLClass ce) {
068                length += metric.classLength;
069        }
070
071        /*
072         * (non-Javadoc)
073         * 
074         * @see
075         * org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb
076         * .owlapi.model.OWLObjectIntersectionOf)
077         */
078        @Override
079        public void visit(OWLObjectIntersectionOf ce) {
080                List<OWLClassExpression> operands = ce.getOperandsAsList();
081                for (OWLClassExpression op : operands) {
082                        op.accept(this);
083                }
084                length += (operands.size() - 1) * metric.objectIntersectionLength;
085        }
086
087        /*
088         * (non-Javadoc)
089         * 
090         * @see
091         * org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb
092         * .owlapi.model.OWLObjectUnionOf)
093         */
094        @Override
095        public void visit(OWLObjectUnionOf ce) {
096                List<OWLClassExpression> operands = ce.getOperandsAsList();
097                for (OWLClassExpression op : operands) {
098                        op.accept(this);
099                }
100                length += (operands.size() - 1) * metric.objectUnionLength;
101        }
102
103        /*
104         * (non-Javadoc)
105         * 
106         * @see
107         * org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb
108         * .owlapi.model.OWLObjectComplementOf)
109         */
110        @Override
111        public void visit(OWLObjectComplementOf ce) {
112                ce.getOperand().accept(this);
113                length += metric.objectComplementLength;
114        }
115
116        /*
117         * (non-Javadoc)
118         * 
119         * @see
120         * org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb
121         * .owlapi.model.OWLObjectSomeValuesFrom)
122         */
123        @Override
124        public void visit(OWLObjectSomeValuesFrom ce) {
125                ce.getProperty().accept(this);
126                ce.getFiller().accept(this);
127                length += metric.objectSomeValuesLength;
128        }
129
130        /*
131         * (non-Javadoc)
132         * 
133         * @see
134         * org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb
135         * .owlapi.model.OWLObjectAllValuesFrom)
136         */
137        @Override
138        public void visit(OWLObjectAllValuesFrom ce) {
139                ce.getProperty().accept(this);
140                ce.getFiller().accept(this);
141                length += metric.objectAllValuesLength;
142        }
143
144        /*
145         * (non-Javadoc)
146         * 
147         * @see
148         * org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb
149         * .owlapi.model.OWLObjectHasValue)
150         */
151        @Override
152        public void visit(OWLObjectHasValue ce) {
153                ce.getProperty().accept(this);
154                length += metric.objectHasValueLength;
155        }
156
157        /*
158         * (non-Javadoc)
159         * 
160         * @see
161         * org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb
162         * .owlapi.model.OWLObjectMinCardinality)
163         */
164        @Override
165        public void visit(OWLObjectMinCardinality ce) {
166                ce.getProperty().accept(this);
167                ce.getFiller().accept(this);
168                length += metric.objectCardinalityLength;
169        }
170
171        /*
172         * (non-Javadoc)
173         * 
174         * @see
175         * org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb
176         * .owlapi.model.OWLObjectExactCardinality)
177         */
178        @Override
179        public void visit(OWLObjectExactCardinality ce) {
180                ce.getProperty().accept(this);
181                ce.getFiller().accept(this);
182                length += metric.objectCardinalityLength;
183        }
184
185        /*
186         * (non-Javadoc)
187         * 
188         * @see
189         * org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb
190         * .owlapi.model.OWLObjectMaxCardinality)
191         */
192        @Override
193        public void visit(OWLObjectMaxCardinality ce) {
194                ce.getProperty().accept(this);
195                ce.getFiller().accept(this);
196                length += metric.objectCardinalityLength;
197        }
198
199        /*
200         * (non-Javadoc)
201         * 
202         * @see
203         * org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb
204         * .owlapi.model.OWLObjectHasSelf)
205         */
206        @Override
207        public void visit(OWLObjectHasSelf ce) {
208                ce.getProperty().accept(this);
209                length += metric.objectHasValueLength;
210        }
211
212        /*
213         * (non-Javadoc)
214         * 
215         * @see
216         * org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb
217         * .owlapi.model.OWLObjectOneOf)
218         */
219        @Override
220        public void visit(OWLObjectOneOf ce) {
221                length += metric.objectOneOfLength;
222        }
223
224        /*
225         * (non-Javadoc)
226         * 
227         * @see
228         * org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb
229         * .owlapi.model.OWLDataSomeValuesFrom)
230         */
231        @Override
232        public void visit(OWLDataSomeValuesFrom ce) {
233                ce.getProperty().accept(this);
234                ce.getFiller().accept(this);
235                length += metric.dataSomeValuesLength;
236        }
237
238        /*
239         * (non-Javadoc)
240         * 
241         * @see
242         * org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb
243         * .owlapi.model.OWLDataAllValuesFrom)
244         */
245        @Override
246        public void visit(OWLDataAllValuesFrom ce) {
247                ce.getProperty().accept(this);
248                ce.getFiller().accept(this);
249                length += metric.dataAllValuesLength;
250        }
251
252        /*
253         * (non-Javadoc)
254         * 
255         * @see
256         * org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb
257         * .owlapi.model.OWLDataHasValue)
258         */
259        @Override
260        public void visit(OWLDataHasValue ce) {
261                ce.getProperty().accept(this);
262                length += metric.dataHasValueLength;
263        }
264
265        /*
266         * (non-Javadoc)
267         * 
268         * @see
269         * org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb
270         * .owlapi.model.OWLDataMinCardinality)
271         */
272        @Override
273        public void visit(OWLDataMinCardinality ce) {
274                ce.getProperty().accept(this);
275                ce.getFiller().accept(this);
276                length += metric.dataCardinalityLength;
277        }
278
279        /*
280         * (non-Javadoc)
281         * 
282         * @see
283         * org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb
284         * .owlapi.model.OWLDataExactCardinality)
285         */
286        @Override
287        public void visit(OWLDataExactCardinality ce) {
288                ce.getProperty().accept(this);
289                ce.getFiller().accept(this);
290                length += metric.dataCardinalityLength;
291        }
292
293        /*
294         * (non-Javadoc)
295         * 
296         * @see
297         * org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb
298         * .owlapi.model.OWLDataMaxCardinality)
299         */
300        @Override
301        public void visit(OWLDataMaxCardinality ce) {
302                ce.getProperty().accept(this);
303                ce.getFiller().accept(this);
304                length += metric.dataCardinalityLength;
305        }
306
307        /*
308         * (non-Javadoc)
309         * 
310         * @see org.semanticweb.owlapi.model.OWLPropertyExpressionVisitor#visit(org.
311         * semanticweb.owlapi.model.OWLObjectProperty)
312         */
313        @Override
314        public void visit(OWLObjectProperty property) {
315                length += metric.objectProperyLength;
316        }
317
318        /*
319         * (non-Javadoc)
320         * 
321         * @see org.semanticweb.owlapi.model.OWLPropertyExpressionVisitor#visit(org.
322         * semanticweb.owlapi.model.OWLObjectInverseOf)
323         */
324        @Override
325        public void visit(OWLObjectInverseOf property) {
326                length += metric.objectInverseLength;
327        }
328
329        /*
330         * (non-Javadoc)
331         * 
332         * @see org.semanticweb.owlapi.model.OWLPropertyExpressionVisitor#visit(org.
333         * semanticweb.owlapi.model.OWLDataProperty)
334         */
335        @Override
336        public void visit(OWLDataProperty property) {
337                length += metric.dataProperyLength;
338        }
339
340        @Override
341        public void visit(@Nonnull OWLAnnotationProperty property) {}
342
343        /*
344         * (non-Javadoc)
345         * 
346         * @see
347         * org.semanticweb.owlapi.model.OWLDataRangeVisitor#visit(org.semanticweb
348         * .owlapi.model.OWLDatatype)
349         */
350        @Override
351        public void visit(OWLDatatype node) {
352                length += metric.datatypeLength;
353        }
354
355        /*
356         * (non-Javadoc)
357         * 
358         * @see
359         * org.semanticweb.owlapi.model.OWLDataRangeVisitor#visit(org.semanticweb
360         * .owlapi.model.OWLDataOneOf)
361         */
362        @Override
363        public void visit(OWLDataOneOf node) {
364                length += metric.dataOneOfLength;
365        }
366
367        /*
368         * (non-Javadoc)
369         * 
370         * @see
371         * org.semanticweb.owlapi.model.OWLDataRangeVisitor#visit(org.semanticweb
372         * .owlapi.model.OWLDataComplementOf)
373         */
374        @Override
375        public void visit(OWLDataComplementOf node) {
376                length += metric.dataComplementLength;
377        }
378
379        /*
380         * (non-Javadoc)
381         * 
382         * @see
383         * org.semanticweb.owlapi.model.OWLDataRangeVisitor#visit(org.semanticweb
384         * .owlapi.model.OWLDataIntersectionOf)
385         */
386        @Override
387        public void visit(OWLDataIntersectionOf node) {
388                Set<OWLDataRange> operands = node.getOperands();
389                for (OWLDataRange op : operands) {
390                        op.accept(this);
391                }
392                length += (operands.size() - 1) * metric.dataIntersectionLength;
393        }
394
395        /*
396         * (non-Javadoc)
397         * 
398         * @see
399         * org.semanticweb.owlapi.model.OWLDataRangeVisitor#visit(org.semanticweb
400         * .owlapi.model.OWLDataUnionOf)
401         */
402        @Override
403        public void visit(OWLDataUnionOf node) {
404                Set<OWLDataRange> operands = node.getOperands();
405                for (OWLDataRange op : operands) {
406                        op.accept(this);
407                }
408                length += (operands.size() - 1) * metric.dataUnionLength;
409        }
410
411        /*
412         * (non-Javadoc)
413         * 
414         * @see
415         * org.semanticweb.owlapi.model.OWLDataRangeVisitor#visit(org.semanticweb
416         * .owlapi.model.OWLDatatypeRestriction)
417         */
418        @Override
419        public void visit(OWLDatatypeRestriction node) {
420                Set<OWLFacetRestriction> facetRestrictions = node
421                                .getFacetRestrictions();
422                length += facetRestrictions.size();
423        }
424}