Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Seperti yang dijelaskan di bagian tentang deklarasi yang dapat dipanggil, saat ini tidak ada alasan untuk secara eksplisit menyatakan spesialisasi untuk fungsi. Topik ini berlaku untuk operasi dan menguraikan cara mendeklarasikan spesialisasi yang diperlukan untuk mendukung funktor tertentu.
Ini adalah masalah yang cukup umum dalam komputasi kuantum untuk memerlukan berdekatan dari transformasi tertentu. Banyak algoritma kuantum memerlukan operasi dan berdampingan untuk melakukan komputasi.
Q# menggunakan komputasi simbolis yang dapat secara otomatis menghasilkan implementasi adjoint yang sesuai untuk implementasi tubuh tertentu. Generasi ini dimungkinkan bahkan untuk implementasi yang secara bebas mencampur komputasi klasik dan kuantum. Namun, ada beberapa batasan yang berlaku dalam kasus ini. Misalnya, pembuatan otomatis tidak didukung karena alasan performa jika implementasi menggunakan variabel yang dapat diubah. Selain itu, setiap operasi yang disebut dalam tubuh menghasilkan kebutuhan adjoint yang sesuai untuk mendukung Adjoint funktor itu sendiri.
Meskipun seseorang tidak dapat dengan mudah membatalkan pengukuran dalam kasus multi-kubit, dimungkinkan untuk menggabungkan pengukuran sehingga transformasi yang diterapkan bersifat unitaris. Dalam hal ini, itu berarti bahwa, meskipun implementasi tubuh berisi pengukuran bahwa sendiri tidak mendukung Adjoint funktor, tubuh secara keseluruhan berdampingan. Meskipun demikian, pembuatan otomatis implementasi adjoint gagal dalam kasus ini. Untuk alasan ini, dimungkinkan untuk menentukan implementasi secara manual.
Kompilator secara otomatis menghasilkan implementasi yang dioptimalkan untuk pola umum seperti konjugasi .
Meskipun demikian, spesialisasi eksplisit mungkin diinginkan untuk menentukan implementasi yang lebih dioptimalkan dengan tangan. Dimungkinkan untuk menentukan satu implementasi dan sejumlah implementasi secara eksplisit.
Nota
Pengkompilasi tidak memverifikasi kebenaran implementasi yang ditentukan secara manual.
Dalam contoh berikut, deklarasi untuk operasi SWAP, yang bertukar status dua qubit q1 dan q2, mendeklarasikan spesialisasi eksplisit untuk versi adjoint-nya dan versi terkontrolnya. Sementara implementasi untuk Adjoint SWAP dan Controlled SWAP dengan demikian ditentukan pengguna, kompilator masih perlu menghasilkan implementasi untuk kombinasi kedua funktor (Controlled Adjoint SWAP, yang sama dengan Adjoint Controlled SWAP).
operation SWAP (q1 : Qubit, q2 : Qubit) : Unit
is Adj + Ctl {
body ... {
CNOT(q1, q2);
CNOT(q2, q1);
CNOT(q1, q2);
}
adjoint ... {
SWAP(q1, q2);
}
controlled (cs, ...) {
CNOT(q1, q2);
Controlled CNOT(cs, (q2, q1));
CNOT(q1, q2);
}
}
Arahan pembuatan otomatis
Saat menentukan cara menghasilkan spesialisasi tertentu, kompilator memprioritaskan implementasi yang ditentukan pengguna. Ini berarti bahwa jika spesialisasi adjoint ditentukan pengguna dan spesialisasi terkontrol dibuat secara otomatis, maka spesialisasi adjoint yang dikontrol dihasilkan berdasarkan adjoint yang ditentukan pengguna dan sebaliknya. Dalam hal ini, kedua spesialisasi ditentukan pengguna. Karena pembuatan otomatis implementasi adjoint tunduk pada lebih banyak batasan, default spesialisasi adjoint terkontrol untuk menghasilkan spesialisasi terkontrol dari implementasi yang ditentukan secara eksplisit dari spesialisasi adjoint.
Dalam kasus implementasi SWAP, opsi yang lebih baik adalah menggabungkan spesialisasi terkontrol untuk menghindari pengkondisian yang tidak perlu mengondisikan eksekusi CNOT pertama dan terakhir pada status qubit kontrol.
Menambahkan deklarasi eksplisit untuk versi adjoint terkontrol yang menentukan arahan pembuatan yang sesuai memaksa pengkompilasi untuk menghasilkan spesialisasi adjoint terkontrol berdasarkan implementasi yang ditentukan secara manual dari versi yang dikontrol sebagai gantinya. Deklarasi eksplisit spesialisasi yang dihasilkan oleh kompilator mengambil formulir
controlled adjoint invert;
dan dimasukkan ke dalam deklarasi SWAP.
Di sisi lain, menyisipkan baris
controlled adjoint distribute;
memaksa pengkompilasi untuk menghasilkan spesialisasi berdasarkan spesialisasi adjoint yang ditentukan (atau dihasilkan). Untuk informasi selengkapnya, lihat ini inferensi spesialisasi parsial proposal untuk detail selengkapnya.
Untuk operasi SWAP, ada opsi yang lebih baik.
SWAP
yang berdampingan sendiri, artinya, itu terbalik sendiri; implementasi adjoint yang ditentukan hanya memanggil isi SWAP dan dinyatakan dengan arahan
adjoint self;
Mendeklarasikan spesialisasi adjoint dengan cara ini memastikan bahwa spesialisasi adjoint terkontrol yang dimasukkan kompilator secara otomatis hanya memanggil spesialisasi terkontrol.
Arahan generasi berikut ada dan valid:
| Spesialisasi | Arahan |
|---|---|
spesialisasi body: |
- |
spesialisasi adjoint: |
self, invert |
spesialisasi controlled: |
distribute |
spesialisasi controlled adjoint: |
self, invert, distribute |
Bahwa semua arahan generasi valid untuk spesialisasi berdampingan terkontrol bukanlah kebetulan; selama funktor berjalan, serangkaian arahan generasi yang valid untuk mengimplementasikan spesialisasi untuk kombinasi funktor selalu merupakan penyatuan set generator yang valid untuk masing-masing.
Selain arahan yang tercantum sebelumnya, direktif auto berlaku untuk semua spesialisasi kecuali body; ini menunjukkan bahwa pengkompilasi harus secara otomatis memilih arahan generasi yang sesuai.
Deklarasi
operation DoNothing() : Unit {
body ... { }
adjoint auto;
controlled auto;
controlled adjoint auto;
}
setara dengan
operation DoNothing() : Unit
is Adj + Ctl { }
Anotasi is Adj + Ctl dalam contoh ini menentukan karakteristik operasi , yang berisi informasi tentang funktor apa yang didukung operasi tertentu.
Meskipun demi keterbacaan, kami sarankan Anda membuat anotasi setiap operasi dengan deskripsi lengkap tentang karakteristiknya, pengompilasi secara otomatis menyisipkan atau menyelesaikan anotasi berdasarkan spesialisasi yang dideklarasikan secara eksplisit. Sebaliknya, kompilator juga menghasilkan spesialisasi yang tidak dinyatakan secara eksplisit tetapi perlu ada berdasarkan karakteristik yang dianotasikan. Kami mengatakan anotasi yang diberikan secara implisit menyatakan spesialisasi ini. Pengkompilasi secara otomatis menghasilkan spesialisasi yang diperlukan jika bisa, memilih arahan yang sesuai. Q# dengan demikian mendukung inferensi karakteristik operasi dan spesialisasi yang ada berdasarkan anotasi (parsial) dan spesialisasi yang ditentukan secara eksplisit.
Dalam arti tertentu, spesialisasi mirip dengan kelebihan beban individu untuk panggilan yang sama, dengan peringatan bahwa pembatasan tertentu berlaku untuk kelebihan beban yang dapat Anda nyatakan.