package org.wikibrain.mapper.algorithms.conceptualign3;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
import org.jgrapht.event.ConnectedComponentTraversalEvent;
import org.jgrapht.event.EdgeTraversalEvent;
import org.jgrapht.event.TraversalListener;
import org.jgrapht.event.VertexTraversalEvent;
import org.wikibrain.core.WikiBrainException;
import org.wikibrain.core.lang.Language;
import org.wikibrain.core.lang.LocalId;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Created by bjhecht on 5/20/14.
*/
public class ConnectedComponentTraversalListener implements TraversalListener<LocalId, ILLEdge> {
private List<LocalId> curVertices;
private ILLGraph graph;
private List<ConnectedComponentHandler> ccHandlers;
private int curComponentId;
private final List<ClusterResult> clusterResults;
private static Logger LOG = LoggerFactory.getLogger(ConceptualignConceptMapper.class);
public ConnectedComponentTraversalListener(ILLGraph graph, List<ConnectedComponentHandler> ccHandlers) throws WikiBrainException {
this.graph = graph;
this.ccHandlers = ccHandlers;
this.curComponentId = 0;
this.clusterResults = Lists.newArrayList();
newConnectedComponent();
}
private void newConnectedComponent(){
//log.trace(""); // stupid hack for a new line
curVertices = Lists.newArrayList();
curComponentId++;
}
// private int debug_counter = 0;
@Override
public void connectedComponentFinished(ConnectedComponentTraversalEvent arg0) {
try {
if (curVertices.size() > 0) { // make sure we're dealing with a valid component (e.g. not a disambig page)
for (ConnectedComponentHandler ccHandler : ccHandlers) {
List<ClusterResult> clusters = ccHandler.handle(curVertices, graph, curComponentId);
clusterResults.addAll(clusters);
}
if (curComponentId % 1000 == 0) {
LOG.info(String.format("Traversed through %d connected components", curComponentId));
}
}
}catch(WikiBrainException e){
LOG.error(e.getMessage());
}
}
@Override
public void connectedComponentStarted(ConnectedComponentTraversalEvent arg0) {
newConnectedComponent();
}
@Override
public void edgeTraversed(EdgeTraversalEvent<LocalId, ILLEdge> arg0) {
// do nothing
}
@Override
public void vertexFinished(VertexTraversalEvent<LocalId> arg0) {
// do nothing
}
@Override
public void vertexTraversed(VertexTraversalEvent<LocalId> arg0) {
curVertices.add(arg0.getVertex());
}
public List<ClusterResult> getClusterResults(){
return this.clusterResults;
}
}