/// <summary> Add a recursive For to the loop. Returns the For created. </summary> public IFor AddRecursive_(ITensor expr, ITensor seed, string name) { if (seed == null) { throw new ArgumentException($"{nameof(seed)} can't be null, use AddOutput instead", nameof(seed)); } ITensorVar variable = seed.Match( (Tensor <float> exprF) => new Tensor <float> .Var(seed.Shape, name), (Tensor <int> exprI) => new Tensor <int> .Var(seed.Shape, name), () => { throw new NotImplementedException(); return((ITensorVar)null); } ); return(AddRecursive_(expr, seed, variable)); }
/// <summary> Add a recursive For to the loop. Returns the For created. </summary> public IFor AddRecursive_(ITensor expr, ITensor seed, ITensorVar variable) { if (seed == null) { throw new ArgumentException($"{nameof(seed)} can't be null, use AddOutput instead", nameof(seed)); } SequencesLocked = true; var f = expr.Match( (Tensor <float> exprF) => (IFor) new Tensor <float> .For(this, Fors.Count, exprF, (Tensor <float>)seed, (Tensor <float> .Var)variable), (Tensor <int> exprI) => new Tensor <int> .For(this, Fors.Count, exprI, (Tensor <int>)seed, (Tensor <int> .Var)variable), null ); Fors.Add(f); _variables.Add(f, variable); return(f); }
private static ITensorVar _patchVar(ITensorVar v, Patch substitutions) { var lastChar = v.Name[v.Name.Length - 1]; var endsWithDigit = lastChar >= '0' && lastChar <= '9'; var name = v.Name; if (endsWithDigit) { name = v.Name.Substring(0, v.Name.Length - 1) + (char)((lastChar - '0') + 1); } else { name += "_1"; } ITensorVar res; if (v is Tensor <float> .Var) { res = new Tensor <float> .Var(v.Shape.Patch(substitutions), name); } else if (v is Tensor <int> .Var) { res = new Tensor <int> .Var(v.Shape.Patch(substitutions), name); } else if (v is Tensor <double> .Var) { res = new Tensor <double> .Var(v.Shape.Patch(substitutions), name); } else { throw new NotImplementedException(); } substitutions.Add_(v, res); return(res); }
public bool IsVariable(ITensorVar expr) => _variables.ContainsValue(expr);