001/*
002 * To change this license header, choose License Headers in Project Properties.
003 * To change this template file, choose Tools | Templates
004 * and open the template in the editor.
005 */
006package org.dllearner.utils.unife;
007
008import java.util.HashSet;
009import java.util.Set;
010import java.util.Stack;
011import javax.annotation.Nonnull;
012import org.semanticweb.owlapi.model.OWLClass;
013import org.semanticweb.owlapi.model.OWLClassExpression;
014import org.semanticweb.owlapi.model.OWLClassExpressionVisitor;
015import org.semanticweb.owlapi.model.OWLDataAllValuesFrom;
016import org.semanticweb.owlapi.model.OWLDataExactCardinality;
017import org.semanticweb.owlapi.model.OWLDataFactory;
018import org.semanticweb.owlapi.model.OWLDataHasValue;
019import org.semanticweb.owlapi.model.OWLDataMaxCardinality;
020import org.semanticweb.owlapi.model.OWLDataMinCardinality;
021import org.semanticweb.owlapi.model.OWLDataSomeValuesFrom;
022import org.semanticweb.owlapi.model.OWLObjectAllValuesFrom;
023import org.semanticweb.owlapi.model.OWLObjectComplementOf;
024import org.semanticweb.owlapi.model.OWLObjectExactCardinality;
025import org.semanticweb.owlapi.model.OWLObjectHasSelf;
026import org.semanticweb.owlapi.model.OWLObjectHasValue;
027import org.semanticweb.owlapi.model.OWLObjectIntersectionOf;
028import org.semanticweb.owlapi.model.OWLObjectMaxCardinality;
029import org.semanticweb.owlapi.model.OWLObjectMinCardinality;
030import org.semanticweb.owlapi.model.OWLObjectOneOf;
031import org.semanticweb.owlapi.model.OWLObjectProperty;
032import org.semanticweb.owlapi.model.OWLObjectSomeValuesFrom;
033import org.semanticweb.owlapi.model.OWLObjectUnionOf;
034import org.semanticweb.owlapi.model.OWLOntologyManager;
035
036/**
037 *
038 * @author Giuseppe Cota <giuseppe.cota@unife.it>
039 */
040public class OWLClassExpressionSimplifierVisitorImpl
041        implements OWLClassExpressionSimplifierVisitor {
042
043    private Stack<OWLClassExpression> stack = new Stack<>();
044
045    private OWLDataFactory factory;
046
047    public OWLClassExpressionSimplifierVisitorImpl(@Nonnull OWLOntologyManager manager) {
048        factory = manager.getOWLDataFactory();
049    }
050
051    public OWLClassExpression getOWLClassExpression() {
052        return stack.pop();
053    }
054
055    public static OWLClassExpression getOWLClassExpression(OWLClassExpression ce, OWLOntologyManager manager) {
056        OWLClassExpressionSimplifierVisitor simplifier = new OWLClassExpressionSimplifierVisitorImpl(manager);
057        ce.accept(simplifier);
058        return simplifier.getOWLClassExpression();
059    }
060
061    @Override
062    public void visit(OWLClass ce) {
063        stack.push(ce);
064    }
065
066    @Override
067    public void visit(OWLObjectIntersectionOf ce) {
068        if (ce.getOperands().size() < 2) {
069            if (ce.getOperands().size() <= 0) {
070                throw new RuntimeException(ce + " wrong number of operands");
071            }
072            stack.push(ce.getOperandsAsList().get(0));
073        } else {
074            Set<OWLClassExpression> operands = new HashSet<>();
075            for (OWLClassExpression c : ce.getOperands()) {
076                c.accept(this);
077                operands.add(stack.pop());
078            }
079            stack.push(factory.getOWLObjectIntersectionOf(operands));
080        }
081    }
082
083    @Override
084    public void visit(OWLObjectUnionOf ce) {
085        if (ce.getOperands().size() < 2) {
086            if (ce.getOperands().size() <= 0) {
087                throw new RuntimeException(ce + " wrong number of operands");
088            }
089            stack.push(ce.getOperandsAsList().get(0));
090        } else {
091            Set<OWLClassExpression> operands = new HashSet<>();
092            for (OWLClassExpression c : ce.getOperands()) {
093                c.accept(this);
094                operands.add(stack.pop());
095            }
096            stack.push(factory.getOWLObjectUnionOf(operands));
097        }
098    }
099
100    @Override
101    public void visit(OWLObjectComplementOf ce) {
102        ce.getOperand().accept(this);
103        OWLClassExpression ceNew = stack.pop();
104        stack.push(factory.getOWLObjectComplementOf(ceNew));
105    }
106
107    @Override
108    public void visit(OWLObjectSomeValuesFrom ce) {
109        ce.getFiller().accept(this);
110        OWLClassExpression ceNew = stack.pop();
111        stack.push(factory.getOWLObjectSomeValuesFrom(ce.getProperty(), ceNew));
112    }
113
114    @Override
115    public void visit(OWLObjectAllValuesFrom ce) {
116        ce.getFiller().accept(this);
117        OWLClassExpression ceNew = stack.pop();
118        stack.push(factory.getOWLObjectAllValuesFrom(ce.getProperty(), ceNew));
119    }
120
121    @Override
122    public void visit(OWLObjectHasValue ce) {
123//        stack.push(factory.getOWLObjectHasValue(ce.getProperty(), ce.getFiller()));
124        stack.push(ce);
125    }
126
127    @Override
128    public void visit(OWLObjectMinCardinality ce) {
129        ce.getFiller().accept(this);
130        OWLClassExpression cen = stack.pop();
131        stack.push(factory.getOWLObjectMinCardinality(ce.getCardinality(), ce.getProperty(), cen));
132    }
133
134    @Override
135    public void visit(OWLObjectExactCardinality ce) {
136        ce.getFiller().accept(this);
137        OWLClassExpression cen = stack.pop();
138        stack.push(factory.getOWLObjectExactCardinality(ce.getCardinality(), ce.getProperty(), cen));
139    }
140
141    @Override
142    public void visit(OWLObjectMaxCardinality ce) {
143        ce.getFiller().accept(this);
144        OWLClassExpression cen = stack.pop();
145        stack.push(factory.getOWLObjectMaxCardinality(ce.getCardinality(), ce.getProperty(), cen));
146    }
147
148    @Override
149    public void visit(OWLObjectHasSelf ce) {
150//        stack.push(factory.getOWLObjectHasSelf(ce.getProperty()));
151        stack.push(ce);
152    }
153
154    @Override
155    public void visit(OWLObjectOneOf ce) {
156//        stack.push(factory.getOWLObjectOneOf(ce.getIndividuals()));
157        stack.push(ce);
158    }
159
160    @Override
161    public void visit(OWLDataSomeValuesFrom ce) {
162//        stack.push(factory.getOWLDataSomeValuesFrom(ce.getProperty(), ce.getFiller()));
163        stack.push(ce);
164    }
165
166    @Override
167    public void visit(OWLDataAllValuesFrom ce) {
168        stack.push(ce);
169    }
170
171    @Override
172    public void visit(OWLDataHasValue ce) {
173        stack.push(ce);
174    }
175
176    @Override
177    public void visit(OWLDataMinCardinality ce) {
178        stack.push(ce);
179    }
180
181    @Override
182    public void visit(OWLDataExactCardinality ce) {
183        stack.push(ce);
184    }
185
186    @Override
187    public void visit(OWLDataMaxCardinality ce) {
188        stack.push(ce);
189    }
190}