module PureSAT.Boost where

import Data.Bits (unsafeShiftR)

-- | Boost weight
--
-- >>> boost 0
-- 64
--
-- >>> boost 3
-- 67
--
-- >>> boost maxBound
-- 18446744073709551615
--
-- >>> boost (maxBound - 63)
-- 18446744073709551615
--
-- >>> boost (maxBound - 64)
-- 18446744073709551615
--
boost :: Word -> Word
boost :: Word -> Word
boost !Word
n =
    let !m :: Word
m = Word
n Word -> Word -> Word
forall a. Num a => a -> a -> a
+ Word
64
    in if Word
m Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
< Word
n then Word
forall a. Bounded a => a
maxBound else Word
m
{-# INLINE [1] boost #-}

-- | Decay weight
--
-- >>> decay 0
-- 0
--
-- >>> decay 1
-- 0
--
-- >>> decay 40
-- 39
--
-- >>> decay 10000
-- 9844
--
decay :: Word -> Word
decay :: Word -> Word
decay Word
0 = Word
0
decay Word
n = Word
n Word -> Word -> Word
forall a. Num a => a -> a -> a
- Word -> Word -> Word
forall a. Ord a => a -> a -> a
max Word
1 (Word -> Int -> Word
forall a. Bits a => a -> Int -> a
unsafeShiftR Word
n Int
6)
{-# INLINE [1] decay #-}