def none_zero_integral(self, index):
        i, j, k, l = index
        basis_i = self.basis_set[i]
        basis_j = self.basis_set[j]
        basis_k = self.basis_set[k]
        basis_l = self.basis_set[l]

        exponents_kl = vector_add(basis_k.integral_exponents, basis_l.integral_exponents)
        exponents_ij = vector_add(basis_i.integral_exponents, basis_j.integral_exponents)
        symmetry_exponents_ijkl = self.symmetry_exponents(vector_add(exponents_ij, exponents_kl))

        if basis_i.coordinates == basis_j.coordinates == basis_k.coordinates == basis_l.coordinates:
            if symmetry_exponents_ijkl.count(0) != 3:
                return False
            else:
                return True

        symmetry_operations = self.symmetry_matrix.shape[1]
        for m in range(1, symmetry_operations):
            a = self.symmetry_matrix.item(i + 1, m)
            b = self.symmetry_matrix.item(j + 1, m)
            c = self.symmetry_matrix.item(k + 1, m)
            d = self.symmetry_matrix.item(l + 1, m)

            w = abs(a) - 1
            x = abs(b) - 1
            y = abs(c) - 1
            z = abs(d) - 1

            if (a, b, c, d).count(0) == 0 and ((i == w and j == x) or (i == x and j == w)) and ((k == y and l == z)
            or (k == z and l == y)) and symmetry_exponents_ijkl != self.int_operate_dict[(m, symmetry_exponents_ijkl)]:
                return False

        return True
 def center_two_vertices(self, nuclei_array):
     center_of_edge = []
     for nuclei_i, nuclei_j in itertools.combinations(nuclei_array, 2):
         axis_i = nuclei_i.coordinates
         axis_j = nuclei_j.coordinates
         axis_edge = vector_add(axis_i, axis_j)
         if rho(axis_edge) > self.error:
             axis_edge = normalize(axis_edge)
             center_of_edge.append(axis_edge)
     return center_of_edge