package edu.isi.karma.modeling.alignment.learner; import org.jgrapht.graph.DirectedWeightedMultigraph; import edu.isi.karma.rep.alignment.ColumnNode; import edu.isi.karma.rep.alignment.ColumnSemanticTypeStatus; import edu.isi.karma.rep.alignment.InternalNode; import edu.isi.karma.rep.alignment.LabeledLink; import edu.isi.karma.rep.alignment.LinkStatus; import edu.isi.karma.rep.alignment.Node; public class LinkCoherence extends Coherence { private boolean interactiveMode; public LinkCoherence() { super(); this.interactiveMode = true; } public LinkCoherence(boolean interactiveMode) { super(); this.interactiveMode = interactiveMode; } public LinkCoherence(LinkCoherence coherence) { super(coherence); } public void updateCoherence(LabeledLink link) { if (link == null) return; if (interactiveMode) { if (link.getStatus() == LinkStatus.ForcedByUser) return; if (link.getTarget() instanceof ColumnNode) { ColumnNode cn = (ColumnNode)link.getTarget(); if (cn.getSemanticTypeStatus() == ColumnSemanticTypeStatus.UserAssigned) return; } } else { if (!(link.getTarget() instanceof InternalNode)) return; } this.itemsCount ++; if (link.getModelIds() == null || link.getModelIds().isEmpty()) return; updateCoherence(link.getModelIds()); } public void updateCoherence(DirectedWeightedMultigraph<Node, LabeledLink> model, LabeledLink link) { if (link == null) return; if (interactiveMode) { if (link.getStatus() == LinkStatus.ForcedByUser) return; if (link.getTarget() instanceof ColumnNode) { ColumnNode cn = (ColumnNode)link.getTarget(); if (cn.getSemanticTypeStatus() == ColumnSemanticTypeStatus.UserAssigned) return; } } else { if (!(link.getTarget() instanceof InternalNode)) return; } this.itemsCount ++; // internal nodes that do not reach to a column node in the model if (link.getTarget() instanceof InternalNode) { InternalNode in = (InternalNode)link.getTarget(); if (model.outgoingEdgesOf(in) == null || model.outgoingEdgesOf(in).isEmpty()) { this.itemsCount += model.edgeSet().size(); return; } } if (link.getModelIds() == null || link.getModelIds().isEmpty()) return; updateCoherence(link.getModelIds()); } public double getCoherenceValue() { if (this.itemsCount == 0) { return 1.0; } if (numOfElementsInMaxPatterns > 0) return (double)patternSize.get(maxPatterns[0])/(double)this.itemsCount; else return 0.0; } public Integer[] getCoherencePair() { // <number of pattern links, total links> if (this.itemsCount == 0) { return new Integer[]{0,0}; } if (numOfElementsInMaxPatterns > 0) return new Integer[]{patternSize.get(maxPatterns[0]),this.itemsCount}; else return new Integer[]{0,this.itemsCount}; } }