Cara bekerja dengan Q# proyek
Dengan Azure Quantum Development Kit, Anda dapat menentukan Q# proyek, yang merupakan struktur folder dengan beberapa Q# file yang dapat mengakses operasi dan fungsi satu sama lain. Proyek berguna untuk mengatur kode sumber Anda secara logis. Anda juga dapat menggunakan proyek sebagai dependensi eksternal, atau pustaka kustom, yang dapat diakses dari sumber eksternal.
Proyek Q# berisi Q# file manifes, bernama qsharp.json, dan satu atau beberapa file *.qs dalam struktur folder tertentu. Saat pengguna membuka file *.qs di Visual Studio Code, atau mengatur project_root
dalam file Jupyter Notebook atau Python, pengompilasi mencari hierarki folder di sekitarnya untuk file manifes dan menentukan cakupan proyek. Jika tidak ada file manifes yang ditemukan, pengkompilasi beroperasi dalam mode file tunggal. Proyek Q# dapat dibuat secara manual atau langsung di Visual Studio Code.
Proyek eksternal Q# adalah proyek standar Q# yang berada di direktori lain atau pada repositori GitHub publik dan menggunakan export
pernyataan untuk menentukan fungsi dan operasi mana yang dapat diakses oleh program eksternal. Program menentukan proyek eksternal sebagai dependensi dalam file manifesnya, dan menggunakan import
pernyataan untuk mengakses item (operasi, fungsi, struct, dan namespace) dalam proyek eksternal. Untuk informasi selengkapnya, lihat Menggunakan proyek sebagai dependensi eksternal.
Prasyarat
- Ruang kerja Azure Quantum di langganan Azure Anda. Untuk membuat ruang kerja, lihat Membuat ruang kerja Azure Quantum.
- Visual Studio Code dengan ekstensi Azure Quantum Development Kit dan Python terinstal.
- Akun GitHub, jika Anda berencana untuk menerbitkan proyek eksternal Anda ke repositori GitHub publik.
Untuk menjalankan program Python, Anda juga perlu:
- Lingkungan Python dengan Python dan Pip terinstal.
- Azure Quantum
qsharp
danazure-quantum
paket.
Q# Menentukan proyek
Proyek Q# didefinisikan oleh keberadaan file manifes, bernama qsharp.json, dan folder src (yang berisi Q# file sumber), yang keduanya harus berada di folder akar proyek. Untuk Q# program dan proyek eksternal, Q# pengkompilasi mendeteksi folder proyek secara otomatis. Untuk program Python dan Jupyter Notebooks, Anda harus menentukan Q# folder proyek dengan qsharp.init
panggilan. Struktur folder untuk Q# proyek, bagaimanapun, tetap sama untuk semua jenis program.
Menentukan folder proyek (Q# program)
Saat file *.qs dibuka di Visual Studio Code, pengkompilasi Q# mencari ke atas dalam struktur folder untuk file manifes. Jika menemukan file manifes, pengkompilasi kemudian menyertakan semua Q# file di direktori /src atau subdirektorinya. Setiap item file tersedia untuk semua file lain dalam proyek.
Misalnya, mengingat struktur folder ini:
- Teleportation_project
- qsharp.json
- src
- Main.qs
- TeleportOperations
- TeleportLib.qs
- PrepareState
- PrepareStateLib.qs
saat Anda membuka file /src/TeleportOperation/PrepareState/PrepareStateLib.qs, pengkompilasi Q# :
- Memeriksa /src/TeleportOperation/PrepareState/ untuk qsharp.json.
- Memeriksa /src/TeleportOperation untuk qsharp.json.
- Memeriksa /src untuk qsharp.json.
- / Memeriksa qsharp.json.
- / Menetapkan sebagai direktori akar proyek, dan menyertakan semua file *.qs di bawah akar dalam proyek, sesuai pengaturan file manifes.
Membuat file manifes
File manifes adalah file .json sederhana bernama qsharp.json yang dapat secara opsional menyertakan bidang penulis, lisensi, dan lints . File manifes minimum yang layak adalah string {}
. Saat Anda membuat Q# proyek di Visual Studio Code, file manifes minimal dibuat untuk Anda.
{}
Contoh file manifes
Berikut ini adalah beberapa contoh bagaimana file manifes dapat menentukan cakupan proyek Anda Q# .
Dalam contoh ini, penulis adalah satu-satunya bidang yang ditentukan, dan oleh karena itu semua file *.qs dalam direktori ini dan semua subdirektorinya disertakan dalam Q# proyek.
{ "author":"Microsoft", "license": "MIT" }
Q# Dalam proyek, Anda juga dapat menggunakan file manifes untuk menyempurnakan pengaturan Linter Visual Studio CodeQ#. Secara default, tiga aturan Linter adalah:
needlessParens
: default =allow
divisionByZero
: default =warn
redundantSemicolons
: default =warn
Dengan menggunakan file manifes, Anda dapat mengatur setiap aturan ke
allow
, ,warn
atauerror
, misalnya{ "author":"Microsoft", "lints": [ { "lint": "needlessParens", "level": "allow" }, { "lint": "redundantSemicolons", "level": "warn" }, { "lint": "divisionByZero", "level": "error" } ] }
Anda juga dapat menggunakan file manifes untuk menentukan proyek eksternal Q# sebagai dependensi dan mengakses operasi dan fungsi dari jarak jauh dalam proyek eksternal tersebut. Untuk informasi selengkapnya, lihat Menggunakan proyek sebagai dependensi eksternal.
Q# persyaratan dan properti proyek
Persyaratan dan konfigurasi berikut berlaku untuk semua Q# proyek.
Semua file *.qs yang ingin Anda sertakan dalam proyek harus berada di bawah folder bernama src, yang harus berada di bawah folder akar .Q# Saat Anda membuat Q# proyek di Visual Studio Code,
/src
folder dibuat secara otomatis.File manifes harus berada pada tingkat yang sama dengan folder src . Saat Anda membuat Q# proyek di Visual Studio Code, file minimal dibuat secara otomatis.
Gunakan
import
pernyataan untuk mereferensikan operasi dan fungsi dari file lain dalam proyek.import MyMathLib.*; //imports all the callables in the MyMathLib namespace ... Multiply(x,y);
atau mereferensikannya satu per satu dengan namespace
MyMathLib.Multiply(x,y);
Hanya untuk Q# proyek
- Hanya satu file *.qs dalam proyek yang Q# dapat memiliki titik masuk yang ditentukan, yang ditentukan oleh satu
Main()
operasi. - File *.qs dengan definisi titik entri dapat ditemukan pada tingkat apa pun di bawah file manifes.
- Setiap operasi atau fungsi yang di-cache dari file *.qs di mana saja dalam Q# proyek ditampilkan dalam teks prediktif di Visual Studio Code.
- Jika namespace untuk operasi atau fungsi yang dipilih belum diimpor, Visual Studio Code secara otomatis menambahkan pernyataan yang diperlukan
import
.
Langkah-langkah untuk membuat Q# proyek
Langkah-langkah ini berlaku untuk semua Q# proyek.
Di penjelajah file Visual Studio Code, klik kanan folder yang ingin Anda gunakan untuk folder Q# akar proyek dan pilih Buat Q# proyek, atau buka folder dan pilih Tampilkan > Palet >Q#Perintah : Buat Q# proyek....
Visual Studio Code membuat file manifes minimal di folder, dan menambahkan
/src
folder denganMain.qs
file templat.Edit file manifes sesuai kebutuhan. Lihat Contoh file manifes.
Tambahkan dan atur file sumber Anda Q# di
/src
bawah folder .Jika Anda mengakses Q# proyek dari program Python atau Jupyter Notebook, atur jalur folder akar menggunakan
qsharp.init
. Contoh ini mengasumsikan program Anda berada di folder Q# /src proyek:qsharp.init(project_root = '../Teleportation_project')
Jika Anda hanya Q# menggunakan file di Visual Studio Code, saat Anda membuka Q# file, pengkompilasi mencari file manifes, menentukan folder akar proyek, lalu memindai subfolder untuk file *.qs.
Catatan
Anda juga dapat membuat file manifes dan /src
folder secara manual di langkah 2.
Contoh proyek
Program teleportasi kuantum ini adalah contoh Q# proyek berdasarkan struktur folder tunggal yang ditunjukkan sebelumnya, dan berjalan pada simulator lokal di VS Code. Untuk menjalankan program pada perangkat keras Azure Quantum atau simulator pihak ketiga, lihat Mulai menggunakan Q# program dan VSCode untuk langkah-langkah mengkompilasi program Anda dan menyambungkan ke ruang kerja Azure Anda.
Contoh menggunakan struktur direktori ini:
- Teleportation_project
- qsharp.json
- src
- Main.qs
- TeleportOperations
- TeleportLib.qs
- PrepareState
- PrepareStateLib.qs
File manifes berisi bidang penulis dan lisensi :
{
"author":"Microsoft",
"license":"MIT"
}
Q# file sumber
File utama, Main.qs, berisi titik masuk dan mereferensikan TeleportOperations.TeleportLib
namespace dari TeleportLib.qs.
import TeleportOperations.TeleportLib.Teleport; // references the Teleport operation from TeleportLib.qs
operation Main() : Unit {
use msg = Qubit();
use target = Qubit();
H(msg);
Teleport(msg, target); // calls the Teleport() operation from TeleportLib.qs
H(target);
if M(target) == Zero {
Message("Teleported successfully!");
Reset(msg);
Reset(target);
}
}
TeleportLib.qs mendefinisikan Teleport()
operasi dan memanggil PrepareBellPair()
operasi dari PrepareStateLib.qs.
import TeleportOperations.PrepareState.PrepareStateLib.*; // references the namespace in PrepareStateLib.qs
operation Teleport(msg : Qubit, target : Qubit) : Unit {
use here = Qubit();
PrepareBellPair(here, target); // calls the PrepareBellPair() operation from PrepareStateLib.qs
Adjoint PrepareBellPair(msg, here);
if M(msg) == One { Z(target); }
if M(here) == One { X(target); }
Reset(here);
}
File PrepareStateLib.qs berisi operasi standar yang dapat digunakan kembali untuk membuat pasangan Bell.
operation PrepareBellPair(left : Qubit, right : Qubit) : Unit is Adj + Ctl {
H(left);
CNOT(left, right);
}
Menjalankan program
Pilih tab untuk lingkungan tempat Anda menjalankan program.
Untuk menjalankan program ini, buka file Main.qs di Visual Studio Code dan pilih Jalankan.
Mengonfigurasi Q# proyek sebagai dependensi eksternal
Proyek Q# juga dapat dikonfigurasi sebagai dependensi eksternal untuk proyek lain, bertindak seperti pustaka, di mana fungsi dan operasi dalam proyek eksternal Q# tersedia untuk beberapa Q# proyek. Dependensi eksternal dapat berada di berbagi drive atau diterbitkan ke repositori GitHub publik.
Untuk menggunakan Q# proyek sebagai dependensi eksternal, Anda perlu:
- Tambahkan proyek eksternal sebagai dependensi dalam file manifes proyek panggilan.
- Jika proyek eksternal diterbitkan ke GitHub, tambahkan properti "file" ke file manifes proyek eksternal.
- Tambahkan
export
pernyataan ke proyek eksternal. - Tambahkan
import
pernyataan ke proyek panggilan.
Mengonfigurasi file manifes
Proyek eksternal Q# dapat berada di berbagi drive lokal atau jaringan, atau diterbitkan ke repositori GitHub publik.
File manifes proyek panggilan
Untuk menambahkan dependensi ke proyek eksternal pada berbagi drive, tentukan dependensi dalam file manifes proyek panggilan.
{
"author": "Microsoft",
"license": "MIT",
"dependencies": {
"MyDependency": {
"path": "/path/to/project/folder/on/disk"
}
}
}
di mana "MyDependency" adalah string yang ditentukan pengguna yang mengidentifikasi namespace saat memanggil operasi. Misalnya, jika Anda membuat dependensi bernama "MyMathFunctions", Anda akan memanggil fungsi dari dependensi tersebut dengan MyMathFunctions.MyFunction()
.
Untuk menambahkan dependensi ke proyek yang diterbitkan ke repositori GitHub publik
{
"author": "Microsoft",
"dependencies": {
"MyDependency": {
"github": {
"owner": "GitHubUser",
"repo": "GitHubRepoName",
"ref": "CommitHash",
"path": "/path/to/dependency"
}
}
}
- Untuk dependensi GitHub, "ref" mengacu pada refspec GitHub. Microsoft merekomendasikan untuk selalu menggunakan hash penerapan, sehingga Anda dapat mengandalkan versi dependensi tertentu.
File manifes proyek eksternal
Jika proyek eksternal Q# Anda diterbitkan ke repositori GitHub publik, Anda harus menambahkan properti file ke file manifes proyek eksternal, termasuk semua file yang digunakan dalam proyek.
{
"author": "Microsoft",
"license": "MIT",
"files": [ "src/MyMathFunctions.qs", "src/Strings/MyStringFunctions.qs" ]
}
Properti "file" bersifat opsional untuk proyek eksternal yang diimpor melalui "path"
(yaitu, impor berbasis filepath lokal). Ini hanya diperlukan untuk proyek yang diterbitkan ke GitHub.
Menggunakan pernyataan ekspor
Untuk membuat fungsi dan operasi dalam proyek eksternal dapat diakses oleh proyek panggilan, Anda menggunakan pernyataan tersebut export
. Anda dapat mengekspor salah satu atau semua yang dapat dipanggil dalam file. Sintaks kartubebas tidak didukung, Anda harus menentukan setiap yang dapat dipanggil untuk diekspor.
operation Operation_A() : Unit {
...
}
operation Operation_B() : Unit {
...
}
// makes just Operation_A available to calling programs
export Operation_A;
// makes Operation_A and Operation_B available to calling programs
export Operation_A, Operation_B, etc.;
// makes Operation_A available as 'OpA'
export Operation_A as OpA;
Menggunakan pernyataan impor
Dari program panggilan, Anda menggunakan import
pernyataan untuk membuat item dari dependensi eksternal tersedia. import
pernyataan menggunakan namespace layanan yang ditentukan untuk dependensi dalam file manifes. Misalnya, untuk dependensi ini
{
"author": "Microsoft",
"license": "MIT",
"dependencies": {
"MyMathFunctions": {
"path": "/path/to/project/folder/on/disk"
}
}
}
Anda mengimpor callables sebagai
import MyMathFunctions.MyFunction; // imports "MyFunction()" from the namespace
...
Pernyataan ini import
juga mendukung sintaksis dan alias kartubebas
// imports all items from the "MyMathFunctions" namespace
import MyMathFunctions.*;
// imports the namespace as "Math", all items are accessible via "Math.<callable>"
import MyMathFunctions as Math;
// imports a single item, available in the local scope as "Add"
import MyMathFunctions.MyFunction as Add;
// imports can be combined on one line
import MyMathFunctions.MyFunction, MyMathFunctions.AnotherFunction as Multiply;
Catatan
Pernyataan yang saat ini digunakan open
dalam Q#, yang digunakan untuk mereferensikan pustaka dan namespace layanan, masih didukung tetapi pada akhirnya tidak akan digunakan lagi. Sementara itu, Anda dapat secara opsional memperbarui file Anda saat ini untuk menggunakan pernyataan .import
Misalnya, open Microsoft.Quantum.Diagnostics;
dapat diganti dengan import Microsoft.Quantum.Diagnostics.*;
.
Perhatikan juga bahwa saat menggunakan import
pernyataan dengan pustaka standar Q# , Anda dapat mempersingkat namespace layanan akar menjadi Std
. Misalnya, import Microsoft.Quantum.Diagnostics.*;
dapat ditulis sebagai import Std.Diagnostics.*;
.
Contoh proyek eksternal
Untuk contoh ini, Anda akan menggunakan program teleportasi yang sama dengan contoh sebelumnya, tetapi memisahkan program panggilan dan panggilan ke dalam proyek yang berbeda.
Buat dua folder di drive lokal Anda, misalnya "Project_A" dan "Project_B".
Buat Q# proyek di setiap folder dengan mengikuti langkah-langkah dalam Langkah-langkah untuk membuat Q# proyek.
Dalam Project_A, program panggilan, salin kode berikut ke dalam file manifes, mengedit jalur sesuai kebutuhan untuk Project_B
{ "author": "Microsoft", "license": "MIT", "dependencies": { "MyTeleportLib": { "path": "/Project_B" } } }
Di Project_A, salin kode berikut ke Main.qs
import MyTeleportLib.Teleport; // imports the Teleport operation from the MyTeleportLib namespace defined in the manifest file operation Main() : Unit { use msg = Qubit(); use target = Qubit(); H(msg); Teleport(msg, target); // calls the Teleport() operation from the MyTeleportLib namespace H(target); if M(target) == Zero { Message("Teleported successfully!"); Reset(msg); Reset(target); } }
Di Project_B, salin kode berikut ke Main.qs
operation Teleport(msg : Qubit, target : Qubit) : Unit { use here = Qubit(); PrepareBellPair(here, target); Adjoint PrepareBellPair(msg, here); if M(msg) == One { Z(target); } if M(here) == One { X(target); } Reset(here); } operation PrepareBellPair(left : Qubit, right : Qubit) : Unit is Adj + Ctl { H(left); CNOT(left, right); } export Teleport; // makes the Teleport operation available to external programs
Catatan
Perhatikan bahwa
PrepareBellPair
operasi tidak perlu diekspor karena tidak dipanggil langsung dari program Anda di Project_A. Karena berada dalam cakupan lokal Project_B, itu sudah dapat diakses olehTeleport
operasi.Untuk menjalankan program, buka /Project_A/Main.qs di Visual Studio Code dan pilih Jalankan.
Proyek dan namespace implisit
Dalam Q# proyek, jika namespace tidak ditentukan dalam program *.qs, maka pengkompilasi menggunakan nama file sebagai namespace. Mereferensikan yang dapat dipanggil dari dependensi eksternal lalu menggunakan sintaks dependencyName<>.<namespace> layanan.<dapat dihubungi>. Namun, jika file diberi nama "Main.qs", pengkompilasi mengasumsikan namespace dan sintaks panggilan adalah <dependencyName>.<dapat> dipanggil, seperti dalam contoh sebelumnya, import MyTeleportLib.Teleport
.
Karena tidak jarang memiliki beberapa file proyek, Anda perlu memperhitungkan sintaks yang benar saat mereferensikan yang dapat dipanggil. Misalnya, dalam proyek dengan struktur file berikut
- /Src
- Main.qs
- MathFunctions.qs
panggilan ke dependensi eksternal adalah
import MyTeleportLib.MyFunction; // "Main" namespace is implied
import MyTeleportLib.MathFunctions.MyFunction; // "Math" namespace must be explicit
Untuk informasi selengkapnya tentang perilaku namespace layanan, lihat Namespace pengguna.