internal string CalculateLineOfWeights()
        {
            string result;

            DacSet dacSet = new DacSet();

            dividers = PrepareDividers();

            for (int i = 0; i < inp.K; i++)
            {
                inp.Divide(i, dividers[i]);
            }

            var weights = inp.GetWeightsArray();

            for (int i = weights.Count - 1; i >= 0; i--)
            {
                var resultWeight = new FibonachiWeight();

                resultWeight.AddCombinations(weights[i]);

                dacSet.AddWeight(resultWeight);
            }

            var dacSetWeights = dacSet.weights.OrderBy(x => x.weight).ToList();

            result = Statistics.GetStatisticOfSimpleWeightsLineToString(inp, dacSetWeights);

            return(result);
        }
        public Outputs Calculate()
        {
            result     = new List <DacSet>();
            bestDacSet = new DacSet();

            int msbDivider = dividers.Length - 1;
            int step       = inp.step;

            ApproximateOneDac(inp.K, msbDivider, step);

            return(new Outputs(result, inp));
        }
        private void ApproximateOneDac(int numOfDac, int startDivider, int step)
        {
            numOfDac--;

            for (int divider = startDivider; divider >= 0; divider--)
            {
                inp.RestoreAllBelowEqualDacs(numOfDac);

                inp.Divide(numOfDac, dividers[divider]);

                if (numOfDac != 0)
                {
                    ApproximateOneDac(numOfDac, divider, step);

                    //звільняємо память
                    if (result.Count > BorderNumber)
                    {
                        result     = result.OrderByDescending(x => x.n).ThenBy(y => y.error).Take(ListNumber).ToList <DacSet>();
                        bestDacSet = result[0];
                    }
                }
                else
                {
                    //рахуэмо відсоток виконаної роботи
                    currentProgress++;

                    var weights = inp.GetWeightsArray();

                    DacSet dacSet = new DacSet();

                    int iOneWeight;
                    for (iOneWeight = 0; true; iOneWeight++)
                    {
                        if ((0.5 - weights[iOneWeight].weight) <= 0.25)
                        {
                            break;
                        }
                    }
                    double weightToApproximate = weights[iOneWeight].weight;

                    for (int i = 0; true; i++)
                    {
                        if (i >= 2)
                        {
                            weightToApproximate = dacSet.weights[i - 1].weight + dacSet.weights[i - 2].weight;
                        }
                        else if (i == 1)
                        {
                            weightToApproximate = dacSet.weights[i - 1].weight;
                        }

                        var aproximatedWeights = ApproximateOneWeight(weightToApproximate, weights);

                        if (aproximatedWeights == null)
                        {
                            break;
                        }

                        dacSet.AddWeight(aproximatedWeights);
                    }
                    if (dacSet.n >= bestDacSet.n || bestDacSet.n - dacSet.n < 3)
                    {
                        dacSet.dividerArray = (float[])inp.dividerArray.Clone();

                        //comment in PROD
                        //dacSet.residue = inp.GetRange() -Fibonachi.CalculateFibonachiRange(dacSet.n);

                        result.Add(dacSet);
                    }

                    var newPercentageProgress = Math.Round(currentProgress * 100 / maxProgress, 2);

                    //якшо відсоток виконаної роботи змінився до четвертої цифри після коми - виводимо
                    if (newPercentageProgress != percentageProgress)
                    {
                        percentageProgress = newPercentageProgress;
                        //fire an event
                        if (CalculatorChanged != null)
                        {
                            CalculatorChanged(this, new ProgressEventArgs(percentageProgress.ToString()));
                        }
                    }
                }
            }
        }