示例#1
0
        public static void CompareAndPushToHeap(global::Array <object> @out, int[] cluster_size, int idx1, int idx2, global::encode.BinaryHeap <object> pairs)
        {
            if ((idx1 == idx2))
            {
                return;
            }

            if ((idx2 < idx1))
            {
                int t = idx2;
                idx2 = idx1;
                idx1 = t;
            }

            bool store_pair = false;

            global::encode.cluster.HistogramPair p = new global::encode.cluster.HistogramPair();
            p.idx1      = idx1;
            p.idx2      = idx2;
            p.valid     = true;
            p.cost_diff = (0.5 * global::encode.Cluster.ClusterCostDiff(((int)(((int[])(cluster_size))[idx1])), ((int)(((int[])(cluster_size))[idx2]))));
            p.cost_diff = ((p.cost_diff -= ((global::encode.histogram.Histogram)(@out[idx1])).bit_cost_) - ((global::encode.histogram.Histogram)(@out[idx2])).bit_cost_);
            if ((((global::encode.histogram.Histogram)(@out[idx1])).total_count_ == 0))
            {
                p.cost_combo = ((global::encode.histogram.Histogram)(@out[idx2])).bit_cost_;
                store_pair   = true;
            }
            else if ((((global::encode.histogram.Histogram)(@out[idx2])).total_count_ == 0))
            {
                p.cost_combo = ((global::encode.histogram.Histogram)(@out[idx1])).bit_cost_;
                store_pair   = true;
            }
            else
            {
                double threshold = (((pairs.size() == 0)) ? (1e99) : (global::System.Math.Max(((double)(0.0)), ((double)(global::haxe.lang.Runtime.toDouble(global::haxe.lang.Runtime.getField(pairs.arr[0], "cost_diff", 1698677367, true)))))));
                global::encode.histogram.Histogram combo = new global::encode.histogram.Histogram(((int)((((int[])(((global::encode.histogram.Histogram)(@out[idx1])).data_)) as global::System.Array).Length)));
                combo.bit_cost_ = ((global::encode.histogram.Histogram)(@out[idx1])).bit_cost_;
                {
                    int _g1 = 0;
                    int _g  = (((int[])(((global::encode.histogram.Histogram)(@out[idx1])).data_)) as global::System.Array).Length;
                    while ((_g1 < _g))
                    {
                        int a = _g1++;
                        ((int[])(combo.data_))[a] = ((int[])(((global::encode.histogram.Histogram)(@out[idx1])).data_))[a];
                    }
                }

                combo.kDataSize    = ((global::encode.histogram.Histogram)(@out[idx1])).kDataSize;
                combo.total_count_ = ((global::encode.histogram.Histogram)(@out[idx1])).total_count_;
                combo.AddHistogram(((global::encode.histogram.Histogram)(@out[idx2])));
                double cost_combo = global::encode.Bit_cost.PopulationCost(combo);
                if ((cost_combo < (threshold - p.cost_diff)))
                {
                    p.cost_combo = cost_combo;
                    store_pair   = true;
                }
            }

            if (store_pair)
            {
                p.cost_diff += p.cost_combo;
                pairs.push(p);
            }
        }