-- minbucket algorithm -- 18/03/2014 18:02 - 18:26 (24mins) let triEnum = (\E :: Map (Int,Int) () -> -- find degree of all vertices let D1 = groupReduce (fst.fst, \_->1, addi, E) in let D2 = groupReduce (snd.fst, \_->1, addi, E) in let D = map (\(k,v)->(k,addi v), eqJoin (fst,fst,D1,D2)) in -- identify edges by vertex with lower degree let E1 = eqJoin (fst, fst, E, D) in let E2 = eqJoin (snd.fst, fst, E1, D) in let E3 = map (\(((_,v1),v2),((_,d1),d2)) -> (if lti (d1,d2) then (v1,v2) else (v2,v1), ()), E2) in -- for each edge, find all angles let A = allPairs (fst, E3) in -- for each angle, see if it is closed let T1 = eqJoin (\(((a,_),(_,b)),_)->(a,b), fst, A, E3) in let T2 = eqJoin (\(((a,_),(_,b)),_)->(b,a), fst, A, E3) in map (\((((v1,_),_),(v2,v3)),_) -> ((v1,v2,v3),()), union (T1,T2)))