Home | History | Annotate | Line # | Download | only in pdsim
      1  1.1  yamt {-
      2  1.1  yamt /*	$NetBSD: lfu.hs,v 1.1 2006/10/09 12:32:46 yamt Exp $	*/
      3  1.1  yamt 
      4  1.1  yamt /*-
      5  1.1  yamt  * Copyright (c)2005 YAMAMOTO Takashi,
      6  1.1  yamt  * All rights reserved.
      7  1.1  yamt  *
      8  1.1  yamt  * Redistribution and use in source and binary forms, with or without
      9  1.1  yamt  * modification, are permitted provided that the following conditions
     10  1.1  yamt  * are met:
     11  1.1  yamt  * 1. Redistributions of source code must retain the above copyright
     12  1.1  yamt  *    notice, this list of conditions and the following disclaimer.
     13  1.1  yamt  * 2. Redistributions in binary form must reproduce the above copyright
     14  1.1  yamt  *    notice, this list of conditions and the following disclaimer in the
     15  1.1  yamt  *    documentation and/or other materials provided with the distribution.
     16  1.1  yamt  *
     17  1.1  yamt  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
     18  1.1  yamt  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     19  1.1  yamt  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     20  1.1  yamt  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     21  1.1  yamt  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     22  1.1  yamt  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     23  1.1  yamt  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     24  1.1  yamt  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     25  1.1  yamt  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     26  1.1  yamt  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     27  1.1  yamt  * SUCH DAMAGE.
     28  1.1  yamt  */
     29  1.1  yamt -}
     30  1.1  yamt 
     31  1.1  yamt import System.Environment
     32  1.1  yamt import System.IO
     33  1.1  yamt import List
     34  1.1  yamt import Maybe
     35  1.1  yamt import Monad
     36  1.1  yamt 
     37  1.1  yamt pgmatch idx pg = idx == fst pg
     38  1.1  yamt 
     39  1.1  yamt pglookup :: Eq a => a -> [(a,b)] -> Maybe (a,b)
     40  1.1  yamt pglookup x = find (pgmatch x)
     41  1.1  yamt 
     42  1.1  yamt pgdequeue :: Eq a => a -> [a] -> [a]
     43  1.1  yamt pgdequeue = delete
     44  1.1  yamt 
     45  1.1  yamt victim :: Ord b => [(a,b)] -> (a,b)
     46  1.1  yamt victim = minimumBy p where
     47  1.1  yamt 	p x y = compare (snd x) (snd y)
     48  1.1  yamt 
     49  1.1  yamt do_lfu1 npg n q qlen [] = (reverse n, q)
     50  1.1  yamt do_lfu1 npg n q qlen rs@(r:rs2) =
     51  1.1  yamt 	let
     52  1.1  yamt 		p = pglookup r q
     53  1.1  yamt 	in
     54  1.1  yamt 	if isJust p then
     55  1.1  yamt 		let
     56  1.1  yamt 			opg = fromJust p
     57  1.1  yamt 			nq = pgdequeue opg q
     58  1.1  yamt 			pg = (fst opg, snd opg + 1)
     59  1.1  yamt 		in
     60  1.1  yamt 		do_lfu1 npg n (pg:nq) qlen rs2
     61  1.1  yamt 	else if qlen < npg then
     62  1.1  yamt 		do_lfu1 npg (r:n) ((r,1):q) (qlen+1) rs2
     63  1.1  yamt 	else
     64  1.1  yamt 		let
     65  1.1  yamt 			opg = victim q
     66  1.1  yamt 			nq = pgdequeue opg q
     67  1.1  yamt 		in
     68  1.1  yamt 		do_lfu1 npg (r:n) ((r,1):nq) qlen rs2
     69  1.1  yamt 
     70  1.1  yamt do_lfu npg rs = fst $ do_lfu1 npg [] [] 0 rs
     71  1.1  yamt 
     72  1.1  yamt main = do
     73  1.1  yamt 	xs <- getContents
     74  1.1  yamt 	args <- getArgs
     75  1.1  yamt 	let
     76  1.1  yamt 		ls = lines xs
     77  1.1  yamt 		npgs::Int
     78  1.1  yamt 		npgs = read $ args !! 0
     79  1.1  yamt 		pgs::[Int]
     80  1.1  yamt 		pgs = map read ls
     81  1.1  yamt 	mapM_ print $ do_lfu npgs pgs
     82