fix(ratio): more attempts to fix ratio bug

This commit is contained in:
Steffen Jost 2022-06-15 16:00:25 +02:00
parent 7984cd9ecb
commit b813442012
13 changed files with 26 additions and 15 deletions

View File

@ -16,6 +16,7 @@ import qualified Data.Text as Text
import qualified Data.Map.Strict as Map import qualified Data.Map.Strict as Map
import Data.Ratio ((%))
import Data.Random.Normal import Data.Random.Normal
import qualified Control.Monad.Random.Class as Random import qualified Control.Monad.Random.Class as Random
import System.Random (RandomGen) import System.Random (RandomGen)
@ -283,7 +284,7 @@ runSimulation' LoadSheetSubmission = do
yieldMany (zip [0..] chunks) yieldMany (zip [0..] chunks)
.| runReaderC simCtx .| runReaderC simCtx
( C.mapM $ \(ci, cs) -> ( C.mapM $ \(ci, cs) ->
fromIntegral cs <$ delayRemaining (1 % (genericLength chunks - ci) :: Rational) fromIntegral cs <$ delayRemaining ((1 % max 1 (genericLength chunks - ci)) :: Rational)
) )
.| generateDownload' uploadSeed .| generateDownload' uploadSeed
-- print $ ala Sum foldMap chunks -- print $ ala Sum foldMap chunks

2
package-lock.json generated
View File

@ -3825,7 +3825,7 @@
"boolbase": "~1.0.0", "boolbase": "~1.0.0",
"css-what": "2.1", "css-what": "2.1",
"domutils": "1.5.1", "domutils": "1.5.1",
"nth-check": "2.0.1" "nth-check": "~1.0.1"
}, },
"dependencies": { "dependencies": {
"nth-check": { "nth-check": {

View File

@ -91,6 +91,7 @@ import qualified Network.Socket as Socket (close)
import Control.Concurrent.STM.Delay import Control.Concurrent.STM.Delay
import Control.Monad.Trans.Cont (runContT, callCC) import Control.Monad.Trans.Cont (runContT, callCC)
import Data.Ratio ((%))
import qualified Data.Set as Set import qualified Data.Set as Set
import qualified Data.Map as Map import qualified Data.Map as Map

View File

@ -9,6 +9,7 @@ import Import
import Handler.Utils import Handler.Utils
import Handler.Utils.Allocation import Handler.Utils.Allocation
import Data.Ratio ((%))
import Data.Map ((!?)) import Data.Map ((!?))
import qualified Data.Map as Map import qualified Data.Map as Map
import qualified Data.Set as Set import qualified Data.Set as Set
@ -121,8 +122,8 @@ allocationAcceptForm aId = runMaybeT $ do
optimumAllocated = round . (* optimumProportion) . fromIntegral optimumAllocated = round . (* optimumProportion) . fromIntegral
where optimumProportion :: Rational where optimumProportion :: Rational
optimumProportion optimumProportion
| allocationCapacity == 0 = 0 | allocationCapacity > 0 = fromIntegral allocationPlacesRequested % fromIntegral allocationCapacity
| otherwise = fromIntegral allocationPlacesRequested % fromIntegral allocationCapacity | otherwise = 0
allocHeat capN allocHeat capN
= invDualHeat (optimumAllocated capN) capN = invDualHeat (optimumAllocated capN) capN
degenerateHeat capN degenerateHeat capN

View File

@ -11,6 +11,7 @@ import Handler.Utils
import qualified Database.Esqueleto.Legacy as E import qualified Database.Esqueleto.Legacy as E
import qualified Database.Esqueleto.Utils as E import qualified Database.Esqueleto.Utils as E
import Data.Ratio ((%))
import qualified Data.Map as Map import qualified Data.Map as Map
import qualified Data.Set as Set import qualified Data.Set as Set
import Data.Map ((!), (!?)) import Data.Map ((!), (!?))
@ -119,9 +120,8 @@ postParticipantsIntersectR = do
symmIntersection intersections lCid uCid = fromMaybe 0 $ intersections !? (lCid, uCid) <|> intersections !? (uCid, lCid) symmIntersection intersections lCid uCid = fromMaybe 0 $ intersections !? (lCid, uCid) <|> intersections !? (uCid, lCid)
intersectionHotness :: _ -> _ -> _ -> Centi intersectionHotness :: _ -> _ -> _ -> Centi
intersectionHotness intersections lCid uCid intersectionHotness intersections lCid uCid
| sumSize == 0 = 0 | sumSize > 0 && intersectSize > 0 = realToFrac . (0.5 +) . (0.5 *) . max 0 . min 1 $ 2 * intersectSize % sumSize
| intersectSize == 0 = 0 | otherwise = 0
| otherwise = realToFrac . (0.5 +) . (0.5 *) . max 0 . min 1 $ 2 * intersectSize % sumSize
where where
sumSize = (min `on` (intersections !)) (lCid, lCid) (uCid, uCid) sumSize = (min `on` (intersections !)) (lCid, lCid) (uCid, uCid)
intersectSize = symmIntersection intersections lCid uCid intersectSize = symmIntersection intersections lCid uCid

View File

@ -20,6 +20,7 @@ module Handler.Utils.Exam
import Import import Import
import Data.Ratio ((%))
import Database.Persist.Sql (SqlBackendCanRead) import Database.Persist.Sql (SqlBackendCanRead)
import qualified Database.Esqueleto.Legacy as E import qualified Database.Esqueleto.Legacy as E
import qualified Database.Esqueleto.Utils as E import qualified Database.Esqueleto.Utils as E

View File

@ -66,6 +66,7 @@ import Utils.Lens
import Import hiding (pi) import Import hiding (pi)
import Data.Ratio ((%))
import qualified Data.Foldable as Foldable import qualified Data.Foldable as Foldable
import qualified Yesod.Form.Functions as Yesod import qualified Yesod.Form.Functions as Yesod

View File

@ -101,7 +101,7 @@ import Data.Dynamic.Lens as Import
import System.FilePath as Import hiding (joinPath, normalise, isValid, makeValid) import System.FilePath as Import hiding (joinPath, normalise, isValid, makeValid)
import Numeric.Natural as Import (Natural) import Numeric.Natural as Import (Natural)
import Data.Ratio as Import ((%)) -- import Data.Ratio as Import ((%))
import Network.IP.Addr as Import (IP) import Network.IP.Addr as Import (IP)

View File

@ -12,6 +12,7 @@ import Jobs.Types
import qualified Data.Set as Set import qualified Data.Set as Set
import qualified Data.Map as Map import qualified Data.Map as Map
import Data.Ratio ((%))
import Data.Time.Zones import Data.Time.Zones
import Data.Time.Clock.POSIX import Data.Time.Clock.POSIX

View File

@ -9,6 +9,8 @@ module Jobs.Handler.Files
import Import hiding (matching, maximumBy, init) import Import hiding (matching, maximumBy, init)
import Data.Ratio ((%))
import Database.Persist.Sql (deleteWhereCount) import Database.Persist.Sql (deleteWhereCount)
import qualified Database.Esqueleto.Legacy as E import qualified Database.Esqueleto.Legacy as E

View File

@ -100,7 +100,7 @@ dispatchJobLmsEnqueueUser qid uid = JobHandlerAtomic act
startLmsUser = E.insertUniqueEntity =<< (mkLmsUser <$> randomLMSIdent <*> randomLMSpw) startLmsUser = E.insertUniqueEntity =<< (mkLmsUser <$> randomLMSIdent <*> randomLMSpw)
inserted <- untilJustMaxM maxLmsUserIdentRetries startLmsUser inserted <- untilJustMaxM maxLmsUserIdentRetries startLmsUser
case inserted of case inserted of
Nothing -> $logErrorS "LMS" "Generating and inserting fresh LmsIdent failed!" Nothing -> $logErrorS "LMS" $ "Generating and inserting fresh LmsIdent failed for uid " <> tshow uid <> " and qid " <> tshow qid <> "!"
(Just _) -> queueDBJob JobSendNotification { jRecipient = uid, jNotification = (Just _) -> queueDBJob JobSendNotification { jRecipient = uid, jNotification =
NotificationQualificationRenewal { nQualification = qid } NotificationQualificationRenewal { nQualification = qid }
} }

View File

@ -6,6 +6,7 @@ module Jobs.HealthReport
import Import import Import
import Data.Ratio ((%))
import Data.List (genericLength) import Data.List (genericLength)
import qualified Data.Map.Strict as Map import qualified Data.Map.Strict as Map
@ -119,9 +120,9 @@ dispatchHealthCheckLDAPAdmins = fmap HealthLDAPAdmins . yesodTimeout (^. _appHea
let hCampusExc :: CampusUserException -> Handler (Sum Integer) let hCampusExc :: CampusUserException -> Handler (Sum Integer)
hCampusExc err = mempty <$ $logErrorS "healthCheckLDAPAdmins" (adminIdent <> ": " <> tshow err) hCampusExc err = mempty <$ $logErrorS "healthCheckLDAPAdmins" (adminIdent <> ": " <> tshow err)
in handle hCampusExc $ Sum 1 <$ campusUserReTest ldapPool ((>= reTestAfter) . realToFrac) FailoverUnlimited (Creds apLdap adminIdent []) in handle hCampusExc $ Sum 1 <$ campusUserReTest ldapPool ((>= reTestAfter) . realToFrac) FailoverUnlimited (Creds apLdap adminIdent [])
if numAdmins == 0 if
then return 0 | numAdmins >= 1 -> return $ numResolved % numAdmins
else return $ numResolved % numAdmins | otherwise -> return 0
_other -> return Nothing _other -> return Nothing
@ -173,12 +174,13 @@ dispatchHealthCheckActiveJobExecutors = HealthActiveJobExecutors <$> do
tid <- myThreadId tid <- myThreadId
let workers' = Map.fromSet jobWorkerName (Map.keysSet jobWorkers) let workers' = Map.fromSet jobWorkerName (Map.keysSet jobWorkers)
workers = Map.filterWithKey (\a _ -> asyncThreadId a /= tid) workers' workers = Map.filterWithKey (\a _ -> asyncThreadId a /= tid) workers'
size_workers = fromIntegral $ Map.size workers
$logDebugS "HealthCheckActiveJobExecutors" . tshow . map showWorkerId $ Map.elems workers' $logDebugS "HealthCheckActiveJobExecutors" . tshow . map showWorkerId $ Map.elems workers'
responders <- fmap (getSum . fold) . liftIO . forConcurrently (Map.toList workers) $ \(_, wName) responders <- fmap (getSum . fold) . liftIO . forConcurrently (Map.toList workers) $ \(_, wName)
-> diffTimeout timeoutLength (Sum 0) (runReaderT ?? app $ Sum 1 <$ writeJobCtlBlock' (writeJobCtl' wName) JobCtlTest) -> diffTimeout timeoutLength (Sum 0) (runReaderT ?? app $ Sum 1 <$ writeJobCtlBlock' (writeJobCtl' wName) JobCtlTest)
if if
| Map.null workers -> return Nothing | size_workers >= 1 -> return . Just $ responders % size_workers
| otherwise -> return . Just $ responders % fromIntegral (Map.size workers) | otherwise -> return Nothing
dispatchHealthCheckDoesFlush :: Handler HealthReport dispatchHealthCheckDoesFlush :: Handler HealthReport

View File

@ -11,6 +11,7 @@ module Model.Types.DateTime
import Import.NoModel import Import.NoModel
import Data.Ratio ((%))
import qualified Data.Text as Text import qualified Data.Text as Text
-- import Data.Either.Combinators (maybeToRight, mapLeft) -- import Data.Either.Combinators (maybeToRight, mapLeft)
import Text.Read (readMaybe) import Text.Read (readMaybe)