docs: def add_features(self, kept_indices, new_indices,
                       new_state_vec, new_state_cov, new_noise_var):
          '''Add new features to the state
  
          kept_indices - the mapping from all indices in the state to new
                         indices in the new version
  
          new_indices - the indices of the new features in the new version
  
          new_state_vec - the state vectors for the new indices
  
          new_state_cov - the covariance matrices for the new indices
  
          new_noise_var - the noise variances for the new indices
          '''
          assert len(kept_indices) == len(self.state_vec)
          assert len(new_indices) == len(new_state_vec)
          assert len(new_indices) == len(new_state_cov)
          assert len(new_indices) == len(new_noise_var)
  
          if self.has_cached_obs_vec:
              del self.obs_vec
          if self.has_cached_predicted_state_vec:
              del self.predicted_obs_vec
  
          nfeatures = len(kept_indices) + len(new_indices)
          next_state_vec = np.zeros((nfeatures, self.state_len))
          next_state_cov = np.zeros((nfeatures, self.state_len, self.state_len))
          next_noise_var = np.zeros((nfeatures, self.state_len))
  
          if len(kept_indices) > 0:
              next_state_vec[kept_indices] = self.state_vec
              next_state_cov[kept_indices] = self.state_cov
              next_noise_var[kept_indices] = self.noise_var
              if len(self.state_noise_idx) > 0:
                  self.state_noise_idx = kept_indices[self.state_noise_idx]
          if len(new_indices) > 0:
              next_state_vec[new_indices] = new_state_vec
              next_state_cov[new_indices] = new_state_cov
              next_noise_var[new_indices] = new_noise_var
          self.state_vec = next_state_vec
          self.state_cov = next_state_cov
          self.noise_var = next_noise_var