public static DisplayModel getDisplayModel(DirectedWeightedMultigraph<Node, LabeledLink> g, HTable hTable) { DisplayModel displayModel = new DisplayModel(g, hTable); return displayModel; }
public DisplayModel(DirectedWeightedMultigraph<Node, LabeledLink> model, HTable hTable) { this.models = new ArrayList<>(); this.computeModels(model); this.nodesLevel = new HashMap<>(); this.nodesSpan = new HashMap<>(); for(DirectedWeightedMultigraph<Node, LabeledLink> subModel : this.models) { logger.debug(modelNum++ + "Start levelingCyclicGraph"); levelingCyclicGraph(subModel); logger.debug(modelNum + "After levelingCyclicGraph"); printLevels(); computeNodeSpan(subModel); printSpans(); updateNodeLevelsConsideringOverlaps(subModel); printLevels(); printSpans(); int maxLevel = getMaxLevel(true); maxLevel = getMaxLevel(spanNodes); if(maxLevel == 0) maxLevel++; for(Node n : noSpanNodes) { int newMaxLevel = getMaxLevel(false); Map<Integer, Set<Node>> nodesAtLevel = getLevelToNodes(null, false); for(int i=maxLevel; i<newMaxLevel; i++) { Set<Node> nodes = nodesAtLevel.get(i);
public DisplayModel(DirectedWeightedMultigraph<Node, LabeledLink> model) { this.models = new ArrayList<>(); this.computeModels(model); this.nodesLevel = new HashMap<>(); this.nodesSpan = new HashMap<>(); this.hTable = null; for(DirectedWeightedMultigraph<Node, LabeledLink> subModel : models) { levelingCyclicGraph(subModel); computeNodeSpan(subModel); } }
private void levelingCyclicGraph(DirectedWeightedMultigraph<Node, LabeledLink> model) { if (isModelEmpty()) { logger.debug("graph does not have any node."); return ; Set<Node> columnNodes = getAllColumnNodes(model); Set<Node> markedNodes = new HashSet<>(); markedNodes.addAll(columnNodes); if(!nodesLevel.containsKey(w) || nodesLevel.get(w) < level) { if(nodesLevel.containsKey(w)) { if(cycleExits(model, columnNodes, new HashSet<Node>(), v, w)) continue; Map<Integer, Set<Node>> levelToNodes = getLevelToNodes(model, false); if (nodes == null || nodes.isEmpty()) break; HashMap<Node, Integer> nodeToInDegree = inDegreeInSet(model, nodes, false); HashMap<Node, Integer> nodeToOutDegree = outDegreeInSet(model, nodes, false); int lastLevel = getMaxLevel(false); for (Node u : model.vertexSet()) { if (u instanceof ColumnNode)
Map<Integer, Set<Node>> levelToNodes = getLevelToNodes(model, false); if (nodes == null || nodes.isEmpty()) break; HashMap<Node, Integer> nodesOverlap = getNodeOverlap(nodes); HashMap<Node, Integer> nodeToInDegree = inDegreeInSet(model, nodes, false); HashMap<Node, Integer> nodeToOutDegree = outDegreeInSet(model, nodes, false); int lastLevel = getMaxLevel(false); for (Node u : model.vertexSet()) { if (u instanceof ColumnNode)
topObj.put(JsonKeys.worksheetId.name(), worksheetId); DisplayModel dm = new DisplayModel(alignmentGraph, vWorksheet .getWorksheet().getHeaders()); HashMap<Node, Integer> nodeHeightsMap = dm.getNodesLevel(); Map<Node, Set<ColumnNode>> nodeCoverage = dm.getNodesSpan();
private void calculateColumnNodesCoveredByBlankNodes() throws KarmaException { DisplayModel dm = new DisplayModel(alignmentGraph); Set<LabeledLink> links = dm.getOutgoingEdgesOf(treeNode); Iterator<LabeledLink> linkIterator = links.iterator(); while(linkIterator.hasNext())
private void computeModels(DirectedWeightedMultigraph<Node, LabeledLink> model) { DirectedWeightedMultigraph<Node, LabeledLink> nodeModel = findModel(n); if(nodeModel == null) { nodeModel = new DirectedWeightedMultigraph<>(LabeledLink.class); Node source = link.getSource(); Node target = link.getTarget(); DirectedWeightedMultigraph<Node, LabeledLink> sourceModel = findModel(source); DirectedWeightedMultigraph<Node, LabeledLink> targetModel = findModel(target); if(sourceModel != null && sourceModel != nodeModel) { mergeModels(sourceModel, nodeModel); mergeModels(targetModel, nodeModel); for(DirectedWeightedMultigraph<Node, LabeledLink> subModel : this.models) { logger.debug("Model: " + modelNum++); printModel(subModel);
private void computeNodeSpan(DirectedWeightedMultigraph<Node, LabeledLink> model) { if (isModelEmpty()) { logger.debug("graph does not have any node."); return; Map<Integer, Set<Node>> levelToNodes = getLevelToNodes(model, true); Set<ColumnNode> allColumnNodes = new HashSet<>(); int i = getMaxLevel(true); while (i >= 0) {
private boolean cycleExits(DirectedWeightedMultigraph<Node, LabeledLink> model, Set<Node> columnNodes, Set<Node> traversedNodes, Node start, Node end) { Set<Node> neighbors = GraphUtil.getOutNeighbors(GraphUtil.asDefaultGraph(model), start); logger.debug("start:" + start.getDisplayId() + ", end:" + end.getDisplayId()); for (Node w : neighbors) { if(w == end) { return true; } if(columnNodes.contains(w) || traversedNodes.contains(w)) continue; traversedNodes.add(w); logger.debug("neighbour:" + w.getDisplayId()); boolean innerCycle = cycleExits(model, columnNodes, traversedNodes, w, end); if(innerCycle) return true; } return false; }