示例#1
0
    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)
示例#2
0
 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