class_docstr: ## Counterfactual Regret Minimization (CFR) Algorithm
  
  We do chance sampling (**CS**) where all the chance events (nodes) are sampled and
  all other events (nodes) are explored.
  
  We can ignore the term $q(z)$ since it's the same for all terminal histories
  since we are doing chance sampling and it cancels out when calculating
  strategy (common in numerator and denominator).
class_docstr_tok: ["#","#","Counterfactual","Regret","Minimization","(","CFR",")","Algorithm","We","do","chance","sampling","(","*","*","CS","*","*",")","where","all","the","chance","events","(","nodes",")","are","sampled","and","all","other","events","(","nodes",")","are","explored",".","We","can","ignore","the","term","$","q","(","z",")","$","since","it","'s","the","same","for","all","terminal","histories","since","we","are","doing","chance","sampling","and","it","cancels","out","when","calculating","strategy","(","common","in","numerator","and","denominator",")","."]
docstr: Returns the information set $I$ of the current player for a given history $h$
docstr_tok: ["Returns","the","information","set","$","I","$","of","the","current","player","for","a","given","history","$","h","$"]
code: def _get_info_set(self, h: History):
      """
      Returns the information set $I$ of the current player for a given history $h$
      """
      info_set_key = h.info_set_key()
      if info_set_key not in self.info_sets:
          self.info_sets[info_set_key] = h.new_info_set()
      return self.info_sets[info_set_key]
  
imports: from typing import NewType, Dict, List, Callable, cast
  from labml import monit, tracker, logger, experiment
  from labml.configs import BaseConfigs, option
label_desc: Use image node_id 2 for calling the CFR obj's underlying member method code with example usage: obj._get_info_set(h) and returns: self