docs: def compile_action_bound_constraints(self,
              state: Sequence[tf.Tensor]) -> Dict[str, Bounds]:
          '''Compiles all actions bounds for the given `state`.
  
          Args:
              state (Sequence[tf.Tensor]): The current state fluents.
  
          Returns:
              A mapping from action names to a pair of
              :obj:`rddl2tf.fluent.TensorFluent` representing
              its lower and upper bounds.
          '''
          scope = self.action_precondition_scope(state)
  
          lower_bounds = self.rddl.domain.action_lower_bound_constraints
          upper_bounds = self.rddl.domain.action_upper_bound_constraints
  
          with self.graph.as_default():
              with tf.name_scope('action_bound_constraints'):
  
                  bounds = {}
                  for name in self.rddl.domain.action_fluent_ordering:
  
                      lower_expr = lower_bounds.get(name)
                      lower = None
                      if lower_expr is not None:
                          with tf.name_scope('lower_bound'):
                              lower = self._compile_expression(lower_expr, scope)
  
                      upper_expr = upper_bounds.get(name)
                      upper = None
                      if upper_expr is not None:
                          with tf.name_scope('upper_bound'):
                              upper = self._compile_expression(upper_expr, scope)
  
                      bounds[name] = (lower, upper)
  
                  return bounds