public void RegularLanguageRegexToCanonicalWordAcceptingDfa_ForKleeneStarAndUnionRegex()
        {
            string regex     = "(X|S)*";
            var    automaton = MatrixEquationSolutionFinder.RegularLanguageRegexToCanonicalWordAcceptingDfa(regex);

            Assert.True(automaton.IsValidWord("S"));
            Assert.True(automaton.IsValidWord("X"));
            Assert.True(automaton.IsValidWord("XS"));

            Assert.False(automaton.IsValidWord("XSRSRSRSRS"));
        }
        public void RegularLanguageRegexToCanonicalWordAcceptingDfa_ConvertsForAtomicRegex()
        {
            string regex     = "X";
            var    automaton = MatrixEquationSolutionFinder.RegularLanguageRegexToCanonicalWordAcceptingDfa(regex);

            Assert.Equal(2, automaton.States.Count);

            Assert.True(automaton.IsValidWord("X"));

            Assert.False(automaton.IsValidWord("XX"));
            Assert.False(automaton.IsValidWord("S"));
            Assert.False(automaton.IsValidWord("R"));
            Assert.False(automaton.IsValidWord("XSRSRSRSRS"));
        }
        protected override void OnStartup(StartupEventArgs e)
        {
            // Application is running
            // Process command line args
            var args = e.Args;

            if (args.Length == 0)
            {
                Console.WriteLine("Expected a file path as an argument but received no arguments");
                Shutdown();
                return;
            }
            var    file = args[0];
            string json;

            try
            {
                json = File.ReadAllText(file);
            }
            catch
            {
                Console.WriteLine($"An error occured while reading file {file}");
                Shutdown();
                return;
            }

            InputData data;

            try
            {
                data = JsonConvert.DeserializeObject <InputData>(json);
                data.ThrowIfNull();
            }
            catch
            {
                Console.WriteLine($"File {file} contained invalid data. Please make sure all parameters are set correctly");
                Shutdown();
                return;
            }

            try
            {
                var vectorX  = new ImmutableVector2D(data.VectorX);
                var vectorY  = new ImmutableVector2D(data.VectorY);
                var matrices = data.Matrices.Select(m => new ImmutableMatrix2x2(As2DArray(m, 2, 2))).ToArray();

                Console.WriteLine("Vector Reachability Problem Input data: ");
                Console.WriteLine("-------------------------");
                Console.WriteLine($"M1, ..., Mn =  {String.Join(", ", matrices.Select(m => m.ToString()))}");
                Console.WriteLine($"x =  {vectorX}");
                Console.WriteLine($"y =  {vectorY}");
                Console.WriteLine("-------------------------");

                // Solve equation
                var sw        = Stopwatch.StartNew();
                var automaton = MatrixEquationSolutionFinder.SolveVectorReachabilityProblem(matrices, vectorX, vectorY);
                sw.Stop();
                Console.WriteLine($"Solution found in {sw.ElapsedMilliseconds}ms");

                // Create main application window, starting minimized if specified
                MainWindow mainWindow = new MainWindow(automaton);
                mainWindow.Show();
            }
            catch (ArgumentException exc)
            {
                Console.WriteLine($"VRP data provided from file {file} was invalid: \n{exc.Message}");
                Shutdown();
                return;
            }
            catch (Exception)
            {
                Console.WriteLine("An unexpected error occured while running");
                Shutdown();
                return;
            }
        }