Example #1
0
        public virtual void VisitInternal(ITreeOperatorNode <TOp> on)
        {
            if (on.Left != null)
            {
                Visit(on.Left);
            }

            if (on.Right != null)
            {
                Visit(on.Right);
            }
        }
Example #2
0
        public override void VisitInternal(ITreeOperatorNode <TensorOp> on)
        {
            Node srcNode   = Context.IsInternal ? Context.InternalNode : null;
            Node graphNode = Graph.AddNode(on.Id.ToString());

            graphNode.Label = new Label(on.Op.ToString());
            if (srcNode != null)
            {
                Graph.AddEdge(srcNode.Id, graphNode.Id);
            }

            using (Context.Internal(graphNode))
            {
                base.VisitInternal(on);
            }
        }
Example #3
0
        public override void VisitInternal(ITreeOperatorNode <TOp> on)
        {
            var operands = new Stack <string>();

            using (Context.Internal(Writer.GetOperatorTemplate(on)))
            {
                base.VisitInternal(on);

                if (on.Right != null)
                {
                    if (on.Right is ITreeOperatorNode <TOp> &&
                        NestedBinaryOperators.Contains(on.Op) &&
                        NestedBinaryOperators.Contains((on.Right as ITreeOperatorNode <TOp>).Op))
                    {
                        operands.Push("(" + (string)Context.Pop() + ")");
                    }
                    else
                    {
                        operands.Push((string)Context.Pop());
                    }
                }

                if (on.Left != null)
                {
                    if (on.Left is ITreeOperatorNode <TOp> &&
                        NestedBinaryOperators.Contains(on.Op) &&
                        NestedBinaryOperators.Contains((on.Left as ITreeOperatorNode <TOp>).Op))
                    {
                        operands.Push("(" + (string)Context.Pop() + ")");
                    }
                    else
                    {
                        operands.Push((string)Context.Pop());
                    }
                }
            }

            Context.Push(Writer.WriteOperator(on.Op, operands.ToArray()));
        }
Example #4
0
 public virtual string GetOperatorTemplate(ITreeOperatorNode <TOp> on) => OperatorTemplate[on.Op];
Example #5
0
        public override void VisitInternal(ITreeOperatorNode <TensorOp> on)
        {
            /* When the operand of a contraction op is not a tensor variable, synthesize a scalar variable
             * to represent the expression
             */
            if (TreeNodeIsContractionOp(on) && !(TreeNodeIsTensor(on.Left) || TreeNodeIsAssignmentOp(on.Left)))
            {
                base.Visit(on.Left);
                string lhs = GetNewVariableName("SYN");
                string rhs = (string)Context.Pop();
                AddElementwiseVariableDefinition(lhs, rhs, Writer.GetOperator(TensorOp.IndexedAssign, lhs, rhs));
                Context.Push(Writer.WriteOperator(on.Op, lhs + "[]"));
                return;
            }

            switch (on.Op)
            {
            case TensorOp.ElementWiseAssign:
                base.VisitInternal(on);
                string s = (string)Context.Pop();
                string lhs = s.Split('=').First().TrimEnd(), rhs = s.Split('=').Last().TrimEnd();
                AddElementwiseVariableDefinition(lhs, rhs, s);
                Context.Push(lhs);
                return;

            case TensorOp.IndexedAssign:
                if (TreeNodeIsTensorValue(on.Right) || TreeNodeIsContractionOp(on.Right))
                {
                    base.VisitInternal(on);
                    if (TreeNodeIsRoot(on))
                    {
                        return;
                    }
                    else
                    {
                        s   = (string)Context.Pop();
                        lhs = s.Split('=').First().TrimEnd(); rhs = s.Split('=').Last().TrimEnd();
                        AddIndexedVariableDefinition(lhs, rhs, s);
                        Context.Push(lhs);
                        return;
                    }
                }
                else
                {
                    var rhsOp = (ITreeOperatorNode <TensorOp>)on.Right;
                    if (TreeNodeIsContractionOp(rhsOp.Left) &&
                        (TreeNodeIsElementwiseOp(rhsOp.Right) || TreeNodeIsTensorValue(rhsOp.Right)))
                    {
                        string leftIndexVarName = on.Left.Left.Label.ToUpper();
                        Visit(on.Left);
                        string leftIndexVar        = (string)Context.Pop();
                        string newLeftIndexVarName = GetNewVariableName("SYN" + leftIndexVarName);
                        string newLeftIndexVar     = leftIndexVar.Replace(leftIndexVarName, newLeftIndexVarName);

                        Visit(rhsOp.Left);
                        string contractionOp = (string)Context.Pop();
                        s = string.Format(Writer.GetOperatorTemplate(TensorOp.IndexedAssign), newLeftIndexVar, contractionOp);
                        AddIndexedVariableDefinition(newLeftIndexVar, contractionOp, s);

                        Visit(rhsOp.Right);
                        string rightOp = string.Format(Writer.GetOperatorTemplate(rhsOp.Op), newLeftIndexVarName,
                                                       (string)Context.Pop());
                        s = string.Format(Writer.GetOperatorTemplate(TensorOp.ElementWiseAssign), leftIndexVarName, rightOp);
                        AddElementwiseVariableDefinition(leftIndexVarName, rightOp, s);
                        Context.Push(Writer.WriteOperator(TensorOp.ElementWiseAssign, leftIndexVarName, rightOp));
                    }
                    return;
                }

            default:
                base.VisitInternal(on);
                return;
            }
        }