示例#1
0
        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);
        }
示例#3
0
            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();
            }