static void Main(string[] args)
        {
            var baseConfig = new Configuration();

            baseConfig.nAreaForStrokeMap   = 15;
            baseConfig.minRadiusArea       = 0.03;
            baseConfig.toleranceFactorArea = 1.3;

            var paramVar1 = new DoubleParamVariation("nAreaForStrokeMap", 10, 2, 20);
            var paramVar2 = new DoubleParamVariation("minRadiusArea", 0.01, 0.02, 0.19);
            var paramVar3 = new DoubleParamVariation("toleranceFactorArea", 1.1, 0.1, 2.1);

            var configSet = baseConfig.getParameterVariations(paramVar1, paramVar2, paramVar3);


            Stream          TestFileStream;
            BinaryFormatter serializer = new BinaryFormatter();
            Dictionary <string, GestureTrace[]> circleGestures, squareGestures, ownFormGestures;

            if (File.Exists("Circle_1Finger.gestures"))
            {
                TestFileStream = File.OpenRead("Circle_1Finger.gestures");
                circleGestures = (Dictionary <string, GestureTrace[]>)serializer.Deserialize(TestFileStream);
                TestFileStream.Close();
            }
            else
            {
                circleGestures = getGestureTraces("Circle_1Finger");

                TestFileStream = File.Create("Circle_1Finger.gestures");
                serializer.Serialize(TestFileStream, circleGestures);
                TestFileStream.Close();
            }

            if (File.Exists("Square_1Finger.gestures"))
            {
                TestFileStream = File.OpenRead("Square_1Finger.gestures");
                squareGestures = (Dictionary <string, GestureTrace[]>)serializer.Deserialize(TestFileStream);
                TestFileStream.Close();
            }
            else
            {
                squareGestures = getGestureTraces("Square_1Finger");

                TestFileStream = File.Create("Square_1Finger.gestures");
                serializer.Serialize(TestFileStream, squareGestures);
                TestFileStream.Close();
            }

            if (File.Exists("OwnForm_1Finger.gestures"))
            {
                TestFileStream  = File.OpenRead("OwnForm_1Finger.gestures");
                ownFormGestures = (Dictionary <string, GestureTrace[]>)serializer.Deserialize(TestFileStream);
                TestFileStream.Close();
            }
            else
            {
                ownFormGestures = getGestureTraces("OwnForm_1Finger");

                TestFileStream = File.Create("OwnForm_1Finger.gestures");
                serializer.Serialize(TestFileStream, ownFormGestures);
                TestFileStream.Close();
            }

            var gesturesToTest = ownFormGestures;

            var nSubsets = 4;
            var results  = new Dictionary <Configuration, IEnumerable <CrossValidator.RecognitionResultRow> >(1000);

            foreach (var config in configSet)
            {
                var recSystem = new RecognitionSystem(config);
                var rows      = CrossValidator.validateRecognition(recSystem, gesturesToTest, nSubsets);
                results[config] = rows;
            }

            CrossValidator.saveResultsToFile(@"F:\Dropbox\LfS\Code\GestureRecognitionTests\GestureRecognition_OwnForm.csv", results);

            //do evaluation

            //Console.WriteLine(model.evaluate(squareTraces.First().Value.First()));



            //var crossValidator = new CrossValidator();

            //////saveSymbolTracesToDatabase();
            //var resCircle = crossValidator.validate(circleTraces, "Circle_1Finger", nSubsets);
            //var resSquare = crossValidator.validate(squareTraces, "Square_1Finger", nSubsets);
            //var resOwnForm = crossValidator.validate(ownFormTraces, "OwnForm_1Finger", nSubsets);

            //var resAll = resCircle.Concat(resSquare).Concat(resOwnForm);
            //saveResultsToFile(@"F:\Dropbox\LfS\Code\GestureRecognitionTests\crossValidation_Extrema.csv", resAll);//resAll);


            ////DBtoExcel(@"D:\Dropbox\LfS\Data\Multitouch_Userstudy\Traces.csv");
        }
コード例 #2
0
        static void Main(string[] args)
        {
            var baseConfig = new Configuration();

            baseConfig.nAreaForStrokeMap   = 15;
            baseConfig.minRadiusArea       = 0.03;
            baseConfig.toleranceFactorArea = 1.3;

            //var paramVar1 = new ParameterVariation("nAreaForStrokeMap", 10, 2, 20);
            var paramVar2 = new DoubleParamVariation("minRadiusArea", 0.005, 0.025, 0.18);
            var paramVar3 = new DoubleParamVariation("toleranceFactorArea", 1.05, 0.05, 1.5);
            var paramVar4 = new DoubleParamVariation("areaPointDistance", 0.05, 0.05, 0.2);



            var configSet = Configuration.getParameterVariations(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10);

            Stream          TestFileStream;
            BinaryFormatter serializer = new BinaryFormatter();
            Dictionary <string, GestureTrace[]> timGestures;

            if (File.Exists("Tim.gestures"))
            {
                TestFileStream = File.OpenRead("Tim.gestures");
                timGestures    = (Dictionary <string, GestureTrace[]>)serializer.Deserialize(TestFileStream);
                TestFileStream.Close();
            }
            else
            {
                string user = "******";
                //string[] gestures = new string[] { "Triangle_Slow", "Triangle_Normal", "Triangle_Fast", "Circle_Slow", "Circle_Normal", "Circle_Fast", "D_Slow", "D_Normal", "D_Fast", "Circle_FastLeftSlowRight", "Circle_SlowLeftFastRight" };
                //string[] gestures = new string[] { "Triangle_Slow", "Triangle_Fast", "Circle_Slow", "Circle_Fast", "D_Slow", "D_Fast", "Circle_1Stop_Bottom", "Circle_2Stop_LeftRight" };
                string[] gestures = new string[] { "Triangle_Slow", "Triangle_Fast", "Circle_Slow", "Circle_Fast", "D_Slow", "D_Fast" };

                timGestures = gestures.Select(g => new { GestureName = g, Traces = getGestureTraces(user, g) }).ToDictionary(e => e.GestureName, e => e.Traces);

                TestFileStream = File.Create("Tim.gestures");
                serializer.Serialize(TestFileStream, timGestures);
                TestFileStream.Close();
            }

            var gesturesToTest = timGestures;

            var       nSubsets = 5;
            var       results  = new Dictionary <Configuration, IEnumerable <CrossValidator.RecognitionResultRow> >(1000);
            Stopwatch sw       = new Stopwatch();

            sw.Start();
            foreach (var config in configSet)
            {
                var recSystem = new RecognitionSystem(config);
                var rows      = CrossValidator.validateRecognition(recSystem, gesturesToTest, nSubsets);
                results[config] = rows;
            }
            var neededTime = sw.ElapsedMilliseconds;

            Console.WriteLine(neededTime);
            CrossValidator.saveResultsToFile(@"D:\Dropbox\LfS\Code\GestureRecognitionTests\GestureRecognition_TimGestures_2Subsets_Test.csv", results);

            //do evaluation

            //Console.WriteLine(model.evaluate(squareTraces.First().Value.First()));



            //var crossValidator = new CrossValidator();

            //////saveSymbolTracesToDatabase();
            //var resCircle = crossValidator.validate(circleTraces, "Circle_1Finger", nSubsets);
            //var resSquare = crossValidator.validate(squareTraces, "Square_1Finger", nSubsets);
            //var resOwnForm = crossValidator.validate(ownFormTraces, "OwnForm_1Finger", nSubsets);

            //var resAll = resCircle.Concat(resSquare).Concat(resOwnForm);
            //saveResultsToFile(@"F:\Dropbox\LfS\Code\GestureRecognitionTests\crossValidation_Extrema.csv", resAll);//resAll);


            ////DBtoExcel(@"D:\Dropbox\LfS\Data\Multitouch_Userstudy\Traces.csv");
        }
コード例 #3
0
        public static void Main()
        {
            var param1  = new IntParamVariation("nAreaForStrokeMap", 10, 5, 20);
            var param2  = new DoubleParamVariation("minRadiusArea", 0.01);
            var param3  = new DoubleParamVariation("toleranceFactorArea", 1.7, 0.2, 2.1);
            var param5  = new BoolParamVariation("useFixAreaNumber", true);
            var param6  = new BoolParamVariation("useSmallestCircle", true);
            var param7  = new BoolParamVariation("isTranslationInvariant", false);
            var param8  = new BoolParamVariation("useAdaptiveTolerance", false);
            var param9  = new DoubleParamVariation("hitProbability", 0.9);
            var param10 = new StringParamVariation("distEstName", new string[]
            {
                nameof(NaiveUniformEstimator),
                nameof(NormalEstimator)
            });

            var              param11                 = new BoolParamVariation("useEllipsoid", false);
            var              configSet               = ParameterVariation.getParameterVariations(param1, param2, param3, param5, param6, param7, param8, param9, param10, param11).Select(ps => new CHnMMParameter(ps)).ToArray();
            string           ConnectionString        = "Server=localhost; Port=5432; User Id=macbook; Database = touchy_data_development";
            string           ConnectionString_heroku = "Database=dcbpejtem8e4qu; Server=ec2-54-75-239-237.eu-west-1.compute.amazonaws.com; Port=5432; User Id=pbcgcsyjsmpeds; Password=323743a3eec80c0a49dcee493617af7b94fee458a6a89a671dc3acaad0c3f437; Sslmode=Require;Trust Server Certificate=true";
            NpgsqlConnection connection              = new NpgsqlConnection(ConnectionString);

            try
            {
                connection.Open();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            NpgsqlCommand command = connection.CreateCommand();

            //#########################################################
            //RECOGNITION TASK//
            //#########################################################

            command.CommandText = "SELECT id FROM Tgestures";
            NpgsqlDataReader ges_read      = command.ExecuteReader();
            DataTable        gesture_table = new DataTable();

            gesture_table.Load(ges_read);
            ges_read.Close();
            var set = configSet[0];
            //foreach (var set in configSet)
            //{
            bool head      = true;
            var  file_name = "../../recognition/";

            file_name += "tol_" + set.toleranceFactorArea;
            file_name += "_dist_" + set.distEstName;
            file_name += "_nArea_" + set.nAreaForStrokeMap;
            file_name += ".csv";
            Console.WriteLine(file_name);
            System.Text.StringBuilder sb = new System.Text.StringBuilder();

            CHnMMClassificationSystem cs = new CHnMMClassificationSystem(set);

            for (int global_user = 1; global_user < 12; global_user++)
            {
                foreach (DataRow gesture in gesture_table.Rows)
                {
                    List <StrokeData> gestureStrokes = new List <StrokeData>();
                    var accumulate = new List <KeyValuePair <int, string[]> >();
                    command.CommandText = "SELECT * FROM trajectories WHERE user_id = " + global_user + " AND gesture_id=" + gesture["id"] + " AND exec_num % 2 = 1 ORDER BY exec_num, stroke_seq;";
                    NpgsqlDataReader reader = command.ExecuteReader();
                    DataTable        dt     = new DataTable();
                    dt.Load(reader);
                    reader.Close();
                    var prev_exec   = 1;
                    var prev_stroke = 0;
                    var time_lapse  = 0;
                    foreach (DataRow row in dt.Rows)
                    {
                        if (prev_exec != Convert.ToInt32(row["exec_num"]))
                        {
                            var trajectory = new StrokeData(global_user, accumulate);
                            gestureStrokes.Add(trajectory);
                            prev_exec  = Convert.ToInt32(row["exec_num"]);
                            time_lapse = 0;
                            accumulate.Clear();
                        }

                        string[,] db_points = row["points"] as string[, ];
                        int trace     = Convert.ToInt32(row["stroke_seq"]);
                        int rowLength = db_points.GetLength(0);
                        if (prev_stroke != trace)
                        {
                            time_lapse = Convert.ToInt32(accumulate.Last().Value[2]);
                        }
                        for (int i = 0; i < rowLength; i++)
                        {
                            string[] single_pt = new string[4];
                            single_pt[0] = db_points[i, 0];
                            single_pt[1] = db_points[i, 1];
                            single_pt[2] = (Convert.ToInt32(db_points[i, 2]) + time_lapse).ToString();
                            single_pt[3] = trace.ToString();
                            accumulate.Add(new KeyValuePair <int, string[]>(Convert.ToInt32(db_points[i, 2]), single_pt));
                        }
                    }
                    if (accumulate.Count > 0)
                    {
                        var last_trajectory = new StrokeData(global_user, accumulate);
                        gestureStrokes.Add(last_trajectory);
                    }
                    var gestureName = global_user + "-" + gesture["id"];
                    cs.trainGesture(gestureName, gestureStrokes.Cast <BaseTrajectory>());
                    Console.WriteLine("=============================================================================\n");
                    Console.WriteLine("=============================================================================");
                }
            }
            for (int global_user = 1; global_user < 12; global_user++)
            {
                Console.WriteLine("User=========================================================" + global_user);
                foreach (DataRow gesture in gesture_table.Rows)
                {
                    var accumulate = new List <KeyValuePair <int, string[]> >();
                    command.CommandText = "SELECT * FROM trajectories WHERE user_id = " + global_user + " AND gesture_id=" + gesture["id"] + " AND exec_num % 2 = 0 ORDER BY exec_num, stroke_seq;";
                    NpgsqlDataReader reader = command.ExecuteReader();
                    DataTable        dt     = new DataTable();
                    dt.Load(reader);
                    reader.Close();
                    var prev_exec   = 2;
                    var prev_stroke = 0;
                    var time_lapse  = 0;
                    foreach (DataRow row in dt.Rows)
                    {
                        if (prev_exec != Convert.ToInt32(row["exec_num"]))
                        {
                            var trajectory = new StrokeData(global_user, accumulate);
                            cs.recognizeGesture(trajectory);
                            prev_exec  = Convert.ToInt32(row["exec_num"]);
                            time_lapse = 0;
                            accumulate.Clear();
                        }

                        string[,] db_points = row["points"] as string[, ];
                        int trace     = Convert.ToInt32(row["stroke_seq"]);
                        int rowLength = db_points.GetLength(0);
                        if (prev_stroke != trace)
                        {
                            time_lapse = Convert.ToInt32(accumulate.Last().Value[2]);
                        }
                        for (int i = 0; i < rowLength; i++)
                        {
                            string[] single_pt = new string[4];
                            single_pt[0] = db_points[i, 0];
                            single_pt[1] = db_points[i, 1];
                            single_pt[2] = (Convert.ToInt32(db_points[i, 2]) + time_lapse).ToString();
                            single_pt[3] = trace.ToString();
                            accumulate.Add(new KeyValuePair <int, string[]>(Convert.ToInt32(db_points[i, 2]), single_pt));
                        }
                    }
                    if (accumulate.Count > 0)
                    {
                        var last_trajectory = new StrokeData(global_user, accumulate);
                        var result          = cs.recognizeGesture(last_trajectory);
                        if (result == null)
                        {
                            Console.WriteLine(gesture["id"] + ": Not Recognized");
                        }
                        else
                        {
                            Console.WriteLine(gesture["id"] + ": " + result);
                        }
                    }
                }
            }
        }
コード例 #4
0
ファイル: Program.cs プロジェクト: umeshbastola/chnmm
        public static void Main()
        {
            var strokeCollection = new List <KeyValuePair <String, StrokeData> >();
            var param1           = new IntParamVariation("nAreaForStrokeMap", 10, 10, 20);
            var param2           = new DoubleParamVariation("minRadiusArea", 0.01, 0.04, 0.25);
            var param3           = new DoubleParamVariation("toleranceFactorArea", 1.1, 0.4, 2.5);
            var param5           = new BoolParamVariation("useFixAreaNumber", true);
            var param6           = new BoolParamVariation("useSmallestCircle", true);
            var param7           = new BoolParamVariation("isTranslationInvariant", true);
            var param8           = new BoolParamVariation("useAdaptiveTolerance", false);
            var param9           = new DoubleParamVariation("hitProbability", 0.9);
            var param10          = new StringParamVariation("distEstName", new string[]
            {
                nameof(NaiveUniformEstimator),
                nameof(NormalEstimator)
            });

            var param11   = new BoolParamVariation("useEllipsoid", false);
            var configSet = ParameterVariation.getParameterVariations(param1, param2, param3, param5, param6, param7, param8, param9, param10, param11).Select(ps => new CHnMMParameter(ps)).ToArray();
            CHnMMClassificationSystem cs = new CHnMMClassificationSystem(configSet[0]);

            string           ConnectionString = "Server=localhost; Port=5432; User Id=touchy; Password=123456;Database = touchy_data_development";
            NpgsqlConnection connection       = new NpgsqlConnection(ConnectionString);

            try
            {
                connection.Open();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            NpgsqlCommand command = connection.CreateCommand();

            command.CommandText = "SELECT * FROM trajectories WHERE user_id='1'  AND gesture_id='0' AND is_password='******'";
            NpgsqlDataReader reader = command.ExecuteReader();
            DataTable        dt     = new DataTable();

            dt.Load(reader);

            foreach (DataRow row in dt.Rows)
            {
                string[,] db_points = row["points"] as string[, ];
                var gestureName = row["user_id"] + "-" + row["gesture_id"] + "-" + row["stroke_seq"];
                var user        = Convert.ToInt32(row["id"]);
                var trace       = Convert.ToInt32(row["stroke_seq"]);
                var trajectory  = new StrokeData(user, trace, db_points);
                strokeCollection.Add(new KeyValuePair <String, StrokeData>(gestureName, trajectory));
            }

            var lookup = strokeCollection.ToLookup(kvp => kvp.Key, kvp => kvp.Value);
            var keys   = lookup.Select(g => g.Key).ToList();

            for (int i = 0; i < keys.Count; i++)
            {
                List <StrokeData> fingerCollection = new List <StrokeData>();
                foreach (StrokeData x in lookup[keys[i]])
                {
                    fingerCollection.Add(x);
                }
                cs.trainGesture(keys[i], fingerCollection.Cast <BaseTrajectory>());
            }

            //command.CommandText = "SELECT * FROM trajectories WHERE exec_num='1' AND user_id='1' AND gesture_id='0'";
            command.CommandText = "SELECT * FROM trajectories WHERE user_id='1' AND gesture_id='0' AND is_password='******'";
            NpgsqlDataReader read = command.ExecuteReader();
            DataTable        vg   = new DataTable();

            vg.Load(read);

            var result = new double[vg.Rows.Count];
            int c      = 0;

            foreach (DataRow row in vg.Rows)
            {
                string[,] db_points = row["points"] as string[, ];
                var gestureName = row["user_id"] + "-" + row["gesture_id"] + "-" + row["stroke_seq"];
                var user        = Convert.ToInt32(row["id"]);
                var trace       = Convert.ToInt32(row["stroke_seq"]);
                var trajectory  = new StrokeData(user, trace, db_points);
                result[c] = cs.getSimilarity(gestureName, trajectory);
                c++;
            }

            bool ok = false;

            foreach (var prob in result)
            {
                Console.WriteLine(prob);
                if (prob <= 0)
                {
                    ok = false;
                    //break;
                }
                ok = true;
            }
            NpgsqlCommand insertion = connection.CreateCommand();

            if (ok)
            {
                Console.WriteLine(" Gesture matches!");
                insertion.CommandText = "UPDATE gestures SET verified=1 WHERE user_id=1";
                insertion.ExecuteNonQuery();
            }
            else
            {
                Console.WriteLine(" Gesture does not match!");
                insertion.CommandText = "UPDATE gestures SET verified=2 WHERE user_id=1";
                insertion.ExecuteNonQuery();
            }
        }
コード例 #5
0
        static void Main(string[] args)
        {
            //var param1 = new IntParamVariation("nAreaForStrokeMap", 10, 5, 20);
            var param1 = new IntParamVariation("nAreaForStrokeMap", 0);
            var param2 = new DoubleParamVariation("minRadiusArea", 0.01, 0.02, 0.19);
            var param3 = new DoubleParamVariation("toleranceFactorArea", 1.1, 0.2, 2.1);
            var param4 = new DoubleParamVariation("areaPointDistance", 0.05, 0.1, 0.35);
            //var param4 = new DoubleParamVariation("areaPointDistance", 0);
            var param5  = new BoolParamVariation("useFixAreaNumber", false);
            var param6  = new BoolParamVariation("useSmallestCircle", true);
            var param7  = new BoolParamVariation("isTranslationInvariant", true);
            var param8  = new BoolParamVariation("useAdaptiveTolerance", false);
            var param9  = new DoubleParamVariation("hitProbability", 0.9);
            var param10 = new StringParamVariation("distEstName", new string[]
            {
                nameof(NaiveUniformEstimator),
                //nameof(AdaptiveUniformEstimator),
                //nameof(MinVarianceUniformEstimator),
                nameof(NormalEstimator)
            });

            var configSet = Configuration.getParameterVariations(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10);

            int    subsets;
            string set;
            bool   crossval;

            //Dataset1
            //2 Subsets = 10 Trainingsbeispiele
            subsets  = 2;
            set      = "OwnForms";
            crossval = true;
            var chnmm       = new CHnMMRecognitionExperiment(set, crossval, subsets, configSet);
            var dtw         = new DTWExperiment(false, set, crossval, subsets);
            var dtwWithTime = new DTWExperiment(true, set, crossval, subsets);
            var dollar      = new DollarExperiment(set, crossval, subsets);

            chnmm.execute();
            //dtw.execute();
            //dtwWithTime.execute();
            //dollar.execute();


            //4 Subsets = 5 Trainingsbeispiele
            subsets     = 4;
            chnmm       = new CHnMMRecognitionExperiment(set, crossval, subsets, configSet);
            dtw         = new DTWExperiment(false, set, crossval, subsets);
            dtwWithTime = new DTWExperiment(true, set, crossval, subsets);
            dollar      = new DollarExperiment(set, crossval, subsets);

            chnmm.execute();
            //dtw.execute();
            //dtwWithTime.execute();
            //dollar.execute();

            //=================================================================

            //2 Subsets = 15 Trainingsbeispiele
            subsets     = 2;
            set         = "TimHard";
            crossval    = true;
            chnmm       = new CHnMMRecognitionExperiment(set, crossval, subsets, configSet);
            dtw         = new DTWExperiment(false, set, crossval, subsets);
            dtwWithTime = new DTWExperiment(true, set, crossval, subsets);
            dollar      = new DollarExperiment(set, crossval, subsets);

            chnmm.execute();
            //dtw.execute();
            //dtwWithTime.execute();
            //dollar.execute();

            //6 Subsets = 5 Trainingsbeispiele
            subsets     = 6;
            chnmm       = new CHnMMRecognitionExperiment(set, crossval, subsets, configSet);
            dtw         = new DTWExperiment(false, set, crossval, subsets);
            dtwWithTime = new DTWExperiment(true, set, crossval, subsets);
            dollar      = new DollarExperiment(set, crossval, subsets);

            chnmm.execute();
            //dtw.execute();
            //dtwWithTime.execute();
            //dollar.execute();

            //var traces = GestureDatabase.GestureDatabase.getGestureTraces("Tim", "Circle_Slow");

            //var protTrace = Helper.TouchesToGestureTrace(traces[1].Touches , traces[1].Id);
            //var testTrace = Helper.TouchesToGestureTrace(traces[5].Touches, traces[5].Id);

            //var prototype = new GestureRecognitionLib.DTW.Template(protTrace.LongestStroke.Points);

            //var full = new GestureRecognitionLib.DTW.Template(testTrace.LongestStroke.Points);
            //var half = new GestureRecognitionLib.DTW.Template(testTrace.LongestStroke.Points.Where((p, i) => i % 2 == 1));

            //var dtwFull = prototype.getDTW(full);
            //var dtwHalf = prototype.getDTW(half);

            //Console.WriteLine($"DTW Cost (full): {dtwFull.GetCost()}");
            //Console.WriteLine($"DTW Cost (half): {dtwHalf.GetCost()}");

            //var param1 = new IntParamVariation("nAreaForStrokeMap", 10);
            //var param2 = new DoubleParamVariation("minRadiusArea", 0.005, 0.01, 0.025);
            //var param3 = new DoubleParamVariation("toleranceFactorArea", 1.1, 0.1, 1.8);
            //var param4 = new DoubleParamVariation("areaPointDistance", 0.05, 0.1, 0.45);
            //var param5 = new BoolParamVariation("useFixAreaNumber", false);
            //var param6 = new BoolParamVariation("useSmallestCircle");
            //var param7 = new BoolParamVariation("isTranslationInvariant", true);
            //var param8 = new BoolParamVariation("useAdaptiveTolerance");
            //var param9 = new DoubleParamVariation("hitProbability", 0.7, 0.1, 0.9);
            //var param10 = new StringParamVariation("distEstName", new string[]
            //{
            //    //nameof(NaiveUniformEstimator),
            //    //nameof(AdaptiveUniformEstimator),
            //    //nameof(MinVarianceUniformEstimator),
            //    nameof(NormalEstimator)
            //});

            //var param1 = new IntParamVariation("nAreaForStrokeMap", 10);
            //var param2 = new DoubleParamVariation("minRadiusArea", 0.005, 0.01, 0.025);
            //var param3 = new DoubleParamVariation("toleranceFactorArea", 1.4, 0.2, 1.8);
            //var param4 = new DoubleParamVariation("areaPointDistance", 0.05, 0.1, 0.45);
            //var param5 = new BoolParamVariation("useFixAreaNumber", false);
            //var param6 = new BoolParamVariation("useSmallestCircle");
            //var param7 = new BoolParamVariation("isTranslationInvariant", false);
            //var param8 = new BoolParamVariation("useAdaptiveTolerance", false);
            //var param9 = new DoubleParamVariation("hitProbability", 0.7, 0.2, 0.9);
            //var param10 = new StringParamVariation("distEstName", new string[]
            //{
            //    nameof(NaiveUniformEstimator),
            //    //nameof(AdaptiveUniformEstimator),
            //    //nameof(MinVarianceUniformEstimator),
            //    nameof(NormalEstimator)
            //});

            //var param1 = new IntParamVariation("nAreaForStrokeMap", 10);
            //var param2 = new DoubleParamVariation("minRadiusArea", 0.025);
            //var param3 = new DoubleParamVariation("toleranceFactorArea", 1.5);
            //var param4 = new DoubleParamVariation("areaPointDistance", 0.2);
            //var param5 = new BoolParamVariation("useFixAreaNumber", true);
            //var param6 = new BoolParamVariation("useSmallestCircle");
            //var param7 = new BoolParamVariation("isTranslationInvariant");
            //var param8 = new BoolParamVariation("useAdaptiveTolerance");
            //var param9 = new DoubleParamVariation("hitProbability", 0.9);
            //var param10 = new StringParamVariation("distEstName", new string[]
            //{
            //    nameof(NaiveUniformEstimator),
            //    //nameof(AdaptiveUniformEstimator),
            //    //nameof(MinVarianceUniformEstimator),
            //    //nameof(NormalEstimator)
            //});

            //var configSet = Configuration.getParameterVariations(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10);


            //var experiment = new Experiment(configSet, "TimAdvanced", 2);

            //var experiment = new Experiment(configSet, "TimSimple", 2);

            //var experiment = new Experiment(configSet, "TimAdvanced", 2);

            //var e0 = new Experiment(configSet, "OwnForms", 4);
            //var e1 = new Experiment(configSet, "TimHard", 2);
            //var e2 = new Experiment(configSet, "TimSimple", 5);

            //var exp = new DTWExperiment(true, "Sigs1", false, 5);


            //var paramaters = new Configuration();
            //paramaters.areaPointDistance = 20;
            //paramaters.isTranslationInvariant = true;
            //paramaters.hitProbability = 0.9;
            //paramaters.minRadiusArea = 5;
            //paramaters.nAreaForStrokeMap = 10;
            //paramaters.toleranceFactorArea = 2;
            //paramaters.useFixAreaNumber = false;
            //paramaters.useSmallestCircle = true;
            //paramaters.distEstName = nameof(NormalEstimator);
            //var exp = new CHnMMExperiment("Sigs1", false, 10, paramaters);

            ////var param1 = new IntParamVariation("nAreaForStrokeMap", 5, 5, 20);
            //var param1 = new IntParamVariation("nAreaForStrokeMap", 0);
            //var param2 = new DoubleParamVariation("minRadiusArea", 0.025, 0.025, 0.15);
            //var param3 = new DoubleParamVariation("toleranceFactorArea", 1.5, 0.5, 3.0);
            //var param4 = new DoubleParamVariation("areaPointDistance", 0.1, 0.1, 0.4);
            ////var param4 = new DoubleParamVariation("areaPointDistance", 0);
            //var param5 = new BoolParamVariation("useFixAreaNumber",false);
            //var param6 = new BoolParamVariation("useSmallestCircle", true);
            //var param7 = new BoolParamVariation("isTranslationInvariant", true);
            //var param8 = new BoolParamVariation("useAdaptiveTolerance", false);
            //var param9 = new DoubleParamVariation("hitProbability", 0.9);
            //var param10 = new StringParamVariation("distEstName", new string[]
            //{
            //    nameof(NaiveUniformEstimator),
            //    //nameof(AdaptiveUniformEstimator),
            //    //nameof(MinVarianceUniformEstimator),
            //    nameof(NormalEstimator)
            //});
            //var configSet = Configuration.getParameterVariations(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10).ToArray();
            ////var exp = new CHnMMRecognitionExperiment("PseudoSigs", false, 10, configSet);
            ////exp.execute();

            //var exp2 = new CHnMMVerificationExperiment("PseudoSigsRandom", 5, false, configSet);
            //exp2.execute();

            //exp2 = new CHnMMVerificationExperiment("PseudoSigsSkilled", 5, false, configSet);
            //exp2.execute();

            //exp2 = new CHnMMVerificationExperiment("DoodlesRandom", 5, false, configSet);
            //exp2.execute();

            //exp2 = new CHnMMVerificationExperiment("DoodlesSkilled", 5, false, configSet);
            //exp2.execute();

            //exp2 = new CHnMMVerificationExperiment("PseudoSigsRandom", 15, configSet);
            //exp2.execute();

            //exp2 = new CHnMMVerificationExperiment("PseudoSigsSkilled", 15, configSet);
            //exp2.execute();

            //exp2 = new CHnMMVerificationExperiment("DoodlesRandom", 15, configSet);
            //exp2.execute();

            //exp2 = new CHnMMVerificationExperiment("DoodlesSkilled", 15, configSet);
            //exp2.execute();


            //var exp = new DTWExperiment(true, "Doodles", false, 10);
            //exp.execute();

            //var data = DataSets.getSignatures(true);

            //Console.Write(data);

            //var dtwRec = new GestureRecognitionLib.DTW.DTWRecognitionSystem(true);
            //var simpleSubsets = new SimpleSplitSubsetCreator(5);
            //var crossvalidationSubsets = new CrossvalidationSubsetCreator(2);
            //var processor = new DynamicAreaPointSampling(0.1);
            //var newExp = new RecognitionExperiment(dtwRec, simpleSubsets, null, "TimHard");

            //var results = newExp.execute();
            //string fileName = "DTWGestureRecognition_TimHard_5trains_withTime.csv";
            //GestureRecognitionResults.saveResultsToFile("..\\..\\ExperimentResults\\" + fileName, results);
        }