Counting triangles

10. april 2014

T = AT, S = A + T

Each triangle appears exactly once in AAA + AAT + TAT + TAA = AAS + TAS = SAS

def VecSum(a,b):
   n = len(a)
   c = [0 for i in range(n)]
   for i in range(n): c[i] = a[i]+b[i]
   return(c)

def MatList(M,names=None):
   n = len(M)
   for i in range(n):
      if names==None: print('[',i+1,') =',M[i])
      else: print('[',names[i],') = ',M[i])

def MatTrans(A):
   nr = len(A); nc = len(A[0])
   T = [[ 0 for i in range(nr)] for j in range(nc)]
   for u in range(nr):
      for v in range(nc):
         T[v][u] = A[u][v]
   return(T)

def MatSym(A):
   nr = len(A); nc = len(A[0])
   if nr!=nc: return(None)
   B = [[ 0 for i in range(nr)] for j in range(nr)]
   for u in range(nr-1):
      for v in range(u+1,nr):
         B[u][v] = A[u][v]+A[v][u]
         B[v][u] = B[u][v]
   return(B)

def MatBin(A):
   nr = len(A); nc = len(A[0])
   B = [[ 0 for i in range(nc)] for j in range(nr)]
   for u in range(nr):
      for v in range(nc):
         B[u][v] = int(A[u][v]>0)
   return(B) 

def MatSetDiag(A,const):
   nr = len(A); nc = len(A[0])    
   if nr!=nc: return(None)
   B = A
   for u in range(nr): B[u][u] = const
   return(B)

def MatSum(A,B):
   nra = len(A); nca = len(A[0]); nrb = len(B); ncb = len(B[0]);
   if nra!=nrb: return(None)
   if nca!=ncb: return(None)
   C = [[ 0 for i in range(nca)] for j in range(nra)]
   for u in range(nra):
      for v in range(nca):
         C[u][v] = A[u][v]+B[u][v]
   return(C)

def MatProd(A,B):
   nra = len(A); nca = len(A[0]); nrb = len(B); ncb = len(B[0]);
   if nca!=nrb: return(None)
   C = [[ 0 for i in range(ncb)] for j in range(nra)]
   for u in range(nra):
      for v in range(ncb):
         s = 0 
         for t in range(nca):
            s = s+A[u][t]*B[t][v]
         C[u][v] = s
   return(C)

def MatProdDiag(A,B):
   nra = len(A); nca = len(A[0]); nrb = len(B); ncb = len(B[0]);
   if nca!=nrb: return(None)
   if nra!=ncb: return(None)
   x = [ 0 for u in range(nra)] 
   for u in range(nra):
      s = 0 
      for v in range(nca):
         s = s+A[u][v]*B[v][u]
      x[u] = s
   return(x)


A = [[ 0 for i in range(7)] for j in range(7)]
A[1][0] = 1; A[1][3] = 1; A[1][2] = 1; A[2][1] = 1
A[2][5] = 1; A[3][0] = 1; A[3][2] = 1; A[3][4] = 1
A[3][6] = 1; A[3][5] = 1; A[4][0] = 1; A[4][1] = 1
A[4][3] = 1; A[4][5] = 1; A[5][4] = 1; A[5][6] = 1
A[6][2] = 1

print("matrix A"); MatList(A)
T = MatTrans(A)
print("transposed A"); MatList(T)
S = MatSym(A); 
print("symmetric A"); MatList(S)
Q = MatProd(T,A); P = MatProd(A,A)
print("matrix TA"); MatList(Q)
print("matrix AA"); MatList(P)
print("matrix A"); MatList(A)
tl = MatProdDiag(P,S)
print("left  =",tl)
tr = MatProdDiag(S,Q)
print("right =",tr)
print("total =",VecSum(tl,tr))

ta = MatProdDiag(P,A); print("AAA =",ta)
tb = MatProdDiag(P,T); print("AAT =",tb)
tc = MatProdDiag(A,Q); print("ATA =",tc)
td = MatProdDiag(T,Q); print("TTA =",td)
print("tri =",VecSum(VecSum(ta,tb),VecSum(tc,td)))

Picture of the test graph

matrix A
[ 1 ) = [0, 0, 0, 0, 0, 0, 0]
[ 2 ) = [1, 0, 1, 1, 0, 0, 0]
[ 3 ) = [0, 1, 0, 0, 0, 1, 0]
[ 4 ) = [1, 0, 1, 0, 1, 1, 1]
[ 5 ) = [1, 1, 0, 1, 0, 1, 0]
[ 6 ) = [0, 0, 0, 0, 1, 0, 1]
[ 7 ) = [0, 0, 1, 0, 0, 0, 0]
transposed A
[ 1 ) = [0, 1, 0, 1, 1, 0, 0]
[ 2 ) = [0, 0, 1, 0, 1, 0, 0]
[ 3 ) = [0, 1, 0, 1, 0, 0, 1]
[ 4 ) = [0, 1, 0, 0, 1, 0, 0]
[ 5 ) = [0, 0, 0, 1, 0, 1, 0]
[ 6 ) = [0, 0, 1, 1, 1, 0, 0]
[ 7 ) = [0, 0, 0, 1, 0, 1, 0]
symmetric A
[ 1 ) = [0, 1, 0, 1, 1, 0, 0]
[ 2 ) = [1, 0, 2, 1, 1, 0, 0]
[ 3 ) = [0, 2, 0, 1, 0, 1, 1]
[ 4 ) = [1, 1, 1, 0, 2, 1, 1]
[ 5 ) = [1, 1, 0, 2, 0, 2, 0]
[ 6 ) = [0, 0, 1, 1, 2, 0, 1]
[ 7 ) = [0, 0, 1, 1, 0, 1, 0]
matrix TA
[ 1 ) = [3, 1, 2, 2, 1, 2, 1]
[ 2 ) = [1, 2, 0, 1, 0, 2, 0]
[ 3 ) = [2, 0, 3, 1, 1, 1, 1]
[ 4 ) = [2, 1, 1, 2, 0, 1, 0]
[ 5 ) = [1, 0, 1, 0, 2, 1, 2]
[ 6 ) = [2, 2, 1, 1, 1, 3, 1]
[ 7 ) = [1, 0, 1, 0, 2, 1, 2]
matrix AA
[ 1 ) = [0, 0, 0, 0, 0, 0, 0]
[ 2 ) = [1, 1, 1, 0, 1, 2, 1]
[ 3 ) = [1, 0, 1, 1, 1, 0, 1]
[ 4 ) = [1, 2, 1, 1, 1, 2, 1]
[ 5 ) = [2, 0, 2, 1, 2, 1, 2]
[ 6 ) = [1, 1, 1, 1, 0, 1, 0]
[ 7 ) = [0, 1, 0, 0, 0, 1, 0]
matrix SA
[ 1 ) = [3, 1, 2, 2, 1, 2, 1]
[ 2 ) = [2, 3, 1, 1, 1, 4, 1]
[ 3 ) = [3, 0, 4, 2, 2, 1, 2]
[ 4 ) = [3, 3, 2, 3, 1, 3, 1]
[ 5 ) = [3, 0, 3, 1, 4, 2, 4]
[ 6 ) = [3, 3, 2, 2, 1, 4, 1]
[ 7 ) = [1, 1, 1, 0, 2, 2, 2]
matrix A
[ 1 ) = [0, 0, 0, 0, 0, 0, 0]
[ 2 ) = [1, 0, 1, 1, 0, 0, 0]
[ 3 ) = [0, 1, 0, 0, 0, 1, 0]
[ 4 ) = [1, 0, 1, 0, 1, 1, 1]
[ 5 ) = [1, 1, 0, 1, 0, 1, 0]
[ 6 ) = [0, 0, 0, 0, 1, 0, 1]
[ 7 ) = [0, 0, 1, 0, 0, 0, 0]
tri = [4, 6, 5, 14, 9, 7, 3] 

AAA = [0, 2, 2, 3, 2, 2, 1]
AAT = [0, 2, 0, 6, 4, 0, 0]
ATA = [0, 2, 1, 4, 2, 2, 1]
TTA = [4, 0, 2, 1, 1, 3, 1]
tri = [4, 6, 5, 14, 9, 7, 3]
tq/time/3cnt.txt · Last modified: 2016/05/26 09:21 by vlado
 
Except where otherwise noted, content on this wiki is licensed under the following license: CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki