docs: def update_values(self):
          """
          This method is for updating in the finite horizon case.  It
          shifts the current value function
  
          .. math::
  
               V_t(x) = x' P_t x + d_t
  
          and the optimal policy :math:`F_t` one step *back* in time,
          replacing the pair :math:`P_t` and :math:`d_t` with
          :math:`P_{t-1}` and :math:`d_{t-1}`, and :math:`F_t` with
          :math:`F_{t-1}`
  
          """
          # === Simplify notation === #
          Q, R, A, B, N, C = self.Q, self.R, self.A, self.B, self.N, self.C
          P, d = self.P, self.d
          # == Some useful matrices == #
          S1 = Q + self.beta * dot(B.T, dot(P, B))
          S2 = self.beta * dot(B.T, dot(P, A)) + N
          S3 = self.beta * dot(A.T, dot(P, A))
          # == Compute F as (Q + B'PB)^{-1} (beta B'PA + N) == #
          self.F = solve(S1, S2)
          # === Shift P back in time one step == #
          new_P = R - dot(S2.T, self.F) + S3
          # == Recalling that trace(AB) = trace(BA) == #
          new_d = self.beta * (d + np.trace(dot(P, dot(C, C.T))))
          # == Set new state == #
          self.P, self.d = new_P, new_d