예제 #1
0
 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));
     }
 }
예제 #2
0
        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();
        }
예제 #3
0
 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));
     }
 }
예제 #4
0
 public static FuncInfo Create(FuncDef fd, SolverAliases aliasOf)
 {
     return(CreateWithCachingInfo(fd, aliasOf, null));
 }
예제 #5
0
        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();
        }