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); }
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); }