tdigest.h 2.0 KB
Newer Older
G
Ganlin Zhao 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
/*
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
 *
 * This program is free software: you can use, redistribute, and/or modify
 * it under the terms of the GNU Affero General Public License, version 3
 * or later ("AGPL"), as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */

/*
 * include/tdigest.c
 *
 * Copyright (c) 2016, Usman Masood <usmanm at fastmail dot fm>
 */

#ifndef TDIGEST_H
#define TDIGEST_H

H
Hongze Cheng 已提交
25 26
#include "os.h"

G
Ganlin Zhao 已提交
27
#ifndef M_PI
H
Hongze Cheng 已提交
28
#define M_PI 3.14159265358979323846264338327950288 /* pi             */
G
Ganlin Zhao 已提交
29 30 31 32
#endif

#define DOUBLE_MAX 1.79e+308

H
Hongze Cheng 已提交
33 34
#define ADDITION_CENTROID_NUM      2
#define COMPRESSION                300
G
Ganlin Zhao 已提交
35 36
#define GET_CENTROID(compression)  (ceil(compression * M_PI / 2) + 1 + ADDITION_CENTROID_NUM)
#define GET_THRESHOLD(compression) (7.5 + 0.37 * compression - 2e-4 * pow(compression, 2))
H
Hongze Cheng 已提交
37 38
#define TDIGEST_SIZE(compression) \
  (sizeof(TDigest) + sizeof(SCentroid) * GET_CENTROID(compression) + sizeof(SPt) * GET_THRESHOLD(compression))
G
Ganlin Zhao 已提交
39 40

typedef struct SCentroid {
H
Hongze Cheng 已提交
41 42 43
  double  mean;
  int64_t weight;
} SCentroid;
G
Ganlin Zhao 已提交
44 45

typedef struct SPt {
H
Hongze Cheng 已提交
46 47 48
  double  value;
  int64_t weight;
} SPt;
G
Ganlin Zhao 已提交
49 50

typedef struct TDigest {
H
Hongze Cheng 已提交
51 52 53
  double  compression;
  int32_t threshold;
  int64_t size;
G
Ganlin Zhao 已提交
54

H
Hongze Cheng 已提交
55 56 57
  int64_t total_weight;
  double  min;
  double  max;
G
Ganlin Zhao 已提交
58

H
Hongze Cheng 已提交
59 60
  int32_t num_buffered_pts;
  SPt    *buffered_pts;
G
Ganlin Zhao 已提交
61

H
Hongze Cheng 已提交
62 63 64
  int32_t    num_centroids;
  SCentroid *centroids;
} TDigest;
G
Ganlin Zhao 已提交
65

H
Hongze Cheng 已提交
66 67 68 69 70 71 72
TDigest *tdigestNewFrom(void *pBuf, int32_t compression);
void     tdigestAdd(TDigest *t, double x, int64_t w);
void     tdigestMerge(TDigest *t1, TDigest *t2);
double   tdigestQuantile(TDigest *t, double q);
void     tdigestCompress(TDigest *t);
void     tdigestFreeFrom(TDigest *t);
void     tdigestAutoFill(TDigest *t, int32_t compression);
G
Ganlin Zhao 已提交
73 74

#endif /* TDIGEST_H */