Пример #1
0
        public void AddAssociativityAddNearbyConstants()
        {
            var builderPair = GetSimpleAndConstantFoldingBuilder();
            var sb          = builderPair.Item1;
            var cfb         = builderPair.Item2;

            var x = GetVarAndIdExpr("x", BasicType.Int).Item2;

            Expr foldedResult   = x;
            Expr unfoldedResult = foldedResult;

            for (int index = 2; index <= 4; ++index)
            {
                foldedResult   = cfb.Mul(cfb.ConstantInt(index), foldedResult);
                unfoldedResult = sb.Mul(sb.ConstantInt(index), unfoldedResult);
                CheckIsInt(foldedResult);
                CheckIsInt(unfoldedResult);
            }
            Assert.AreEqual("24 * x", foldedResult.ToString());
            Assert.AreEqual("4 * 3 * 2 * x", unfoldedResult.ToString());
            Assert.IsFalse(foldedResult.Equals(unfoldedResult));

            var asMul = ExprUtil.AsMul(foldedResult);

            Assert.IsNotNull(asMul);
            // Check the constant is the top left argument
            Assert.IsNotNull(ExprUtil.AsLiteral(asMul.Args[0]));
        }
Пример #2
0
        public void MulAssociativityPropagateConstantUp()
        {
            var builderPair = GetSimpleAndConstantFoldingBuilder();
            var sb          = builderPair.Item1;
            var cfb         = builderPair.Item2;

            Expr foldedResult   = sb.ConstantInt(2);
            Expr unfoldedResult = foldedResult;

            for (int index = 0; index < 3; ++index)
            {
                var x = GetVarAndIdExpr("x" + index.ToString(), BasicType.Int).Item2;
                foldedResult   = cfb.Mul(x, foldedResult);
                unfoldedResult = sb.Mul(x, unfoldedResult);
                CheckIsInt(foldedResult);
                CheckIsInt(unfoldedResult);
            }
            Assert.AreEqual("2 * x2 * x1 * x0", foldedResult.ToString());
            Assert.AreEqual("x2 * x1 * x0 * 2", unfoldedResult.ToString());
            Assert.IsFalse(foldedResult.Equals(unfoldedResult));


            var asMul = ExprUtil.AsMul(foldedResult);

            Assert.IsNotNull(asMul);
            // Check the constant is the top left argument
            Assert.IsNotNull(ExprUtil.AsLiteral(asMul.Args[0]));
        }
Пример #3
0
        public void AddSimpleConstantsRealVars()
        {
            var cfb    = GetConstantFoldingBuilder();
            var x      = GetVarAndIdExpr("x", BasicType.Real).Item2;
            var result = cfb.Add(x, x);

            CheckIsReal(result);
            var asMul = ExprUtil.AsMul(result);

            Assert.IsNotNull(asMul);
            var asMulLhs = ExprUtil.AsLiteral(asMul.Args[0]);

            Assert.IsNotNull(asMulLhs);
            Assert.AreEqual("2e0", asMulLhs.asBigDec.ToString());
            Assert.AreSame(x, asMul.Args[1]);
            Assert.AreEqual("2e0 * x", result.ToString());
        }
Пример #4
0
        public void AddSameIntVars()
        {
            var cfb    = GetConstantFoldingBuilder();
            var x      = GetVarAndIdExpr("x", BasicType.Int).Item2;
            var result = cfb.Add(x, x);

            CheckIsInt(result);
            var asMul = ExprUtil.AsMul(result);

            Assert.IsNotNull(asMul);
            var asMulLhs = ExprUtil.AsLiteral(asMul.Args[0]);

            Assert.IsNotNull(asMulLhs);
            Assert.AreEqual(BigNum.FromInt(2), asMulLhs.asBigNum);
            Assert.AreSame(x, asMul.Args[1]);
            Assert.AreEqual("2 * x", result.ToString());
        }
Пример #5
0
        public void NestedDivInt()
        {
            var builderPair = GetSimpleAndConstantFoldingBuilder();
            var x           = GetVarAndIdExpr("x", BasicType.Int).Item2;
            var y           = GetVarAndIdExpr("y", BasicType.Int).Item2;
            var z           = GetVarAndIdExpr("z", BasicType.Int).Item2;
            var cfb         = builderPair.Item2;
            var result      = cfb.Div(cfb.Div(x, y), z);
            var asDiv       = ExprUtil.AsDiv(result);

            Assert.IsNotNull(asDiv);
            CheckIsInt(result);
            Assert.AreSame(x, asDiv.Args[0]);
            var rhsOfDiv = ExprUtil.AsMul(asDiv.Args[1]);

            Assert.IsNotNull(rhsOfDiv);
            Assert.AreSame(y, rhsOfDiv.Args[0]);
            Assert.AreSame(z, rhsOfDiv.Args[1]);
        }