らんだむな記憶

blogというものを体験してみようか!的なー

<QT> save_statevector

Representing Qubit States をぽちぽちやってみると

qc.save_statevector()   # Tell simulator to save statevector

AttributeError: 'QuantumCircuit' object has no attribute 'save_statevector'

というエラーが出た。調べた結果、

sim = Aer.get_backend('aer_simulator')  # Tell Qiskit how to simulate our circuit

するとメソッドが追加される・・・らしい。

sim.__class__

qiskit.providers.aer.backends.aer_simulator.AerSimulator

を参考に https://github.com/Qiskit/qiskit-aer/blob/main/qiskit/providers/aer/backends/aer_simulator.py を見ると、確かにメソッドが増えそうな感じのコードが書かれてはいる。

そういう黒魔術的なことはやったことがないので、ちょっと実験をしてみよう:

class Dog:
    pass

dog = Dog()
setattr(dog, 'bark', lambda: 'Woof')
print(dog.bark())

class Cat:
    pass

cat = Cat()
try:
    cat.mew()
except AttributeError as e:
    print(e)

setattr(Cat, 'mew', lambda cls: 'Meow')

print(cat.mew())
print(Cat().mew())

Woof
'Cat' object has no attribute 'mew'
Meow
Meow

となった・・・。なるほどね。

qc.save_statevector()
qobj = assemble(qc)
result = sim.run(qobj).result()

は単に

result = sim.run(qc).result()

でも良さそうに思っているが何かちょっと違うのかもしれない・・・。Simulators — Qiskit 0.36.1 documentation では transpile を使っている。