docs: def evolve(self, new_date):
          """
          evolve to the new process state at the next date
  
          :param date new_date: date or point in time of the new state
          :return State:
          """
          if all(p.state.date == new_date for p in self.producers):
              return [p.state for p in self.producers]
  
          if self._cholesky is not None:
              q = [self.random.gauss(0., 1.) for _ in range(len(self._cholesky))]
              q = list(self._cholesky.dot(q))
          else:
              q = list()
  
          state = list()
          for p in self.producers:
              if len(self._driver_index[p]) == len(p.diffusion_driver):
                  qq = [q[i] for i in self._driver_index[p]]
              elif len(self._driver_index[p]) < len(p.diffusion_driver):
                  qq = list()
                  for d in p.diffusion_driver:
                      qqq = q[self._diffusion_driver.index(d)] if d in self._diffusion_driver else self.random.gauss(0., 1.)
                      qq.append(qqq)
              else:
                  qq = [self.random.gauss(0., 1.) for _ in p.diffusion_driver]
  
              p.random.extend(qq)
              state.append(p.evolve(new_date))
  
          return state