class_docstr: Glues together all other inference classes in a sequence that actually runs inference.
docstr: Initialize the inference runner.
  
  context_providers: a list of context providers to be used
  ruleset: the set of rules that will produce signals
  solver: the inference solver to be used
  renderers: the renderers that will write inference results as meaningful output
  progress_reporter: `InferenceProgressReporter` to report progress
docstr_tok: ["Initialize","the","inference","runner",".","context_providers",":","a","list","of","context","providers","to","be","used","ruleset",":","the","set","of","rules","that","will","produce","signals","solver",":","the","inference","solver","to","be","used","renderers",":","the","renderers","that","will","write","inference","results","as","meaningful","output","progress_reporter",":","`","InferenceProgressReporter","`","to","report","progress"]
code: def __init__(
      self,
      context_providers: List[InferenceContextProvider],
      ruleset: List[InferenceRule],
      solver: InferenceSolver,
      renderers: List[InferenceRenderer],
      progress_reporter: InferenceProgressReporter = NoOpInferenceProgressReporter(),
  ) -> None:
      """Initialize the inference runner.
  
      context_providers: a list of context providers to be used
      ruleset: the set of rules that will produce signals
      solver: the inference solver to be used
      renderers: the renderers that will write inference results as meaningful output
      progress_reporter: `InferenceProgressReporter` to report progress
      """
      logger.warning(
          "Semantic Model Inference is still in Beta. "
          "As such, you should not expect it to be 100% stable or be free of bugs. Any public CLI or Python interfaces may change without prior notice."
          " If you find any bugs or feel like something is not behaving as it should, feel free to open an issue on the Metricflow Github repo."
      )
  
      if len(context_providers) != 1 or not isinstance(
          context_providers[0], DataWarehouseInferenceContextProvider
      ):
          raise ValueError(
              "Currently, InferenceRunner requires exactly one DataWarehouseInferenceContextProvider."
          )
  
      if len(ruleset) == 0:
          raise ValueError(
              "Running inference with an empty ruleset would produce no result."
          )
  
      if len(renderers) == 0:
          raise ValueError(
              "Running inference with no renderer would discard the results."
          )
  
      self.context_providers = context_providers
      self.ruleset = ruleset
      self.solver = solver
      self.renderers = renderers
      self._progress = progress_reporter
  
imports: from __future__ import annotations
  import contextlib
  import logging
  from abc import ABC, abstractmethod
  from collections import defaultdict
  from typing import Iterator, List
  import more_itertools
  from metricflow.dataflow.sql_table import SqlTable
  from metricflow.inference.context.base import InferenceContextProvider
  from metricflow.inference.context.data_warehouse import DataWarehouseInferenceContextProvider
  from metricflow.inference.renderer.base import InferenceRenderer
  from metricflow.inference.rule.base import InferenceRule
  from metricflow.inference.solver.base import InferenceSolver
label_desc: Use image node_id 1 to create a new InferenceRunner object  with example: obj = InferenceRunner(context_providers, ruleset, solver, renderers, progress_reporter)