/* Copyright 2008, 2009, 2010 by the Oxford University Computing Laboratory
This file is part of HermiT.
HermiT is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
HermiT 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 HermiT. If not, see <http://www.gnu.org/licenses/>.
*/
package org.semanticweb.HermiT.model;
import java.io.Serializable;
import java.util.Set;
import org.semanticweb.HermiT.Prefixes;
public class DescriptionGraph implements DLPredicate,Serializable {
private static final long serialVersionUID=-6098910060520673164L;
protected final String m_name;
protected final AtomicConcept[] m_atomicConceptsByVertices;
protected final Edge[] m_edges;
protected final Set<AtomicConcept> m_startConcepts;
public DescriptionGraph(String name,AtomicConcept[] atomicConceptsByVertices,Edge[] edges,Set<AtomicConcept> startConcepts) {
m_name=name;
m_atomicConceptsByVertices=atomicConceptsByVertices;
m_edges=edges;
m_startConcepts=startConcepts;
}
public String getName() {
return m_name;
}
public int getArity() {
return m_atomicConceptsByVertices.length;
}
public AtomicConcept getAtomicConceptForVertex(int vertex) {
return m_atomicConceptsByVertices[vertex];
}
public int getNumberOfVertices() {
return m_atomicConceptsByVertices.length;
}
public int getNumberOfEdges() {
return m_edges.length;
}
public Edge getEdge(int edgeIndex) {
return m_edges[edgeIndex];
}
public Set<AtomicConcept> getStartConcepts() {
return m_startConcepts;
}
public void produceStartDLClauses(Set<DLClause> resultingDLClauses) {
Variable X=Variable.create("X");
for (AtomicConcept startAtomicConcept : m_startConcepts) {
Atom[] antecedent=new Atom[] { Atom.create(startAtomicConcept,X) };
int numberOfVerticesWithStartConcept=0;
for (AtomicConcept vertexConcept : m_atomicConceptsByVertices)
if (vertexConcept.equals(startAtomicConcept))
numberOfVerticesWithStartConcept++;
int index=0;
Atom[] consequent=new Atom[numberOfVerticesWithStartConcept];
for (int vertex=0;vertex<m_atomicConceptsByVertices.length;vertex++)
if (m_atomicConceptsByVertices[vertex].equals(startAtomicConcept))
consequent[index++]=Atom.create(ExistsDescriptionGraph.create(this,vertex),X);
resultingDLClauses.add(DLClause.create(consequent,antecedent));
}
}
public String toString(Prefixes ns) {
return ns.abbreviateIRI(m_name);
}
public String toString() {
return toString(Prefixes.STANDARD_PREFIXES);
}
public String getTextRepresentation() {
StringBuffer buffer=new StringBuffer();
String CRLF=System.getProperty("line.separator");
buffer.append('[');
buffer.append(CRLF);
for (int vertex=0;vertex<m_atomicConceptsByVertices.length;vertex++) {
buffer.append(" ");
buffer.append(vertex);
buffer.append(" --> ");
buffer.append(m_atomicConceptsByVertices[vertex].getIRI());
buffer.append(CRLF);
}
buffer.append(CRLF);
for (Edge edge : m_edges) {
buffer.append(" ");
buffer.append(edge.getFromVertex());
buffer.append(" -- ");
buffer.append(edge.getAtomicRole().getIRI());
buffer.append(" --> ");
buffer.append(edge.getToVertex());
buffer.append(CRLF);
}
buffer.append(CRLF);
for (AtomicConcept atomicConcept : m_startConcepts) {
buffer.append(" ");
buffer.append(atomicConcept.getIRI());
buffer.append(CRLF);
}
buffer.append(']');
return buffer.toString();
}
public static class Edge implements Serializable {
private static final long serialVersionUID=-2407275128459101707L;
protected final AtomicRole m_atomicRole;
protected final int m_fromVertex;
protected final int m_toVertex;
public Edge(AtomicRole atomicRole,int fromVertex,int toVertex) {
m_atomicRole=atomicRole;
m_fromVertex=fromVertex;
m_toVertex=toVertex;
}
public AtomicRole getAtomicRole() {
return m_atomicRole;
}
public int getFromVertex() {
return m_fromVertex;
}
public int getToVertex() {
return m_toVertex;
}
public int hashCode() {
return m_fromVertex+7*m_toVertex+11*m_atomicRole.hashCode();
}
public boolean equals(Object that) {
if (this==that)
return true;
if (!(that instanceof Edge))
return false;
Edge thatEdge=(Edge)that;
return m_atomicRole.equals(thatEdge.m_atomicRole) && m_fromVertex==thatEdge.m_fromVertex && m_toVertex==thatEdge.m_toVertex;
}
}
}