def do_sample(self, samples, circuit, noise_model=None, initial_state=0, *args, **kwargs) -> QubitWaveFunction: assert (noise_model is None) state = qulacs.QuantumState(self.n_qubits) lsb = BitStringLSB.from_int(initial_state, nbits=self.n_qubits) state.set_computational_basis( BitString.from_binary(lsb.binary).integer) self.circuit.update_quantum_state(state) if hasattr(self, "measurements"): result = {} for sample in range(samples): sample_result = {} for t, m in self.measurements.items(): m.update_quantum_state(state) sample_result[t] = state.get_classical_value(t) sample_result = dict( sorted(sample_result.items(), key=lambda x: x[0])) binary = BitString.from_array(sample_result.values()) if binary in result: result[binary] += 1 else: result[binary] = 1 return QubitWaveFunction(state=result) else: # sample from the whole wavefunction (all-Z measurement) result = state.sampling(samples) return self.convert_measurements(backend_result=result)
def apply_paulistring(self, paulistring: 'PauliString'): """ Inefficient function which computes action of a single paulistring :param paulistring: PauliString :return: Expectation Value """ result = QubitWaveFunction() for k, v in self.items(): arr = k.array c = v for idx, p in paulistring.items(): if p.lower() == "x": arr[idx] = (arr[idx] + 1) % 2 elif p.lower() == "y": c *= 1.0j * (-1) ** (arr[idx]) arr[idx] = (arr[idx] + 1) % 2 elif p.lower() == "z": c *= (-1) ** (arr[idx]) else: raise TequilaException("unknown pauli: " + str(p)) result[BitString.from_array(array=arr)] = c return paulistring.coeff * result