org.semanticweb.elk.reasoner.taxonomy.TaxonomyNodeUtils Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of elk-reasoner Show documentation
Show all versions of elk-reasoner Show documentation
The core ELK Reasoner package
/*
* #%L
* ELK Reasoner
* $Id:$
* $HeadURL:$
* %%
* Copyright (C) 2011 - 2013 Department of Computer Science, University of Oxford
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
package org.semanticweb.elk.reasoner.taxonomy;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Set;
import org.semanticweb.elk.owl.interfaces.ElkEntity;
import org.semanticweb.elk.reasoner.taxonomy.model.GenericInstanceNode;
import org.semanticweb.elk.reasoner.taxonomy.model.GenericTaxonomyNode;
import org.semanticweb.elk.reasoner.taxonomy.model.GenericTypeNode;
import org.semanticweb.elk.util.collections.ArrayHashSet;
import org.semanticweb.elk.util.collections.Operations;
import org.semanticweb.elk.util.collections.Operations.Functor;
/**
* A collection of utility methods, mostly for the frequent use case of
* recursive traversal
*
* @author Pavel Klinov
*
* [email protected]
* @author Peter Skocovsky
*/
public class TaxonomyNodeUtils {
public static Set getAllReachable(
final Collection extends N> direct,
final Functor> succ) {
final Set result = new ArrayHashSet(direct.size());
result.addAll(direct);
final Queue todo = new LinkedList(direct);
while (!todo.isEmpty()) {
final N next = todo.poll();
for (final N succNode : succ.apply(next)) {
if (result.add(succNode)) {
todo.add(succNode);
}
}
}
return Collections.unmodifiableSet(result);
}
public static Set collectFromAllReachable(
final Collection extends N> direct,
final Collection extends O> init,
final Functor> succ,
final Functor> collect) {
final Set result = new ArrayHashSet();
result.addAll(init);
final Set queued = new ArrayHashSet();
queued.addAll(direct);
final Queue todo = new LinkedList(direct);
while (!todo.isEmpty()) {
final N next = todo.poll();
result.addAll(collect.apply(next));
for (final N succNode : succ.apply(next)) {
if (queued.add(succNode)) {
todo.add(succNode);
}
}
}
return Collections.unmodifiableSet(result);
}
/**
* Returns all super-nodes of a node whose direct super-nodes are in
* direct
.
*
* @param
* The type of nodes
* @param
* The type of members of the nodes.
* @param direct
* The direct super-nodes.
* @return all super-nodes of a node whose direct super-nodes are
* direct
.
*/
public static >
Set extends N> getAllSuperNodes(final Collection extends N> direct) {
return getAllReachable(direct, new Functor>() {
@Override
public Set extends N> apply(final N node) {
return node.getDirectSuperNodes();
}});
}
/**
* Returns all sub-nodes of a node whose direct sub-nodes are
* direct
.
*
* @param
* The type of nodes
* @param
* The type of members of the nodes.
* @param direct
* The direct sub-nodes.
* @return all sub-nodes of a node whose direct sub-nodes are
* direct
.
*/
public static >
Set extends N> getAllSubNodes(final Collection extends N> direct) {
return getAllReachable(direct, new Functor>() {
@Override
public Set extends N> apply(final N node) {
return node.getDirectSubNodes();
}});
}
/**
* Returns all instance nodes of the specified type node and all its
* sub-nodes.
*
* @param
* The type of type nodes
* @param
* The type of instance nodes
* @param
* The type of members of the type nodes.
* @param
* The type of members of the instance nodes.
* @param node
* The type node whose instances should be returned.
* @return all instance nodes of the specified type node and all its
* sub-nodes.
*/
public static , IN extends GenericInstanceNode>
Set extends IN> getAllInstanceNodes(final GenericTypeNode node) {
return TaxonomyNodeUtils.collectFromAllReachable(
node.getDirectSubNodes(),
node.getDirectInstanceNodes(),
new Operations.Functor, Set extends GenericTypeNode>>() {
@Override
public Set extends TN> apply(final GenericTypeNode n) {
return n.getDirectSubNodes();
}
},
new Operations.Functor, Set extends IN>>() {
@Override
public Set extends IN> apply(final GenericTypeNode n) {
return n.getDirectInstanceNodes();
}
});
}
}