void ComputeCorrelationsUShortOverlap(IBooleanMatrix entity_data)
        {
            var overlap = Overlap.ComputeUShort(entity_data);

            for (int x = 0; x < NumEntities; x++)
            {
                for (int y = 0; y < x; y++)
                {
                    this[x, y] = ComputeCorrelationFromOverlap(overlap[x, y], entity_data.NumEntriesByRow(x), entity_data.NumEntriesByRow(y));
                }
            }
        }
        void ComputeCorrelationsWeighted(IBooleanMatrix entity_data)
        {
            var overlap_and_entity_weights = Overlap.ComputeWeighted(entity_data);
            var overlap        = overlap_and_entity_weights.Item1;
            var entity_weights = overlap_and_entity_weights.Item2;

            for (int x = 0; x < NumEntities; x++)
            {
                for (int y = 0; y < x; y++)
                {
                    this[x, y] = ComputeCorrelationFromOverlap(overlap[x, y], entity_weights[x], entity_weights[y]);
                }
            }
        }
        void ComputeCorrelationsUIntOverlap(IBooleanMatrix entity_data)
        {
            var overlap = Overlap.ComputeUInt(entity_data);

            // compute correlations
            for (int x = 0; x < num_entities; x++)
            {
                for (int y = 0; y < x; y++)
                {
                    this[x, y] = ComputeCorrelationFromOverlap(overlap[x, y], entity_data.NumEntriesByRow(x), entity_data.NumEntriesByRow(y));
                    this[y, x] = ComputeCorrelationFromOverlap(overlap[x, y], entity_data.NumEntriesByRow(y), entity_data.NumEntriesByRow(x));
                }
            }
        }