protected LBDDNode Contraction(LBDDNode x, int v, bool pos) // сужение функции на 0 или 1 { if (v != x.GetVarId()) { return(x); } return(pos ? x.GetHigh() : x.GetLow()); }
private void ConvertToDot(LBDDNode node) { if (node.IsTerminal) { return; } var v = CreateVertex(node); var l = CreateVertex(node.GetLow()); var h = CreateVertex(node.GetHigh()); if (!g.ContainsEdge(v, l)) { g.AddEdge(new LBDDToGraph.Edge(v, l, false)); } if (!g.ContainsEdge(v, h)) { g.AddEdge(new LBDDToGraph.Edge(v, h, true)); } ConvertToDot(node.GetLow()); ConvertToDot(node.GetHigh()); }
public virtual LBDDNode NOT(LBDDNode f) { if (f.GetId() == Zero.GetId()) { return(One); } if (f.GetId() == One.GetId()) { return(Zero); } if (_notCache.ContainsKey(f.GetId())) { return(_notCache[f.GetId()]); } int v = f.GetVarId(); var invLow = NOT(f.GetLow()); var invHigh = NOT(f.GetHigh()); LBDDNode node = null; if (f.IsDouble()) { node = MakeOrReturn(v, LBDDNode.Labeling.Double, invHigh, invLow); } else if (f.IsNegate()) { node = MakeOrReturn(v, LBDDNode.Labeling.Non, invLow, invHigh); } else /*f.IsNormal()*/ { node = MakeOrReturn(v, LBDDNode.Labeling.Negate, invLow, invHigh); } _notCache.Add(f.GetId(), node); return(node); }