docs: def get_G(self, k, add_noise=True):
          """ get G matrix from angles. """
          G = np.ones((self.N - 1, self.N - 1))
          if (add_noise):
              noise = pi * 0.1 * np.random.rand(
                  (self.N - 1) * (self.N - 1)).reshape((self.N - 1, self.N - 1))
          other_indices = np.delete(range(self.N), k)
          for idx, i in enumerate(other_indices):
              for jdx, j in enumerate(other_indices):
                  if (add_noise and
                          i != j):  # do not add noise on diagonal elements.
                      thetak_ij = self.get_inner_angle(k,
                                                       (i, j)) + noise[idx, jdx]
                  else:
                      thetak_ij = self.get_inner_angle(k, (i, j))
                  G[idx, jdx] = cos(thetak_ij)
                  G[jdx, idx] = cos(thetak_ij)
          return G