public static void Full_Sys_Test_Alternative()
        {
            int dim       = 32;
            int testcases = 20;
            int dws       = 80;
            int K         = 20;
            int maxSearch = 500;
            int ntrees    = 3;

            int    nrand  = 100;
            int    ddeter = 1;
            double ratio  = .4;
            double prune  = 1.5;

            Random random = new Random();

            PointSet ps = new PointSet("ColorHistogram.asc", 1, ' ');

            ps.NormalizePoints();

            //Indexes
            var bruteForce = new BruteForce(ps);

            var standardTree   = new KDTree(ps, false);
            var standardForest = new KDTreeForestHolder(ps, ddeter, nrand, false, false);

            //Result holders
            var standardDist   = new List <double>();
            var queryDist      = new List <double>();
            var standardDist_f = new List <double>();

            for (int i = 0; i < dws; i++)
            {
                Console.WriteLine(dim + " " + i);
                var querydw = new DimWeight(dim, random);

                var queryTree = new KDTree(ps, querydw, false);

                for (int j = 0; j < testcases; j++)
                {
                    var p   = ps.Points[random.Next(ps.Points.Count())];
                    var bfd = bruteForce.GetKNN(p, K, querydw).GetMeanDistance(p, querydw);

                    standardDist.Add(standardTree.root.GetANN(p, K, maxSearch, querydw).GetMeanDistance(p, querydw) / bfd - 1);
                    queryDist.Add(queryTree.root.GetANN(p, K, maxSearch, querydw).GetMeanDistance(p, querydw) / bfd - 1);
                    standardDist_f.Add(standardForest.GetANN(p, querydw, K, ntrees, ratio, prune, maxSearch).GetMeanDistance(p, querydw) / bfd - 1);
                }
            }

            Console.WriteLine(standardDist.Average() + "," + standardDist_f.Average() + "," + queryDist.Average());
        }
        public static void Full_Sys_Test_Nrand()
        {
            int dim       = 8;
            int npoint    = 100000;
            int testcases = 20;
            int dws       = 80;
            int K         = 20;
            int maxSearch = 500;
            int ntrees    = 3;

            var nrands = new List <int>()
            {
                20, 50, 100, 200, 400
            };
            int    ddeter = 1;
            double ratio  = .4;
            double prune  = 1.5;

            var    lines    = new List <string>();
            string filename = "resultsnrand.csv";

            Random random = new Random();

            foreach (var nrand in nrands)
            {
                PointSet ps = new PointSet(dim);

                for (int i = 0; i < npoint; i++)
                {
                    ps.AddPoint(new Point(dim, random));
                }

                //Indexes
                var bruteForce = new BruteForce(ps);

                var standardTree   = new KDTree(ps, false);
                var standardForest = new KDTreeForestHolder(ps, ddeter, nrand, false, false);

                //Result holders
                var standardDist   = new List <double>();
                var queryDist      = new List <double>();
                var standardDist_f = new List <double>();

                for (int i = 0; i < dws; i++)
                {
                    Console.WriteLine(dim + " " + i);
                    var querydw = new DimWeight(dim, random);

                    var queryTree = new KDTree(ps, querydw, false);

                    for (int j = 0; j < testcases; j++)
                    {
                        var p   = new Point(dim, random);
                        var bfd = bruteForce.GetKNN(p, K, querydw).GetMeanDistance(p, querydw);

                        standardDist.Add(standardTree.root.GetANN(p, K, maxSearch, querydw).GetMeanDistance(p, querydw) / bfd - 1);
                        queryDist.Add(queryTree.root.GetANN(p, K, maxSearch, querydw).GetMeanDistance(p, querydw) / bfd - 1);
                        double val = standardForest.GetANN(p, querydw, K, ntrees, ratio, prune, maxSearch).GetMeanDistance(p, querydw) / bfd - 1;
                        if (!Double.IsNaN(val) && val < 1000)
                        {
                            standardDist_f.Add(val);
                        }
                    }
                }

                lines.Add(standardDist.Average() + "," + standardDist_f.Average() + "," + queryDist.Average());
            }

            System.IO.File.WriteAllLines(filename, lines);
        }
        public static void Full_Sys_Test_nSearch()
        {
            int dim        = 8;
            int npoint     = 100000;
            int testcases  = 20;
            int dws        = 80;
            int K          = 20;
            var maxSearchs = new List <int>()
            {
                50, 200, 500, 2000, 8000
            };
            int ntrees = 3;

            int    nrand  = 100;
            int    ddeter = 1;
            double ratio  = .4;
            double prune  = 1.5;

            var    lines    = new List <string>();
            string filename = "resultsnsearch.csv";

            Random random = new Random();

            PointSet ps = new PointSet(dim);

            for (int i = 0; i < npoint; i++)
            {
                ps.AddPoint(new Point(dim, random));
            }

            //Indexes
            var bruteForce = new BruteForce(ps);

            var standardTree   = new KDTree(ps, false);
            var standardForest = new KDTreeForestHolder(ps, ddeter, nrand, false, false);

            //Result holders
            var standardDist   = new List <List <double> >();
            var queryDist      = new List <List <double> >();
            var standardDist_f = new List <List <double> >();

            for (int i = 0; i < maxSearchs.Count(); i++)
            {
                standardDist.Add(new List <double>());
                queryDist.Add(new List <double>());
                standardDist_f.Add(new List <double>());
            }

            for (int i = 0; i < dws; i++)
            {
                Console.WriteLine(dim + " " + i);
                var querydw = new DimWeight(dim, random);

                var queryTree = new KDTree(ps, querydw, false);

                for (int j = 0; j < testcases; j++)
                {
                    var p   = new Point(dim, random);
                    var bfd = bruteForce.GetKNN(p, K, querydw).GetMeanDistance(p, querydw);
                    foreach (var maxSearch in maxSearchs)
                    {
                        int indx = 0;
                        standardDist[indx].Add(standardTree.root.GetANN(p, K, maxSearch, querydw).GetMeanDistance(p, querydw) / bfd - 1);
                        queryDist[indx].Add(queryTree.root.GetANN(p, K, maxSearch, querydw).GetMeanDistance(p, querydw) / bfd - 1);


                        standardDist_f[indx].Add(standardForest.GetANN(p, querydw, K, ntrees, ratio, prune, maxSearch).GetMeanDistance(p, querydw) / bfd - 1);
                        indx++;
                    }
                }
            }

            for (int i = 0; i < standardDist.Count(); i++)
            {
                lines.Add(standardDist[i].Average() + "," + queryDist[i].Average() + "," + standardDist_f[i].Average());
            }

            System.IO.File.WriteAllLines(filename, lines);
        }
        public static void Full_Sys_Test_ExtremeDRV()
        {
            int dim       = 8;
            int npoint    = 100000;
            int testcases = 10;
            int dws       = 50;
            int K         = 20;
            int maxSearch = 500;
            int ntrees    = 3;

            int    nrand  = 50;
            int    ddeter = 3;
            double ratio  = .4;
            double prune  = 1.5;
            double selper = .125;

            Random   random = new Random();
            PointSet ps     = new PointSet(dim);

            for (int i = 0; i < npoint; i++)
            {
                ps.AddPoint(new Point(dim, random));
            }

            ////garbage
            //var p2 = new Point(dim, random);
            //var querydw2 = new DimWeight(dim, 0, random);
            //var queryTree2 = new KDTree(ps, querydw2, false);
            //var tmp = queryTree2.root.GetANN(p2, K, maxSearch, querydw2);

            //Indexes
            var bruteForce = new BruteForce(ps);

            var standardTree   = new KDTree(ps, false);
            var standardForest = new KDTreeForestHolder(ps, ddeter, nrand, false, false);

            var standardTree_r   = new KDTree(ps, true);
            var standardForest_r = new KDTreeForestHolder(ps, ddeter, nrand, false, true);

            //Result holders
            var standardDist   = new List <double>();
            var queryDist      = new List <double>();
            var standardDist_f = new List <double>();

            var standardDist_r   = new List <double>();
            var queryDist_r      = new List <double>();
            var standardDist_f_r = new List <double>();

            for (int i = 0; i < dws; i++)
            {
                Console.WriteLine(i);
                var querydw = new DimWeight(dim, selper, random);

                var queryTree   = new KDTree(ps, querydw, false);
                var queryTree_r = new KDTree(ps, querydw, true);

                for (int j = 0; j < testcases; j++)
                {
                    var p   = new Point(dim, random);
                    var bfd = bruteForce.GetKNN(p, K, querydw).GetMeanDistance(p, querydw);

                    standardDist.Add(standardTree.root.GetANN(p, K, maxSearch, querydw).GetMeanDistance(p, querydw) / bfd - 1);
                    queryDist.Add(queryTree.root.GetANN(p, K, maxSearch, querydw).GetMeanDistance(p, querydw) / bfd - 1);
                    standardDist_f.Add(standardForest.GetANN(p, querydw, K, ntrees, ratio, prune, maxSearch).GetMeanDistance(p, querydw) / bfd - 1);

                    standardDist_r.Add(standardTree_r.root.GetANN(p, K, maxSearch, querydw).GetMeanDistance(p, querydw) / bfd - 1);
                    queryDist_r.Add(queryTree_r.root.GetANN(p, K, maxSearch, querydw).GetMeanDistance(p, querydw) / bfd - 1);
                    standardDist_f_r.Add(standardForest_r.GetANN(p, querydw, K, ntrees, ratio, prune, maxSearch).GetMeanDistance(p, querydw) / bfd - 1);
                }
            }

            Console.WriteLine(standardDist.Average() + " " + standardDist_f.Average() + " " + queryDist.Average());
            Console.WriteLine(standardDist_r.Average() + " " + standardDist_f_r.Average() + " " + queryDist_r.Average());

            Console.WriteLine(stdev(standardDist) + " " + stdev(standardDist_f) + " " + stdev(queryDist));
            Console.WriteLine(stdev(standardDist_r) + " " + stdev(standardDist_f_r) + " " + stdev(queryDist_r));
        }