class_docstr: Correlation-based voxel selection component of FCMA.
  
  Parameters
  ----------
  
  labels: list of 1D array
      the condition labels of the epochs
      len(labels) labels equals the number of epochs
  
  epochs_per_subj: int
      The number of epochs of each subject
  
  num_folds: int
      The number of folds to be conducted in the cross validation
  
  raw_data: list of 2D array in shape [epoch length, nVoxels]
      Assumption: 1. all activity data contains the same number of voxels
                  2. the activity data has been z-scored,
                     ready to compute correlation as matrix multiplication
                  3. all subjects have the same number of epochs
                  4. epochs belonging to the same subject are adjacent
                     in the list
                  5. if MPI jobs are running on multiple nodes, the path
                     used must be on a filesystem shared by all nodes
  
  raw_data2: Optional, list of 2D array in shape [epoch length, nVoxels]
      raw_data2 shares the data structure of the assumptions of raw_data
      If raw_data2 is None, the correlation will be computed as
      raw_data by raw_data.
      If raw_data2 is specified, len(raw_data) MUST equal len(raw_data2),
      the correlation will be computed as raw_data by raw_data2.
  
  voxel_unit: int, default 64
      The number of voxels assigned to a worker each time
  
  process_num: Optional[int]
      The maximum number of processes used in cross validation.
      If None, the number of processes will equal
      the number of available hardware threads, considering cpusets
      restrictions.
      If 0, cross validation will not use python multiprocessing.
  
  master_rank: int, default 0
      The process which serves as the master
docstr: Master node's operation.
  
  Assigning tasks to workers and collecting results from them
  
  Parameters
  ----------
  None
  
  Returns
  -------
  results: list of tuple (voxel_id, accuracy)
      the accuracy numbers of all voxels, in accuracy descending order
      the length of array equals the number of voxels
docstr_tok: ["Master","node","'s","operation",".","Assigning","tasks","to","workers","and","collecting","results","from","them","Parameters","--","--","--","--","--","None","Returns","--","--","--","-","results",":","list","of","tuple","(","voxel_id",",","accuracy",")","the","accuracy","numbers","of","all","voxels",",","in","accuracy","descending","order","the","length","of","array","equals","the","number","of","voxels"]
code: def _master(self):
      """Master node's operation.
  
      Assigning tasks to workers and collecting results from them
  
      Parameters
      ----------
      None
  
      Returns
      -------
      results: list of tuple (voxel_id, accuracy)
          the accuracy numbers of all voxels, in accuracy descending order
          the length of array equals the number of voxels
      """
      logger.info(
          "Master at rank %d starts to allocate tasks",
          MPI.COMM_WORLD.Get_rank(),
      )
      results = []
      comm = MPI.COMM_WORLD
      size = comm.Get_size()
      sending_voxels = (
          self.voxel_unit
          if self.voxel_unit < self.num_voxels
          else self.num_voxels
      )
      current_task = (0, sending_voxels)
      status = MPI.Status()
      # using_size is used when the number of tasks
      # is smaller than the number of workers
      using_size = size
      for i in range(0, size):
          if i == self.master_rank:
              continue
          if current_task[1] == 0:
              using_size = i
              break
          logger.debug("master starts to send a task to worker %d" % i)
          comm.send(current_task, dest=i, tag=self._WORKTAG)
          next_start = current_task[0] + current_task[1]
          sending_voxels = (
              self.voxel_unit
              if self.voxel_unit < self.num_voxels - next_start
              else self.num_voxels - next_start
          )
          current_task = (next_start, sending_voxels)
  
      while using_size == size:
          if current_task[1] == 0:
              break
          result = comm.recv(
              source=MPI.ANY_SOURCE, tag=MPI.ANY_TAG, status=status
          )
          results += result
          comm.send(
              current_task, dest=status.Get_source(), tag=self._WORKTAG
          )
          next_start = current_task[0] + current_task[1]
          sending_voxels = (
              self.voxel_unit
              if self.voxel_unit < self.num_voxels - next_start
              else self.num_voxels - next_start
          )
          current_task = (next_start, sending_voxels)
  
      for i in range(0, using_size):
          if i == self.master_rank:
              continue
          result = comm.recv(source=MPI.ANY_SOURCE, tag=MPI.ANY_TAG)
          results += result
  
      for i in range(0, size):
          if i == self.master_rank:
              continue
          comm.send(None, dest=i, tag=self._TERMINATETAG)
  
      return results
  
imports: import numpy
  import time
  from mpi4py import MPI
  from scipy.stats.mstats import zscore
  from sklearn import model_selection
  import sklearn
  from .None import fcma_extension
  from .None import cython_blas
  from ..utils.utils import usable_cpu_count
  import logging
  import multiprocessing
label_desc: Use image node_id 3 for calling the VoxelSelector obj's underlying member method code with example usage: obj._master() and returns: results