public override void VisitLeaf(ITreeValueNode node) { if (!TreeNodeIsDimensionVariable(node)) { base.VisitLeaf(node); return; } else { (ITreeValueNode parent, int dim) = GetDimensionVariableParent(node); if (Tree.InputVariableNodes.Contains(parent)) { base.VisitLeaf(node); return; } else { ITermShape parentShape = parent.ValueAs <ITermShape>(); ITermShape substituteParentShape = InputShapes.FirstOrDefault(s => s.Dimensions.SequenceEqual(parentShape.Dimensions)); if (substituteParentShape == null) { throw new TileGeneratorException(this, "Could not find input variable node to substitute for " + $"{parentShape.Label}."); } else { Context.Push(substituteParentShape.Label.ToUpper() + "DIM" + dim.ToString()); } } } }
public bool Compile <TKernel>(IEnumerable <ITermShape> inputShapes, ITermShape outputShape, string code, out IRunnable <TKernel> result) where TKernel : unmanaged, IEquatable <TKernel>, IComparable <TKernel>, IConvertible { result = null; ThrowIfNotInitialized(); Status = CompilerStatus.Compiling; var f = CreateFunction(code); if (!f.IsAllocated) { CompilerStatusMessage = f.LastStatusString; return(false); } var inputTensors = inputShapes .Select(i => CreateTensor(CreateShape <TKernel>(i.Dimensions), i.Label.ToUpper())) .ToArray(); var outputTensor = CreateTensor(CreateShape <TKernel>(outputShape.Dimensions), outputShape.Label.ToUpper()); var invoker = new Invoker <TKernel>(Context, f, outputTensor, inputTensors); if (!(invoker.IsAllocated && invoker.AllVariablesSet)) { CompilerStatusMessage = invoker.LastStatusString; return(false); } result = invoker; return(true); }
public bool Compile <TVectorKernel>(int vectorCount, int vectorLength, string code, out IRunnable <TVectorKernel> result) where TVectorKernel : unmanaged, IEquatable <TVectorKernel>, IComparable <TVectorKernel>, IConvertible { var inputs = new ITermShape[vectorCount]; for (int i = 0; i < inputs.Length; i++) { inputs[i] = new DeviceTensor(OpenFirstDevice(), CreateShape <TVectorKernel>(vectorLength), "I" + i); } ITermShape output = new DeviceTensor(OpenFirstDevice(), CreateShape <TVectorKernel>(vectorLength), "O"); return(Compile(inputs, output, code, out result)); }
public bool Compile <TKernel>(ITermShape inputShape, ITermShape outputShape, string code, out IRunnable <TKernel> result) where TKernel : unmanaged, IEquatable <TKernel>, IComparable <TKernel>, IConvertible => Compile(new ITermShape[] { inputShape }, outputShape, code, out result);