public async Task <Result <CoverSampleResult> > GetMatrix(
            FileData fileData,
            double low,
            double high,
            IGroupingMethod groupMethod,
            double paramInput,
            double step,
            ProgressBarModel progressBarModel,
            Task waitRun)
        {
            var both = GetLowsAndHighs(low, high, step).ToArray();

            var lows  = both.AsParallel().Select(x => x.Item1).ToArray();
            var highs = both.AsParallel().Select(x => x.Item2).ToArray();

            var matrices = (await ComputeForEvery2(fileData, groupMethod, paramInput, highs, lows, progressBarModel, waitRun)).OrderByDescending(y => y.Grade).ToList();

            var max = matrices.First();

            var testMatrixRows = _coverMatrixClassificator.Classify(fileData.TestObjects, max.AttributesCovers, max.HighZeroColumns, max.LowZeroColumns);

            max.TestMatrix =
                new Core.Common.Items.MatrixFeatures.Matrix(testMatrixRows);

            var dataMatrix = _matrixToGridMatrix.TransformToDataTable(max.DataMatrix);
            var testMatrix = _matrixToGridMatrix.TransformToDataTable(max.TestMatrix);

            var result = new CoverSampleResult(max, matrices, fileData.FileName)
            {
                SLOW               = low,
                SHIGH              = high,
                SelecteMethod      = groupMethod.MethodName,
                SelecteMethodParam = paramInput,
                STEP               = step
            };

            max.DataMatrix.DataTable = dataMatrix;
            max.TestMatrix.DataTable = testMatrix;
            DataObject.SchemeObject  = null;

            return(new Result <CoverSampleResult>(result));
        }
        private async Task <IEnumerable <CoverResult> > ComputeForEvery2(FileData fileData,
                                                                         IGroupingMethod groupMethod,
                                                                         double paramInput,
                                                                         double[] highs,
                                                                         double[] lows,
                                                                         ProgressBarModel progressBarModel,
                                                                         Task waitRun)
        {
            progressBarModel.Progress = 0;

            var all = (
                from highl in highs
                from lowl in lows
                select(highl, lowl)
                )
                      .ToArray();

            progressBarModel.Progress = 1;

            var step = 97.00 / all.Length;
            var list = new ConcurrentBag <Task <CoverResult> >();
            //var listr = new ConcurrentBag<CoverResult>();
            var listOfGroupsOfDataObjects = groupMethod.GroupElementsBy(fileData.DataObjects, fileData.Attributes, paramInput).ToArray();

            CountPositiveDecisions(fileData, listOfGroupsOfDataObjects);
            //var stopwatch = new Stopwatch();
            //stopwatch.Start();

            all
            .AsParallel()
            .ForAll(pair =>
            {
                if (waitRun.IsCompleted)
                {
                    return;
                }

                var cover =
                    Compute(
                        fileData,
                        pair.Item1,
                        pair.Item2,
                        listOfGroupsOfDataObjects,
                        progressBarModel,
                        step);

                list.Add(cover);
            });

            var result =
                await Task.WhenAll(list);

            return(result);

            //    stopwatch.Stop();
            //    Debug.WriteLine(stopwatch.ElapsedTicks);

            //    progressBarModel.Progress = 1;
            //    stopwatch.Restart();
            //    foreach (var pair in all.AsParallel())
            //    {
            //        var cover =
            //            Compute(
            //                fileData,
            //                pair.Item1,
            //                pair.Item2,
            //                listOfGroupsOfDataObjects,
            //                progressBarModel,
            //                step);

            //        list.Add(cover);
            //    };
            //    await Task.WhenAll(list);
            //    stopwatch.Stop();
            //    Debug.WriteLine(stopwatch.ElapsedTicks);
            //    progressBarModel.Progress = 1;
            //    stopwatch.Restart();
            //    foreach (var pair in all.AsParallel())
            //    {
            //        var cover =
            //           Compute(
            //                fileData,
            //                pair.Item1,
            //                pair.Item2,
            //                listOfGroupsOfDataObjects,
            //                progressBarModel,
            //                step);

            //        listr.Add(await cover);
            //    }
            //    stopwatch.Stop();
            //    Debug.WriteLine(stopwatch.ElapsedTicks);

            //    progressBarModel.Progress = 1;
            //    stopwatch.Restart();
            //    all.AsParallel().ForAll(async pair =>
            //    {
            //        var cover =
            //            Compute(
            //                fileData,
            //                pair.Item1,
            //                pair.Item2,
            //                listOfGroupsOfDataObjects,
            //                progressBarModel,
            //                step);

            //        listr.Add(await cover);
            //    });

            //    stopwatch.Stop();
            //    Debug.WriteLine(stopwatch.ElapsedTicks);

            //    progressBarModel.Progress = 1;
            //    stopwatch.Restart();

            //    await Task.WhenAll(GetCoverTasks(fileData, progressBarModel, all, listOfGroupsOfDataObjects, step));

            //    stopwatch.Stop();
            //    Debug.WriteLine(stopwatch.ElapsedTicks);
            //    return listr;
        }