Exemplo n.º 1
0
        public Bucket[] BucketizeHands(int round, McHand[] hands, IClusterNode parentNode)
        {
            KMeansNode parentKmNode = (KMeansNode)parentNode;

            if (hands == null || hands.Length == 0)
            {
                parentKmNode.AllocateChildren(1);
                parentKmNode.Children[0] = new KMeansNode(Dim, 0);
                return(new Bucket[] { new Bucket() });
            }

            double[][] centers;
            double[][] values = CalcValuesAndKMeans(parentKmNode, round, hands, out centers);

            if (IsVerbose)
            {
                Console.Write("Centers:");
                PrintCenters(centers);
                Console.WriteLine();
            }
            Array.Sort(centers, new CenterComparer());
            if (IsVerbose)
            {
                Console.Write("Sorted centers:");
                PrintCenters(centers);
                Console.WriteLine();
            }

            parentKmNode.AllocateChildren(centers.Length);
            for (int c = 0; c < centers.Length; ++c)
            {
                KMeansNode node = new KMeansNode(Dim, 0);
                centers[c].CopyTo(node.Center, 0);
                parentKmNode.Children[c] = node;
            }

            Bucket[] buckets = new Bucket[parentKmNode.Children.Length].Fill(i => new Bucket());
            for (int i = 0; i < hands.Length; ++i)
            {
                // Never normalize values here, because it is either not necessary or already done (for k-means).
                int abstrCard = parentKmNode.FindClosestChild(values[i], false);
                buckets[abstrCard].Hands.Add(hands[i]);
            }
            return(buckets);
        }
Exemplo n.º 2
0
        public int GetAbstractCard(int[] hand, int handLength)
        {
            int round     = HeHelper.HandSizeToRound[handLength];
            int abstrCard = GetPreflopAbstrCard(hand);

            if (round == 0)
            {
                return(abstrCard);
            }
            KMeansNode kn = (KMeansNode)_clusterTree.Root.GetChild(abstrCard);

            double[] point = new double[Dim];
            for (int r = 1; r <= round; ++r)
            {
                CalculateValue(hand, HeHelper.RoundToHandSize[r], point);
                abstrCard = kn.FindClosestChild(point, _normalizeHandValues);
                kn        = kn.Children[abstrCard];
            }
            Debug.Assert(abstrCard >= 0 && abstrCard < MaxBucketCounts[round]);
            return(abstrCard);
        }