review updates

This commit is contained in:
Vyacheslav Matyukhin 2022-09-21 02:20:17 +04:00
parent 6fc21ddda6
commit 13f352752e
No known key found for this signature in database
GPG Key ID: 3D2A774C5489F96C

View File

@ -307,9 +307,12 @@ module Floats = {
continuous samples and discrete samples. The discrete samples are stored in a mutable map.
Samples are thought to be discrete if they have at least `minDiscreteWight` duplicates.
If the min discreet weight is 4, that would mean that at least four elements needed from a specific
If the min discrete weight is 4, that would mean that at least four elements needed from a specific
value for that to be kept as discrete. This is important because in some cases, we can expect that
some common elements will be generated by regular operations. The final continous array will be sorted.
some common elements will be generated by regular operations. The final continuous array will be sorted.
This function is performance-critical, don't change it significantly without benchmarking
SampleSet->PointSet conversion performance.
*/
let splitContinuousAndDiscreteForMinWeight = (
sortedArray: array<float>,
@ -318,34 +321,32 @@ module Floats = {
let continuous: array<float> = []
let discrete = FloatFloatMap.empty()
let flush = (cnt: int, value: float): unit => {
if cnt >= minDiscreteWeight {
FloatFloatMap.add(value, cnt->Belt.Int.toFloat, discrete)
let addData = (count: int, value: float): unit => {
if count >= minDiscreteWeight {
FloatFloatMap.add(value, count->Belt.Int.toFloat, discrete)
} else {
for _ in 1 to cnt {
let _ = continuous->Js.Array2.push(value)
for _ in 1 to count {
continuous->Js.Array2.push(value)->ignore
}
}
}
if sortedArray->Js.Array2.length != 0 {
let (finalCnt, finalValue) = sortedArray->Belt.Array.reduce(
// initial prev value doesn't matter; if it collides with the first element of the array, flush won't do anything
(0, 0.),
((cnt, prev), element) => {
if element == prev {
(cnt + 1, prev)
} else {
// new value, process previous ones
flush(cnt, prev)
(1, element)
}
},
)
let (finalCount, finalValue) = sortedArray->Belt.Array.reduce(
// initial prev value doesn't matter; if it collides with the first element of the array, flush won't do anything
(0, 0.),
((count, prev), element) => {
if element == prev {
(count + 1, prev)
} else {
// new value, process previous ones
addData(count, prev)
(1, element)
}
},
)
// flush final values
flush(finalCnt, finalValue)
}
// flush final values
addData(finalCount, finalValue)
(continuous, discrete)
}