process main{
	rLenA = args[0]
	cLenA = args[1]
	A = [ [ random(10) for y in range(cLenA) ]  for x in range(rLenA) ] 
	
	rLenB = args[2]
	cLenB = args[3]
	B = [ [ random(10) for y in range(cLenB) ]  for x in range(rLenB) ] 

	print("Matrix A")
	print(A)
	print("Matrix B")
	print(B)

	B=[ B[y][x] for x in range(len(B[0])) for y in range(len(B)) ]
	B=[ [ B[x] for x in range((0+(y*rLenB)):(rLenB+(y*rLenB))-1) ] for y in range(0:cLenB-1) ]
	
	[ out("data",A[x],B[y],x,y) for x in range(0:rLenA-1) for y in range(0:cLenB-1)]
	
	cnt=(rLenA*cLenB)	
	out("tuples",cnt)
	
	tot=0	
   	C = [[0*y for y in range(cLenB)] for x in range(rLenA)] 
	[ C[x][y]=tot for i in range(cnt) if in("result",? x,? y,? tot)]
	print("Results")
	print(C)


}

process client{
	
	len=0   
	do{
	   tot=0
	   in("tuples",? len)
	   if(len!=0){
	         A=[] B=[] x=0 y=0
		 out("tuples",len-1)
	  	 in("data",? A,? B,? x,? y)
	  	 [ tot=tot+(A[r]*B[s])  for r in range(len(A)) for s in range(0:len(B)) if s==r]
	  	 out("result",x,y,tot)
	   }
	}while(len!=0)
}
