From 27f965672df34f9c0f4158340f556e9f18cea7fd Mon Sep 17 00:00:00 2001 From: Iustin Pop <iustin@google.com> Date: Sat, 14 Feb 2009 09:00:56 +0100 Subject: [PATCH] Implement oneline-output for hbal --- src/hbal.hs | 48 ++++++++++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/src/hbal.hs b/src/hbal.hs index 4c721eec2..58a3008af 100644 --- a/src/hbal.hs +++ b/src/hbal.hs @@ -23,6 +23,7 @@ import Utils data Options = Options { optShowNodes :: Bool , optShowCmds :: Bool + , optOneline :: Bool , optNodef :: FilePath , optInstf :: FilePath , optMaxRounds :: Int @@ -34,6 +35,7 @@ defaultOptions :: Options defaultOptions = Options { optShowNodes = False , optShowCmds = False + , optOneline = False , optNodef = "nodes" , optInstf = "instances" , optMaxRounds = -1 @@ -44,11 +46,12 @@ defaultOptions = Options we find a valid solution or we exceed the maximum depth. -} -iterateDepth :: Cluster.Table - -> Int -- ^ Current round - -> Int -- ^ Max rounds - -> IO Cluster.Table -iterateDepth ini_tbl cur_round max_rounds = +iterateDepth :: Cluster.Table -- The starting table + -> Int -- ^ Current round + -> Int -- ^ Max rounds + -> Bool -- ^ Wheter to be silent + -> IO Cluster.Table -- The resulting table +iterateDepth ini_tbl cur_round max_rounds oneline = let Cluster.Table _ ini_il ini_cv ini_plc = ini_tbl all_inst = Container.elems ini_il fin_tbl = Cluster.checkMove ini_tbl all_inst @@ -58,7 +61,7 @@ iterateDepth ini_tbl cur_round max_rounds = allowed_next = (max_rounds < 0 || cur_round < max_rounds) in do - printf " - round %d: " cur_round + unless oneline $ printf " - round %d: " cur_round hFlush stdout let msg = if fin_cv < ini_cv then @@ -71,11 +74,12 @@ iterateDepth ini_tbl cur_round max_rounds = (fin_plc_len - ini_plc_len) else "no improvement, stopping\n" - putStr msg - hFlush stdout + unless oneline $ do + putStr msg + hFlush stdout (if fin_cv < ini_cv then -- this round made success, try deeper if allowed_next - then iterateDepth fin_tbl (cur_round + 1) max_rounds + then iterateDepth fin_tbl (cur_round + 1) max_rounds oneline -- don't go deeper, but return the better solution else return fin_tbl else @@ -90,6 +94,9 @@ options = , Option ['C'] ["print-commands"] (NoArg (\ opts -> opts { optShowCmds = True })) "print the ganeti command list for reaching the solution" + , Option ['o'] ["oneline"] + (NoArg (\ opts -> opts { optOneline = True })) + "print the ganeti command list for reaching the solution" , Option ['n'] ["nodes"] (ReqArg (\ f opts -> opts { optNodef = f }) "FILE") "the node list FILE" @@ -130,6 +137,7 @@ main = do cmd_args <- System.getArgs (opts, _) <- parseOpts cmd_args + let oneline = optOneline opts let (node_data, inst_data) = case optMaster opts of "" -> (readFile $ optNodef opts, @@ -140,11 +148,12 @@ main = do (nl, il, ktn, kti) <- liftM2 Cluster.loadData node_data inst_data - printf "Loaded %d nodes, %d instances\n" + unless oneline $ printf "Loaded %d nodes, %d instances\n" (Container.size nl) (Container.size il) let (bad_nodes, bad_instances) = Cluster.computeBadItems nl il - printf "Initial check done: %d bad nodes, %d bad instances.\n" + unless oneline $ printf + "Initial check done: %d bad nodes, %d bad instances.\n" (length bad_nodes) (length bad_instances) when (length bad_nodes > 0) $ do @@ -158,21 +167,21 @@ main = do let ini_cv = Cluster.compCV nl ini_tbl = Cluster.Table nl il ini_cv [] - printf "Initial coefficients: overall %.8f, %s\n" - ini_cv (Cluster.printStats nl) + unless oneline $ printf "Initial coefficients: overall %.8f, %s\n" + ini_cv (Cluster.printStats nl) - putStrLn "Trying to minimize the CV..." - fin_tbl <- iterateDepth ini_tbl 1 (optMaxRounds opts) + unless oneline $ putStrLn "Trying to minimize the CV..." + fin_tbl <- iterateDepth ini_tbl 1 (optMaxRounds opts) oneline let (Cluster.Table fin_nl _ fin_cv fin_plc) = fin_tbl ord_plc = reverse fin_plc - printf "Final coefficients: overall %.8f, %s\n" + unless oneline $ printf "Final coefficients: overall %.8f, %s\n" fin_cv (Cluster.printStats fin_nl) - printf "Solution length=%d\n" (length ord_plc) + unless oneline $ printf "Solution length=%d\n" (length ord_plc) let (sol_strs, cmd_strs) = Cluster.printSolution il ktn kti ord_plc - putStr $ unlines $ sol_strs + unless oneline $ putStr $ unlines $ sol_strs when (optShowCmds opts) $ do putStrLn "" @@ -187,3 +196,6 @@ main = do putStrLn $ Cluster.printNodes ktn fin_nl printf "Original: mem=%d disk=%d\n" orig_mem orig_disk printf "Final: mem=%d disk=%d\n" final_mem final_disk + when oneline $ do + printf "%.8f %d %.8f %8.3f\n" + ini_cv (length ord_plc) fin_cv (ini_cv / fin_cv) -- GitLab