class_docstr: Class for an n-fold product manifold :math:`M^n`.
  
  Define a manifold as the product manifold of n copies of a given base
  manifold M.
  
  Parameters
  ----------
  space : NFoldManifold
      Base space.
  scales : array-like
      Scale of each metric in the product.
docstr: Pointwise inner product.
  
  Parameters
  ----------
  tangent_vec_a : array-like, shape=[..., n_copies, *base_shape]
      First tangent vector at base point.
  tangent_vec_b : array-like, shape=[..., n_copies, *base_shape]
      Second tangent vector at base point.
  base_point : array-like, shape=[..., n_copies, *base_shape]
      Point on the manifold.
      Optional, default: None.
  
  Returns
  -------
  pointwise_inner_prod : array-like, shape=[..., n_copies]
      Inner-product of the two tangent vectors.
docstr_tok: ["Pointwise","inner","product",".","Parameters","--","--","--","--","--","tangent_vec_a",":","array-like",",","shape=","[","...",",","n_copies",",","*","base_shape","]","First","tangent","vector","at","base","point",".","tangent_vec_b",":","array-like",",","shape=","[","...",",","n_copies",",","*","base_shape","]","Second","tangent","vector","at","base","point",".","base_point",":","array-like",",","shape=","[","...",",","n_copies",",","*","base_shape","]","Point","on","the","manifold",".","Optional",",","default",":","None",".","Returns","--","--","--","-","pointwise_inner_prod",":","array-like",",","shape=","[","...",",","n_copies","]","Inner-product","of","the","two","tangent","vectors","."]
code: def pointwise_inner_product(
      self, tangent_vec_a, tangent_vec_b, base_point
  ):
      """Pointwise inner product.
  
      Parameters
      ----------
      tangent_vec_a : array-like, shape=[..., n_copies, *base_shape]
          First tangent vector at base point.
      tangent_vec_b : array-like, shape=[..., n_copies, *base_shape]
          Second tangent vector at base point.
      base_point : array-like, shape=[..., n_copies, *base_shape]
          Point on the manifold.
          Optional, default: None.
  
      Returns
      -------
      pointwise_inner_prod : array-like, shape=[..., n_copies]
          Inner-product of the two tangent vectors.
      """
      base_manifold = self._space.base_manifold
  
      tangent_vec_a_, tangent_vec_b_, point_ = gs.broadcast_arrays(
          tangent_vec_a, tangent_vec_b, base_point
      )
      batch_shape = get_batch_shape(
          self._space.point_ndim, tangent_vec_a_
      )
  
      point_ = gs.reshape(point_, (-1, *base_manifold.shape))
      vector_a = gs.reshape(tangent_vec_a_, (-1, *base_manifold.shape))
      vector_b = gs.reshape(tangent_vec_b_, (-1, *base_manifold.shape))
      inner_each = base_manifold.metric.inner_product(
          vector_a, vector_b, point_
      )
  
      reshaped = gs.reshape(
          inner_each, batch_shape + (self._space.n_copies,)
      )
  
      if self.scales is not None:
          reshaped = gs.einsum("j,...j->...j", self.scales, reshaped)
  
      return reshaped
  
imports: import geomstats.backend
  import geomstats.errors
  from geomstats.geometry.manifold import Manifold
  from geomstats.geometry.riemannian_metric import RiemannianMetric
  from geomstats.vectorization import get_batch_shape
label_desc: Use image node_id 3 for calling the NFoldMetric obj's underlying member method code with example usage: obj.pointwise_inner_product(tangent_vec_a, tangent_vec_b, base_point) and returns: reshaped