public static FuncInfo CreateWithCachingInfo(FuncDef fd, SolverAliases aliasOf, string cachingDomainParam) { if (string.IsNullOrEmpty(fd.name) || fd.argsInfo == null || fd.resultsInfo == null || fd.resultsInfo.Length == 0) { return(null); } else { return(new FuncInfo(fd, aliasOf, cachingDomainParam)); } }
public FuncInfo(string name, string[] inputs, string[] outputs, SolverAliases aliasOf = null) { this.name = name; if (inputs == outputs) // fix for _Input function { this.inputs = inputs; this.outputs = outputs; this.inOuts = None; this.pureIns = None; this.pureOuts = outputs; return; } if (aliasOf != null) { this.inputs = aliasOf.ToRealNames(inputs); var outs = aliasOf.ToRealNames(outputs); for (int i = 0; i < outputs.Length; i++) { if (outs[i] != outputs[i] && !inputs.Contains(outs[i])) { throw new SolverException(string.Format("Alias name can't be used as function output ({0}: {1}=>{2})", outs[i], name, outputs[i])); } } this.outputs = outs; } else { this.inputs = inputs; this.outputs = outputs; } int no = outputs.Length; var pureOuts = new List <string>(no); var inOuts = new List <string>(no); for (int i = 0; i < no; i++) { var s = outputs[i]; if (Array.IndexOf <string>(inputs, s) < 0) { pureOuts.Add(s); } else { inOuts.Add(s); } } this.pureIns = inputs.Where(s => Array.IndexOf <string>(outputs, s) < 0).ToArray(); this.pureOuts = pureOuts.ToArray(); this.inOuts = inOuts.ToArray(); }
public static FuncInfo WithoutCachingInfo(FuncInfo info, SolverAliases aliasOf) { if (info.IsSingleInputFunc) { return(info); } if (info.fd == null) { return(new FuncInfo(info.name, info.inputs, info.outputs, aliasOf)); } else { return(Create(info.fd, aliasOf)); } }
public static FuncInfo Create(FuncDef fd, SolverAliases aliasOf) { return(CreateWithCachingInfo(fd, aliasOf, null)); }
FuncInfo(FuncDef fd, SolverAliases aliasOf, string cachingDomainParam = null) { name = fd.name; this.fd = fd; if (cachingDomainParam != null && fd.cachingExpiration != TimeSpan.Zero) { nCachingInps = 1; inputs = new string[fd.argsInfo.Length + nCachingInps]; int k = 0; inputs[k++] = cachingDomainParam; foreach (var arg in fd.argsInfo) { inputs[k++] = arg.ToString(); } } else { inputs = new string[fd.argsInfo.Length]; for (int i = 0; i < inputs.Length; i++) { var s = fd.argsInfo[i].ToString(); inputs[i] = aliasOf.GetRealName(s); } } int no = fd.resultsInfo.Length; outputs = new string[no]; var pureOuts = new List <string>(no); var inOuts = new List <string>(no); for (int i = 0; i < outputs.Length; i++) { var s = fd.resultsInfo[i].ToString(); var real = aliasOf.GetRealName(s); if (real != s && !inputs.Contains(real)) { if (fd.kind != FuncKind.Macro) { throw new SolverException(string.Format("Name conflict between alias '{0}' and output of function '{1}'", s, name)); } } outputs[i] = real; } foreach (var s in outputs) { if (Array.IndexOf <string>(inputs, s) < 0) { pureOuts.Add(s); } else { System.Diagnostics.Debug.Assert(ValueInfo.IsID(s), $"Only _ID parameters can be 'in/out' // {name}:{s}"); inOuts.Add(s); } } var pureIns = new List <string>(no); for (int i = 0; i < inputs.Length; i++) { var s = inputs[i]; if (Array.IndexOf <string>(outputs, s) < 0) { pureIns.Add(s); } } this.pureIns = pureIns.ToArray(); this.pureOuts = pureOuts.ToArray(); this.inOuts = inOuts.ToArray(); }