Пример #1
0
        public static CasExpressionTree ToExpressionTree(this MathematicaExpression expr, IntegerSequenceGenerator seqGen, SortedDictionary <string, CasExpressionTreeNode> subExprDict, string lhsVarName)
        {
            var srcStk = new Stack <Expr>();
            var dstStk = new Stack <CasExpressionTreeNode>();

            var rootExpr = expr.Expression;
            var rootNode = new CasExpressionTreeNode(lhsVarName, expr);
            var tree     = new CasExpressionTree(rootNode, subExprDict);

            var rootExprText = rootExpr.ToString();

            if (subExprDict.ContainsKey(rootExprText) == false)
            {
                subExprDict.Add(rootExprText, rootNode);
            }

            srcStk.Push(rootExpr);
            dstStk.Push(rootNode);

            while (srcStk.Count > 0)
            {
                var curExpr = srcStk.Pop();
                var curNode = dstStk.Pop();

                if (curExpr.Args.Length > 0)
                {
                    var newArgs = new object[curExpr.Args.Length];

                    var i = 0;
                    foreach (var childExpr in curExpr.Args)
                    {
                        var childExprText = childExpr.ToString();
                        CasExpressionTreeNode childNode;

                        if (subExprDict.TryGetValue(childExprText, out childNode) == false)
                        {
                            var childArgName = seqGen.GetNewStringId();

                            var childCasExpr =
                                MathematicaExpression.Create(expr.CasInterface, childExpr);

                            childNode = new CasExpressionTreeNode(childArgName, childCasExpr);

                            subExprDict.Add(childExprText, childNode);
                        }

                        curNode.AddChild(childNode);

                        srcStk.Push(childExpr);
                        dstStk.Push(childNode);

                        if (childExpr.AtomQ())
                        {
                            newArgs[i] = childExpr;
                        }
                        else
                        {
                            newArgs[i] = new Expr(ExpressionType.Symbol, childNode.LhsVariableName);
                        }

                        i++;
                    }

                    curNode.RhsReducedExpression =
                        MathematicaExpression.Create(
                            expr.CasInterface,
                            new Expr(curExpr.Head, newArgs)
                            );
                }
                else
                {
                    curNode.RhsReducedExpression = curNode.RhsExpression;
                }
            }

            return(tree);
        }
Пример #2
0
        //public static bool IsLowLevelVariable(this Expr expr)
        //{
        //    return expr.SymbolQ() && IsLowLevelVariableName(expr.ToString());
        //}

        /// <summary>
        /// True if the given symbolic scalar is actually a low-level item symbol
        /// </summary>
        /// <param name="symbolicScalar"></param>
        /// <returns></returns>
        public static bool IsLowLevelVariable(this MathematicaExpression symbolicScalar)
        {
            var expr = symbolicScalar.Expression;

            return(expr.SymbolQ() && IsLowLevelVariableName(expr.ToString()));
        }
Пример #3
0
 public CasExpressionTreeNode(string lhsVarName, MathematicaExpression nodeExpr)
 {
     RhsExpression        = nodeExpr;
     RhsReducedExpression = nodeExpr;
     LhsVariableName      = lhsVarName;
 }
Пример #4
0
        public MathematicaExpression Add(string constName, MathematicaExpression casExpr)
        {
            _constantsDictionary.Add(constName, casExpr);

            return(casExpr);
        }
Пример #5
0
 public CasExpressionTreeNode(MathematicaExpression nodeExpr)
 {
     RhsExpression        = nodeExpr;
     RhsReducedExpression = nodeExpr;
 }