import sys from collections import defaultdict from functools import reduce def load_txt(fname): list2 = [] with open(fname,'r') as f: list2 = [tuple(map(int,line.split(','))) for line in f] return list2 def flatmap(lista, f): return flatten(colection_map(lista,f)) def flatten(list_of_lists): flattened_list = [item for sublist in list_of_lists for item in sublist] return flattened_list def colection_map(lista, f): return list(map(f, lista)) def reduceByKey(kolekcja, f): result_dict = {} result = [] for key, value in kolekcja: if key in result_dict: result_dict[key]=f(result_dict[key], value) else: result_dict[key] = value for key, value in result_dict.items(): result.append((key,value)) return result def crossJoinByKey(m1,m2): list1 = [] for k1 in m1: for k2 in m2: if k1[0] == k2[0]: list1.append((k1[0],(k1[1],k2[1]))) return list1 list1 = load_txt(sys.argv[1]) #print(list1) fA = lambda p: ((p[0],p[1]),(p[1],p[0])) fP1 = lambda p: (p[0],0) fR = lambda a,b: a+b fP2 = lambda p: p[0] fPe = lambda p: (p,p,True) fT = lambda t: (t[1][1],(t[0],t[1][0])) fS1 = lambda a,b: (a[0],min(a[1],b[1])) fS2 = lambda t: (t[0],min(t[1][0],t[1][1])) fS3 = lambda s: (s[0],(s[0],s[1])) fZ1 = lambda p: p[2] fZ2 = lambda p,q: p or q fW1 = lambda w: (w[1][1],(w[0],(w[1][0],w[1][1]))) fW2 = lambda w: (w[1]) fW3 = lambda w: (w[0][0],w[1]) fPe2 =lambda s: (s[0],min(s[1][0],s[1][1]),s[1][1] < s[1][0]) listA = flatmap(list1, fA) #print(listA) listP = colection_map(reduceByKey(colection_map(listA, fP1),fR),fP2) #print(listP) listPe = colection_map(listP,fPe) #print(listPe) listT = crossJoinByKey(listPe,listA) #print(listT) listS = colection_map(colection_map(reduceByKey(listT,fS1),fS2),fS3) #print("list S: ",listS) z = reduce(fZ2,colection_map(listPe,fZ1)) #print(z) while z: #print("--------------------------------------------") listW1 = colection_map(listS,fW1) #print("list W1: ", listW1) listW2 = colection_map(crossJoinByKey(listW1,listS),fW2) #print("list W2: ",listW2) listS = colection_map(listW2,fW3) #print("list S: ",listS) listPe = colection_map(listS, fPe2) z = reduce(fZ2,colection_map(listPe,fZ1)) if z == False: listZ = crossJoinByKey(listS,listA) print(listZ) #print("list S: ",listS)