code: def do_gate_matrix(self, matrix: np.ndarray,
                         qubits: Sequence[int]) -> 'AbstractQuantumSimulator':
          
          unitary = lifted_gate_matrix(matrix=matrix, qubit_inds=qubits, n_qubits=self.n_qubits)
          self.density = unitary.dot(self.density).dot(np.conj(unitary).T)
          return self
docs: Apply an arbitrary unitary; not necessarily a named gate.
  
          :param matrix: The unitary matrix to apply. No checks are done
          :param qubits: A list of qubits to apply the unitary to.
          :return: ``self`` to support method chaining.