public void Test_CreateCt() { int oppCount = 2; var pockets = PocketHelper.GetAllPockets(); //var pockets = new HePocketKind[] { HePocketKind._AA, HePocketKind._76s, HePocketKind._72o }; var pocketDist = PocketHelper.GetProbabDistr(pockets); double[,] ptPeMax = MultiplayerPocketProbability.ComputePreferenceMatrixPeMax(pockets); string xmlAt = Props.Global.Expand("${bds.DataDir}ai.pkr.holdem.learn/nlpf-1.xml"); ActionTree at = XmlToActionTree.Convert(xmlAt); string[] actionLabels = CreateActionLabels(at, 0); Dictionary <string, int> actionLabelToId = new Dictionary <string, int>(); for (int i = 0; i < actionLabels.Length; ++i) { actionLabelToId.Add(actionLabels[i], i); } double[] oppDist = MultiplayerPocketProbability.Compute(oppCount, pocketDist, ptPeMax); ChanceTree ct = PreflopStrategy.CreateCt(pockets, oppDist); //GameDefinition gd = XmlSerializerExt.Deserialize<GameDefinition>(Props.Global.Expand("${bds.DataDir}ai.pkr.metastrategy/${0}", "kuhn.gamedef.xml")); //at = CreateActionTreeByGameDef.Create(gd); //ct = CreateChanceTreeByGameDef.Create(gd); VisChanceTree.Show(ct, Path.Combine(_outDir, "ct.gv")); VisActionTree.Show(at, Path.Combine(_outDir, "at.gv")); StrategyTree[] st = SolveAndVerifyVerifySolution(at, ct, 0.001, false); double[,] fs = FlattenStrategy(st[0], 0, pockets.Length, actionLabelToId); Console.WriteLine("Result for opponent count: {0}", oppCount); Console.Write("{0,4}", oppCount); foreach (string al in actionLabels) { Console.Write("{0,20}", al); } Console.WriteLine(); int raiseCount = 0; for (int c = 0; c < pockets.Length; ++c) { Console.Write("{0,4}", HePocket.KindToString(pockets[c])); for (int j = 0; j < actionLabels.Length; ++j) { Console.Write("{0,20}", Math.Round(fs[c, j] * 100, 0)); } if (fs[c, actionLabels.Length - 1] > 0.9) { raiseCount += HePocket.KindToRange(pockets[c]).Length; } Console.WriteLine(); } Console.WriteLine("Raise count: {0}", raiseCount); }
/// <summary> /// Runs FictitiousPlay with the specified parameters. /// Some parameters are set by default (e.g. verbosity), the caller has a chance to overwrite them /// using Configure delegate. /// </summary> public StrategyTree[] Solve(ActionTree at, ChanceTree ct) { int playersCount = 2; DirectoryExt.Delete(BaseDir); Directory.CreateDirectory(BaseDir); string inputDir = Path.Combine(BaseDir, "input"); Directory.CreateDirectory(inputDir); string traceDir = Path.Combine(BaseDir, "trace"); string chanceTreeFile = Path.Combine(inputDir, "ct.dat"); string actionTreeFile = Path.Combine(inputDir, "at.dat"); ct.Write(chanceTreeFile); at.Write(actionTreeFile); if (VisualizeTrees) { VisActionTree.Show(at, actionTreeFile + ".gv"); VisChanceTree.Show(ct, chanceTreeFile + ".gv"); } Solver.ChanceTreeFile = chanceTreeFile; Solver.EqualCa = false; Solver.ActionTreeFile = actionTreeFile; Solver.OutputPath = BaseDir; Solver.SnapshotsCount = 2; Solver.Epsilon = Epsilon; Solver.ThreadsCount = 6; Solver.IsVerbose = true; Solver.IterationVerbosity = 10000; Solver.MaxIterationCount = 1000000000; if (Configure != null) { Configure(Solver); } Solver.Solve(); StrategyTree[] eqStrategies = new StrategyTree[playersCount]; for (int p = 0; p < playersCount; ++p) { string fileName = Solver.CurrentSnapshotInfo.StrategyFile[p]; eqStrategies[p] = StrategyTree.Read <StrategyTree>(fileName); if (VisualizeTrees) { VisStrategyTree.Show(eqStrategies[p], fileName + ".gv"); } } return(eqStrategies); }
private GameValue Solve(TestParams testParams, bool visualize, ConfigureSolver configureSolver) { if (visualize) { VisActionTree.Show(testParams.ActionTree, Path.Combine(_outDir, String.Format("{0}-at.gv", testParams.Name))); VisChanceTree.Show(testParams.ChanceTree, Path.Combine(_outDir, String.Format("{0}-ct.gv", testParams.Name))); for (int p = 0; p < testParams.StrategyTrees.Length; ++p) { VisStrategyTree.Show(testParams.StrategyTrees[p], Path.Combine(_outDir, string.Format("{0}-st-{1}.gv", testParams.Name, p))); } } // Make sure input is correct. for (int p = 0; p < testParams.ChanceTree.Nodes[0].Position; ++p) { string errorText; Assert.IsTrue(VerifyAbsStrategy.Verify(testParams.StrategyTrees[p], p, 0.000001, out errorText), errorText); } GameValue gv = new GameValue { ChanceTree = testParams.ChanceTree, ActionTree = testParams.ActionTree, Strategies = testParams.StrategyTrees }; gv.PrepareVis = visualize; if (configureSolver != null) { configureSolver(gv); } gv.Solve(); if (visualize) { for (int p = 0; p < testParams.ChanceTree.PlayersCount; ++p) { GameValue.Vis.Show(gv, p, Path.Combine(_outDir, String.Format("{0}-{1}-val.gv", testParams.Name, p))); } } Assert.AreEqual(2, gv.Values.Length); for (int p = 0; p < testParams.ChanceTree.PlayersCount; ++p) { Console.WriteLine("Game value pos {0}: {1}", p, gv.Values[p]); Assert.AreEqual(testParams.ExpectedResult[p], gv.Values[p], testParams.Epsilon); } return(gv); }
public void Test_LeducHe() { GameDefinition gd = XmlSerializerExt.Deserialize <GameDefinition>( Props.Global.Expand("${bds.DataDir}ai.pkr.metastrategy/leduc-he.gamedef.xml")); ActionTree ct = CreateActionTreeByGameDef.Create(gd); using (TextWriter w = new StreamWriter(File.Open(Path.Combine(_outDir, "leduc-at.gv"), FileMode.Create))) { VisActionTree vis = new VisActionTree { Output = w }; vis.Show(ct); } }
private void Solve(TestParams testParams, bool visualize, ConfigureSolver configureSolver) { if (visualize) { VisActionTree.Show(testParams.ActionTree, Path.Combine(_outDir, String.Format("{0}-at.gv", testParams.Name))); VisChanceTree.Show(testParams.ChanceTree, Path.Combine(_outDir, String.Format("{0}-ct.gv", testParams.Name))); } StrategyTree [] eqStrategies = new StrategyTree[testParams.ChanceTree.PlayersCount]; string error; for (int heroPos = 0; heroPos < testParams.ChanceTree.PlayersCount; ++heroPos) { // Create and configure EqLp solver EqLp solver = new EqLp { HeroPosition = heroPos, ChanceTree = testParams.ChanceTree, ActionTree = testParams.ActionTree, }; if (configureSolver != null) { configureSolver(solver); } // Solve EqLp solver.Solve(); eqStrategies[heroPos] = solver.Strategy; if (visualize) { VisStrategyTree.Show(solver.Strategy, Path.Combine(_outDir, string.Format("{0}-eq-{1}.gv", testParams.Name, heroPos))); } // Verify the eq value and strategy Assert.AreEqual(testParams.ExpectedResult[heroPos], solver.Value, testParams.Epsilon, "Wrong eq value"); Assert.IsTrue(VerifyAbsStrategy.Verify(solver.Strategy, solver.HeroPosition, 1e-7, out error), error); } // Verify eq, use another (better) epsilon because EqLp and VerifyEq have better precision // than most of the reference game solvers like OCFR. Assert.IsTrue(VerifyEq.Verify(testParams.ActionTree, testParams.ChanceTree, eqStrategies, 1e-7, out error), error); }
public void Test_Eq() { GameDefinition gd = XmlSerializerExt.Deserialize <GameDefinition>("kuhn8.gamedef.xml"); ChanceTree ct = CreateChanceTreeByGameDef.Create(gd); VisChanceTree.Show(ct, "kuhn8-ct.gv"); ActionTree at = CreateActionTreeByGameDef.Create(gd); VisActionTree.Show(at, "kuhn8-at.gv"); double[] values; StrategyTree [] strategies = EqLp.Solve(at, ct, out values); Console.WriteLine("Kuhn8 eq values: {0}, {1}", values[0], values[1]); VisStrategyTree.Show(strategies[0], "kuhn8-eq-0.gv"); VisStrategyTree.Show(strategies[1], "kuhn8-eq-1.gv"); // Make strategy for T same as for Q //strategies[0].Nodes[strategies[0].FindNode("0d0 0p0", null)].Probab = 0.5; //strategies[0].Nodes[strategies[0].FindNode("0d0 0p0 1p1 0p1", null)].Probab = 0.5; //strategies[0].Nodes[strategies[0].FindNode("0d0 0p1", null)].Probab = 0.5; // Make strategy for Q same as for T strategies[0].Nodes[strategies[0].FindNode("0d2 0p0", null)].Probab = 0; strategies[0].Nodes[strategies[0].FindNode("0d2 0p0 1p1 0p1", null)].Probab = 0; strategies[0].Nodes[strategies[0].FindNode("0d2 0p1", null)].Probab = 1; VisStrategyTree.Show(strategies[0], "kuhn8-eq-0-adj.gv"); Br br = new Br { ActionTree = at, ChanceTree = ct, HeroPosition = 1 }; br.Strategies = new StrategyTree[] { strategies[0], null }; br.Solve(); StrategyTree br0 = br.Strategies[1]; Console.WriteLine("Br against pos 0: {0}", br.Value); VisStrategyTree.Show(strategies[1], "kuhn8-eq-br-0.gv"); }
private static bool ProcessActionTree() { ActionTree tree; if (_cmdLine.Input != "") { tree = UFTree.Read <ActionTree>(_cmdLine.Input); } else { tree = CreateActionTreeByGameDef.Create(_gd); } if (_outputFormat == ".gv") { using (TextWriter w = new StreamWriter(File.Open(_cmdLine.Output, FileMode.Create))) { VisActionTree vis = new VisActionTree { Output = w }; if (_cmdLine.ClearExpr) { vis.ShowExpr.Clear(); } vis.ShowExprFromString(_cmdLine.ShowExpr); vis.PruneIfExt = (t, n, s, d) => s[d].Round > _cmdLine.MaxRound; vis.MatchPath = _cmdLine.MatchPath; vis.Show(tree); } } else if (_outputFormat == ".dat") { tree.Write(_cmdLine.Output); } else { Console.Error.WriteLine("Unsupported output format '{0}' for tree kind '{1}'", _outputFormat, _cmdLine.TreeKind); return(false); } return(true); }
public void Test_CallKK() { string outDir = Path.Combine(_outDir, "call-KK"); Directory.CreateDirectory(outDir); HePocketKind[] sbPockets = new HePocketKind[] { HePocketKind._AA, HePocketKind._KK, HePocketKind._AKs }; HePocketKind[] bbPockets = new HePocketKind[] { HePocketKind._AA, HePocketKind._KK, HePocketKind._QQ, HePocketKind._AKs }; string xmlAt = Props.Global.Expand("${bds.DataDir}ai.pkr.holdem.learn/bigcards-pf-1.xml"); ActionTree at = XmlToActionTree.Convert(xmlAt); VisActionTree.Show(at, Path.Combine(outDir, "at.gv")); BigCardsPreflop bc = new BigCardsPreflop(); bc.Solve(at, sbPockets, bbPockets); Console.WriteLine("Game values: {0}, {1}", bc.GameValues[0], bc.GameValues[1]); VisChanceTree.Show(bc.Ct, Path.Combine(outDir, "ct.gv")); VisStrategyTree.Show(bc.Strategies[0], Path.Combine(outDir, "st-0.gv")); VisStrategyTree.Show(bc.Strategies[1], Path.Combine(outDir, "st-1.gv")); }
/// <summary> /// Runs the solver with the specified parameters.. /// </summary> /// <param name="iterCounts">Number of iterations for each run, -1 - unlimited.</param> private StrategyTree RunSolver(TestParams testParams, bool visualize, bool trace, int [] iterCounts, ConfigureSolver configureSolver) { int playersCount = testParams.ChanceTree.PlayersCount; string baseDir = Path.Combine(_outDir, testParams.Name); DirectoryExt.Delete(baseDir); Directory.CreateDirectory(baseDir); string inputDir = Path.Combine(baseDir, "input"); Directory.CreateDirectory(inputDir); string traceDir = Path.Combine(baseDir, "trace"); if (trace) { Directory.CreateDirectory(traceDir); } string chanceTreeFile = Path.Combine(inputDir, "ct.dat"); string actionTreeFile = Path.Combine(inputDir, "at.dat"); testParams.ChanceTree.Write(chanceTreeFile); testParams.ActionTree.Write(actionTreeFile); if (visualize) { VisActionTree.Show(testParams.ActionTree, actionTreeFile + ".gv"); VisChanceTree.Show(testParams.ChanceTree, chanceTreeFile + ".gv"); } int runs = iterCounts.Length; Breb solver = null; for (int r = 0; r < runs; ++r) { // Create and configure a solver solver = new Breb { GameDef = testParams.GameDef, ActionTreeFile = actionTreeFile, ChanceTreeFile = chanceTreeFile, OutputPath = baseDir, SnapshotsCount = 2, Epsilon = testParams.Epsilon, ThreadsCount = DEFAULT_THREADS_COUNT, }; if (trace) { solver.TraceDir = traceDir; } solver.MaxIterationCount = iterCounts[r]; if (configureSolver != null) { configureSolver(solver); } solver.Solve(); } string fileName = solver.CurrentSnapshotInfo.StrategyFile; StrategyTree eqStrategy = StrategyTree.Read <StrategyTree>(fileName); if (visualize) { VisStrategyTree.Show(eqStrategy, fileName + ".gv"); } return(eqStrategy); }
private void Solve(TestParams testParams, bool visualize, ConfigureSolver configureSolver) { if (visualize) { VisActionTree.Show(testParams.ActionTree, Path.Combine(_outDir, String.Format("{0}-at.gv", testParams.Name))); VisChanceTree.Show(testParams.ChanceTree, Path.Combine(_outDir, String.Format("{0}-ct.gv", testParams.Name))); for (int p = 0; p < testParams.StrategyTrees.Length; ++p) { VisStrategyTree.Show(testParams.StrategyTrees[p], Path.Combine(_outDir, string.Format("{0}-st-{1}.gv", testParams.Name, p))); } } // Make sure input is correct. for (int p = 0; p < testParams.ChanceTree.Nodes[0].Position; ++p) { string errorText; Assert.IsTrue(VerifyAbsStrategy.Verify(testParams.StrategyTrees[p], p, 0.000001, out errorText), errorText); } for (int heroPos = 0; heroPos < testParams.ChanceTree.PlayersCount; ++heroPos) { // Create and configure Br solver Br br = new Br { HeroPosition = heroPos, ChanceTree = testParams.ChanceTree, ActionTree = testParams.ActionTree, }; br.Strategies = new StrategyTree[testParams.ChanceTree.PlayersCount]; for (int opp = 0; opp < testParams.ChanceTree.PlayersCount; ++opp) { if (opp == heroPos) { continue; } br.Strategies[opp] = testParams.StrategyTrees[opp]; } br.PrepareVis = visualize; if (configureSolver != null) { configureSolver(br); } // Solve Br br.Solve(); if (visualize) { Br.Vis.Show(br, Path.Combine(_outDir, String.Format("{0}-br-{1}.gv", testParams.Name, heroPos))); } // Verify the Br value and strategy Assert.AreEqual(testParams.ExpectedResult[heroPos], br.Value, testParams.Epsilon, "Wrong BR value"); string error; Assert.IsTrue(VerifyAbsStrategy.Verify(br.Strategies[br.HeroPosition], br.HeroPosition, out error), error); // Verify Br strategy has the expected value by running an independent GameValue algo on it. GameValue gv = new GameValue { ActionTree = br.ActionTree, ChanceTree = br.ChanceTree, Strategies = br.Strategies }; gv.Solve(); Assert.AreEqual(testParams.ExpectedResult[heroPos], gv.Values[br.HeroPosition], testParams.Epsilon, "Wrong GameValue value"); } }