docs: def run(self,
              horizon: int,
              initial_state: Optional[StateTensor] = None) -> SimulationOutput:
          '''Builds the MDP graph and simulates in batch the trajectories
          with given `horizon`. Returns the non-fluents, states, actions, interms
          and rewards. Fluents and non-fluents are returned in factored form.
  
          Note:
              All output arrays have shape: (batch_size, horizon, fluent_shape).
              Except initial state that has shape: (batch_size, fluent_shape).
  
          Args:
              horizon (int): The number of timesteps in the simulation.
              initial_state (Optional[Sequence[tf.Tensor]]): The initial state tensors.
  
          Returns:
              Tuple[NonFluentsArray, StatesArray, ActionsArray, IntermsArray, np.array]: Simulation ouput tuple.
          '''
          trajectory = self.trajectory(horizon, initial_state)
  
          with tf.Session(graph=self.graph) as sess:
              sess.run(tf.global_variables_initializer())
              non_fluents = sess.run(self._non_fluents)
              initial_state, states, actions, interms, rewards = sess.run(trajectory)
  
          # non-fluents
          non_fluent_ordering = self._cell._compiler.rddl.domain.non_fluent_ordering
          non_fluents = tuple(zip(non_fluent_ordering, non_fluents))
  
          # states
          state_fluent_ordering = self._cell._compiler.rddl.domain.state_fluent_ordering
          states = tuple(zip(state_fluent_ordering, states))
  
          # interms
          interm_fluent_ordering = self._cell._compiler.rddl.domain.interm_fluent_ordering
          interms = tuple(zip(interm_fluent_ordering, interms))
  
          # actions
          action_fluent_ordering = self._cell._compiler.rddl.domain.action_fluent_ordering
          actions = tuple(zip(action_fluent_ordering, actions))
  
          # rewards
          rewards = np.squeeze(rewards)
  
          outputs = (non_fluents, initial_state, states, actions, interms, rewards)
  
          return outputs