tdigest.h 2.0 KB
Newer Older
A
AlexDuan 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/*
 * 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/>.
 */

A
AlexDuan 已提交
16 17 18 19 20 21 22 23 24
/*
 * include/tdigest.c
 *
 * Copyright (c) 2016, Usman Masood <usmanm at fastmail dot fm>
 */

#ifndef TDIGEST_H
#define TDIGEST_H

A
AlexDuan 已提交
25 26 27 28
#ifndef M_PI
#define M_PI        3.14159265358979323846264338327950288   /* pi             */
#endif

A
AlexDuan 已提交
29 30
#define DOUBLE_MAX 1.79e+308

31
#define ADDITION_CENTROID_NUM 2
A
AlexDuan 已提交
32
#define COMPRESSION 400
W
fix bug  
wpan 已提交
33
#define GET_CENTROID(compression)  (ceil(compression * M_PI / 2) + 1 + ADDITION_CENTROID_NUM)
A
AlexDuan 已提交
34
#define GET_THRESHOLD(compression) (7.5 + 0.37 * compression - 2e-4 * pow(compression, 2))
35
#define TDIGEST_SIZE(compression)  (sizeof(TDigest) + sizeof(SCentroid)*GET_CENTROID(compression) + sizeof(SPt)*GET_THRESHOLD(compression))
A
AlexDuan 已提交
36

A
AlexDuan 已提交
37
typedef struct SCentroid {
A
AlexDuan 已提交
38
    double mean;
A
AlexDuan 已提交
39 40
    int64_t weight;
}SCentroid;
A
AlexDuan 已提交
41

A
AlexDuan 已提交
42
typedef struct SPt {
A
AlexDuan 已提交
43
    double value;
A
AlexDuan 已提交
44 45
    int64_t weight;
}SPt;
A
AlexDuan 已提交
46 47 48

typedef struct TDigest {
    double compression;
A
AlexDuan 已提交
49 50
    int32_t threshold;
    int64_t size;
A
AlexDuan 已提交
51

A
AlexDuan 已提交
52
    int64_t total_weight;
A
AlexDuan 已提交
53 54 55
    double min;
    double max;

A
AlexDuan 已提交
56 57
    int32_t num_buffered_pts;
    SPt *buffered_pts;
A
AlexDuan 已提交
58

A
AlexDuan 已提交
59 60
    int32_t num_centroids;
    SCentroid *centroids;
A
AlexDuan 已提交
61 62
}TDigest;

A
AlexDuan 已提交
63 64
TDigest *tdigestNewFrom(void* pBuf, int32_t compression);
void tdigestAdd(TDigest *t, double x, int64_t w);
A
AlexDuan 已提交
65 66 67 68
void tdigestMerge(TDigest *t1, TDigest *t2);
double tdigestQuantile(TDigest *t, double q);
void tdigestCompress(TDigest *t);
void tdigestFreeFrom(TDigest *t);
A
AlexDuan 已提交
69
void tdigestAutoFill(TDigest* t, int32_t compression);
A
AlexDuan 已提交
70 71

#endif /* TDIGEST_H */