def _flatten_structures(self): c_specs, self.edges, self.weights, self.einstrs, self.einpaths = [], [], [], [], [] ks = {} # handle n=1 case specially c_specs.append([1,0,0,0,0,1,1,0]) self.edges.append(()) self.weights.append(()) self.einstrs.append(self.einstrs_d[(1,0)][0]) self.einpaths.append(self.einpaths_d[(1,0)][0]) for ne in sorted(self.edges_d.keys()): n, e = ne z = zip(self.edges_d[ne], self.weights_d[ne], self.chis_d[ne], self.einstrs_d[ne], self.einpaths_d[ne]) for edgs, ws, c, es, ep in z: for w in ws: d = sum(w) k = ks.setdefault((n,d), 0) ks[(n,d)] += 1 vs = valencies(EFP(edgs, weights=w).graph).values() v = max(vs) h = Counter(vs)[1] c_specs.append([n, e, d, v, k, c, 1, h]) self.edges.append(edgs) self.weights.append(w) self.einstrs.append(es) self.einpaths.append(ep) self.c_specs = np.asarray(c_specs)
def _generate_efms(self): self.efm_einstrs, self.efm_specs, self.efm_einpaths = [], [], [] if self.gen_efms: for edgs,ws in zip(self.edges, self.weights): einstr, efm_spec = efp2efms(EFP(edgs, weights=ws).graph) self.efm_einstrs.append(einstr) self.efm_specs.append(efm_spec) self.efm_einpaths.append(np.einsum_path(einstr, *[np.empty([4]*sum(s)) for s in efm_spec], optimize=self.ve.np_optimize)[0])