code: def do_gate_matrix(self, matrix: np.ndarray,
                         qubits: Sequence[int]) -> 'AbstractQuantumSimulator':
          
          # e.g. 2-qubit matrix is 4x4; turns into (2,2,2,2) tensor.
          tensor = np.reshape(matrix, (2,) * len(qubits) * 2)
  
          # Note to developers: you can use either einsum- or tensordot- based functions.
          # tensordot seems a little faster, but feel free to experiment.
          # self.wf = targeted_einsum(gate=gate_matrix, wf=self.wf, wf_target_inds=qubits)
          self.wf = targeted_tensordot(gate=tensor, wf=self.wf, wf_target_inds=qubits)
          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.