private static BDDNode AddTransition(OBDD obdd, BDDNode node, int index, int numBits, int offset) { for (int i = 0; i < numBits; i++) { int literal = i * 2 + offset; var variable = obdd.MakeLiteral(literal); bool hasBit = (index & (1 << i)) != 0; if (!hasBit) { variable = obdd.MakeNot(variable); } node = obdd.MakeAnd(node, variable); } return(node); }
public void AddTransition() { const int numBits = 3; var obdd = new OBDD(); var root = AddTransition(obdd, 0, 1, numBits); // example i = 0, j = 1, numBits = 3 // binary i = 000, j = 001 // interleave j2 i2 j1 i1 j0 i0 // 0 0 0 0 1 0 // variables 5 4 3 2 1 0 using (var writer = new StringWriter()) { root.ExportToGraphviz(writer); Debug.Log(writer); } using (var writer = new StringWriter()) { obdd.ExportToGraphviz(writer); Debug.Log(writer); } }
public static BDDNode MakeAnd(this OBDD obdd, BDDNode a, BDDNode b) { return(obdd.MakeIfThenElse(a, b, BDDNode.False)); }
public static BDDNode MakeLiteral(this OBDD obdd, int index) { return(obdd.MakeNode(index, BDDNode.True, BDDNode.False)); }
public static BDDNode MakeNot(this OBDD obdd, BDDNode node) { return(obdd.MakeIfThenElse(node, BDDNode.False, BDDNode.True)); }
public static BDDNode MakeOr(this OBDD obdd, BDDNode a, BDDNode b) { return(obdd.MakeIfThenElse(a, BDDNode.True, b)); }