def run_analytically(self, init_state=None, qc=None): """ Simulate the state evolution under the given `qutip.QubitCircuit` with matrice exponentiation. It will calculate the propagator with matrix exponentiation and return a list of :class:`qutip.Qobj`. This method won't include noise or collpase. Parameters ---------- qc: :class:`.QubitCircuit`, optional Takes the quantum circuit to be implemented. If not given, use the quantum circuit saved in the processor by ``load_circuit``. init_state: :class:`qutip.Qobj`, optional The initial state of the qubits in the register. Returns ------- U_list: list A list of propagators obtained for the physical implementation. """ if init_state is not None: U_list = [init_state] else: U_list = [] tlist = self.get_full_tlist() coeffs = self.get_full_coeffs() # Compute drift Hamiltonians H_drift = 0 for drift_ham in self.drift.drift_hamiltonians: H_drift += drift_ham.get_qobj(self.dims) # Compute control Hamiltonians for n in range(len(tlist)-1): H = H_drift + sum( [coeffs[m, n] * self.ctrls[m] for m in range(len(self.ctrls))]) dt = tlist[n + 1] - tlist[n] U = (-1j * H * dt).expm() U = self.eliminate_auxillary_modes(U) U_list.append(U) try: # correct_global_phase are defined for ModelProcessor if self.correct_global_phase and self.global_phase != 0: U_list.append(globalphase( self.global_phase, N=self.num_qubits) ) except AttributeError: pass return U_list
def run_analytically(self, init_state=None, qc=None): """ Simulate the state evolution under the given `qutip.QubitCircuit` with matrice exponentiation. It will calculate the propagator with matrix exponentiation and return a list of :class:`qutip.Qobj`. This method won't include noise or collpase. Parameters ---------- qc: :class:`qutip.qip.QubitCircuit`, optional Takes the quantum circuit to be implemented. If not given, use the quantum circuit saved in the processor by ``load_circuit``. init_state: :class:`qutip.Qobj`, optional The initial state of the qubits in the register. Returns ------- evo_result: :class:`qutip.Result` An instance of the class :class:`qutip.Result` will be returned. """ # TODO change init_state to init_state if init_state is not None: U_list = [init_state] else: U_list = [] tlist = self.get_full_tlist() # TODO replace this by get_complete_coeff coeffs = np.array(self.coeffs) for n in range(len(tlist) - 1): H = sum( [coeffs[m, n] * self.ctrls[m] for m in range(len(self.ctrls))]) dt = tlist[n + 1] - tlist[n] U = (-1j * H * dt).expm() U = self.eliminate_auxillary_modes(U) U_list.append(U) try: # correct_global_phase are defined for ModelProcessor if self.correct_global_phase and self.global_phase != 0: U_list.append(globalphase(self.global_phase, N=self.N)) except AttributeError: pass return U_list