Esempio n. 1
0
        public void TestSwapSimple2()
        {
            var manager = new BDDManager(3);
            var n2      = manager.Create(2, manager.One, manager.Zero);
            var n3      = manager.Create(1, manager.One, n2);
            var n4      = manager.Create(1, manager.Zero, manager.One);
            var root    = manager.Create(0, n3, n4);

            var dict = new Dictionary <int, string> {
                { 0, "a" }, { 1, "b" }, { 2, "c" }
            };
            var rdict = dict.ToDictionary((x) => x.Value, (x) => x.Key);

            var truth = BuildThruthTable(manager, root);

            Console.WriteLine(manager.ToDot(root, (x) => x.RefCount.ToString()));

            var res = manager.Swap(root, rdict["b"], rdict["c"]);

            CheckThruthTable(truth, res);
            Console.WriteLine(manager.ToDot(res, (x) => x.RefCount.ToString()));

            res = manager.Reduce(res);
            CheckThruthTable(truth, res);
            Console.WriteLine(manager.ToDot(res, (x) => x.RefCount.ToString()));
        }
Esempio n. 2
0
        public void TestSimpleITE()
        {
            var manager = new BDDManager(4);

            var b = manager.Create(1, manager.One, manager.Zero);
            var f = manager.Create(0, manager.One, b);

            var c = manager.Create(2, manager.One, manager.Zero);
            var g = manager.Create(0, c, manager.Zero);

            var d = manager.Create(3, manager.One, manager.Zero);
            var h = manager.Create(1, manager.One, d);

            var dict = new Dictionary <int, string> {
                { 0, "a" }, { 1, "b" }, { 2, "c" }, { 3, "d" }
            };

            var res = manager.ITE(f, g, h);

            manager.Reduce(res);

            Assert.AreEqual(0, res.Index);
            Assert.AreEqual(2, res.High.Index);
            Assert.AreEqual(1, res.Low.Index);
            Assert.AreEqual(3, res.Low.Low.Index);

            Assert.AreEqual(true, res.High.High.Value);
            Assert.AreEqual(false, res.High.Low.Value);
            Assert.AreEqual(false, res.Low.High.Value);
            Assert.AreEqual(true, res.Low.Low.High.Value);
            Assert.AreEqual(false, res.Low.Low.Low.Value);
        }
Esempio n. 3
0
        public void TestReduceInfEdAcUk()
        {
            var manager = new BDDManager(3);
            var n1      = manager.Create(2, manager.One, manager.Zero);
            var n2      = manager.Create(2, manager.One, manager.Zero);

            var n3 = manager.Create(1, n1, manager.Zero);
            var n4 = manager.Create(1, n2, n1);
            var n5 = manager.Create(0, n4, n3);

            var truth = BuildThruthTable(manager, n5);

            var res = manager.Reduce(n5);

            CheckThruthTable(truth, res);

            Assert.AreEqual(0, res.Index);
            Assert.AreEqual(1, res.Low.Index);
            Assert.AreEqual(2, res.Low.High.Index);
            Assert.AreEqual(2, res.High.Index);

            Assert.AreEqual(false, res.Low.Low.Value);
            Assert.AreEqual(false, res.Low.High.Low.Value);
            Assert.AreEqual(false, res.High.Low.Value);

            Assert.AreEqual(true, res.High.High.Value);
            Assert.AreEqual(true, res.Low.High.High.Value);
        }
Esempio n. 4
0
        public void TestReduceSimple()
        {
            var manager = new BDDManager(3);
            var n3      = manager.Create(2, manager.One, manager.One);
            var n4      = manager.Create(1, n3, manager.Zero);
            var n2      = manager.Create(1, n3, manager.Zero);
            var root    = manager.Create(0, n2, n4);

            var truth = BuildThruthTable(manager, root);

            var res = manager.Reduce(root);

            CheckThruthTable(truth, res);

            Assert.AreEqual(1, res.Index);
            Assert.AreEqual(false, res.Low.Value);
            Assert.AreEqual(true, res.High.Value);
        }
Esempio n. 5
0
        public void TestSwapAsymetric()
        {
            var manager = new BDDManager(2);
            var n3      = manager.Create(1, manager.One, manager.Zero);
            var root    = manager.Create(0, n3, manager.One);

            var dict = new Dictionary <int, string> {
                { 0, "a" }, { 1, "b" }, { 2, "c" }
            };

            var truth = BuildThruthTable(manager, root);

            Console.WriteLine(manager.ToDot(root, (x) => x.RefCount.ToString()));

            var res = manager.Reduce(manager.Swap(root, 0, 1));

            Console.WriteLine(manager.ToDot(res, (x) => x.RefCount.ToString()));

            CheckThruthTable(truth, res);
        }
Esempio n. 6
0
        public void TestReduceInfUnibzIt()
        {
            var manager = new BDDManager(4);
            var n1      = manager.Create(3, manager.Zero, manager.Zero);
            var n2      = manager.Create(3, manager.One, manager.Zero);
            var n3      = manager.Create(3, manager.Zero, manager.Zero);
            var n4      = manager.Create(3, manager.One, manager.Zero);
            var n5      = manager.Create(3, manager.Zero, manager.Zero);
            var n6      = manager.Create(3, manager.One, manager.Zero);
            var n7      = manager.Create(3, manager.One, manager.One);
            var n8      = manager.Create(3, manager.One, manager.One);

            var n9  = manager.Create(2, n2, n1);
            var n10 = manager.Create(2, n4, n3);
            var n11 = manager.Create(2, n6, n5);
            var n12 = manager.Create(2, n8, n7);

            var n13 = manager.Create(1, n10, n9);
            var n14 = manager.Create(1, n12, n11);

            var n15 = manager.Create(0, n14, n13);

            var truth = BuildThruthTable(manager, n15);

            var res = manager.Reduce(n15);

            CheckThruthTable(truth, res);

            Assert.AreEqual(0, res.Index);
            Assert.AreEqual(2, res.Low.Index);
            Assert.AreEqual(3, res.Low.High.Index);
            Assert.AreEqual(1, res.High.Index);
            Assert.AreEqual(2, res.High.Low.Index);

            Assert.AreEqual(false, res.Low.Low.Value);
            Assert.AreEqual(false, res.Low.High.Low.Value);
            Assert.AreEqual(false, res.High.Low.Low.Value);

            Assert.AreEqual(true, res.High.High.Value);
            Assert.AreEqual(true, res.Low.High.High.Value);
        }
Esempio n. 7
0
        private void button5_Click(object sender, EventArgs e)
        {
            if (textBox1.Text != "")
            {
                string       input = textBox1.Text;
                List <Token> rpn   = Arithmetic.Calculate(input);
                if (rpn != null)
                {
                    Dictionary <string, bool> variables = Arithmetic.GetVariables(rpn);
                    var manager = new BDDManager(variables.Count);
                    var root    = Arithmetic.CreateTree(rpn, variables, manager);
                    if (root != null)
                    {
                        List <BDDNode> list = root.Nodes.ToList();

                        var v1 = new Dictionary <int, string>();
                        int j  = 0;
                        foreach (KeyValuePair <string, bool> kv in variables)
                        {
                            v1.Add(j, kv.Key);
                            j++;
                        }
                        manager.Reduce(root);
                        Func <BDDNode, string> labelFunction = (x) => v1[x.Index];
                        Bitmap bm = new Bitmap(Graphviz.RenderImage(manager.ToDot(root, labelFunction, false), "jpg"));
                        pictureBox1.Image = bm;
                        label1.Text       = "Готово";
                    }
                    else
                    {
                        label1.Text = "Ошибка при вычислении логической формулы";
                    }
                }
                else
                {
                    label1.Text = "Ошибка ввода логической формулы";
                }
            }
        }