Sulit untuk memikirkan kembali konsep tugas, tetapi hasilnya sepadan.
Catatan penulis : Saya tahu bahwa saya salah menghitung transfer Bragg dalam kasus klasik dan kuantum; Namun, itu cukup dekat dengan kebenaran untuk memahami perbedaan antara pemrograman komputer klasik dan kuantum.
Waktu: di suatu tempat di 2018. Lokasi: saluran busuk di Slaka.
"Apakah kamu kenal Python?"
Pertanyaan-pertanyaan John Timmer, direktur ilmiah Ars Technica, terkadang dapat mengejutkan. Jika mungkin untuk menghamili surat-surat di Slaka dengan hati-hati, maka jawaban saya "Ya" akan mengalir begitu saja.
Ternyata D-Wave memutuskan untuk memberi dunia akses ke pengoptimal kuantumnya melalui API. Ars mengundangnya untuk mencoba, tetapi Anda perlu tahu Python. Saya sudah siap untuk itu.
Saya berasumsi bahwa D-Wave akan merilis semacam API fantastis yang dapat mengambil kode hak milik saya yang membuat programmer menangis, dan mengubahnya menjadi baris yang dioptimalkan kuantum. Sayangnya, ketika saya sampai pada pengoptimal kuantum, ternyata itu bukan. Saya dengan cepat menemukan diri saya tenggelam dalam dokumentasi, mencoba mencari tahu apa yang perlu saya lakukan sama sekali.
Saya pikir perwakilan humas D-Wave memikirkan seseorang yang cukup tahu untuk menjalankan contoh yang sudah jadi. Tapi saya keras kepala. Saya perlu membuat tiga atau empat kemungkinan tugas yang ingin saya uji. Saya ingin mencari tahu: dapatkah saya menguasai proses pemecahan masalah ini pada komputer D-Wave? Seberapa mudah untuk membuat lompatan konseptual dari pemrograman klasik ke bekerja dengan anil kuantum? Apakah setidaknya beberapa tugas saya cocok dengan mesin ini?
Mengungkap kesimpulan yang luar biasa segera, saya akan mengatakan bahwa jawabannya adalah sebagai berikut: mungkin itu tidak cukup "menguasai"; sulit; tidak semua tugas.
Pilihan tugas untuk pemrograman
Terlepas dari cara Anda membayangkan saya, saya bisa disebut programmer yang berlatih. Pada dasarnya, siapa pun dengan pemahaman pemrograman yang baik akan meringis (dan mungkin melakukan pembunuhan) ketika saya melihat kode Python saya.
Namun, saya dapat memunculkan tugas-tugas yang membutuhkan penulisan program untuk menyelesaikannya. Saya perlu, misalnya, sesuatu yang menghitung medan listrik dari satu set elektroda. Sesuatu yang menemukan keadaan dengan energi atom helium minimal. Atau sesuatu yang menghitung peningkatan intensitas cahaya pada awal laser. Tugas-tugas ini paling menarik minat saya. Dan memulai proyek ini, saya tidak tahu apakah arsitektur D-Wave dapat menyelesaikan masalah ini.
Saya memilih dua masalah yang, menurut pendapat saya, dapat bekerja: menemukan anggota set Mandelbrot dan menghitung kontur potensial dari satu set elektroda. Keuntungan dari masalah ini adalah saya dapat dengan cepat menyelesaikannya menggunakan kode klasik dan membandingkan jawaban. Tapi saya dengan cepat mengalami masalah mencoba mencari cara untuk mulai memecahkan masalah ini pada mesin dari D-Wave. Ini membutuhkan perubahan besar dalam memahami tugas, dan pemikiran saya bekerja dengan sangat mudah.
Sebagai contoh, salah satu masalah yang saya temui adalah bahwa kita berurusan dengan angka-angka biner tingkat rendah (terlepas dari kenyataan bahwa mereka diekspresikan dalam bentuk qubit, bukan bit). Ini berarti bahwa, pada kenyataannya, program tidak memiliki tipe. Hampir semua pengalaman pemrograman saya adalah untuk memecahkan masalah fisik menggunakan tipe numerik floating point.
Anda harus berpikir berbeda tentang tugas: jawabannya harus dinyatakan sebagai bilangan biner (idealnya, benar atau salah), dan semua fisika (misalnya, semua bilangan titik apung) harus dinyatakan melalui kombinasi qubit. Bahkan jika hidup saya bergantung padanya, saya tidak akan bisa mencari tahu bagaimana hal ini dapat dilakukan untuk tugas saya. Tenggelam dalam pengajaran, saya membiarkan masalah ini sedikit mendidih dalam jus saya sendiri.
Enam bulan kemudian, saya akhirnya menemukan masalah yang saya kenal yang bisa saya selesaikan dengan komputer D-Wave. Lintasan cahaya melalui serat Bragg grating dapat dinyatakan sebagai masalah biner: apakah foton keluar dari filter, atau tidak? Semua fisika terkandung dalam senyawa qubit, dan jawabannya diekstraksi dari energi larutan.
Bragg gratings
Bragg satu dimensi adalah bahan multilayer. Setiap celah antara dua lapisan memantulkan sejumlah kecil cahaya. Penetrasi total melalui seluruh struktur ditentukan oleh jarak antara celah. Agar cahaya dapat lewat, perlu bahwa gelombang dari interval yang berbeda bertambah dalam fase. Spektrum lulus dari kisi-kisi Bragg ideal dengan 50 lapisan dan pemantulan 0,1% ditunjukkan di bawah ini.

Kode berikut menghasilkan data untuk grafik ini:
ld = np.linspace(ld_center-3e-9, ld_center+3e-9, num_ld) k = 2*np.pi/ld T = np.ones(ld.shape) for j in range(num_layers): T = T*(1-A)*np.cos(j*k*layer_sep)**2
Di sini kita secara eksplisit menghitung kontribusi relatif setiap celah, yang dinyatakan dalam daya optik, yang mencapai celah berikutnya. Gangguan konstruktif dan destruktif diperhitungkan dengan mengurangi atau meningkatkan kontribusi celah, tergantung pada seberapa dekat jarak antara lapisan bertepatan dengan setengah panjang gelombang.
Retasan ini diperlukan karena koneksi qubit diekspresikan hanya dalam bilangan real dan bukan dalam bilangan kompleks (fisika paling baik diekspresikan melalui bilangan kompleks yang berisi amplitudo dan fase cahaya). Namun demikian, output dari kode klasik terlihat kira-kira benar - tidak adanya pita frekuensi sisi sedikit khawatir, yang menunjukkan ketidaklengkapan model, tetapi sejauh ini tidak masalah.
Kode model klasik tidak memiliki pemeriksaan konsistensi. Saya menghitung hasilnya, menunjukkan dengan tepat bagaimana gelombang akan merambat. Bahkan jika asumsi ini ternyata salah, hasil perhitungannya akan sama - walaupun semua persamaan didasarkan pada fisika, tidak mungkin untuk menjamin dalam kode yang mereka gambarkan dengan benar.
Kami lolos ke kuanta
Dalam sistem D-Wave, perlu untuk membuat rantai qubit, yang masing-masing mewakili intensitas cahaya di celah. Setiap qubit dikaitkan dengan tetangganya, dan bobot koneksi mewakili jalur dari satu celah ke celah lainnya, dengan mempertimbangkan jarak antar antarmuka. Jika jarak antara antarmuka sama dengan setengah panjang gelombang, cahaya dapat beresonansi antara dua antarmuka dan meneruskan. Jika jaraknya seperempat dari panjang gelombang, gangguan destruktif dipicu, dan koneksi harus minimal.
Melewati satu celah ditunjukkan pada 99,9%, jadi koneksi antara nol dan qubit pertama adalah
Antara yang pertama dan kedua:
Antara yang kedua dan ketiga:
Dalam rumus ini, d adalah jarak fisik antara lapisan, dan λ adalah panjang gelombang. Jika d / λ = 0,5, maka cosinus sama dengan kesatuan, dan kita bisa berharap untuk transmisi cahaya yang ideal.
Dalam sistem D-Wave, ini berarti bahwa setiap dua qubit yang berdekatan harus terhubung sebagai berikut:
Dalam ungkapan ini, derajat u memperhitungkan pengaruh qubit sebelumnya dan menyederhanakan skema koneksi.
Implementasi tugas
Sekarang, mengetahui cara menghubungkan qubit, kita harus melihat koneksi fisik qubit untuk memutuskan bagaimana menyelesaikan tugas ini. Ini disebut embedding minor.
Kita harus memberi komputer daftar koneksi antara qubit dengan bobotnya. Kita juga harus menentukan penyimpangan yang menunjukkan pentingnya setiap qubit. Dalam kasus kami, semua qubit sama pentingnya, oleh karena itu mereka ditetapkan sebagai -1 untuk semua qubit (saya mengambil nomor ini dari contoh standar). Penyimpangan dan koneksi harus dikaitkan dengan qubit fisik dan hubungan di antara mereka. Dalam kasus tugas besar, menemukan pemetaan seperti itu bisa memakan waktu lama.
Kode untuk menghasilkan hubungan dan penyimpangan cukup sederhana.
Untungnya, D-Wave API akan mencoba menemukan implementasi kecil sendiri. Saya menemukan bahwa itu berfungsi untuk filter dengan 50 lapisan, tetapi tidak dapat mengatasi 100 lapisan. Ini agak aneh bagi saya, karena memiliki 2.000 qubit dan panjang rantai 1 (kita tidak perlu menggabungkan beberapa qubit fisik untuk membuat satu yang logis), sistem harus dapat mengimplementasikan masalah yang lebih besar. Melihat ke belakang, saya percaya bahwa kegagalan itu disebabkan oleh fakta bahwa saya meminta terlalu banyak koneksi nol.
Pendekatan alternatif tidak secara eksplisit mendefinisikan ikatan nol. Ini memberikan algoritma kebebasan untuk menemukan lebih banyak opsi implementasi di mana qubit tidak memiliki koneksi. Saya belum mencoba ini, tetapi pilihan ini menurut saya langkah logis berikutnya.
Bagaimanapun, memulai mesin D-Wave sangat sederhana:
response = EmbeddingComposite(DWaveSampler()).sample_qubo(Q_auto, num_reads=num_runs)
Belajar berbicara dengan sopan
Perbedaan antara algoritma klasik saya dan solusi D-Wave adalah bahwa komputer D-Wave tidak secara langsung mengembalikan hasil yang jelas. Ternyata pecah menjadi banyak bagian. Kami mendapatkan daftar energi, dan yang terkecil darinya harus menjadi solusi. Untuk beberapa putaran (katakanlah 1000) untuk setiap energi, kita mendapatkan berapa kali muncul dalam jawaban. Dan untuk setiap menjalankan kami mendapatkan "respons", nilai qubit. Tidak jelas bagi saya yang mana dari nilai-nilai ini yang dapat (dan dapat) ditafsirkan sebagai melewati filter.
Pada akhirnya, saya memutuskan bahwa energi solusi minimum akan menjadi jawaban terbaik, karena nilai ini dalam arti tertentu mewakili jumlah energi yang tersimpan dalam filter. Oleh karena itu, solusi dengan energi lebih tinggi mewakili permeabilitas filter yang lebih besar, seperti yang ditunjukkan di bawah ini. Mengubah jawaban ini menjadi bagian cahaya yang nyata dibiarkan sebagai pekerjaan rumah bagi mereka yang memahami hal ini.

Dimungkinkan juga untuk mendapatkan representasi fisik dari proses dengan memeriksa nilai-nilai qubit dalam solusi dengan energi terendah. Di bawah ini Anda dapat melihat nilai bit solusi yang sesuai dengan puncak kurva transmisi (500 nm), transmisi 50% (500,6 nm) dan transmisi 5% (501,4 nm).

Di tepi puncak transmisi, qubit cenderung menumpuk dalam kelompok unit. Pada puncaknya, qubit bergantian antara 0 dan 1. Solusi terakhir ini adalah gambar biner tentang bagaimana intensitas cahaya dalam kisi Bragg bervariasi. Dengan kata lain, solusi D-Wave juga menghadirkan fisika secara langsung, yang tidak dapat dikatakan tentang kode klasik saya.
Inilah kekuatan sesungguhnya dari anil kuantum. Ya, saya dapat dengan sempurna menurunkan kurva melewati filter dari perhitungan klasik. Tetapi untuk mendapatkan gambaran tentang apa yang sebenarnya terjadi di dalam, Anda memerlukan kode yang lebih kompleks. Dan dalam anil kuantum, ini sepenuhnya gratis. Menurut saya, ini sangat keren.
Keuntungan lain dari anil kuantum adalah ia menjamin solusi yang konsisten dalam kerangka pilihan saya terhadap bobot ikatan qubit. Ini berarti bahwa solusi komputer kuantum cenderung lebih dapat diandalkan daripada solusi yang diperoleh dari kode klasik.
Diskusi tentang pemrograman kuantum
Bagian tersulit tentang memprogram mesin D-Wave adalah Anda harus berpikir berbeda tentang tugas. Sebagai contoh, saya terbiasa dengan masalah minimisasi ketika kurva bertepatan dengan data. Tetapi saya merasa sangat sulit untuk mengubah cara Anda berpikir tentang masalah fisik sehingga Anda mulai menulis kode untuk menyelesaikannya. Tidak membantu bahwa sebagian besar contoh yang diberikan oleh perusahaan tampak abstrak dan tidak dapat disesuaikan dengan masalah fisik bagi saya. Tetapi situasi ini akan berubah ketika semakin banyak pengguna mulai menerbitkan kode mereka.
Juga, kesulitan mungkin timbul dengan penafsiran jawaban. Pada dasarnya, saya menyukai kesederhanaan API, dan itu bagus untuk mendapatkan ide tambahan secara gratis. Dalam waktu dekat, saya bisa menggunakan D-Wave untuk memecahkan masalah nyata.