docs: def compile_cpfs(self,
                       scope: Dict[str, TensorFluent],
                       batch_size: Optional[int] = None,
                       noise: Optional[Noise] = None) -> Tuple[List[CPFPair], List[CPFPair]]:
          '''Compiles the intermediate and next state fluent CPFs given the current `state` and `action` scope.
  
          Args:
              scope (Dict[str, :obj:`rddl2tf.fluent.TensorFluent`]): The fluent scope for CPF evaluation.
              batch_size (Optional[int]): The batch size.
  
          Returns:
              Tuple[List[CPFPair], List[CPFPair]]: A pair of lists of TensorFluent
              representing the intermediate and state CPFs.
          '''
          interm_fluents = self.compile_intermediate_cpfs(scope, batch_size, noise)
          scope.update(dict(interm_fluents))
          next_state_fluents = self.compile_state_cpfs(scope, batch_size, noise)
          return interm_fluents, next_state_fluents