Inconsistência no Qiskit Aqua CircuitSampler do Operator Flow

Sep 23 2020

Estou tentando envolver minha cabeça em torno de Qiskit Aqua Operators e me deparei com isto:

Meu código

t=0.5
hamiltonian=get_hamiltonian(1,1) #a four 4 qubit hamiltonian (Transverse field Ising model)
evo_time=Parameter("t")

evo_op=(evo_time*hamiltonian).exp_i()
evo_op1 = evo_op @ (Zero^4)

trotter_op=PauliTrotterEvolution(trotter_mode=Suzuki(reps=10,order=1)).convert(evo_op1)
trotter_op_values=trotter_op.bind_parameters({evo_time: t})

circuit1=trotter_op_values.to_circuit()
backend=Aer.get_backend("qasm_simulator")
circuit1.measure_all()

counts1=execute(circuit1, backend=backend, shots=10024).result().get_counts()

for key in counts1.keys():
    counts1[key]=counts1[key]/10024

a=0
# I had to instantiate again the trotter_op because trotter_op_values.to_circuit()
#didn't create a new circuit and instead, by having done circuit1.measure_all()
# trotter_op was modified as well.

trotter_op=PauliTrotterEvolution(trotter_mode=Suzuki(reps=10,order=1)).convert(evo_op1)
trotter_op_values=trotter_op.bind_parameters({evo_time: t})
sampler=CircuitSampler(backend=Aer.get_backend("qasm_simulator"))
sampler.quantum_instance.shots=10024
results1=sampler.convert(trotter_op_values).primitive

#normalize the results from the circuitsampler
for key in results1.keys():
    a+=results1[key]
for key in results1.keys():
    results1[key]=results1[key]/a

# assert counts1.keys()==results1.keys()
assert sum(counts1.values()) #check normalization
assert sum(results1.values()) #check normalization

for key in results1.keys():
    print("state: {} | Counts1: {} | Results1: {}".format(key,counts1[key], results1[key]))

    
plot_histogram([counts1, results1], legend=["Running the circuit","CircuitSampler from aqua"])

O que eu esperava Já que o evo_op1 é apenas um CircuitStateFncuja inicialização era o estado zero para os 4 qubits então, passar isso para CircuitSamplero CircuitStateFnseria substituído por um DictStateFncujas amplitudes seriam iguais a medir todos os 4 qubits no circuito de trotterização com uma inicialização de estado zero (meu circuit1).

O que eu obtive Os histogramas nunca correspondem, para qualquer valor de texceto t=0. No entanto, há sempre uma semelhança clara entre os gráficos (para pequenos, ta probabilidade de 0000é sempre a maior, por exemplo, e todos os outros estados têm probabilidades semelhantes, mas nunca exatamente iguais)

o que estou perdendo? Foi uma má interpretação do Fluxo do Operador?

Respostas

1 tsgeorgios Sep 23 2020 at 18:01

Bem, você está certo. Depois de CircuitSamplerobter uma DictStateFninformação de fase perdida (consulte os documentos ) nas amplitudes e você terá que tirar o quadrado delas para o gráfico do histograma (não normalizar).

Além disso, lembre-se que a quantidade de fotos não é armazenada no QuantumInstancede CircuitSampler(da forma como você está configurando). Você deveria preferir fazer

qinstance = QuantumInstance(backend, shots=10024)
sampler = CircuitSampler(qinstance)