コード例 #1
0
ファイル: Program.cs プロジェクト: ivangalbans/fis
        static void Main(string[] args)
        {
            if (args.Count() != 2 && args.Count() != 3)
            {
                Console.WriteLine("Incorrec parameters: <data>.json <rules>.fis [<step_size>]");
                Environment.ExitCode = 1;
                return;
            }

            string argData  = args[0];
            string argRules = args[1];

            double argStepSize = 0.1;

            if (args.Count() == 3)
            {
                argStepSize = double.Parse(args[2]);
            }

            // Load from files
            var     rules = new AntlrFileStream(argRules);
            dynamic data  = JsonConvert.DeserializeObject <dynamic>(new StreamReader(argData).ReadToEnd());

            // Parse rules file

            var lexer = new FuzzyLexer(rules);

            var errors = new List <string>();

            lexer.RemoveErrorListeners();
            lexer.AddErrorListener(new ErrorListener(errors));

            var tokens = new CommonTokenStream(lexer);
            var parser = new FuzzyParser(tokens);

            parser.RemoveErrorListeners();
            parser.AddErrorListener(new ParserErrorListener(errors));

            IParseTree tree = parser.compileUnit();

            if (errors.Any())
            {
                Console.WriteLine();
                foreach (var item in errors)
                {
                    Console.WriteLine(item);
                }
                Environment.ExitCode = 1;
                return;
            }

            // Retieve dictionaries from data JSON file
            var values = data["variables"];

            var funcs = new Dictionary <string, FunctionBase>();

            foreach (JProperty f in data["functions"])
            {
                funcs.Add(f.Name, GetFunction(f.Values().First(), f.Values().Skip(1)));
            }

            // Evaluate rules expressions
            var     evaluator = new Evaluator(values, funcs);
            dynamic result    = evaluator.Visit(tree);

            (string model, string defuzzy, IEnumerable <dynamic> output) = (result.Item1, result.Item2, result.Item3);

            model = model.ToLower();

            var rulesOutput = new List <(double, string, string)>();

            foreach (var item in output)
            {
                double tmp = double.Parse(item.Item1.ToString());
                rulesOutput.Add((tmp, item.Item2, item.Item3));
            }


            if (model == "mamdani")
            {
                Print(ModelMethod.Mamdani(rulesOutput, GetDefuzzifier(defuzzy.ToLower()), funcs, argStepSize));
            }
            else if (model == "sugeno")
            {
                var rulesOutputSugeno = new List <(double, string, double)>();
                foreach (var item in output)
                {
                    double tmp = double.Parse(item.Item3.ToString());
                    rulesOutputSugeno.Add((item.Item1, item.Item2, tmp));
                }
                Print(ModelMethod.Sugeno(rulesOutputSugeno));
            }
            else if (model == "tsukamoto")
            {
                Print(ModelMethod.Tsukamoto(rulesOutput, funcs, argStepSize));
            }
            else
            {
                throw new Exception($"The model {model} is not exists");
            }
        }