module Data.BloomFilter.Blocked.Calc (
NumEntries,
BloomSize (..),
FPR,
sizeForFPR,
BitsPerEntry,
sizeForBits,
sizeForPolicy,
BloomPolicy (..),
policyFPR,
policyForFPR,
policyForBits,
) where
import Data.BloomFilter.Classic.Calc (BitsPerEntry, BloomPolicy (..),
BloomSize (..), FPR, NumEntries)
policyForFPR :: FPR -> BloomPolicy
policyForFPR :: Double -> BloomPolicy
policyForFPR Double
fpr | Double
fpr Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
<= Double
0 Bool -> Bool -> Bool
|| Double
fpr Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
>= Double
1 =
[Char] -> BloomPolicy
forall a. HasCallStack => [Char] -> a
error [Char]
"bloomPolicyForFPR: fpr out of range (0,1)"
policyForFPR Double
fpr =
BloomPolicy {
policyBits :: Double
policyBits = Double
c,
policyHashes :: Int
policyHashes = Int
k
}
where
k :: Int
k :: Int
k = Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
1 (Double -> Int
forall b. Integral b => Double -> b
forall a b. (RealFrac a, Integral b) => a -> b
round (Double
recip_log2 Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
log_fpr))
c :: Double
c = Double
log_fpr Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
log_fpr Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
f2
Double -> Double -> Double
forall a. Num a => a -> a -> a
+ Double
log_fpr Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
f1
Double -> Double -> Double
forall a. Num a => a -> a -> a
+ Double
f0
log_fpr :: Double
log_fpr = Double -> Double
forall a. Num a => a -> a
negate (Double -> Double
forall a. Floating a => a -> a
log Double
fpr)
f2,f1,f0 :: Double
f2 :: Double
f2 = Double
8.079418894776325e-2
f1 :: Double
f1 = Double
1.6462569292513933
f0 :: Double
f0 = Double
0.5550062950289885
policyForBits :: BitsPerEntry -> BloomPolicy
policyForBits :: Double -> BloomPolicy
policyForBits Double
c | Double
c Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
< Double
0 =
[Char] -> BloomPolicy
forall a. HasCallStack => [Char] -> a
error [Char]
"policyForBits: bits per entry must be > 0"
policyForBits Double
c =
BloomPolicy {
policyBits :: Double
policyBits = Double
c,
policyHashes :: Int
policyHashes = Int
k
}
where
k :: Int
k = Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
1 (Double -> Int
forall b. Integral b => Double -> b
forall a b. (RealFrac a, Integral b) => a -> b
round (Double
c Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
log2))
policyFPR :: BloomPolicy -> FPR
policyFPR :: BloomPolicy -> Double
policyFPR BloomPolicy {
policyBits :: BloomPolicy -> Double
policyBits = Double
c
} =
Double -> Double
forall a. Floating a => a -> a
exp (Double
0 Double -> Double -> Double
forall a. Ord a => a -> a -> a
`min` Double -> Double
forall a. Num a => a -> a
negate (Double
cDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
cDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
f2 Double -> Double -> Double
forall a. Num a => a -> a -> a
+ Double
cDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
f1 Double -> Double -> Double
forall a. Num a => a -> a -> a
+ Double
f0))
where
f2,f1,f0 :: Double
f2 :: Double
f2 = -Double
5.03623760876204e-3
f1 :: Double
f1 = Double
0.5251544487138062
f0 :: Double
f0 = -Double
0.10110451821280719
sizeForFPR :: FPR -> NumEntries -> BloomSize
sizeForFPR :: Double -> Int -> BloomSize
sizeForFPR = BloomPolicy -> Int -> BloomSize
sizeForPolicy (BloomPolicy -> Int -> BloomSize)
-> (Double -> BloomPolicy) -> Double -> Int -> BloomSize
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Double -> BloomPolicy
policyForFPR
sizeForBits :: BitsPerEntry -> NumEntries -> BloomSize
sizeForBits :: Double -> Int -> BloomSize
sizeForBits = BloomPolicy -> Int -> BloomSize
sizeForPolicy (BloomPolicy -> Int -> BloomSize)
-> (Double -> BloomPolicy) -> Double -> Int -> BloomSize
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Double -> BloomPolicy
policyForBits
sizeForPolicy :: BloomPolicy -> NumEntries -> BloomSize
sizeForPolicy :: BloomPolicy -> Int -> BloomSize
sizeForPolicy BloomPolicy {
policyBits :: BloomPolicy -> Double
policyBits = Double
c,
policyHashes :: BloomPolicy -> Int
policyHashes = Int
k
} Int
n =
BloomSize {
sizeBits :: Int
sizeBits = Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
1 (Double -> Int
forall b. Integral b => Double -> b
forall a b. (RealFrac a, Integral b) => a -> b
ceiling (Int -> Double
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
c)),
sizeHashes :: Int
sizeHashes = Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
1 Int
k
}
log2, recip_log2 :: Double
log2 :: Double
log2 = Double -> Double
forall a. Floating a => a -> a
log Double
2
recip_log2 :: Double
recip_log2 = Double -> Double
forall a. Fractional a => a -> a
recip Double
log2