// 22/03/2014 11:52 - reading cpp version // til 12:02, 12:07 - // 26/03/2014 13:56 - 14:16 (20mins) -- rmat N Nz a b c d fraction seed -o out1.file out1.mr -- rmat 20 8 0.45 0.25 0.25 0.05 0.0 284958 -o NULL mre -- constants let (N, M) = (powi (2,11), powi (2,13)) in let (nlevels, frac) = (subi (..., 1), ...) in let (nonzero, order) = ... in let delta0 = shr (order, 1) in let (a0,b0,c0,d0) = ... in -- one iteration of edge generation let genNext = \(a,b,c,d,dt,i,j) -> let r = randf () in let (i',j') = if ltf (r,a) then (i,i) else (if ltf (r, addf (a,b)) then (i, addf (j,dt)) else (if ltf (rn, addf (a,addf(b,b))) then (addf (i,dt), j) else (addf (i,dt), addf (j,dt)))) let dt' = divf (dt,2.0) in if (gtf (frac, 0.0)) then ( let f = \v -> (mulf (v, mulf (frac, subf (randf (), 0.5)))) in let (a1,b1,c1,d1) = (f a, f b, f c, f d) in let tot = addf (addf (a1,b1), addf (c1,d1)) in (divf (a1,tot), divf (b1,tot), divf (c1,tot), divf (d1,tot))) else (a,b,c,d,dt',i',j') in -- generate an edge let genE = \(a,b,c,d,dt) -> ( let (_,_,_,_,_,i,j) = while ( \(s, ilev) -> ((genNext s, addi (ilev,1)), lti (ilev, nlevels)), ((a,b,c,d,st,0,0), 0) in (i,j))) in -- generate edges, removing duplicates, until we have enough let genEl = \(Mrem, Eacc) -> let E' = mapList (\_ -> genE (a0,b0,c0,d0,delta0), rangeList (0,Mrem,1)) in let E'' = groupReduceList (id, \_->(), fst, (), E') in let Eacc' = union (Eacc, E'') in (subi (N, count Eacc'), Eacc') -- loop while Mrem > 0 (while edges still needed) while (\(Mrem, Eacc) -> (genEl (Mrem, Eacc), gti (Mrem, 0)), (N, emptyMap))