X-Git-Url: https://code.grnet.gr/git/ganeti-local/blobdiff_plain/691dcd2a5db503a89abb50a38f29c3cfef890a2b..99b63608c593b37bead28376777fa95e49825a51:/Ganeti/HTools/Utils.hs diff --git a/Ganeti/HTools/Utils.hs b/Ganeti/HTools/Utils.hs index 0d585b6..7ae2367 100644 --- a/Ganeti/HTools/Utils.hs +++ b/Ganeti/HTools/Utils.hs @@ -2,7 +2,7 @@ {- -Copyright (C) 2009 Google Inc. +Copyright (C) 2009, 2010 Google Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -24,6 +24,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA module Ganeti.HTools.Utils ( debug + , debugFn + , debugXy , sepSplit , varianceCoeff , commaJoin @@ -39,6 +41,7 @@ module Ganeti.HTools.Utils , tryRead , formatTable , annotateResult + , defaultGroupID ) where import Control.Monad (liftM) @@ -56,6 +59,14 @@ import Ganeti.HTools.Types debug :: Show a => a -> a debug x = trace (show x) x +-- | Displays a modified form of the second parameter before returning it +debugFn :: Show b => (a -> b) -> a -> a +debugFn fn x = debug (fn x) `seq` x + +-- | Show the first parameter before returning the second one +debugXy :: Show a => a -> b -> b +debugXy a b = debug a `seq` b + -- * Miscelaneous -- | Comma-join a string list. @@ -77,15 +88,21 @@ sepSplit sep s -- Simple and slow statistical functions, please replace with better -- versions --- | The covariance of the list +-- | Our modified standard deviation function (not, it's not the variance) varianceCoeff :: [Double] -> Double varianceCoeff lst = - let ll = fromIntegral (length lst)::Double -- length of list - mv = sum lst / ll -- mean value - av = foldl' (\accu em -> let d = em - mv in accu + d * d) 0.0 lst - bv = sqrt (av / ll) -- stddev - cv = bv / ll -- covariance - in cv + -- first, calculate the list length and sum lst in a single step, + -- for performance reasons + let (ll', sx) = foldl' (\(rl, rs) e -> + let rl' = rl + 1 + rs' = rs + e + in rl' `seq` rs' `seq` (rl', rs')) (0::Int, 0) lst + ll = fromIntegral ll'::Double + mv = sx / ll + av = foldl' (\accu em -> let d = em - mv in accu + d * d) 0.0 lst + bv = sqrt (av / ll) -- stddev + cv = bv / ll -- standard deviation divided by list length + in cv -- * JSON-related functions @@ -193,3 +210,7 @@ formatTable vals numpos = ) flds ) (zip3 vtrans numpos mlens) in transpose expnd + +-- | Default group UUID (just a string, not a real UUID) +defaultGroupID :: GroupID +defaultGroupID = "00000000-0000-0000-0000-000000000000"