Setara 'Hello World' di dunia D-Wave adalah contoh kotak-kotak 2D. Dalam contoh ini, Anda diberi grafik kotak berikut dengan 4 simpul:
Mari kita mendefinisikan bahwa kita mewarnai simpul hitam jika dan putih jika . Tujuannya adalah untuk membuat pola kotak-kotak dengan empat simpul pada grafik. Ada berbagai cara untuk mendefinisikan
dan untuk mencapai hasil ini. Pertama-tama, ada dua kemungkinan solusi untuk masalah ini: σ i = - 1 σ i = + 1 jam Jσsayaσsaya= - 1σsaya= + 1hJ
Annealer kuantum D-Wave meminimalkan Ising Hamiltonian yang kami definisikan dan penting untuk memahami efek dari pengaturan coupler yang berbeda. Perhatikan misalnya coupler :J0 , 1
Jika kita atur ke , Hamiltonian diminimalkan jika kedua qubit mengambil nilai yang sama. Kami mengatakan skrup negatif berkorelasi . Sedangkan jika kita mengaturnya ke , Hamiltonian diminimalkan jika dua qubit mengambil nilai yang berlawanan. Dengan demikian, skrup positif anti-berkorelasi .J 0 , 1 = + 1J0 , 1= - 1J0 , 1= + 1
Dalam contoh kotak-kotak, kami ingin anti-mengkorelasikan setiap pasangan qubit tetangga yang menimbulkan Hamiltonian berikut:
H= σ0σ1+ σ0σ2+ σ1σ3+ σ2σ3
Demi demonstrasi, kami juga menambahkan istilah bias pada qubit ke- sehingga kami hanya mendapatkan solusi # 1. Solusi ini memerlukan dan oleh karena itu kami menyetel biasnya . Hamiltonian terakhir sekarang:σ 0 = - 1 jam 0 = 10σ0= - 1h0= 1
H= σ0+ σ0σ1+ σ0σ2+ σ1σ3+ σ2σ3
Jadi mari kita kode itu!
CATATAN: Anda MEMBUTUHKAN akses ke Layanan Cloud D-Wave untuk apa pun agar berfungsi.
Pertama-tama, pastikan Anda telah menginstal paket Python dwave_sapi2
( https://cloud.dwavesys.com/qubist/downloads/ ). Semuanya akan menjadi Python 2.7 karena D-Wave saat ini tidak mendukung versi Python yang lebih tinggi. Yang sedang berkata, mari kita impor hal-hal penting:
from dwave_sapi2.core import solve_ising
from dwave_sapi2.embedding import find_embedding, embed_problem, unembed_answer
from dwave_sapi2.util import get_hardware_adjacency
from dwave_sapi2.remote import RemoteConnection
Untuk terhubung ke D-Wave Solver API Anda akan memerlukan token API yang valid untuk solver SAPI mereka, URL SAPI dan Anda harus memutuskan prosesor kuantum mana yang ingin Anda gunakan:
DWAVE_SAPI_URL = 'https://cloud.dwavesys.com/sapi'
DWAVE_TOKEN = [your D-Wave API token]
DWAVE_SOLVER = 'DW_2000Q_VFYC_1'
Saya merekomendasikan menggunakan D-Wave 2000Q Virtual Full Yield Chimera (VFYC) yang merupakan chip yang berfungsi penuh tanpa qubit mati! Berikut tata letak chip Chimera:
Pada titik ini saya membagi tutorial menjadi dua bagian yang berbeda. Di bagian pertama, kami secara manual menyematkan masalah ke grafik perangkat keras Chimera dan di bagian kedua kami menggunakan heuristik penyematan D-Wave untuk menemukan penyematan perangkat keras.
Penanaman manual
Unit sel di sudut kiri atas pada tata letak chip D-Wave 2000Q di atas terlihat seperti ini:
Perhatikan, bahwa tidak semua skrup divisualisasikan dalam gambar ini. Seperti yang Anda lihat, tidak ada coupler antara qubit dan qubit yang perlu kita terapkan secara langsung pada grafik persegi di atas. Itu sebabnya kita sekarang mendefinisikan ulang , , dan . Kami kemudian melanjutkan dan mendefinisikan sebagai daftar dan sebagai kamus:010 → 01 → 42 → 73 → 3hJ
J = {(0,4): 1, (4,3): 1, (3,7): 1, (7,0): 1}
h = [-1,0,0,0,0,0,0,0,0]
h memiliki 8 entri karena kami menggunakan qubit 0 hingga 7. Kami sekarang membuat koneksi ke API Solver dan meminta pemecah D-Wave 2000Q VFYC:
connection = RemoteConnection(DWAVE_SAPI_URL, DWAVE_TOKEN)
solver = connection.get_solver(DWAVE_SOLVER)
Sekarang, kita dapat menentukan jumlah pembacaan dan memilih answer_mode
untuk menjadi "histogram" yang sudah mengurutkan hasil berdasarkan jumlah kemunculan bagi kita. Kami sekarang siap untuk menyelesaikan contoh Ising dengan annealer kuantum D-Wave:
params = {"answer_mode": 'histogram', "num_reads": 10000}
results = solve_ising(solver, h, J, **params)
print results
Anda harus mendapatkan hasil berikut:
{
'timing': {
'total_real_time': 1655206,
'anneal_time_per_run': 20,
'post_processing_overhead_time': 13588,
'qpu_sampling_time': 1640000,
'readout_time_per_run': 123,
'qpu_delay_time_per_sample': 21,
'qpu_anneal_time_per_sample': 20,
'total_post_processing_time': 97081,
'qpu_programming_time': 8748,
'run_time_chip': 1640000,
'qpu_access_time': 1655206,
'qpu_readout_time_per_sample': 123
},
'energies': [-5.0],
'num_occurrences': [10000],
'solutions': [
[1, 3, 3, 1, -1, 3, 3, -1, {
lots of 3 's that I am omitting}]]}
Seperti yang Anda lihat, kami mendapatkan energi keadaan dasar yang benar ( energies
) . String solusi penuh dengan 's yang merupakan hasil default untuk qubit yang tidak digunakan / tidak terukur dan jika kita menerapkan transformasi terbalik - , , dan - kita mendapatkan string solusi yang benar . Selesai!- 5.030 → 04 → 17 → 23 → 3[ 1 , - 1 , - 1 , 1 ]
Penyematan heuristik
Jika Anda mulai membuat instance Ising yang lebih besar dan lebih besar, Anda tidak akan dapat melakukan penyematan manual. Jadi misalkan kita tidak dapat secara manual menanamkan contoh kotak-kotak 2D kami. dan kemudian tetap tidak berubah dari definisi awal kami:Jh
J = {(0,1): 1, (0,2): 1, (1,3): 1, (2,3): 1}
h = [-1,0,0,0]
Kami kembali membuat koneksi jarak jauh dan mendapatkan contoh solver D-Wave 2000Q VFYC:
connection = RemoteConnection(DWAVE_SAPI_URL, DWAVE_TOKEN)
solver = connection.get_solver(DWAVE_SOLVER)
Untuk menemukan embedding masalah kita, kita perlu terlebih dahulu mendapatkan matriks kedekatan dari grafik perangkat keras saat ini:
adjacency = get_hardware_adjacency(solver)
Sekarang mari kita coba mencari penyisipan masalah kita:
embedding = find_embedding(J.keys(), adjacency)
Jika Anda berurusan dengan instance Ising besar, Anda mungkin ingin mencari embeddings di banyak utas (diparalelkan dengan banyak CPU) dan kemudian memilih embedding dengan panjang rantai terkecil! Sebuah rantai adalah ketika beberapa qubit dipaksa untuk bertindak sebagai qubit tunggal dalam rangka meningkatkan derajat konektivitas. Namun, semakin lama rantai semakin besar kemungkinan rusak. Dan rantai yang rusak memberikan hasil yang buruk!
Kami sekarang siap untuk menanamkan masalah kami ke grafik:
[h, j0, jc, embeddings] = embed_problem(h, J, embedding, adjacency)
j0
jc
J
J = j0.copy()
J.update(jc)
Sekarang, kami siap untuk menyelesaikan masalah yang tertanam:
params = {"answer_mode": 'histogram', "num_reads": 10000}
raw_results = solve_ising(solver, h, J, **params)
print 'Lowest energy found: {}'.format(raw_results['energies'])
print 'Number of occurences: {}'.format(raw_results['num_occurrences'])
Itu raw_results
tidak akan masuk akal bagi kita kecuali kita membuka masalah. Dalam hal, beberapa rantai terputus, kami memperbaikinya melalui suara terbanyak sebagaimana ditentukan oleh argumen opsional broken_chains
:
unembedded_results = unembed_answer(raw_results['solutions'],
embedding, broken_chains='vote')
print 'Solution string: {}'.format(unembedded_results)
Jika Anda menjalankan ini, Anda harus mendapatkan hasil yang benar di semua pembacaan:
Lowest energy found: [-5.0]
Number of occurences: [10000]
Solution string: [[1, -1, -1, 1]]
Saya harap ini menjawab pertanyaan Anda dan saya sangat merekomendasikan memeriksa semua parameter tambahan yang dapat Anda berikan ke solve_ising
fungsi untuk meningkatkan kualitas solusi Anda seperti num_spin_reversal_transforms
atau postprocess
.