Bagaimana Anda menulis program sederhana untuk perangkat D-Wave?

27

Saya ingin tahu bagaimana pekerjaan untuk perangkat D-Wave ditulis dalam kode dan dikirimkan ke perangkat.

Dalam jawaban itu akan lebih baik untuk melihat contoh spesifik ini untuk masalah sederhana. Saya kira "Hello World" dari perangkat D-Wave akan menjadi seperti menemukan keadaan dasar dari model 2D Ising sederhana , karena ini adalah jenis masalah yang langsung direalisasikan oleh perangkat keras. Jadi mungkin ini akan menjadi contoh yang bagus untuk dilihat. Tetapi jika mereka yang memiliki keahlian, contoh alternatif akan cocok, saya akan senang melihat alternatif.

James Wootton
sumber

Jawaban:

24

Setara 'Hello World' di dunia D-Wave adalah contoh kotak-kotak 2D. Dalam contoh ini, Anda diberi grafik kotak berikut dengan 4 simpul:

                                                  square_graph

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

               checkerboard_solutions

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:

dwave_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:

physical_qubits

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:0100142733hJ

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_modeuntuk 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.0300417233[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)

j0jcJ

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_resultstidak 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_isingfungsi untuk meningkatkan kualitas solusi Anda seperti num_spin_reversal_transformsatau postprocess.

Mark Fingerhuth
sumber
9

Judul dan badan pertanyaan tampaknya mengajukan dua pertanyaan berbeda. Pada judul, Anda bertanya "Bagaimana Anda menulis program sederhana untuk perangkat D-Wave?" perangkat, dan apa kode yang sesuai (yang merupakan pertanyaan yang lebih spesifik)

Saya akan menjawab yang pertama, karena ini adalah pertanyaan yang lebih umum.

Menurut halaman Perangkat Lunak D-Wave :

Sistem D-Wave 2000Q menyediakan API Internet standar (berdasarkan layanan RESTful), dengan perpustakaan klien tersedia untuk C / C ++, Python, dan MATLAB. Antarmuka ini memungkinkan pengguna untuk mengakses sistem baik sebagai sumber daya cloud melalui jaringan, atau diintegrasikan ke dalam lingkungan komputasi tinggi dan pusat data (HPC) mereka. Akses juga tersedia melalui layanan cloud yang dihosting D-Wave. Menggunakan alat pengembangan D-Wave dan perpustakaan klien, pengembang dapat membuat algoritma dan aplikasi dalam lingkungan mereka yang ada menggunakan alat standar industri.

Sementara pengguna dapat mengirimkan masalah ke sistem dalam sejumlah cara yang berbeda, pada akhirnya masalah merupakan seperangkat nilai yang sesuai dengan bobot qubit dan kekuatan skrup. Sistem mengambil nilai-nilai ini bersama dengan parameter lain yang ditentukan pengguna dan mengirimkan instruksi mesin kuantum tunggal (QMI) ke QPU. Solusi masalah sesuai dengan konfigurasi optimal qubit yang ditemukan; yaitu, titik terendah dalam lanskap energi. Nilai-nilai ini dikembalikan ke program pengguna melalui jaringan.

Karena komputer kuantum lebih probabilistik daripada deterministik, banyak nilai dapat dikembalikan, tidak hanya memberikan solusi terbaik yang ditemukan, tetapi juga alternatif lain yang sangat baik untuk dipilih. Pengguna dapat menentukan jumlah solusi yang mereka inginkan sistem untuk kembali.

Pengguna dapat mengirimkan masalah ke komputer kuantum D-Wave dengan beberapa cara:

  1. Menggunakan program dalam C, C ++, Python, atau MATLAB untuk membuat dan menjalankan QMI
  2. Menggunakan alat D-Wave seperti:

    • QSage , seorang penerjemah yang dirancang untuk masalah optimasi

    • ToQ , penerjemah bahasa tingkat tinggi yang digunakan untuk mengatasi masalah kepuasan dan dirancang untuk memungkinkan pengguna "berbicara" dalam bahasa domain masalah mereka

    • qbsolv , pemecah optimisasi partisi hybrid open-source untuk masalah yang lebih besar dari yang akan sesuai dengan aslinya pada QPU. Qbsolv dapat
      diunduh di sini .

    • dw , yang mengeksekusi QMI yang dibuat melalui editor teks

  3. Dengan secara langsung memprogram sistem melalui QMI

Unduh buku putih ini untuk mempelajari lebih lanjut tentang model pemrograman untuk sistem D-Wave

Sanchayan Dutta
sumber
5

Input ke D-Wave adalah daftar interaksi dan baru-baru ini waktu anil dari qubit.

Jsayaj=1

Saya merekomendasikan lampiran dalam makalah ini untuk deskripsi singkat tentang bagaimana perangkat keras D-Wave beroperasi. (Pengungkapan penuh: Saya rekan penulis.)

Andrew O
sumber
2
Mungkin lebih baik jika Anda memasukkan sebagian besar jawaban di sini, daripada di tautan? Menjadi penulis pendamping di koran, Anda mungkin paling cocok untuk membuat ringkasan yang baik.
agaitaarino