code: def parse_branchinglevel(self, branchinglevel_node, depth, validate):
          
          new_open_ends = set()
          branchsets = branchinglevel_node.nodes
          for number, branchset_node in enumerate(branchsets):
              branchset = self.parse_branchset(branchset_node, depth, number,
                                               validate)
              self.parse_branches(branchset_node, branchset, validate)
              if self.root_branchset is None:  # not set yet
                  self.num_paths = 1
                  self.root_branchset = branchset
              else:
                  self.apply_branchset(branchset_node, branchset)
              for branch in branchset.branches:
                  new_open_ends.add(branch)
              self.num_paths *= len(branchset.branches)
          if number > 0:
              logging.warning('There is a branching level with multiple '
                              'branchsets in %s', self.filename)
          self.open_ends.clear()
          self.open_ends.update(new_open_ends)
docs: Parse one branching level.
  
          :param branchinglevel_node:
              ``etree.Element`` object with tag "logicTreeBranchingLevel".
          :param depth:
              The sequential number of this branching level, based on 0.
          :param validate:
              Whether or not the branching level, its branchsets and their
              branches should be validated.
  
          Enumerates children branchsets and call :meth:`parse_branchset`,
          :meth:`validate_branchset`, :meth:`parse_branches` and finally
          :meth:`apply_branchset` for each.
  
          Keeps track of "open ends" -- the set of branches that don't have
          any child branchset on this step of execution. After processing
          of every branching level only those branches that are listed in it
          can have child branchsets (if there is one on the next level).