review updates
This commit is contained in:
parent
6fc21ddda6
commit
13f352752e
|
@ -307,9 +307,12 @@ module Floats = {
|
||||||
continuous samples and discrete samples. The discrete samples are stored in a mutable map.
|
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.
|
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
|
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 = (
|
let splitContinuousAndDiscreteForMinWeight = (
|
||||||
sortedArray: array<float>,
|
sortedArray: array<float>,
|
||||||
|
@ -318,34 +321,32 @@ module Floats = {
|
||||||
let continuous: array<float> = []
|
let continuous: array<float> = []
|
||||||
let discrete = FloatFloatMap.empty()
|
let discrete = FloatFloatMap.empty()
|
||||||
|
|
||||||
let flush = (cnt: int, value: float): unit => {
|
let addData = (count: int, value: float): unit => {
|
||||||
if cnt >= minDiscreteWeight {
|
if count >= minDiscreteWeight {
|
||||||
FloatFloatMap.add(value, cnt->Belt.Int.toFloat, discrete)
|
FloatFloatMap.add(value, count->Belt.Int.toFloat, discrete)
|
||||||
} else {
|
} else {
|
||||||
for _ in 1 to cnt {
|
for _ in 1 to count {
|
||||||
let _ = continuous->Js.Array2.push(value)
|
continuous->Js.Array2.push(value)->ignore
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if sortedArray->Js.Array2.length != 0 {
|
let (finalCount, finalValue) = sortedArray->Belt.Array.reduce(
|
||||||
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
|
||||||
// initial prev value doesn't matter; if it collides with the first element of the array, flush won't do anything
|
(0, 0.),
|
||||||
(0, 0.),
|
((count, prev), element) => {
|
||||||
((cnt, prev), element) => {
|
if element == prev {
|
||||||
if element == prev {
|
(count + 1, prev)
|
||||||
(cnt + 1, prev)
|
} else {
|
||||||
} else {
|
// new value, process previous ones
|
||||||
// new value, process previous ones
|
addData(count, prev)
|
||||||
flush(cnt, prev)
|
(1, element)
|
||||||
(1, element)
|
}
|
||||||
}
|
},
|
||||||
},
|
)
|
||||||
)
|
|
||||||
|
|
||||||
// flush final values
|
// flush final values
|
||||||
flush(finalCnt, finalValue)
|
addData(finalCount, finalValue)
|
||||||
}
|
|
||||||
|
|
||||||
(continuous, discrete)
|
(continuous, discrete)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user