예제 #1
0
        public static (int[] match, float score) FuzzyMatch(IReadOnlyList <string> wmPattern, IReadOnlyList <string> wmText, int loc, FuzzyMatchOptions options = default, LineRange[] ranges = default)
        {
            if (ranges == null)
            {
                ranges = new LineRange[] { new LineRange {
                                               length = wmText.Count
                                           } }
            }
            ;

            options ??= new();

            // we're creating twice as many MatchMatrix objects as we need, incurring some wasted allocation and setup time, but it reads easier than trying to precompute all the edge cases
            var fwdMatchers = ranges.Select(r => new MatchMatrix(wmPattern, wmText, options.MaxMatchOffset, r)).SkipWhile(m => loc > m.WorkingRange.last).ToArray();
            var revMatchers = ranges.Reverse().Select(r => new MatchMatrix(wmPattern, wmText, options.MaxMatchOffset, r)).SkipWhile(m => loc < m.WorkingRange.first).ToArray();

            int   warnDist       = OffsetWarnDistance(wmPattern.Count, wmText.Count);
            float penaltyPerLine = options.EnableDistancePenalty ? 1f / (10 * warnDist) : 0;

            var fwd = new MatchRunner(loc, 1, fwdMatchers, penaltyPerLine);
            var rev = new MatchRunner(loc, -1, revMatchers, penaltyPerLine);

            float bestScore = options.MinMatchScore;

            int[] bestMatch = null;
            while (fwd.Step(ref bestScore, ref bestMatch) | rev.Step(ref bestScore, ref bestMatch))
            {
                ;
            }

            return(bestMatch, bestScore);
        }
예제 #2
0
        private static void Main()
        {
            Console.SetWindowSize(120, 40);
            Console.SetBufferSize(120, 1000);

            var match = new MatchBuilder {
                Games = 10
            };

            match.Teams.Add(
                RobotBuilder.FromFile(@"C:\Program Files (x86)\Robot Battle\fire.prg"),
                RobotBuilder.FromFile(@"C:\Program Files (x86)\Robot Battle\fire.prg"),
                RobotBuilder.FromFile(@"C:\Program Files (x86)\Robot Battle\fire.prg")
                );
            match.Teams.Add(
                RobotBuilder.FromFile(@"C:\Program Files (x86)\Robot Battle\fire.prg"),
                RobotBuilder.FromFile(@"C:\Program Files (x86)\Robot Battle\fire.prg")
                );
            using (var writer = XmlWriter.Create(Console.Out, new XmlWriterSettings {
                Indent = true
            })) {
                match.ToXml().WriteTo(writer);
            }
            Console.WriteLine();
            var runner = new MatchRunner(match);
            var result = runner.Run();

            using (var writer = XmlWriter.Create(Console.Out, new XmlWriterSettings {
                Indent = true
            })) {
                result.ToXml().WriteTo(writer);
            }
            Console.ReadKey();
        }
        private static void Main(string[] args)
        {
            var options = new Options();

            if (!Parser.Default.ParseArguments(args, options))
            {
                return;
            }

            if (options.ShowRules)
            {
                var rules = Match.GetInstance().GetRules();

                using (var file = new StreamWriter("rules.md"))
                {
                    file.WriteLine(rules);
                }

                Console.WriteLine("Saved these rules in rules.md:");
                Console.WriteLine(rules);
                return;
            }

            try
            {
                var match  = Match.GetInstance();
                var runner = new MatchRunner(
                    match,
                    options.PlayerOneBotFolder,
                    options.PlayerTwoBotFolder,
                    new SpaceInvadersRenderer(),
                    options.Quiet,
                    options.Scrolling,
                    options.Log
                    );
                runner.Run();
            }
            catch (FileNotFoundException ex)
            {
                Debug.WriteLine("File not found...");
                Console.WriteLine("File not found...");

                Debug.WriteLine(ex.Message);
                Console.WriteLine(ex.Message);

                Debug.WriteLine(ex.StackTrace);
                Console.WriteLine(ex.StackTrace);
            }
            catch (Exception ex)
            {
                Debug.WriteLine("Something went wrong...");
                Console.WriteLine("Something went wrong...");

                Debug.WriteLine(ex.Message);
                Console.WriteLine(ex.Message);

                Debug.WriteLine(ex.StackTrace);
                Console.WriteLine(ex.StackTrace);
            }
        }
예제 #4
0
        private void QueueNextGame()
        {
            if (MatchRunner != null)
            {
                MatchRunner.Dispose();
            }

            var nextGame = MasterState.Instance.DequeueMatch();

            if (nextGame == null)
            {
                Log.InfoDialog("No games are scheduled");
                return;
            }

            whitePlayerLog = new List <string>();
            blackPlayerLog = new List <string>();

            var whiteSettings = MasterState.Instance.Engines.SingleOrDefault(x => x.Id == nextGame.WhiteId);
            var blackSettings = MasterState.Instance.Engines.SingleOrDefault(x => x.Id == nextGame.BlackId);
            var timeSettings  = MasterState.Instance.TimeSettings.SingleOrDefault(x => x.Id == nextGame.TimeControlId);
            var white         = new UciEnginePlayer(whiteSettings);
            var black         = new UciEnginePlayer(blackSettings);

            MatchRunner = new MatchRunner(white, black, timeSettings);

            MatchRunner.PlayerWhite.RegisterCommandListener((d, msg) =>
            {
                var str = string.Format("White {0}: {1}", d == UciProcess.CommandDirection.EngineInput ? "Input" : "Output", msg);
                lock (whitePlayerLog)
                    whitePlayerLog.Add(str);
                NotifyChanged(() => WhitePlayerLog);
            });

            MatchRunner.PlayerBlack.RegisterCommandListener((d, msg) =>
            {
                var str = string.Format("Black {0}: {1}", d == UciProcess.CommandDirection.EngineInput ? "Input" : "Output", msg);
                lock (blackPlayerLog)
                    blackPlayerLog.Add(str);
                NotifyChanged(() => BlackPlayerLog);
            });

            MatchRunner.PlayerWhite.RegisterInfoListener(dict =>
            {
                UpdatePlayerInfo(dict, whitePlayerInfo);
                NotifyChanged(() => WhitePlayerInfo);
            });

            MatchRunner.PlayerBlack.RegisterInfoListener(dict =>
            {
                UpdatePlayerInfo(dict, blackPlayerInfo);
                NotifyChanged(() => BlackPlayerInfo);
            });

            NotifyChanged(() => MatchRunner);
            Task.Run(() => MatchRunner.LoadAndSetup());
        }
예제 #5
0
        public void TestMatchRunner1()
        {
            var config = new UciEngineSettings
            {
                Name    = "Rybka",
                Command = @"C:\chess\arena_3.0\Engines\Rybka\Rybka v2.2n2.mp.w32.exe"
            };

            var white        = new UciEnginePlayer(config);
            var black        = new UciEnginePlayer(config);
            var timeSettings = new TimeSettings {
                Name = "60 Sec Match", InitialTime = 60, TimeModeMachine = TimeMode.Blitz
            };
            var runner = new MatchRunner(white, black, timeSettings);

            runner.LoadAndSetup();
        }
예제 #6
0
        private void QueueNextGame()
        {
            if (MatchRunner != null)
            {
                MatchRunner.Dispose();
            }

            var nextGame = MasterState.Instance.DequeueMatch();
            if (nextGame == null)
            {
                Log.InfoDialog("No games are scheduled");
                return;
            }

            whitePlayerLog = new List<string>();
            blackPlayerLog = new List<string>();

            var whiteSettings = MasterState.Instance.Engines.SingleOrDefault(x => x.Id == nextGame.WhiteId);
            var blackSettings = MasterState.Instance.Engines.SingleOrDefault(x => x.Id == nextGame.BlackId);
            var timeSettings = MasterState.Instance.TimeSettings.SingleOrDefault(x => x.Id == nextGame.TimeControlId);
            var white = new UciEnginePlayer(whiteSettings);
            var black = new UciEnginePlayer(blackSettings);

            MatchRunner = new MatchRunner(white, black, timeSettings);

            MatchRunner.PlayerWhite.RegisterCommandListener((d, msg) =>
            {
                var str = string.Format("White {0}: {1}", d == UciProcess.CommandDirection.EngineInput ? "Input" : "Output", msg);
                lock (whitePlayerLog)
                    whitePlayerLog.Add(str);
                NotifyChanged(() => WhitePlayerLog);
            });

            MatchRunner.PlayerBlack.RegisterCommandListener((d, msg) =>
            {
                var str = string.Format("Black {0}: {1}", d == UciProcess.CommandDirection.EngineInput ? "Input" : "Output", msg);
                lock (blackPlayerLog)
                    blackPlayerLog.Add(str);
                NotifyChanged(() => BlackPlayerLog);
            });

            MatchRunner.PlayerWhite.RegisterInfoListener(dict =>
            {
                UpdatePlayerInfo(dict, whitePlayerInfo);
                NotifyChanged(() => WhitePlayerInfo);
            });

            MatchRunner.PlayerBlack.RegisterInfoListener(dict =>
            {
                UpdatePlayerInfo(dict, blackPlayerInfo);
                NotifyChanged(() => BlackPlayerInfo);
            });

            NotifyChanged(() => MatchRunner);
            Task.Run(() => MatchRunner.LoadAndSetup());
        }
예제 #7
0
 public void Init()
 {
     m_MatchMaker = new MatchRunner();
 }
예제 #8
0
 private void EngineStop()
 {
     MatchRunner.Stop();
 }
예제 #9
0
 private void EngineGo()
 {
     MatchRunner.Go();
 }