/// <summary>
        /// Refine clusters
        /// </summary>
        /// <param name="clusters">Collection of clusters</param>
        /// <param name="decks">Collection of partial decks used to refine clusters</param>
        /// <returns>Refined collection of clusters</returns>
        public List <Cluster> RefineClusters(List <Cluster> clusters, List <PartialDeck> decks)
        {
            Trace.Log("");
            Trace.Log("*** Refining clusters ***");

            // Group decks into clusters
            var clusterGroups = this.MatchDecksToClusters(clusters, decks);

            // Generate the next iteration for each cluster
            foreach (Cluster cluster in clusterGroups.Keys)
            {
                Trace.Log("");
                Trace.Log("Refining cluster: " + cluster.ToString());

                var matchingDecks = clusterGroups[cluster];
                var cardCounter   = new CardCounter(matchingDecks);
                this.TraceCardCounts(cardCounter, matchingDecks.Count);

                Cluster newCluster = new Cluster();
                for (int i = 0; i < 30; i++)
                {
                    newCluster.Add(cardCounter.InstanceCounts[i].CardId);
                }

                var diff = cluster.Diff(newCluster);
                Trace.Log("Diff: " + diff.ToString());
            }

            return(null);
        }
        /// <summary>
        /// Trace card counts
        /// </summary>
        private void TraceCardCounts(CardCounter cardCounter, int totalCount)
        {
            int i = 1;

            foreach (var instanceCount in cardCounter.InstanceCounts)
            {
                Trace.Log(
                    "{4}: {0} #{1}: {2} ({3:P2})",
                    HearthDb.Cards.All[instanceCount.CardId].Name,
                    instanceCount.Instance,
                    instanceCount.Count,
                    (double)instanceCount.Count / (double)totalCount,
                    i++);
            }
        }