org.carrot2.util.GraphUtils Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of carrot2-core Show documentation
Show all versions of carrot2-core Show documentation
Carrot2 Text Clustering Library
/*
* Carrot2 project.
*
* Copyright (C) 2002-2021, Dawid Weiss, Stanisław Osiński.
* All rights reserved.
*
* Refer to the full license file "carrot2.LICENSE"
* in the root folder of the repository checkout or at:
* https://www.carrot2.org/carrot2.LICENSE
*/
package org.carrot2.util;
import com.carrotsearch.hppc.IntArrayDeque;
import com.carrotsearch.hppc.IntArrayList;
import java.util.ArrayList;
import java.util.List;
/** Various utilities for processing graphs. */
public class GraphUtils {
/**
* Finds coherent subgraphs of an undirected graph.
*
* @param vertexCount the number of vertices in the graph
* @param arcPredicate a predicate that determines which vertices are connected by an arc
* @param pruneOneNodeSubrgaphs if true
, one-node subgraphs will not be included in
* the result
* @return a list of {@link IntArrayList}s containing vertices of the coherent subgraphs
*/
public static List findCoherentSubgraphs(
int vertexCount, IArcPredicate arcPredicate, boolean pruneOneNodeSubrgaphs) {
// Find coherent sub-graphs using breadth-first search
final boolean[] nodesChecked = new boolean[vertexCount];
final List clusterGroups = new ArrayList<>();
final IntArrayDeque nodeQueue = new IntArrayDeque();
for (int i = 0; i < vertexCount; i++) {
if (!nodesChecked[i]) {
nodeQueue.clear();
nodeQueue.addLast(i);
nodesChecked[i] = true;
IntArrayList clusterGroup = new IntArrayList();
while (!nodeQueue.isEmpty()) {
// Get a node from the queue
int node = nodeQueue.removeFirst();
// Add to the current sub-graph (cluster group)
clusterGroup.add(node);
// Add all its non-checked neighbors to the queue
for (int j = i + 1; j < vertexCount; j++) {
if (!nodesChecked[j]) {
if (arcPredicate.isArcPresent(node, j)) {
nodeQueue.addLast(j);
nodesChecked[j] = true;
}
}
}
}
if (clusterGroup.size() > 1 || !pruneOneNodeSubrgaphs) {
clusterGroups.add(clusterGroup);
}
}
}
return clusterGroups;
}
/** A predicate defining arcs of an undirected graph. */
public static interface IArcPredicate {
/**
* Returns true
if there is an arc connecting vertexA
and
* vertexB
.
*/
public boolean isArcPresent(int vertexA, int vertexB);
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy