Example #1
0
        public ExtremumSearcher(
            eye_tracking_mouse.Options.CalibrationMode starting_mode,
            DataSet data_set,
            Action <TestResultsInfo> test_results_info_callback,
            CancellationToken cancellation_token)
        {
            this.data_set                   = data_set;
            this.cancellation_token         = cancellation_token;
            this.test_results_info_callback = test_results_info_callback;

            iterator = new CalibrationModeIterator(starting_mode);
            handled_extremums.Add(iterator.GetUniqueKey(starting_mode));
            extremums_queue.Add(new UtilityAndModePair(0, starting_mode));
        }
        public static void UniqueKeysAreUnique(eye_tracking_mouse.Options.CalibrationMode mode)
        {
            var unique_keys = new HashSet <long>();
            var iterator    = new CalibrationModeIterator(mode);

            foreach (var field in iterator.Fields)
            {
                field.SetFieldValue(mode, field.Min);
            }

            for (int i = 0; i < 10; i++)
            {
                foreach (var field in iterator.Fields)
                {
                    if (field.Increment(mode, 1))
                    {
                        long key = iterator.GetUniqueKey(mode);
                        Assert(!unique_keys.Contains(key));
                        unique_keys.Add(key);
                    }
                }
            }

            unique_keys.Clear();

            foreach (var field in iterator.Fields)
            {
                field.SetFieldValue(mode, field.Min);
            }
            long tests_to_run = 1000000;

            try
            {
                ForEachFieldValue(0, iterator.Fields, mode, (x) => {
                    if (--tests_to_run < 0)
                    {
                        throw new NotImplementedException("Удалые пляски на костылях.");
                    }
                    else
                    {
                        long key = iterator.GetUniqueKey(x);
                        Assert(!unique_keys.Contains(key));
                        unique_keys.Add(key);
                    }
                });
            } catch (NotImplementedException)
            {
                Assert(tests_to_run < 0);
            }


            foreach (var field in iterator.Fields)
            {
                field.SetFieldValue(mode, field.Min);
            }
            tests_to_run = 1000001;
            try
            {
                ForEachFieldValue(0, iterator.Fields, mode, (x) => {
                    if (--tests_to_run < 0)
                    {
                        throw new NotImplementedException("Удалые пляски на костылях.");
                    }
                    else if (tests_to_run == 0)
                    {
                        long key = iterator.GetUniqueKey(x);
                        Assert(!unique_keys.Contains(key));
                    }
                    else
                    {
                        long key = iterator.GetUniqueKey(x);
                        Assert(unique_keys.Contains(key));
                    }
                });
            }
            catch (NotImplementedException)
            {
                Assert(tests_to_run < 0);
            }
        }
Example #3
0
        public async Task <List <UtilityAndModePair> > SearchNext()
        {
            if (extremums_queue.Count == 0)
            {
                return(null);
            }

            var retval = new List <UtilityAndModePair>();

            const int max_tasks_count        = 12;
            var       tasks                  = new Task <List <UtilityAndModePair> > [Math.Min(max_tasks_count, extremums_queue.Count)];
            var       new_test_results_array = new Dictionary <long, float> [tasks.Length];

            for (int i = 0; i < tasks.Length; i++)
            {
                new_test_results_array[i] = new Dictionary <long, float>();
                var new_test_results = new_test_results_array[i];
                var mode             = extremums_queue[i].mode;
                tasks[i] = Task.Factory.StartNew <List <UtilityAndModePair> >(() =>
                {
                    return(FindNeighbourExtremums(mode, new_test_results));
                }, cancellation_token);
            }

            extremums_queue.RemoveRange(0, tasks.Length);

            List <UtilityAndModePair> new_extremums = new List <UtilityAndModePair>();

            for (int i = 0; i < tasks.Length; i++)
            {
                new_extremums.InsertRange(new_extremums.Count, await tasks[i]);
            }

            // merge cached results
            foreach (var new_test_results in new_test_results_array)
            {
                new_test_results.ToList().ForEach(x =>
                {
                    if (!previous_test_results.ContainsKey(x.Key))
                    {
                        previous_test_results.Add(x.Key, x.Value);
                    }
                });
            }

            foreach (var extremum in new_extremums)
            {
                long key = iterator.GetUniqueKey(extremum.mode);
                if (handled_extremums.Contains(key))
                {
                    continue;
                }
                handled_extremums.Add(key);
                extremums_queue.Add(extremum);
                retval.Add(extremum);
            }

            extremums_queue.Sort((x, y) => {
                if (x.utility < y.utility)
                {
                    return(1);
                }
                if (x.utility == y.utility)
                {
                    return(0);
                }
                return(-1);
            });

            QueueInfo = "Queue. Size: " + extremums_queue.Count + " \nContent: ";
            for (int i = 0; i < extremums_queue.Count && i < 10; i++)
            {
                QueueInfo += extremums_queue[i].utility + " ";
            }
            QueueInfo += "\n Extremums handled: " + handled_extremums.Count() + "\n";

            return(retval);
        }