docs: def _sample_action_fluent(self,
              name: str,
              dtype: tf.DType,
              size: Sequence[int],
              constraints: Dict[str, Constraints],
              default_value: tf.Tensor,
              prob: float) -> tf.Tensor:
          '''Samples the action fluent with given `name`, `dtype`, and `size`.
  
          With probability `prob` it chooses the action fluent `default_value`,
          with probability 1-`prob` it samples the fluent w.r.t. its `constraints`.
  
          Args:
              name (str): The name of the action fluent.
              dtype (tf.DType): The data type of the action fluent.
              size (Sequence[int]): The size and shape of the action fluent.
              constraints (Dict[str, Tuple[Optional[TensorFluent], Optional[TensorFluent]]]): The bounds for each action fluent.
              default_value (tf.Tensor): The default value for the action fluent.
              prob (float): A probability measure.
  
          Returns:
              tf.Tensor: A tensor for sampling the action fluent.
          '''
          shape = [self.batch_size] + list(size)
  
          if dtype == tf.float32:
              bounds = constraints.get(name)
              if bounds is None:
                  low, high = -self.MAX_REAL_VALUE, self.MAX_REAL_VALUE
                  dist = tf.distributions.Uniform(low=low, high=high)
                  sampled_fluent = dist.sample(shape)
              else:
                  low, high = bounds
                  batch = (low is not None and low.batch) or (high is not None and high.batch)
                  low = tf.cast(low.tensor, tf.float32) if low is not None else -self.MAX_REAL_VALUE
                  high = tf.cast(high.tensor, tf.float32) if high is not None else self.MAX_REAL_VALUE
                  dist = tf.distributions.Uniform(low=low, high=high)
                  if batch:
                      sampled_fluent = dist.sample()
                  elif isinstance(low, tf.Tensor) or isinstance(high, tf.Tensor):
                      if (low+high).shape.as_list() == list(size):
                          sampled_fluent = dist.sample([self.batch_size])
                      else:
                          raise ValueError('bounds are not compatible with action fluent.')
                  else:
                      sampled_fluent = dist.sample(shape)
          elif dtype == tf.int32:
              logits = [1.0] * self.MAX_INT_VALUE
              dist = tf.distributions.Categorical(logits=logits, dtype=tf.int32)
              sampled_fluent = dist.sample(shape)
          elif dtype == tf.bool:
              probs = 0.5
              dist = tf.distributions.Bernoulli(probs=probs, dtype=tf.bool)
              sampled_fluent = dist.sample(shape)
  
          select_default = tf.distributions.Bernoulli(prob, dtype=tf.bool).sample(self.batch_size)
          action_fluent = tf.where(select_default, default_value, sampled_fluent)
  
          return action_fluent