void AddSeparationConstraintsForFlatEdges(LayerInfo layerInfo, ISolverShell solver) { if (layerInfo != null) { foreach (var p in layerInfo.flatEdges) { int left, right; if (LayerArrays.X[p.Item1] < LayerArrays.X[p.Item2]) { left = p.Item1; right = p.Item2; } else { left = p.Item2; right = p.Item1; } if (left == right) { continue; } double gap = GetGap(left, right); foreach (IntEdge edge in database.GetMultiedge(p.Item1, p.Item2)) { solver.AddLeftRightSeparationConstraint(left, right, gap + NodeSeparation() + (edge.Edge.Label != null ? edge.Edge.Label.Width : 0)); } } } }
void PutLeftRightConstraintsIntoSolver(ISolverShell solver) { foreach (var pair in horizontalConstraints.LeftRighInts) { solver.AddLeftRightSeparationConstraint(pair.Item1, pair.Item2, SimpleGapBetweenTwoNodes(pair.Item1, pair.Item2)); } }
void CalculateLabelsX() { int i; ISolverShell solver = ConstrainedOrdering.CreateSolver(); for (i = 0; i < pairArray.Length; i++) { solver.AddVariableWithIdealPosition(i, labelCenters[i], GetLabelWeight(pairArray[i])); } //add non overlapping constraints between to neighbor labels double prevLabelWidth = GetMaxLabelWidth(pairArray[0]); for (i = 0; i < pairArray.Length - 1; i++) { solver.AddLeftRightSeparationConstraint(i, i + 1, (prevLabelWidth + (prevLabelWidth = GetMaxLabelWidth(pairArray[i + 1]))) / 2 + settings.NodeSeparation); } for (i = 0; i < labelCenters.Length; i++) { double x = labelCenters[i] = solver.GetVariableResolvedPosition(i); foreach (Label label in PairLabels(pairArray[i])) { label.Center = new Point(x, label.Center.Y); } } }
void PutLayerNodeSeparationsIntoSolver(ISolverShell solver) { foreach (var layer in LayerArrays.Layers) { for (int i = 0; i < layer.Length - 1; i++) { int l = layer[i]; int r = layer[i + 1]; solver.AddLeftRightSeparationConstraint(l, r, SimpleGapBetweenTwoNodes(l, r)); } } }
//at the moment we only are looking for the order of nodes in the layer void FillSolverWithoutKnowingLayerOrder(IEnumerable <int> layer, LayerInfo layerInfo, ISolverShell solver, SweepMode sweepMode) { foreach (int v in layer) { if (layerInfo.neigBlocks.ContainsKey(v)) { //v is a block root int blockNode = GetFixedBlockNode(v, layerInfo, sweepMode); if (blockNode != -1) { solver.AddVariableWithIdealPosition(v, FixedNodePosition(blockNode, sweepMode), ConstrainedVarWeight); } else { IEnumerable <int> t = from u in layerInfo.neigBlocks[v].Concat(new[] { v }) where IsConnectedToPrevLayer(u, sweepMode) select u; if (t.Any()) { blockNode = t.First(); solver.AddVariableWithIdealPosition(v, GetBaricenterOnPrevLayer(blockNode, sweepMode)); } } } else if (!BelongsToNeighbBlock(v, layerInfo)) { if (NodeIsConstrained(v, sweepMode, layerInfo)) { solver.AddVariableWithIdealPosition(v, FixedNodePosition(v, sweepMode), ConstrainedVarWeight); } else if (IsConnectedToPrevLayer(v, sweepMode)) { solver.AddVariableWithIdealPosition(v, GetBaricenterOnPrevLayer(v, sweepMode)); } } } AddGoalToKeepFlatEdgesShortOnBlockLevel(layerInfo, solver); foreach (var p in layerInfo.leftRight) { solver.AddLeftRightSeparationConstraint(p.Item1, p.Item2, GetGapBetweenBlockRoots(p.Item1, p.Item2)); } }
//at the moment we only are looking for the order of nodes in the layer void FillSolverWithoutKnowingLayerOrder(IEnumerable<int> layer, LayerInfo layerInfo, ISolverShell solver, SweepMode sweepMode) { foreach (int v in layer) if (layerInfo.neigBlocks.ContainsKey(v)) { //v is a block root int blockNode = GetFixedBlockNode(v, layerInfo, sweepMode); if (blockNode != -1) solver.AddVariableWithIdealPosition(v, FixedNodePosition(blockNode, sweepMode), ConstrainedVarWeight); else { IEnumerable<int> t = from u in layerInfo.neigBlocks[v].Concat(new[] { v }) where IsConnectedToPrevLayer(u, sweepMode) select u; if (t.Any()) { blockNode = t.First(); solver.AddVariableWithIdealPosition(v, GetBaricenterOnPrevLayer(blockNode, sweepMode)); } } } else if (!BelongsToNeighbBlock(v, layerInfo)) { if (NodeIsConstrained(v, sweepMode, layerInfo)) solver.AddVariableWithIdealPosition(v, FixedNodePosition(v, sweepMode), ConstrainedVarWeight); else if (IsConnectedToPrevLayer(v, sweepMode)) solver.AddVariableWithIdealPosition(v, GetBaricenterOnPrevLayer(v, sweepMode)); } AddGoalToKeepFlatEdgesShortOnBlockLevel(layerInfo, solver); foreach (var p in layerInfo.leftRight) solver.AddLeftRightSeparationConstraint(p.Item1, p.Item2, GetGapBetweenBlockRoots(p.Item1, p.Item2)); }
void AddSeparationConstraintsForFlatEdges(LayerInfo layerInfo, ISolverShell solver) { if (layerInfo != null) { foreach (var p in layerInfo.flatEdges) { int left, right; if (LayerArrays.X[p.Item1] < LayerArrays.X[p.Item2]) { left = p.Item1; right = p.Item2; } else { left = p.Item2; right = p.Item1; } if (left == right) continue; double gap = GetGap(left, right); foreach (IntEdge edge in database.GetMultiedge(p.Item1, p.Item2)) solver.AddLeftRightSeparationConstraint(left, right, gap + NodeSeparation() + (edge.Edge.Label != null ? edge.Edge.Label.Width : 0)); } } }