package doser.entitydisambiguation.algorithms.collective;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class Vertex implements Comparable<Vertex> {
private List<String> uris;
private int entityQuery;
private double score;
private boolean isCandidate;
private String description;
private String text;
private String context;
private double occurrences;
private Set<Edge> outgoingEdges;
private double sumOutGoing;
public Vertex() {
super();
this.uris = new ArrayList<String>();
this.outgoingEdges = new HashSet<Edge>();
this.entityQuery = -1;
this.isCandidate = false;
this.sumOutGoing = 0;
this.text = "";
this.context = "";
}
public void addOutGoingEdge(Edge e) {
outgoingEdges.add(e);
this.sumOutGoing += e.getTransition();
for(Edge out : outgoingEdges) {
out.setProbability(out.getTransition() / sumOutGoing);
}
}
public void removeAllOutgoingEdges() {
this.outgoingEdges.clear();
}
public Edge removeOutgoingEdge(Vertex v, Map<Edge, Number> edgeWeight) {
Edge toRemove = null;
for (Edge e : outgoingEdges) {
if (e.getTarget().equals(v)) {
toRemove = e;
break;
}
}
if (toRemove != null) {
outgoingEdges.remove(toRemove);
sumOutGoing -= toRemove.getTransition();
}
// Update Transition Probability
for(Edge out : outgoingEdges) {
out.setProbability(out.getTransition() / sumOutGoing);
edgeWeight.put(out, out.getProbability());
}
return toRemove;
}
public String getContext() {
return context;
}
public void setContext(String context) {
this.context = context;
}
public double getSumOutGoingEdges() {
return sumOutGoing;
}
public Set<Edge> getOutgoingEdges() {
return this.outgoingEdges;
}
public List<String> getUris() {
return uris;
}
public void addUri(String uri) {
this.uris.add(uri);
}
public boolean isCandidate() {
return isCandidate;
}
public void setCandidate(boolean isCandidate) {
this.isCandidate = isCandidate;
}
public int getEntityQuery() {
return entityQuery;
}
public void setEntityQuery(int entityQuery) {
this.entityQuery = entityQuery;
}
public void setGraphValue(double val) {
this.score = val;
}
public double getScore() {
return this.score;
}
public void setScore(double score) {
this.score = score;
}
public String getDescription() {
return description;
}
void setDescription(String description) {
this.description = description;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public double getOccurrences() {
return occurrences;
}
public void setOccurrences(int occurrences) {
this.occurrences = Math.log10(occurrences + 1);
}
@Override
public boolean equals(Object obj) {
Vertex comp = (Vertex) obj;
boolean isEqual = true;
if (this.uris.size() != comp.getUris().size()
|| this.entityQuery != comp.getEntityQuery()) {
return false;
}
for (int i = 0; i < uris.size(); ++i) {
if (!uris.get(i).equalsIgnoreCase(comp.getUris().get(i))) {
isEqual = false;
break;
}
}
return isEqual;
}
@Override
public int hashCode() {
return (generateUriHash(this.uris) + ((Integer) this.getEntityQuery())
.hashCode());
}
private int generateUriHash(List<String> uris) {
int hash = 0;
for (String uri : uris) {
hash += uri.hashCode();
}
return hash;
}
/**
* The return values are switched to provide a descending order when using
* Collections.sort(), which generally provides an ascending sort order.
*
*/
@Override
public int compareTo(Vertex o) {
if (this.getOccurrences() < o.getOccurrences()) {
return 1;
} else if (this.getOccurrences() > o.getOccurrences()) {
return 1;
} else {
return 0;
}
}
}