{-# LANGUAGE TypeApplications #-}
module Shelley.Spec.Ledger.StabilityWindow
( computeStabilityWindow,
computeRandomnessStabilisationWindow,
)
where
import Data.Word (Word64)
import Shelley.Spec.Ledger.BaseTypes
computeStabilityWindow ::
Word64 ->
ActiveSlotCoeff ->
Word64
computeStabilityWindow :: Word64 -> ActiveSlotCoeff -> Word64
computeStabilityWindow Word64
k ActiveSlotCoeff
asc =
Double -> Word64
forall a b. (RealFrac a, Integral b) => a -> b
ceiling (Double -> Word64) -> Double -> Word64
forall a b. (a -> b) -> a -> b
$ Word64 -> Double
forall a b. (Integral a, Num b) => a -> b
fromIntegral @_ @Double (Word64
3 Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
* Word64
k) Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ Rational -> Double
forall a. Fractional a => Rational -> a
fromRational (Ratio Word64 -> Rational
forall a. Real a => a -> Rational
toRational Ratio Word64
f)
where
f :: Ratio Word64
f = UnitInterval -> Ratio Word64
intervalValue (UnitInterval -> Ratio Word64)
-> (ActiveSlotCoeff -> UnitInterval)
-> ActiveSlotCoeff
-> Ratio Word64
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ActiveSlotCoeff -> UnitInterval
activeSlotVal (ActiveSlotCoeff -> Ratio Word64)
-> ActiveSlotCoeff -> Ratio Word64
forall a b. (a -> b) -> a -> b
$ ActiveSlotCoeff
asc
computeRandomnessStabilisationWindow ::
Word64 ->
ActiveSlotCoeff ->
Word64
computeRandomnessStabilisationWindow :: Word64 -> ActiveSlotCoeff -> Word64
computeRandomnessStabilisationWindow Word64
k ActiveSlotCoeff
asc =
Double -> Word64
forall a b. (RealFrac a, Integral b) => a -> b
ceiling (Double -> Word64) -> Double -> Word64
forall a b. (a -> b) -> a -> b
$ Word64 -> Double
forall a b. (Integral a, Num b) => a -> b
fromIntegral @_ @Double (Word64
4 Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
* Word64
k) Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ Rational -> Double
forall a. Fractional a => Rational -> a
fromRational (Ratio Word64 -> Rational
forall a. Real a => a -> Rational
toRational Ratio Word64
f)
where
f :: Ratio Word64
f = UnitInterval -> Ratio Word64
intervalValue (UnitInterval -> Ratio Word64)
-> (ActiveSlotCoeff -> UnitInterval)
-> ActiveSlotCoeff
-> Ratio Word64
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ActiveSlotCoeff -> UnitInterval
activeSlotVal (ActiveSlotCoeff -> Ratio Word64)
-> ActiveSlotCoeff -> Ratio Word64
forall a b. (a -> b) -> a -> b
$ ActiveSlotCoeff
asc