/// <summary> Проверка матрицы для алгоритма </summary>

        private void CheckMatrixforAghorithm()
        {
            var counter = new MatrixErrorCounter();
            int amount  = counter.CountOfErrorsMatrixforAlgorithm(Matrix, GivenGraph);

            if (amount > 0)
            {
                short  k       = (short)((short)amount * 3);
                string mistake = null;
                switch (amount)
                {
                case 1:
                    mistake = "Найдена " + amount + " ошибка";
                    break;

                case 2:
                case 3:
                case 4:
                    mistake = "Найдено " + amount + " ошибки";
                    break;

                default:
                    mistake = "Найдено " + amount + " ошибок";
                    break;
                }

                if (UserActionsManager.Score > k)
                {
                    UserActionsManager.RegisterMistake(mistake, k);
                }
                else if (UserActionsManager.Score > 0)
                {
                    UserActionsManager.RegisterMistake(mistake, (short)UserActionsManager.Score);
                }
            }
            else
            {
                MessageBox.Show("Задание 1.2 пройдено.\n Вы перешли к заданию 2.\n Ознакомьтесь со справкой.<?>");
                for (var i = 0; i < GivenGraph.VerticesCount; ++i)
                {
                    Matrix[i].IsEnabled = false;
                }
                _task = Task.TaskSelectDomSets;
            }
        }
        /// <summary> Проверка матрицы </summary>
        private void CheckMatrix()
        {
            var counter = new MatrixErrorCounter();
            var amount  = counter.CountOfErrorsMatrix(Matrix, GivenGraph);

            if (amount > 0)
            {
                short  k       = (short)((short)amount * 3);
                string mistake = null;
                switch (amount)
                {
                case 1:
                    mistake = "Найдена " + amount + " ошибка";
                    break;

                case 2:
                case 3:
                case 4:
                    mistake = "Найдено " + amount + " ошибки";
                    break;

                default:
                    mistake = "Найдено " + amount + " ошибок";
                    break;
                }

                if (UserActionsManager.Score > k)
                {
                    UserActionsManager.RegisterMistake(mistake, k);
                }
                else if (UserActionsManager.Score > 0)
                {
                    UserActionsManager.RegisterMistake(mistake, (short)UserActionsManager.Score);
                }
            }
            else
            {
                UserActionsManager.RegisterInfo("Внешняя устойчивость. Задание выполнено, переход к следующему заданию");
                MessageBox.Show("Задание 1.1 пройдено.\n Вы перешли к заданию 1.2.\n Ознакомьтесь со справкой.<?>");
                _task = Task.TaskModifiedAdjMatrix;
            }
        }
        private void InitToolBarCommands()
        {
            ToolBarCommands = new ObservableCollection <ToolBarCommandBase>();

            // Выбор множества External stability
            var selectDsCommand = new ToolBarToggleCommand(
                () =>
            {
                if (_task == Task.TaskSelectDomSets)
                {
                    VertexClickCmd = new DelegateCommand(
                        o => SelectRMouseClick((IVertex)o),
                        o => true);
                    _state = State.SetEs;
                    IsMouseVerticesMovingEnabled = false;
                }
            },

                () =>
            {
                _state = State.Nothing;
                IsMouseVerticesMovingEnabled = true;
            },

                () => _state == State.Nothing,
                () => true
                )
            {
                Image       = new BitmapImage(GetImageUri("es.png")),
                Description = "Выбор множества внешней устойчивости"
            };

            // Вызов окна со справкой
            var helpM = new ToolBarInstantCommand(
                () => MessageBox.Show
                (
                    "Лабораторная работа \"Устойчивость графов \"\n "
                    +
                    "Задание \"Множество внешней устойчивости\"\n"
                    +
                    "Цель: найти число внешней устойчивости графа\n"
                    +
                    "\n"
                    +
                    "для перехода к следующему заданию нажмите ОК\n"
                    +
                    "Для изменения матрицы необходимо изменить значение в ячейке и нажать \"Enter\"\n"
                    +
                    "Либо дважды кликнуть мышью по ячейке матрицы\n"
                    +
                    "\n"
                    +
                    "Задания:\n"
                    +
                    "1.1 Заполнить матрицу смежности\n"
                    +
                    "1.2 Измените матрицу смежности под выполнение алгоритма красно-синих вершин\n"
                    +
                    "2.Выделите несколько доминирующих множеств графа\n (выделение множества доступно по кнопке <ES>\nзакрытие множества происходит по кнопке <{}>)\n"
                    +
                    "3.Определить число внешней устойчивости (пометить соответствующее множество вершин)"
                ),
                () => _state == State.Nothing
                )
            {
                Image       = new BitmapImage(GetImageUri("help.png")),
                Description = "Справка"
            };

            // Проверка задания
            var checkButton = new ToolBarInstantCommand(
                () =>
            {
                var mp = new MatrixPrinter();
                var m  = Matrix;
                switch (_task)
                {
                case Task.TaskAdjacencyMatrix:
                    UserActionsManager.RegisterInfo("Внешняя устойчивость. Задание 1.1. На проверку отправлена матрица: " + mp.MatrixToString(m));
                    CheckMatrix();
                    break;

                case Task.TaskModifiedAdjMatrix:
                    UserActionsManager.RegisterInfo("Внешняя устойчивость. Задание 1.2. На проверку отправлена матрица: " + mp.MatrixToString(m));
                    CheckMatrixforAghorithm();
                    break;

                case Task.TaskSelectDomSets:
                    MessageBox.Show(string.Format(
                                        "Необходимо найти еще {0} множеств(о) внешней устойчивости", _countOfSes));
                    break;

                case Task.TaskFindMinDomSets:
                    IsMinDS();
                    break;

                case Task.TaskEnd:
                    UserActionsManager.ReportThatTaskFinished();
                    break;
                }
            },
                () => _state == State.Nothing
                )
            {
                Image       = new BitmapImage(GetImageUri("ok.png")),
                Description = "Проверить матрицу"
            };

            // Проверка множества и его сохранение
            var addSetofES = new ToolBarInstantCommand(
                () =>
            {
                if (_task == Task.TaskSelectDomSets)
                {
                    ValidateSet();
                }
            },
                () => _state == State.Nothing
                )
            {
                Image       = new BitmapImage(GetImageUri("add.png")),
                Description = "Добавить множество"
            };

            // Проверка задания
            var debugButton = new ToolBarInstantCommand(
                () =>
            {
                var counter = new MatrixErrorCounter();
                if (_task == Task.TaskAdjacencyMatrix)
                {
                    counter.FillInMatrix(Matrix, GivenGraph);
                }
                if (_task == Task.TaskModifiedAdjMatrix)
                {
                    counter.ModifyMatrix(Matrix);
                }
            },
                () => _state == State.Nothing
                )
            {
                Image       = new BitmapImage(GetImageUri("ok.png")),
                Description = "Автозаполнение"
            };

            ToolBarCommands.Add(checkButton);
            ToolBarCommands.Add(selectDsCommand);
            ToolBarCommands.Add(addSetofES);
            ToolBarCommands.Add(helpM);
            //ToolBarCommands.Add(debugButton);
        }