code: def random_upper_triangular_matrix(self, n_points=1):
      if n_points == 1:
          size = 3
          expected_shape = (3, 3)
          indices = [(0, 1), (0, 2), (1, 2)]
      else:
          size = n_points * 3
          expected_shape = (n_points, 3, 3)
          indices = []
          for k in range(n_points):
              indices.extend([(k, 0, 1), (k, 0, 2), (k, 1, 2)])
  
      vec = gs.random.uniform(size=size)
      return gs.array_from_sparse(
          indices, vec, expected_shape
      ) + gs.eye(3)
  
imports: import geomstats.backend
  from geomstats.geometry.base import ComplexMatrixVectorSpace
  from geomstats.geometry.euclidean import Euclidean
  from geomstats.geometry.general_linear import SquareMatrices
  from geomstats.vectorization import get_n_points
label_desc: Use image node_id 1 for calling the HeisenbergVectorsRandomDataGenerator obj's underlying member method code with example usage: obj.random_upper_triangular_matrix(n_points) and returns: unknown