Edit

kc3-lang/brotli/c/enc/cluster.c

Branch :

  • Show log

    Commit

  • Author : Evgenii Kliuchnikov
    Date : 2022-11-17 13:03:09
    Hash : a8f5813b
    Message : Update Documentation: - add note that brotli is a "stream" format, not an archive-like - regenerate .1 with Pandoc Build: - drop legacy "BROTLI_BUILD_PORTABLE" option - drop "BROTLI_SANITIZED" definition Code: - c: comb includes - c/enc: extract encoder state into separate header - c/enc: drop designated q10 codepath - c/enc: dealing better with flushing of empty stream - fix MSVC compilation API: - py: use library version instead of one in version.h - c: add plugable API to report consumed input / produced output - c/java: support "lean" prepared dictionaries (without copy of source)

  • c/enc/cluster.c
  • /* Copyright 2013 Google Inc. All Rights Reserved.
    
       Distributed under MIT license.
       See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
    */
    
    /* Functions for clustering similar histograms together. */
    
    #include "cluster.h"
    
    #include <brotli/types.h>
    
    #include "../common/platform.h"
    #include "bit_cost.h"  /* BrotliPopulationCost */
    #include "fast_log.h"
    #include "histogram.h"
    #include "memory.h"
    
    #if defined(__cplusplus) || defined(c_plusplus)
    extern "C" {
    #endif
    
    static BROTLI_INLINE BROTLI_BOOL HistogramPairIsLess(
        const HistogramPair* p1, const HistogramPair* p2) {
      if (p1->cost_diff != p2->cost_diff) {
        return TO_BROTLI_BOOL(p1->cost_diff > p2->cost_diff);
      }
      return TO_BROTLI_BOOL((p1->idx2 - p1->idx1) > (p2->idx2 - p2->idx1));
    }
    
    /* Returns entropy reduction of the context map when we combine two clusters. */
    static BROTLI_INLINE double ClusterCostDiff(size_t size_a, size_t size_b) {
      size_t size_c = size_a + size_b;
      return (double)size_a * FastLog2(size_a) +
        (double)size_b * FastLog2(size_b) -
        (double)size_c * FastLog2(size_c);
    }
    
    #define CODE(X) X
    
    #define FN(X) X ## Literal
    #include "cluster_inc.h"  /* NOLINT(build/include) */
    #undef FN
    
    #define FN(X) X ## Command
    #include "cluster_inc.h"  /* NOLINT(build/include) */
    #undef FN
    
    #define FN(X) X ## Distance
    #include "cluster_inc.h"  /* NOLINT(build/include) */
    #undef FN
    
    #undef CODE
    
    #if defined(__cplusplus) || defined(c_plusplus)
    }  /* extern "C" */
    #endif