code: def observe(self, C, obs_mesh_new, obs_vals_new, mean_under=None):
          
  
          self.C = C
          self.obs_mesh = C.obs_mesh
          self.obs_len = C.obs_len
  
          self.Uo = C.Uo
  
          # Evaluate the underlying mean function on the new observation mesh.
          if mean_under is None:
              mean_under_new = C._mean_under_new(self, obs_mesh_new)
          else:
              mean_under_new = mean_under
  
          # If self hasn't been observed yet:
          if not self.observed:
  
              self.dev = (obs_vals_new - mean_under_new)
  
              self.reg_mat = C._unobs_reg(self)
  
          # If self has been observed already:
          elif len(obs_vals_new) > 0:
  
              # Rank of old observations.
              m_old = len(self.dev)
  
              # Deviation of new observation from mean without regard to old
              # observations.
              dev_new = (obs_vals_new - mean_under_new)
  
              # Again, basis covariances get special treatment.
              self.reg_mat = C._obs_reg(self, dev_new, m_old)
  
              # Stack deviations of old and new observations from unobserved
              # mean.
              self.dev = hstack((self.dev, dev_new))
          self.observed = True
docs: Synchronizes self's observation status with C's.
          Values of observation are given by obs_vals.
  
          obs_mesh_new and obs_vals_new should already have
          been sliced, as Covariance.observe(..., output_type='o') does.