public ChanceTree Create(GameDefinition gd, IChanceAbstraction [] abstractions) { _abstractions = abstractions; _gameDef = gd; _hands = new int[gd.MinPlayers][].Fill(i => new int[gd.RoundsCount]); _activePlayersOne = ActivePlayers.Get(gd.MinPlayers, 1, 1); _activePlayersAll = ActivePlayers.Get(gd.MinPlayers, 1, gd.MinPlayers); _maxDepth = gd.RoundsCount * gd.MinPlayers; ChanceTree gdChanceTree = CreateChanceTreeByGameDef.Create(gd); WalkUFTreePP <ChanceTree, CreateIntermediateTreeContext> wt1 = new WalkUFTreePP <ChanceTree, CreateIntermediateTreeContext>(); wt1.OnNodeBegin = CreateIntermediateTree_OnNodeBegin; wt1.OnNodeEnd = CreateIntermediateTree_OnNodeEnd; _nodesCount = 0; wt1.Walk(gdChanceTree); _abstChanceTree = new ChanceTree(_nodesCount + 1); WalkTreePP <IntermediateNode, IntermediateNode, int, CopyTreeContext> wt2 = new WalkTreePP <IntermediateNode, IntermediateNode, int, CopyTreeContext>(); wt2.OnNodeBegin = CopyTree_OnNodeBegin; _nodesCount = 0; wt2.Walk(_intRoot, _intRoot); _abstChanceTree.Version.Description = String.Format("Chance tree (gamedef: {0}", gd.Name); for (int p = 0; p < gd.MinPlayers; ++p) { _abstChanceTree.Version.Description += String.Format(", {0}", abstractions[p].Name); } _abstChanceTree.Version.Description += ")"; return(_abstChanceTree); }
private void VerifyWalk(TestTree tree, UFToUniAdapter adapter) { List <int> expectedPre = new List <int>(); List <int> expectedPost = new List <int>(); WalkUFTreePP <TestTree, WalkUFTreePPContext> wft = new WalkUFTreePP <TestTree, WalkUFTreePPContext>(); wft.OnNodeBegin = (t, s, d) => expectedPre.Add(tree.Nodes[s[d].NodeIdx].Value); wft.OnNodeEnd = (t, s, d) => expectedPost.Add(tree.Nodes[s[d].NodeIdx].Value); wft.Walk(tree); List <int> actualPre = new List <int>(); List <int> actualPost = new List <int>(); WalkTreePP <UFToUniAdapter, int, int, AdapterContext> wt = new WalkTreePP <UFToUniAdapter, int, int, AdapterContext>(); wt.OnNodeBegin = (t, n, s, d) => { actualPre.Add(tree.Nodes[n].Value); return(true); }; wt.OnNodeEnd = (t, n, s, d) => actualPost.Add(tree.Nodes[n].Value); wt.Walk(adapter, 0); Assert.AreEqual(expectedPre, actualPre); Assert.AreEqual(expectedPost, actualPost); int bi, cnt; adapter.GetChildrenBeginIdxAndCount(0, out bi, out cnt); Assert.AreEqual(4, cnt); }
private void WriteInternal(BinaryWriter w) { // Write version first to allow standard tools work. Version.Write(w); w.Write(SERIALIZATION_FORMAT_VERSION); w.Write(PlayersCount); w.Write(RoundsCount); w.Write(SamplesCount); w.Write(SourceInfo); Int64 leavesCount = CalculateLeavesCount(); w.Write(leavesCount); UInt64 sumLeavesCount = 0; var wt = new WalkTreePP <Node, object, int, WriteInternalContext>(); wt.OnNodeEnd = (Node tree, object node, List <WriteInternalContext> stack, int depth) => { int maxDepth = PlayersCount * RoundsCount; if (depth < maxDepth) { return; } byte[] cards = new byte[PlayersCount * RoundsCount]; for (int d = 0; d < cards.Length; ++d) { cards[d] = (byte)(stack[d].ChildrenIterator - 1); } LeafT leaf = (stack[depth - 1].Node as Node).Leaves[cards[depth - 1]]; w.Write(cards); w.Write(leaf.Count); w.Write(leaf.Result); sumLeavesCount += leaf.Count; }; wt.Walk(Root, Root); VerifyTotalCount(sumLeavesCount); UpdateDescription(); }