public virtual void VisitInternal(ITreeOperatorNode <TOp> on) { if (on.Left != null) { Visit(on.Left); } if (on.Right != null) { Visit(on.Right); } }
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); } }
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())); }
public virtual string GetOperatorTemplate(ITreeOperatorNode <TOp> on) => OperatorTemplate[on.Op];
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; } }