private List <DataPoint> GetPlotData()
        {
            string projectPath = Path.GetDirectoryName(Path.GetDirectoryName(Directory.GetCurrentDirectory()));
            string filePath    = @"DataSets\theta.txt";
            string fullPath    = Path.Combine(projectPath, filePath);

            var trainingSet               = this.GetNormalizedData();
            var resultList                = new List <DataPoint>();
            var functionsCalculator       = new FunctionsCalculator(trainingSet);
            var gradientDescentCalculator = new GradientDescentCalculator(trainingSet);

            double bound = 2043280050.60283;

            double alpha = 0.1;

            // todo: replace hardcoded number of values with dynamic initialization
            var theta = new double[] { 0, 0, 0 };

            try
            {
                double costFunctionResult = functionsCalculator.CostFuction(theta);
                int    iteration          = 1;
                resultList.Add(new DataPoint(iteration, costFunctionResult));
                do
                {
                    theta = gradientDescentCalculator.Descent(theta, alpha, 3);
                    costFunctionResult = functionsCalculator.CostFuction(theta);
                    iteration++;
                    resultList.Add(new DataPoint(iteration, costFunctionResult));
                    Console.WriteLine(costFunctionResult);
                } while (costFunctionResult > bound);

                File.WriteAllText(fullPath, string.Join(" ", theta));
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }

            return(resultList);
        }