void InitSolverVars(ISolverShell solver) { for (int i = 0; i < LayerArrays.Y.Length; i++) { solver.AddVariableWithIdealPosition(i, 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); } } }
//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 InitSolverVars(ISolverShell solver) { for (int i = 0; i < LayerArrays.Y.Length; i++) solver.AddVariableWithIdealPosition(i, 0); }