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); }
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); } }
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()); }
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(); }
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()); }
public void Init() { m_MatchMaker = new MatchRunner(); }
private void EngineStop() { MatchRunner.Stop(); }
private void EngineGo() { MatchRunner.Go(); }