Example #1
0
        private static void FindCountTreesForMyProblems()
        {
            var smallTxt = "small.txt";

            var smallIds =
                File.Exists("small.txt") ? new HashSet <string>(File.ReadAllLines(smallTxt)
                                                                .Where(line => line.Trim().Length > 0)
                                                                .Select(line => line.Split('\t'))
                                                                .Select(p => p[0])) : new HashSet <string>();

            MyProblem[] prob  = ProblemsReader.ProblemsToSolve().Where(p => p.Size >= 14 && !smallIds.Contains(p.Id)).OrderBy(p => p.Size).ToArray();
            int         limit = 100000000;

            foreach (MyProblem p in prob)
            {
                Console.Write("{2} {0}: {1}  ", p.Id, string.Join(",", p.Operations).PadRight(40), p.Size);
                int count = new SmartGenerator(p.Operations).Enumerate(p.Size - 1, p.Size - 1, false).Take(limit).Count();
                if (count == limit)
                {
                    Console.WriteLine(limit + "+");
                }
                else
                {
                    Console.WriteLine(count);
                    File.AppendAllText(smallTxt, p.Id + "\t" + p.Size + "\r\n");
                }
            }
        }
Example #2
0
        private static void FindCountTreesForTrainProblems(int startSize, int endSize)
        {
            ProblemsReader reader        = ProblemsReader.CreateDefault();
            string         filename      = @"..\..\..\..\problems-samples\sizetrees.txt";
            var            problems      = reader.ReadProblems().Where(p => p.Size >= startSize && p.Size <= endSize);
            var            trainproblems = problems.SelectMany(p => reader.ReadTrainProblems(p, true).Concat(reader.ReadTrainProblems(p, false)));

            foreach (var p in trainproblems)
            {
                var t0    = DateTime.Now;
                int count = new SmartGenerator(p.operators).Enumerate(p.size - 1).Count();
                var t1    = DateTime.Now;
                var time  = t1 - t0;
                var str   = String.Format("{0}\ttrees:{1}\ttime:{2}\tsize:{3}\t{4}\n", p.id, count, time, p.size, p.ToString());
                Console.WriteLine(str);
                File.AppendAllText(filename, str);
            }
        }
Example #3
0
        public static string PostSolution(string problemId, int size, string[] operations)
        {
            var gsc = new GameServerClient();

            log.DebugFormat("Trying to solve problem {0}...", problemId);
            var random = new Random();

            List <ulong> inputs  = Enumerable.Range(1, 256).Select(e => random.NextUInt64()).ToList();
            List <ulong> outputs = gsc.Eval(problemId, inputs).ToList();

            log.Debug("Eval result for samples received");

            IEnumerable <byte[]> trees = new SmartGenerator(inputs, outputs, operations).Enumerate(size - 1, size - 1, false);

            int tasksCount = 4;
            IEnumerable <byte[][]>   chunckedTrees          = Chuncked(trees, 1 * 1024 * 1024);
            IEnumerable <byte[][][]> chunckedTreesPerWorker = Chuncked(chunckedTrees, tasksCount);
            var results = new byte[0][];
            IEnumerator <byte[][][]> enumerator = chunckedTreesPerWorker.GetEnumerator();

            enumerator.MoveNext();

            var sw = Stopwatch.StartNew();

            while (true)
            {
                if (sw.Elapsed.TotalSeconds > 400)
                {
                    throw new InvalidOperationException(string.Format("TIME_LIMIT: {0} sec", sw.Elapsed.TotalSeconds));
                }

                byte[][][] treesPerWorkerChunk = enumerator.Current;
                var        tasks = new List <Task <byte[][]> >(tasksCount);
                log.Debug("Starting creating tasks");
                foreach (var treesChunk in treesPerWorkerChunk)
                {
                    byte[][]        treeToCheck = treesChunk;
                    Task <byte[][]> task        = Task.Factory.StartNew(() => FilterTrees(treeToCheck, inputs, outputs));
                    tasks.Add(task);
                }
                log.Debug("Finished created tasks and starts new chunk");
                enumerator.MoveNext();
                log.Debug("Finished new chunk");
                Task.WaitAll(tasks.ToArray <Task>());

                List <byte[][]> tasksResults = Results(tasks);
                log.DebugFormat("All tasks completed, {0} results", results.Length);
                byte[] solution;
                while ((solution = GetSolution(tasksResults)) != null)
                {
                    log.Debug("First solution finded, asking the guess...");
                    var         s           = solution.SkipWhile(b => b == 16).ToArray();
                    string      formula     = String.Format("(lambda (x) {0})", s.ToSExpr().Item1);
                    WrongAnswer wrongAnswer = gsc.Guess(problemId, formula);

                    log.Debug("Guess answer received");

                    if (wrongAnswer == null)
                    {
                        log.DebugFormat("Problem solved!!!. Problem Id: {0}", problemId);
                        return(formula);
                    }

                    log.Debug(string.Format("WrongAnswer received: {0}", wrongAnswer));
                    inputs       = inputs.Concat(new[] { wrongAnswer.Arg }).ToList();
                    outputs      = outputs.Concat(new[] { wrongAnswer.CorrectValue }).ToList();
                    tasksResults =
                        tasksResults.Select(
                            r =>
                            FilterTrees(r, new List <ulong> {
                        wrongAnswer.Arg
                    }, new List <ulong> {
                        wrongAnswer.CorrectValue
                    }))
                        .ToList();
                }
            }
        }