def TQtwo2oneRows(self): nr,nc = self._graph['dim'] C = Graph(); C._graph['mode'] = 1; C._graph['nNodes'] = nr for v in range(nr): C.addNode(v+1,1); C._nodes[v+1][3] = dict(self._nodes[v+1][3]) for t in self.nodesMode(2): for p in self.inStar(t): u = self.twin(t,p); Apw = self._links[p][4]['tq'] for q in self.inStar(t): v = self.twin(t,q); r = (u,v) if not r in C._links: C._links[r] = \ [ u, v, True, None, {'tq': []} ] C._links[r][4]['tq'] = TQ.TQ.sum(C._links[r][4]['tq'], TQ.TQ.prod(Apw,self._links[q][4]['tq'])) return C def TQtwo2oneCols(self,lType='edge',key='tq'): nr,nc = self._graph['dim'] C = Graph(); C._graph['mode'] = 1; C._graph['nNodes'] = nc C._graph['temporal'] = True; C._graph['simple'] = True C._graph['network'] = self._graph['network']+'COLS' C._graph['title'] = 'COLS of '+self._graph['title'] C._graph['time'] = self._graph['time'] if 'legends' in self._graph: C._graph['legends']['Tlabs'] = \ self._graph['legends']['Tlabs'] C._graph['meta'] = self._graph['meta'] C._graph['required'] = self._graph['required'] C._graph['multirel'] = self._graph['multirel'] for v in range(nc): C.addNode(v+1,1); C._nodes[v+1][3] = dict(self._nodes[nr+v+1][3]) C._nodes[v+1][3]['mode'] = 1 for t in self.nodesMode(1): for p in self.outStar(t): u = self.twin(t,p)-nr; Apw = self._links[p][4][key] for q in self.outStar(t): v = self.twin(t,q)-nr if u<=v: r = (u,v) if lType=='edge': if not r in C._links: C.addEdge(u,v,lid=r,w={key: []}) s = TQ.TQ.prod(Apw,self._links[q][4][key]) if u!=v: s = TQ.TQ.sum(s,s) C._links[r][4][key] = TQ.TQ.sum(C._links[r][4][key],s) else: if not r in C._links: C.addArc(u,v,lid=r,w={key: []}) s = TQ.TQ.prod(Apw,self._links[q][4][key]) C._links[r][4][key] = TQ.TQ.sum(C._links[r][4][key],s) if u!=v: rr = (v,u) if not rr in C._links: C.addArc(v,u,lid=rr,w={key: []}) C._links[rr][4][key] = C._links[r][4][key] return C def TQmultiply(A,B,oneMode=False): nar,nac = A._graph['dim']; nbr,nbc = B._graph['dim'] if nac != nbr: raise Graph.graphError( "Noncompatible networks {0} != {1}".format(nac,nbr)) if oneMode and (nar != nbc): raise Graph.graphError( "Product is not a one-mode network {0} != {1}".format(nar,nbc)) C = Graph(); C._graph['mode'] = 2; C._graph['dim'] = [nar,nbc] for v in range(nar): C.addNode(v+1,1); C._nodes[v+1][3] = dict(A._nodes[v+1][3]) if not oneMode: for v in range(nar,nar+nbc): C.addNode(v+1,2) C._nodes[v+1][3] = dict(B._nodes[v+1+nbr-nar][3]) for t in A.nodesMode(2): for p in A.inStar(t): u = A.twin(t,p); Apw = A._links[p][4]['tq'] for q in B.outStar(t-nar): v = B.twin(t-nar,q)-nbr if not oneMode: v = v+nar r = (u,v) if not r in C._links: C._links[r] = \ [ u, v, True, None, {'tq': []} ] C._links[r][4]['tq'] = TQ.TQ.sum(C._links[r][4]['tq'], TQ.TQ.prod(Apw,B._links[q][4]['tq'])) return C