code: def update(self, z):
          
  
          if z is None:
              return
  
          # rename for readability and a tiny extra bit of speed
          I = self._I
          gamma = self.gamma
          Q = self.Q
          H = self.H
          P = self.P
          x = self.x
          V_inv = self._V_inv
          F = self.F
          W = self.W
  
          # common subexpression H.T * V^-1
          HTVI = dot(H.T, V_inv)
  
          L = linalg.inv(I - gamma * dot(Q, P) + dot(HTVI, H).dot(P))
  
          # common subexpression P*L
          PL = dot(P, L)
  
          K = dot(F, PL).dot(HTVI)
  
          self.y = z - dot(H, x)
  
          # x = x + Ky
          # predict new x with residual scaled by the H-Infinity gain
          self.x = self.x + dot(K, self.y)
          self.P = dot(F, PL).dot(F.T) + W
  
          # force P to be symmetric
          self.P = (self.P + self.P.T) / 2
  
          # pylint: disable=bare-except
          try:
              self.z = np.copy(z)
          except:
              self.z = copy.deepcopy(z)
docs: Add a new measurement `z` to the H-Infinity filter. If `z` is None,
          nothing is changed.
  
          Parameters
          ----------
          z : ndarray
              measurement for this update.