class_docstr: Move-split-merge (MSM) distance between two time series.
  
  (MSM) [1] is a distance measure that is conceptually similar to other edit
  distance-based approaches, where similarity is calculated by using a set of
  operations to transform one series into another. Each operation has an
  associated cost, and three operations are defined for MSM: move, split, and merge.
  Move is synonymous with a substitution operation, where one value is replaced by
  another. Split and merge differ from other approaches, as they attempt to add
  context to insertions and deletions. The cost of inserting and deleting values
  depends on the value itself and adjacent values, rather than treating all
  insertions and deletions equally (for example, as in ERP). Therefore, the split
  operation is introduced to insert an identical copy of a value immediately after
  itself, and the merge operation is used to delete a value if it directly follows
  an identical value.
  
  Currently only works with univariate series.
  
  References
  ----------
  .. [1] Stefan A., Athitsos V., Das G.: The Move-Split-Merge metric for time
  series. IEEE Transactions on Knowledge and Data Engineering 25(6):1425–1438, 2013
docstr: Create a no_python compiled MSM distance path callable.
  
  Series should be shape (1, m), where m is the series length. Series can be
  different lengths.
  
  Parameters
  ----------
  x: np.ndarray (2d array of shape (d,m1)).
      First time series.
  y: np.ndarray (2d array of shape (d,m2)).
      Second time series.
  return_cost_matrix: bool, defaults = False
      Boolean that when true will also return the cost matrix.
  c: float, default = 1.0
      Cost for split or merge operation.
  window: float, defaults = None
      Float that is the radius of the sakoe chiba window (if using Sakoe-Chiba
      lower bounding). Must be between 0 and 1.
  itakura_max_slope: float, defaults = None
      Gradient of the slope for itakura parallelogram (if using Itakura
      Parallelogram lower bounding). Must be between 0 and 1.
  bounding_matrix: np.ndarray (2d array of shape (m1,m2)), defaults = None
      Custom bounding matrix to use. If defined then other lower_bounding params
      are ignored. The matrix should be structure so that indexes considered in
      bound should be the value 0. and indexes outside the bounding matrix should
      be infinity.
  kwargs: any
      extra kwargs.
  
  Returns
  -------
  Callable[[np.ndarray, np.ndarray], float]
      No_python compiled MSM distance callable.
  
  Raises
  ------
  ValueError
      If the input time series have more than one dimension (shape[0] > 1)
      If the input time series is not a numpy array.
      If the input time series doesn't have exactly 2 dimensions.
      If the sakoe_chiba_window_radius is not an integer.
      If the itakura_max_slope is not a float or int.
      If epsilon is not a float.
docstr_tok: ["Create","a","no_python","compiled","MSM","distance","path","callable",".","Series","should","be","shape","(","1",",","m",")",",","where","m","is","the","series","length",".","Series","can","be","different","lengths",".","Parameters","--","--","--","--","--","x",":","np.ndarray","(","2d","array","of","shape","(","d",",","m1",")",")",".","First","time","series",".","y",":","np.ndarray","(","2d","array","of","shape","(","d",",","m2",")",")",".","Second","time","series",".","return_cost_matrix",":","bool",",","defaults","=","False","Boolean","that","when","true","will","also","return","the","cost","matrix",".","c",":","float",",","default","=","1.0","Cost","for","split","or","merge","operation",".","window",":","float",",","defaults","=","None","Float","that","is","the","radius","of","the","sakoe","chiba","window","(","if","using","Sakoe-Chiba","lower","bounding",")",".","Must","be","between","0","and","1.","itakura_max_slope",":","float",",","defaults","=","None","Gradient","of","the","slope","for","itakura","parallelogram","(","if","using","Itakura","Parallelogram","lower","bounding",")",".","Must","be","between","0","and","1.","bounding_matrix",":","np.ndarray","(","2d","array","of","shape","(","m1",",","m2",")",")",",","defaults","=","None","Custom","bounding","matrix","to","use",".","If","defined","then","other","lower_bounding","params","are","ignored",".","The","matrix","should","be","structure","so","that","indexes","considered","in","bound","should","be","the","value","0.","and","indexes","outside","the","bounding","matrix","should","be","infinity",".","kwargs",":","any","extra","kwargs",".","Returns","--","--","--","-","Callable","[","[","np.ndarray",",","np.ndarray","]",",","float","]","No_python","compiled","MSM","distance","callable",".","Raises","--","--","--","ValueError","If","the","input","time","series","have","more","than","one","dimension","(","shape","[","0","]",">","1",")","If","the","input","time","series","is","not","a","numpy","array",".","If","the","input","time","series","does","n't","have","exactly","2","dimensions",".","If","the","sakoe_chiba_window_radius","is","not","an","integer",".","If","the","itakura_max_slope","is","not","a","float","or","int",".","If","epsilon","is","not","a","float","."]
code: def _distance_alignment_path_factory(
      self,
      x: np.ndarray,
      y: np.ndarray,
      return_cost_matrix: bool = False,
      c: float = 1.0,
      window: float = None,
      itakura_max_slope: float = None,
      bounding_matrix: np.ndarray = None,
      **kwargs: dict,
  ) -> DistanceAlignmentPathCallable:
      """Create a no_python compiled MSM distance path callable.
  
      Series should be shape (1, m), where m is the series length. Series can be
      different lengths.
  
      Parameters
      ----------
      x: np.ndarray (2d array of shape (d,m1)).
          First time series.
      y: np.ndarray (2d array of shape (d,m2)).
          Second time series.
      return_cost_matrix: bool, defaults = False
          Boolean that when true will also return the cost matrix.
      c: float, default = 1.0
          Cost for split or merge operation.
      window: float, defaults = None
          Float that is the radius of the sakoe chiba window (if using Sakoe-Chiba
          lower bounding). Must be between 0 and 1.
      itakura_max_slope: float, defaults = None
          Gradient of the slope for itakura parallelogram (if using Itakura
          Parallelogram lower bounding). Must be between 0 and 1.
      bounding_matrix: np.ndarray (2d array of shape (m1,m2)), defaults = None
          Custom bounding matrix to use. If defined then other lower_bounding params
          are ignored. The matrix should be structure so that indexes considered in
          bound should be the value 0. and indexes outside the bounding matrix should
          be infinity.
      kwargs: any
          extra kwargs.
  
      Returns
      -------
      Callable[[np.ndarray, np.ndarray], float]
          No_python compiled MSM distance callable.
  
      Raises
      ------
      ValueError
          If the input time series have more than one dimension (shape[0] > 1)
          If the input time series is not a numpy array.
          If the input time series doesn't have exactly 2 dimensions.
          If the sakoe_chiba_window_radius is not an integer.
          If the itakura_max_slope is not a float or int.
          If epsilon is not a float.
      """
      from sktime.distances._distance_alignment_paths import (
          compute_min_return_path,
      )
      from sktime.distances._msm_numba import _cost_matrix
      from sktime.distances.lower_bounding import (
          resolve_bounding_matrix,
      )
      from sktime.utils.numba.njit import njit
  
      if x.shape[0] > 1 or y.shape[0] > 1:
          raise ValueError(
              f"ERROR, MSM distance currently only works with "
              f"univariate series, passed seris shape {x.shape[0]} and"
              f"shape {y.shape[0]}"
          )
  
      _bounding_matrix = resolve_bounding_matrix(
          x, y, window, itakura_max_slope, bounding_matrix
      )
  
      if return_cost_matrix is True:
  
          @njit(cache=True)
          def numba_msm_distance_alignment_path(
              _x: np.ndarray,
              _y: np.ndarray,
          ) -> Tuple[List, float, np.ndarray]:
              cost_matrix = _cost_matrix(_x, _y, _bounding_matrix, c)
              path = compute_min_return_path(
                  cost_matrix, _bounding_matrix
              )
              return path, cost_matrix[-1, -1], cost_matrix
  
      else:
  
          @njit(cache=True)
          def numba_msm_distance_alignment_path(
              _x: np.ndarray,
              _y: np.ndarray,
          ) -> Tuple[List, float]:
              cost_matrix = _cost_matrix(_x, _y, _bounding_matrix, c)
              path = compute_min_return_path(
                  cost_matrix, _bounding_matrix
              )
              return path, cost_matrix[-1, -1]
  
      return numba_msm_distance_alignment_path
  
imports: from typing import List, Tuple
  import numpy
  from sktime.distances.base import DistanceAlignmentPathCallable, DistanceCallable, NumbaDistance
label_desc: Use image node_id 1 for calling the _MsmDistance obj's underlying member method code with example usage: obj._distance_alignment_path_factory(x, y, return_cost_matrix, c, window, itakura_max_slope, bounding_matrix) and returns: numba_msm_distance_alignment_path, path,  cost_matrix,  cost_matrix, path,  cost_matrix