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));
     }
 }
Ejemplo n.º 3
0
        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));
         }
     }
 }
 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));
         }
     }
 }
 void PutLeftRightConstraintsIntoSolver(ISolverShell solver) {
     foreach (var pair in horizontalConstraints.LeftRighInts) {
         solver.AddLeftRightSeparationConstraint(pair.Item1, pair.Item2, SimpleGapBetweenTwoNodes(pair.Item1, pair.Item2));
     }
 }