Пример #1
0
        static void Knn()
        {
            IPoints points = Dataset.LoadDataset(@"c:\temp\points.csv");

            // Used for testing K nearest neighbor
            IPointsKnn dataset = new PointsKnn();

            dataset.Data.AddRange(points.Data.Select(i => i as IPKnn));

            // Used for testing K nearest neighbor
            var rect = new SingleDetectLibrary.Code.Data.Rectangle
            {
                XMin        = -180,
                XMax        = 180,
                YMin        = -90,
                YMax        = 90,
                MaxDistance = 20,
            };

            rect.Validate();
            const int k = 3;

            IAlgorithm algo = new Algorithm(dataset, rect, StrategyType.Grid);

            var origin = new SingleDetectLibrary.Code.Data.P {
                X = 0, Y = 0
            };

            algo.UpdateIndex(origin);

            var duration = algo.UpdateKnn(origin, new KnnConfiguration {
                K = k
            });

            // Print result
            CW(string.Format("{0} msec. {1}:", algo.Strategy.Name, duration));
            CW("K Nearest Neighbors:");
            CW(string.Format("Origin: {0}", origin));
            CW(string.Format("Distance sum: {0}", algo.Knn.GetDistanceSum()));
            algo.Knn.NNs.OrderBy(i => i.Distance).ToList().ForEach(CW);


            // Update strategy
            algo.SetAlgorithmStrategy(new NaiveStrategy());

            // Use algo
            duration = algo.UpdateKnn(origin, new KnnConfiguration {
                K = k
            });

            // Print result
            CW(string.Format("\n{0} msec. {1}:", algo.Strategy.Name, duration));
            CW("K Nearest Neighbors:");
            CW(string.Format("Distance sum: {0}", algo.Knn.GetDistanceSum()));
            algo.Knn.NNs.OrderBy(i => i.Distance).ToList().ForEach(CW);
        }
        // Example of usage:
        // Get 3 nearest ->             /AreaGMC/gmc.svc/Knn/lat=8_5;lon=10_25;k=3
        // Get 3 nearest type 1 ->      /AreaGMC/gmc.svc/Knn/lat=8_5;lon=10_25;k=3;type=1
        // Get nearest within 1 km ->   /AreaGMC/gmc.svc/Knn/lat=8_5;lon=10_25;k=1000000;dist=1
        public JsonKnnReply Knn(string s)
        {
            var sw = new Stopwatch();
            sw.Start();

            var invalid = new JsonKnnReply {};
            if (string.IsNullOrEmpty(s))
            {
                invalid.EMsg = "param is empty";
                return invalid;
            }

            var arr = s.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries);
            if (arr.Length < 3)
            {
                invalid.EMsg = string.Format("param length is not valid: {0}",arr.Length);
                return invalid;
            }

            var nvc = new NameValueCollection();
            foreach (var a in arr)
            {
                var kv = a.Split(new[] { "=" }, StringSplitOptions.RemoveEmptyEntries);
                if (kv.Length != 2) continue;

                nvc.Add(kv[0], kv[1]);
            }

            foreach (var key in Ajax.KnnReq)
            {
                if (nvc[key] != null) continue;

                invalid.EMsg = string.Format("param {0} is missing", key);
                return invalid;
            }

            try
            {
                var y = nvc[Ajax.lat].Replace("_", ".").ToDouble();
                var x = nvc[Ajax.lon].Replace("_", ".").ToDouble();
                var k = int.Parse(nvc[Ajax.k]);
                var type = nvc[Ajax.type] == null ? -1 : int.Parse(nvc[Ajax.type]);

                double? dist = null;
                if(! string.IsNullOrEmpty(nvc[Ajax.dist])) dist = nvc[Ajax.dist].Replace("_", ".").ToDouble();
                               
                // knn algo
                var algo = MemoryDatabase.Data as IKnnAlgorithm;
                if (algo == null)
                {
                    invalid.EMsg = "algorithm is not available";
                    return invalid;
                }

                // Use algo
                var origin = new SingleDetectLibrary.Code.Data.P { X = x, Y = y, Type = type };
                var knnSameTypeOnly = type != -1;

                var conf = new KnnConfiguration {K = k, SameTypeOnly = knnSameTypeOnly, MaxDistance = dist};                                
                var duration = algo.UpdateKnn(origin, conf);

                var nns = algo.Knn.NNs.Select(p => p as PDist).ToList();
                var gmsNns = new List<GmcPDist>();
                foreach (var i in nns)
                {
                    //i.Distance = Math.Round(i.Distance, 7);
                    var pdist = new GmcPDist
                                    {
                                        Id = i.Point.Uid.ToString(),
                                        Point = i.Point, 
                                        Distance = Math.Round(i.Distance, 7)
                                    };
                    gmsNns.Add(pdist);
                }
                
                var result = 
                new JsonKnnReply
                {
                    Data = string.Format("Distance in km, x: {0}; y: {1}; k: {2}; sameTypeOnly: {3}, algo msec: {4}",
                        x.DoubleToString(), y.DoubleToString(), k, knnSameTypeOnly, duration),
                    Nns = gmsNns, // cannot be interface, thus casting
                    
                    Msec = Sw(sw),
                };

                return result;
            }
            catch (Exception ex)
            {
                invalid.EMsg = string.Format("Parsing error param: {0}",
                    ex.Message);
                return invalid;
            }                                                         
        }
        static void Knn()
        {
            IPoints points = Dataset.LoadDataset(@"c:\temp\points.csv");

            // Used for testing K nearest neighbor
            IPointsKnn dataset = new PointsKnn();
            dataset.Data.AddRange(points.Data.Select(i => i as IPKnn));

            // Used for testing K nearest neighbor
            var rect = new SingleDetectLibrary.Code.Data.Rectangle
            {
                XMin = -180,
                XMax = 180,
                YMin = -90,
                YMax = 90,
                MaxDistance = 20,
            };
            rect.Validate();
            const int k = 3;

            IAlgorithm algo = new Algorithm(dataset, rect, StrategyType.Grid);

            var origin = new SingleDetectLibrary.Code.Data.P { X = 0, Y = 0 };            
            algo.UpdateIndex(origin);

            var duration = algo.UpdateKnn(origin, new KnnConfiguration{K = k});

            // Print result
            CW(string.Format("{0} msec. {1}:", algo.Strategy.Name, duration));
            CW("K Nearest Neighbors:");
            CW(string.Format("Origin: {0}", origin));
            CW(string.Format("Distance sum: {0}", algo.Knn.GetDistanceSum()));
            algo.Knn.NNs.OrderBy(i => i.Distance).ToList().ForEach(CW);


            // Update strategy
            algo.SetAlgorithmStrategy(new NaiveStrategy());

            // Use algo
            duration = algo.UpdateKnn(origin, new KnnConfiguration{K = k});

            // Print result
            CW(string.Format("\n{0} msec. {1}:", algo.Strategy.Name, duration));
            CW("K Nearest Neighbors:");
            CW(string.Format("Distance sum: {0}", algo.Knn.GetDistanceSum()));
            algo.Knn.NNs.OrderBy(i => i.Distance).ToList().ForEach(CW);
        }
        // Example of usage:
        // Get 3 nearest ->             /AreaGMC/gmc.svc/Knn/lat=8_5;lon=10_25;k=3
        // Get 3 nearest type 1 ->      /AreaGMC/gmc.svc/Knn/lat=8_5;lon=10_25;k=3;type=1
        // Get nearest within 1 km ->   /AreaGMC/gmc.svc/Knn/lat=8_5;lon=10_25;k=1000000;dist=1
        public JsonKnnReply Knn(string s)
        {
            var sw = new Stopwatch();

            sw.Start();

            var invalid = new JsonKnnReply {
            };

            if (string.IsNullOrEmpty(s))
            {
                invalid.EMsg = "param is empty";
                return(invalid);
            }

            var arr = s.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries);

            if (arr.Length < 3)
            {
                invalid.EMsg = string.Format("param length is not valid: {0}", arr.Length);
                return(invalid);
            }

            var nvc = new NameValueCollection();

            foreach (var a in arr)
            {
                var kv = a.Split(new[] { "=" }, StringSplitOptions.RemoveEmptyEntries);
                if (kv.Length != 2)
                {
                    continue;
                }

                nvc.Add(kv[0], kv[1]);
            }

            foreach (var key in Ajax.KnnReq)
            {
                if (nvc[key] != null)
                {
                    continue;
                }

                invalid.EMsg = string.Format("param {0} is missing", key);
                return(invalid);
            }

            try
            {
                var y    = nvc[Ajax.lat].Replace("_", ".").ToDouble();
                var x    = nvc[Ajax.lon].Replace("_", ".").ToDouble();
                var k    = int.Parse(nvc[Ajax.k]);
                var type = nvc[Ajax.type] == null ? -1 : int.Parse(nvc[Ajax.type]);

                double?dist = null;
                if (!string.IsNullOrEmpty(nvc[Ajax.dist]))
                {
                    dist = nvc[Ajax.dist].Replace("_", ".").ToDouble();
                }

                // knn algo
                var algo = MemoryDatabase.Data as IKnnAlgorithm;
                if (algo == null)
                {
                    invalid.EMsg = "algorithm is not available";
                    return(invalid);
                }

                // Use algo
                var origin = new SingleDetectLibrary.Code.Data.P {
                    X = x, Y = y, Type = type
                };
                var knnSameTypeOnly = type != -1;

                var conf = new KnnConfiguration {
                    K = k, SameTypeOnly = knnSameTypeOnly, MaxDistance = dist
                };
                var duration = algo.UpdateKnn(origin, conf);

                var nns    = algo.Knn.NNs.Select(p => p as PDist).ToList();
                var gmsNns = new List <GmcPDist>();
                foreach (var i in nns)
                {
                    //i.Distance = Math.Round(i.Distance, 7);
                    var pdist = new GmcPDist
                    {
                        Id       = i.Point.Uid.ToString(),
                        Point    = i.Point,
                        Distance = Math.Round(i.Distance, 7)
                    };
                    gmsNns.Add(pdist);
                }

                var result =
                    new JsonKnnReply
                {
                    Data = string.Format("Distance in km, x: {0}; y: {1}; k: {2}; sameTypeOnly: {3}, algo msec: {4}",
                                         x.DoubleToString(), y.DoubleToString(), k, knnSameTypeOnly, duration),
                    Nns = gmsNns, // cannot be interface, thus casting

                    Msec = Sw(sw),
                };

                return(result);
            }
            catch (Exception ex)
            {
                invalid.EMsg = string.Format("Parsing error param: {0}",
                                             ex.Message);
                return(invalid);
            }
        }