]> git.ipfire.org Git - thirdparty/collectd.git/commitdiff
change exponential constructor
authorSvetlana Shmidt <sshmidt@google.com>
Wed, 29 Jul 2020 09:23:23 +0000 (14:23 +0500)
committerSvetlana Shmidt <sshmidt@google.com>
Wed, 29 Jul 2020 09:23:23 +0000 (14:23 +0500)
src/daemon/distribution.c
src/daemon/distribution.h

index fca4d0f5e827b303a38612b5da5aa44c741fcee7..faaf08de32dbe39099df7640dd853da7e836d359 100644 (file)
@@ -121,25 +121,19 @@ distribution_t* distribution_new_linear(size_t num_buckets, double size) {
   return build_distribution_from_bucket_array(num_buckets, bucket_array);
 }
 
-distribution_t* distribution_new_exponential(size_t num_buckets, double initial_size, double factor) {
-  if (num_buckets == 0 || initial_size <= 0 || factor <= 1) {
+distribution_t* distribution_new_exponential(size_t num_buckets, double base, double factor) {
+  if (num_buckets == 0 || base <= 1 || factor <= 0) {
     errno = EINVAL;
     return NULL;
   }
 
   bucket_t bucket_array[num_buckets];
-  bucket_array[0] = (bucket_t) {
-    .bucket_counter = 0,
-    .minimum = 0,
-    .maximum = initial_size,
-  };
-  for (size_t i = 1; i < num_buckets; i++) {
-    bucket_array[i].bucket_counter = 0;
-    bucket_array[i].minimum = bucket_array[i - 1].maximum;
-    if (i == num_buckets - 1)
-      bucket_array[i].maximum = INFINITY;
-    else
-      bucket_array[i].maximum = bucket_array[i].minimum * factor;
+  for (size_t i = 0; i < num_buckets; i++) {
+    bucket_array[i] = (bucket_t) {
+        .bucket_counter = 0,
+        .minimum = (i == 0) ? 0 : bucket_array[i - 1].maximum,
+        .maximum = (i == num_buckets - 1) ? INFINITY : factor * pow(base, i), //check if it's slow
+    };
   }
   return build_distribution_from_bucket_array(num_buckets, bucket_array);
 }
@@ -244,7 +238,7 @@ double distribution_average(distribution_t *dist) {
 
 int main() {
   double a[] = {3.0, 5.7, 6.7};
-  distribution_t *p = distribution_new_custom(3, a);
+  distribution_t *p = distribution_new_exponential(4, 2, 3);
   distribution_update(p, 2);
   distribution_update(p, 5);
   distribution_update(p, 7.5);
@@ -253,6 +247,6 @@ int main() {
     printf("%f %f %llu\n", p->tree[i].minimum, p->tree[i].maximum, p->tree[i].bucket_counter);
   }
   printf("%f\n", distribution_average(p));
-  printf("%f\n", distribution_percentile(p, 90));
+  printf("%f\n", distribution_percentile(p, 70));
   distribution_destroy(p);
 }
\ No newline at end of file
index 7c887b09ed9e6215c58eda5952c54664b76820f6..3c4e1eea69a405b19f5fa88c17f6b3225c9ebc2a 100644 (file)
@@ -44,13 +44,13 @@ distribution_t* distribution_new_linear(size_t num_buckets, double size);
 
 /**
  * function creates new distribution with the exponential buckets:
- * [0; initial_size) [initial_size; initial_size * factor) ... [initial_size * factor^{num_buckets - 2}; infinity)
+ * [0; factor) [factor; factor * base) ... [factor * base^{num_buckets - 2}; infinity)
  * @param num_buckets - number of buckets. Should be greater than 0
- * @param initial_size - size of the first bucket. Should be greater than 0
- * @param factor - factor for buckets' upper bound. Should be greater than 1
+ * @param base - base of geometric progression. Should be greater than 1
+ * @param factor - size of the first bucket. Should be greater than 0
  * @return - pointer to a new distribution or null pointer if parameters are wrong or memory allocation fails
  */
-distribution_t* distribution_new_exponential(size_t num_buckets, double initial_size, double factor);
+distribution_t* distribution_new_exponential(size_t num_buckets, double base, double factor);
 
 /**
  * function creates new distribution with the custom buckets: