code: def _recover_from_split_shuffle(self, split_points):
      splits_info = list(
          self._splits_into_k(self._node_data_size, self._k)
      )
      _size_mapping = {}
      out = {}
      for nid in split_points:
          index = split_points[nid]
          for split_info in splits_info:
              if split_info[0] <= index < split_info[1]:
                  if split_info[1] - split_info[0] not in _size_mapping:
                      _size_mapping[split_info[1] - split_info[0]] = [
                          (split_info, nid, index - split_info[0])
                      ]
                  else:
                      _size_mapping[
                          split_info[1] - split_info[0]
                      ].append((split_info, nid, index - split_info[0]))
      for size in _size_mapping:
          shuffler = Shuffler(self._node_size, size, self._seed)
          fixed_size_splits = _size_mapping[size]
          for (split_info, nid, _), i in zip(
              fixed_size_splits,
              shuffler.get_reverse_indexes(
                  step=1, indexes=[p[2] for p in fixed_size_splits]
              ),
          ):
              out[nid] = split_info[0] + i
      return out
  
imports: import logging
  import typing
  from typing import List, MutableMapping, Tuple, Optional
  import torch
  from fate.arch.computing.api import KVTable
  from ._histogram_local import Histogram
  from ._histogram_splits import HistogramSplits
  from .indexer import HistogramIndexer, Shuffler
label_desc: Use image node_id 12 for calling the DistributedHistogram obj's underlying member method code with example usage: obj._recover_from_split_shuffle(split_points) and returns: out