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])); }
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])); }
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()); }
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()); }
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]); }