class_docstr: Multiprocessing evaluator
class_docstr_tok: ["Multiprocessing","evaluator"]
docstr: Args:
      estimators: estimators to be evaluated
      experiments:
      max_num_workers: <= 0 no multiprocessing
                       otherwise create max_num_workers processes
docstr_tok: ["Args",":","estimators",":","estimators","to","be","evaluated","experiments",":","max_num_workers",":","<","=","0","no","multiprocessing","otherwise","create","max_num_workers","processes"]
code: def __init__(
      self,
      experiments: Iterable[Tuple[Iterable[Estimator], object]],
      max_num_workers: int,
  ):
      """
      Args:
          estimators: estimators to be evaluated
          experiments:
          max_num_workers: <= 0 no multiprocessing
                           otherwise create max_num_workers processes
      """
      self._experiments = experiments
      self._tasks = None
      if max_num_workers > 0:
          self._tasks = [[] for _ in range(max_num_workers)]
          for i, experiment in enumerate(experiments):
              self._tasks[i % max_num_workers].append(experiment)
  
imports: import logging
  import math
  import pickle
  import tempfile
  from abc import ABC, abstractmethod
  from dataclasses import dataclass, field
  from multiprocessing import Pool
  from typing import Iterable, List, Mapping, Optional, Tuple, Union
  import torch
  from reagent.evaluation.cpe import bootstrapped_std_error_of_mean
  from torch import Tensor
label_desc: Use image node_id 1 to create a new Evaluator object  with example: obj = Evaluator(experiments, max_num_workers)