'Perform simulation smoothing
Does not return anything, but populates the object\'s `simulated_*`
attributes, as specified by simulation output.
Parameters
simulation_output : integer, optional
Bitmask controlling simulation output. Default is to use the
simulation output defined in object initialization.
disturbance_variates : array_likes, optional
Random values to use as disturbance variates, distributed standard
Normal. Usually only specified if results are to be replicated
(e.g. to enforce a seed) or for testing. If not specified, random
variates are drawn.
initial_state_variates : array_likes, optional
Random values to use as initial state variates. Usually only
specified if results are to be replicated (e.g. to enforce a seed)
or for testing. If not specified, random variates are drawn.'

def simulate(self, simulation_output=(-1), disturbance_variates=None, initial_state_variates=None):

    self._generated_measurement_disturbance = None
    self._generated_state_disturbance = None
    self._generated_state = None
    self._generated_obs = None
    self._generated_state = None
    self._simulated_state = None
    self._simulated_measurement_disturbance = None
    self._simulated_state_disturbance = None
    self.model._initialize_representation(prefix=self.prefix)
    self.model._initialize_state(prefix=self.prefix)
    if (disturbance_variates is not None):
        self._simulation_smoother.set_disturbance_variates(np.array(disturbance_variates, dtype=self.dtype))
    else:
        self._simulation_smoother.draw_disturbance_variates()
    if (initial_state_variates is not None):
        self._simulation_smoother.set_initial_state_variates(np.array(initial_state_variates, dtype=self.dtype))
    else:
        self._simulation_smoother.draw_initial_state_variates()
    self._simulation_smoother.simulate(simulation_output)
