Пример #1
0
    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);
    }
Пример #2
0
    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);
        }
    }
Пример #3
0
 public static BDDNode MakeAnd(this OBDD obdd, BDDNode a, BDDNode b)
 {
     return(obdd.MakeIfThenElse(a, b, BDDNode.False));
 }
Пример #4
0
 public static BDDNode MakeLiteral(this OBDD obdd, int index)
 {
     return(obdd.MakeNode(index, BDDNode.True, BDDNode.False));
 }
Пример #5
0
 public static BDDNode MakeNot(this OBDD obdd, BDDNode node)
 {
     return(obdd.MakeIfThenElse(node, BDDNode.False, BDDNode.True));
 }
Пример #6
0
 public static BDDNode MakeOr(this OBDD obdd, BDDNode a, BDDNode b)
 {
     return(obdd.MakeIfThenElse(a, BDDNode.True, b));
 }