====== TQmat ====== Notes: * the network matrices are considered two-mode # operations with temporal quantities (tau = 0) # March 10, 2014 import pickle a = [(1,5,2), (6,8,1), (11,12,3), (14,16,2), (17,18,5), (19,20,1)] b = [(2,3,4), (4,7,3), (9,10,2), (13,15,5), (16,21,1)] inf = float("inf"); one = 1; zero = 0 N = [] E = [(1,inf,one)] # the third component is the unit in semiring def TQget(S): try: return(next(S)) except StopIteration: return((inf,inf,0)) def plus(a,b): return(a+b) def times(a,b): return(a*b) def TQstandard(a): if len(a) == 0: return(a) fc = inf; c = [] for (sa,fa,va) in a: if fc == sa: if vc == va: fc = fa else: if sc != fc: c.append((sc,fc,vc)) vc = va; sc = sa; fc = fa else: if (fc != inf) and (sc != fc): c.append((sc,fc,vc)) sc = sa; fc = fa; vc = va if sc != fc: c.append((sc,fc,vc)) return(c) def TQbinary(a): c = [] for (sa,fa,va) in a: if va > 0: c.append((sa,fa,1)) return(TQstandard(c)) def TQinvert(a): c = [] for (sa,fa,va) in a: c.append((sa,fa,1/va)) return(c) def TQcentral(v,C): cc = c = []; n = len(C) for t in range(n): if t!=v: c = TQsum(c,TQinvert(C[v][t])) for (s,f,v) in c: cc.append((s,f,v/(n-1))) return(cc) def TQsum(a,b): if len(a) == 0: return(b) if len(b) == 0: return(a) c = []; A = a.__iter__(); B = b.__iter__() (sa,fa,va) = TQget(A); (sb,fb,vb) = TQget(B) while (sa0: if names==None: print('(',i+1,',',j+1,') =',M[i][j]) else: print('(',names[i],',',names[j],') =\n ',M[i][j]) def MatClosure(R): n = len(R); C = R for k in range(n): for u in range(n): for v in range(n): C[u][v] = TQsum(C[u][v], TQprod(C[u][k],C[k][v])) C[k][k] = TQsum(E,C[k][k]) return(C) def MatBin(A): nr = len(A); nc = len(A[0]) B = [[ [] for i in range(nc)] for j in range(nr)] for u in range(nr): for v in range(nc): B[u][v] = TQbinary(A[u][v]) return(B) def sumSyM(C,Rows,Cols,diag=False): # extend for Rows and Cols are temporal partitions n = len(C); s = [] for u in Rows: for v in Cols: if u>v: s = TQsum(s,C[v][u]) elif u 1: e.append((s,f,1/v/(v-1))) else: e.append((s,f,0)) inv.append(e) # print("Invert") # for (i,e) in enumerate(inv): print(i+1,e) tri = MatProdDiag(MatProd(S,Ab),S) cc = [] for (i,t) in zip(inv,tri): cc.append(TQprod(i,t)) return(cc) else: return(None)