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"); } }