You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

91 lines
2.1 KiB

/*
* vim: set ft=rust:
* vim: set ft=reason:
*
* Copyright (c) 2016 - present Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
open! Utils;
type t = {
sum: float,
avg: float,
min: float,
p10: float,
median: float,
p75: float,
max: float,
count: int
};
let to_json s =>
`Assoc [
("sum", `Float s.sum),
("avg", `Float s.avg),
("min", `Float s.min),
("p10", `Float s.p10),
("median", `Float s.median),
("p75", `Float s.p75),
("max", `Float s.max),
("count", `Int s.count)
];
let from_json json => {
let open! Yojson.Basic.Util;
{
sum: json |> member "sum" |> to_float,
avg: json |> member "avg" |> to_float,
min: json |> member "min" |> to_float,
p10: json |> member "p10" |> to_float,
median: json |> member "median" |> to_float,
p75: json |> member "p75" |> to_float,
max: json |> member "max" |> to_float,
count: json |> member "count" |> to_int
}
};
let compute_statistics values => {
let num_elements = IList.length values;
let sum = IList.fold_left (fun acc v => acc +. v) 0.0 values;
let average = sum /. float_of_int num_elements;
let values_arr = Array.of_list values;
Array.sort
(
fun a b =>
if (a == b) {
0
} else if (a -. b < 0.0) {
(-1)
} else {
1
}
)
values_arr;
let percentile pct => {
assert (pct >= 0.0 && pct <= 1.0);
assert (num_elements > 0);
let max_index = num_elements - 1;
let pct_index = float_of_int max_index *. pct;
let low_index = int_of_float (Pervasives.floor pct_index);
let high_index = int_of_float (Pervasives.ceil pct_index);
let low = values_arr.(low_index);
let high = values_arr.(high_index);
(low +. high) /. 2.0
};
{
sum,
avg: average,
min: percentile 0.0,
p10: percentile 0.10,
median: percentile 0.50,
p75: percentile 0.75,
max: percentile 1.0,
count: num_elements
}
};