class_docstr: Diffeormorphism.
  
  Let :math:`f` be the diffeomorphism
  :math:`f: M \rightarrow N` of the manifold
  :math:`M` into the manifold :math:`N`.
docstr: Tangent diffeomorphism at base point.
  
  df_p is a linear map from T_pM to T_f(p)N.
  
  Parameters
  ----------
  tangent_vec : array-like, shape=[..., *space_shape]
      Tangent vector at base point.
  base_point : array-like, shape=[..., *space_shape]
      Base point.
  image_point : array-like, shape=[..., *image_shape]
      Image point.
  
  Returns
  -------
  image_tangent_vec : array-like, shape=[..., *image_shape]
      Image tangent vector at image of the base point.
  
  Notes
  -----
  Signature choice (i.e. having the possibility to pass both base and image
  points) comes from performance considerations.
  In several methods (e.g. `PullbackDiffeoMetric.inner_product`) the need
  to call `tangent_diffeomorphism` comes after having called
  `diffeomorphism`, which means we have both `base_point` and
  `image_point` available.
  In some cases, `tangent_diffeomorphism` needs access to `base_point`
  (e.g. `SRVTransform`), while in others, it needs access to `image_point`
  (e.g. `CholeskyMap`).
  By passing both, we give the corresponding implementation the possibility
  to choose the one that is more convenient (performancewise).
  If we pass only one of the two, it has the mechanims to perform the
  necessary transformations (e.g. calling `diffeomorphism` or
  `inverse_diffeomorphism` on it).
docstr_tok: ["Tangent","diffeomorphism","at","base","point",".","df_p","is","a","linear","map","from","T_pM","to","T_f","(","p",")","N.","Parameters","--","--","--","--","--","tangent_vec",":","array-like",",","shape=","[","...",",","*","space_shape","]","Tangent","vector","at","base","point",".","base_point",":","array-like",",","shape=","[","...",",","*","space_shape","]","Base","point",".","image_point",":","array-like",",","shape=","[","...",",","*","image_shape","]","Image","point",".","Returns","--","--","--","-","image_tangent_vec",":","array-like",",","shape=","[","...",",","*","image_shape","]","Image","tangent","vector","at","image","of","the","base","point",".","Notes","--","--","-","Signature","choice","(","i.e",".","having","the","possibility","to","pass","both","base","and","image","points",")","comes","from","performance","considerations",".","In","several","methods","(","e.g",".","`","PullbackDiffeoMetric.inner_product","`",")","the","need","to","call","`","tangent_diffeomorphism","`","comes","after","having","called","`","diffeomorphism","`",",","which","means","we","have","both","`","base_point","`","and","`","image_point","`","available",".","In","some","cases",",","`","tangent_diffeomorphism","`","needs","access","to","`","base_point","`","(","e.g",".","`","SRVTransform","`",")",",","while","in","others",",","it","needs","access","to","`","image_point","`","(","e.g",".","`","CholeskyMap","`",")",".","By","passing","both",",","we","give","the","corresponding","implementation","the","possibility","to","choose","the","one","that","is","more","convenient","(","performancewise",")",".","If","we","pass","only","one","of","the","two",",","it","has","the","mechanims","to","perform","the","necessary","transformations","(","e.g",".","calling","`","diffeomorphism","`","or","`","inverse_diffeomorphism","`","on","it",")","."]
code: def tangent_diffeomorphism(
      self, tangent_vec, base_point=None, image_point=None
  ):
      r"""Tangent diffeomorphism at base point.
  
      df_p is a linear map from T_pM to T_f(p)N.
  
      Parameters
      ----------
      tangent_vec : array-like, shape=[..., *space_shape]
          Tangent vector at base point.
      base_point : array-like, shape=[..., *space_shape]
          Base point.
      image_point : array-like, shape=[..., *image_shape]
          Image point.
  
      Returns
      -------
      image_tangent_vec : array-like, shape=[..., *image_shape]
          Image tangent vector at image of the base point.
  
      Notes
      -----
      Signature choice (i.e. having the possibility to pass both base and image
      points) comes from performance considerations.
      In several methods (e.g. `PullbackDiffeoMetric.inner_product`) the need
      to call `tangent_diffeomorphism` comes after having called
      `diffeomorphism`, which means we have both `base_point` and
      `image_point` available.
      In some cases, `tangent_diffeomorphism` needs access to `base_point`
      (e.g. `SRVTransform`), while in others, it needs access to `image_point`
      (e.g. `CholeskyMap`).
      By passing both, we give the corresponding implementation the possibility
      to choose the one that is more convenient (performancewise).
      If we pass only one of the two, it has the mechanims to perform the
      necessary transformations (e.g. calling `diffeomorphism` or
      `inverse_diffeomorphism` on it).
      """
  
imports: import abc
  import math
  import geomstats.backend
  from geomstats.vectorization import get_batch_shape
label_desc: Use image node_id 3 for calling the Diffeo obj's underlying member method code with example usage: obj.tangent_diffeomorphism(tangent_vec, base_point, image_point) without return types