プロジェクトを操作する Q# 方法
Azure Quantum Development Kitでは、プロジェクトを定義 Q# できます。プロジェクトは、互いの操作と機能にアクセスできる複数 Q# のファイルを含むフォルダー構造です。 プロジェクトは、ソース コードを論理的に整理するのに役立ちます。 外部ソースからアクセスできる外部依存関係またはカスタム ライブラリとしてプロジェクトを使用することもできます。
Q#プロジェクトには、qsharp.jsonという名前のマニフェスト ファイルと、指定したフォルダー構造内の 1 つ以上の *.qs ファイルが含まれていますQ#。 ユーザーが VS Code で *.qs ファイルを開くか、Jupyter Notebook または Python ファイルで設定 project_root
すると、コンパイラは、周囲のフォルダー階層でマニフェスト ファイルを検索し、プロジェクトのスコープを決定します。 マニフェスト ファイルが見つからない場合、コンパイラは 1 つのファイル モードで動作します。 プロジェクトは Q# 、手動で作成することも、VS Code で直接作成することもできます。
外部Q#プロジェクトは、別のディレクトリまたはパブリック GitHub リポジトリに存在し、ステートメントを使用export
して、外部プログラムからアクセスできる関数と操作を定義する標準Q#プロジェクトです。 プログラムは、外部プロジェクトをマニフェスト ファイルの依存関係として定義し、ステートメントを使用 import
して外部プロジェクトの項目 (操作、関数、構造体、および名前空間) にアクセスします。 詳細については、「外部依存関係としてのプロジェクトの使用」を参照してください。
前提条件
- Azure サブスクリプションの Azure Quantum ワークスペース。 ワークスペースを作成するには、Azure Quantum ワークスペースの作成に関するページを参照してください。
- Azure Quantum Development Kit 拡張機能と Python 拡張機能がインストールされた Visual Studio Code。
- 外部プロジェクトをパブリック GitHub リポジトリに発行する予定の場合は、GitHub アカウント。
Python プログラムを実行する場合は、次のものが必要です。
- Python と Pip がインストールされた Python 環境。
- Azure Quantum
qsharp
とazure-quantum
パッケージ。
プロジェクトを定義するQ#
Q#プロジェクトは、qsharp.jsonという名前のマニフェスト ファイルと src フォルダー (ソース ファイルを含むQ#) の存在によって定義され、どちらもプロジェクトのルート フォルダーに存在する必要があります。 プログラムと外部プロジェクトの場合 Q# 、コンパイラは Q# プロジェクト フォルダーを自動的に検出します。 Python プログラムと Jupyter Notebook の場合は、呼び出しでプロジェクト フォルダーを Q# 指定する qsharp.init
必要があります。 ただし、プロジェクトの Q# フォルダー構造は、すべての種類のプログラムで同じままです。
プロジェクト フォルダー (Q# プログラム) の定義
VS Code で *.qs ファイルを開くと、 Q# コンパイラはフォルダー構造内でマニフェスト ファイルを上方向に検索します。 マニフェスト ファイルが見つかると、コンパイラは /src ディレクトリまたはそのサブディレクトリ内のすべての Q# ファイルを含めます。 各ファイルの項目は、プロジェクト内の他のすべてのファイルで使用できます。
たとえば、次のフォルダー構造が考えられます。
- Teleportation_project
- qsharp.json
- src
- Main.qs
- TeleportOperations
- TeleportLib.qs
- PrepareState
- PrepareStateLib.qs
ファイル /src/TeleportOperation/PrepareState/PrepareStateLib.qs を開くと、コンパイラは次のようになりますQ#。
- qsharp.jsonの /src/TeleportOperation/PrepareState/ を確認します。
- qsharp.jsonの /src/TeleportOperation を確認します。
- /src でqsharp.jsonをチェックします。
- qsharp.jsonを確認 / します。
- /プロジェクトのルート ディレクトリとして確立し、マニフェスト ファイルの設定に従って、プロジェクトのルートの下にあるすべての *.qs ファイルを含めます。
マニフェスト ファイルの作成
マニフェスト ファイルは、qsharp.jsonという名前の単純な.json ファイルで、必要に応じて作成者、ライセンス、および lint フィールドを含めることができます。 実行可能な最小マニフェスト ファイルは文字列 {}
です。 VS Code でプロジェクトを Q# 作成すると、最小限のマニフェスト ファイルが自動的に作成されます。
{}
マニフェスト ファイルの例
マニフェスト ファイルでプロジェクトのスコープ Q# を定義する方法の例を次に示します。
この例では、 author が指定された唯一のフィールドであるため、このディレクトリ内のすべての *.qs ファイルとそのすべてのサブディレクトリがプロジェクトに Q# 含まれます。
{ "author":"Microsoft", "license": "MIT" }
Q#プロジェクト内では、マニフェスト ファイルを使用して VS Code Q# リンター設定を微調整することもできます。 既定では、次の 3 つのリンター ルールがあります。
needlessParens
: default =allow
divisionByZero
: default =warn
redundantSemicolons
: default =warn
マニフェスト ファイルを使用して、各ルールを次
warn
error
のいずれかにallow
設定できます。{ "author":"Microsoft", "lints": [ { "lint": "needlessParens", "level": "allow" }, { "lint": "redundantSemicolons", "level": "warn" }, { "lint": "divisionByZero", "level": "error" } ] }
マニフェスト ファイルを使用して外部プロジェクトを依存関係として定義し、その外部 Q# プロジェクトの操作と関数にリモートでアクセスすることもできます。 詳細については、「外部依存関係としてのプロジェクトの使用」を参照してください。
Q# プロジェクトの要件とプロパティ
次の要件と構成は、すべての Q# プロジェクトに適用されます。
プロジェクトに含める *.qs ファイルはすべて、src という名前のフォルダーの下Q#になければなりません。このフォルダーは、 . VS Code でプロジェクトを Q# 作成すると、
/src
フォルダーが自動的に作成されます。マニフェスト ファイルは、src フォルダーと同じレベルにする必要があります。 VS Code でプロジェクトを Q# 作成すると、最小限のファイルが自動的に作成されます。
ステートメントを使用して
import
、プロジェクト内の他のファイルの操作と関数を参照します。import MyMathLib.*; //imports all the callables in the MyMathLib namespace ... Multiply(x,y);
名前空間を使用して個別に参照する
MyMathLib.Multiply(x,y);
プロジェクトの場合 Q# のみ
- 1 つの操作で定義されたエントリ ポイントを持つことは、プロジェクト内 Q# の 1 つの
Main()
*.qs ファイルだけです。 - エントリ ポイント定義を含む *.qs ファイルは、マニフェスト ファイルの下の任意のレベルに配置できます。
- プロジェクト内の任意の場所 Q# にある *.qs ファイルからキャッシュされた操作または関数は、VS Code の予測テキストに表示されます。
- 選択した操作または関数の名前空間がまだインポートされていない場合、VS Code によって必要な
import
ステートメントが自動的に追加されます。
プロジェクトを作成する Q# 手順
これらの手順はすべての Q# プロジェクトに適用されます。
VS Code ファイル エクスプローラーで、プロジェクトのルート フォルダーに使用するフォルダーを右クリックし、[プロジェクトの作成] を選択するか、フォルダーを開いて [コマンド パレットQ#>の表示>: プロジェクトのQ#作成...] を選択します。Q# Q#
VS Code は、フォルダーに最小限のマニフェスト ファイルを作成し、テンプレート ファイルを含む
/src
フォルダーをMain.qs
追加します。必要に応じてマニフェスト ファイルを編集します。 マニフェスト ファイルの例を参照してください。
フォルダーの下にソース ファイルを Q# 追加して
/src
整理します。Python プログラムまたは Jupyter Notebook からプロジェクトにQ#アクセスする場合は、 を使用してルート フォルダーパスを
qsharp.init
設定します。 この例では、プログラムがプロジェクトの /src フォルダー Q# 内にあるものとします。qsharp.init(project_root = '../Teleportation_project')
VS Code でファイルのみを Q# 使用している場合、ファイルを Q# 開くと、コンパイラはマニフェスト ファイルを検索し、プロジェクトのルート フォルダーを決定し、サブフォルダーで *.qs ファイルをスキャンします。
Note
手順 2 でマニフェスト ファイルとフォルダーを /src
手動で作成することもできます。
プロジェクトの例
この量子テレポート プログラムは、前に示した単一フォルダー構造に基づくプロジェクトの Q# 例であり、VS Code のローカル シミュレーターで実行されます。 Azure Quantum ハードウェアまたはサード パーティのシミュレーターでプログラムを実行するには、プログラムをコンパイルして Azure ワークスペースに接続する手順については、「プログラムと VSCode の概要Q#」を参照してください。
この例では、次のディレクトリ構造を使用します。
- Teleportation_project
- qsharp.json
- src
- Main.qs
- TeleportOperations
- TeleportLib.qs
- PrepareState
- PrepareStateLib.qs
マニフェスト ファイルには、作成者フィールドとライセンス フィールドが含まれています。
{
"author":"Microsoft",
"license":"MIT"
}
Q# ソース ファイル
メイン ファイル Main.qs にはエントリ ポイントが含まれており、TeleportLib.qs から名前空間を TeleportOperations.TeleportLib
参照します。
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 は操作をTeleport()
定義し、PrepareStateLib.qs から操作を呼び出PrepareBellPair()
します。
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);
}
PrepareStateLib.qs ファイルには、ベル ペアを作成するための標準の再利用可能な操作が含まれています。
operation PrepareBellPair(left : Qubit, right : Qubit) : Unit is Adj + Ctl {
H(left);
CNOT(left, right);
}
プログラムの実行
プログラムを実行している環境のタブを選択します。
このプログラムを実行するには、VS Code で Main.qs ファイルを開き、[実行] を選択します。
外部依存関係としてのプロジェクトの構成Q#
プロジェクトは Q# 、他のプロジェクトの外部依存関係として構成することもできます。ライブラリと同様に動作し、外部 Q# プロジェクトの関数と操作を複数 Q# のプロジェクトで使用できます。 外部依存関係は、ドライブ共有上に存在することも、パブリック GitHub リポジトリに公開することもできます。
プロジェクトを Q# 外部依存関係として使用するには、次の手順を実行する必要があります。
- 外部プロジェクトを依存関係として、呼び出し元プロジェクトのマニフェスト ファイルに追加します。
- 外部プロジェクトが GitHub に発行されている場合は、外部プロジェクトのマニフェスト ファイルに "files" プロパティを追加します。
- 外部プロジェクトにステートメントを追加
export
します。 - 呼び出し元のプロジェクトにステートメントを追加
import
します。
マニフェスト ファイルの構成
外部 Q# プロジェクトは、ローカルまたはネットワーク ドライブ共有上に配置することも、パブリック GitHub リポジトリに発行することもできます。
呼び出し元のプロジェクト マニフェスト ファイル
ドライブ共有上の外部プロジェクトに依存関係を追加するには、呼び出し元プロジェクトのマニフェスト ファイルで依存関係を定義します。
{
"author": "Microsoft",
"license": "MIT",
"dependencies": {
"MyDependency": {
"path": "/path/to/project/folder/on/disk"
}
}
}
ここで、"MyDependency" は、操作を呼び出すときに名前空間を識別するユーザー定義の文字列です。 たとえば、"MyMathFunctions" という名前の依存関係を作成する場合、その依存関係 MyMathFunctions.MyFunction()
から関数を呼び出します。
パブリック GitHub リポジトリに発行されたプロジェクトに依存関係を追加するには
{
"author": "Microsoft",
"dependencies": {
"MyDependency": {
"github": {
"owner": "GitHubUser",
"repo": "GitHubRepoName",
"ref": "CommitHash",
"path": "/path/to/dependency"
}
}
}
- GitHub の依存関係の場合、"ref" は GitHub refspec を参照します。 特定のバージョンの依存関係に依存できるように、コミット ハッシュを常に使用することをお勧めします。
外部プロジェクト マニフェスト ファイル
外部Q#プロジェクトがパブリック GitHub リポジトリに発行されている場合は、プロジェクトで使用されるすべてのファイルを含め、外部プロジェクトのマニフェスト ファイルに files プロパティを追加する必要があります。
{
"author": "Microsoft",
"license": "MIT",
"files": [ "src/MyMathFunctions.qs", "src/Strings/MyStringFunctions.qs" ]
}
"files" プロパティは、インポート "path"
する外部プロジェクト (つまり、ローカル ファイルパスベースのインポート) では省略可能です。 GitHub に発行されたプロジェクトにのみ必要です。
export ステートメントの使用
外部プロジェクトの関数と操作を呼び出し元のプロジェクトからアクセスできるようにするには、ステートメントを export
使用します。 ファイル内の任意またはすべての呼び出し可能な呼び出し可能ファイルをエクスポートできます。 ワイルドカード構文はサポートされていません。エクスポートする呼び出し可能な各呼び出しを指定する必要があります。
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;
import ステートメントの使用
呼び出し元のプログラムでは、ステートメントを使用 import
して、外部依存関係の項目を使用できるようにします。 import
ステートメントは、マニフェスト ファイル内の依存関係に対して定義されている名前空間を使用します。 たとえば、この依存関係の場合
{
"author": "Microsoft",
"license": "MIT",
"dependencies": {
"MyMathFunctions": {
"path": "/path/to/project/folder/on/disk"
}
}
}
次のように呼び出し可能ファイルをインポートします。
import MyMathFunctions.MyFunction; // imports "MyFunction()" from the namespace
...
このステートメントでは import
、ワイルドカードの構文とエイリアスもサポートされています
// 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;
Note
ライブラリと名前空間をQ#参照するために使用される現在使用open
されているステートメントは引き続きサポートされていますが、最終的には非推奨になります。 それまでは、必要に応じて、ステートメントを使用するように現在のファイルを import
更新できます。 たとえば、open Microsoft.Quantum.Diagnostics;
は import Microsoft.Quantum.Diagnostics.*;
に置き換えることができます。
また、標準Q#ライブラリでステートメントをimport
使用する場合は、ルート名前空間Std
を . たとえば、次 import Microsoft.Quantum.Diagnostics.*;
のように import Std.Diagnostics.*;
記述できます。
外部プロジェクトの例
この例では、前の例と同じテレポート プログラムを使用しますが、呼び出し元のプログラムと呼び出し可能なプログラムを異なるプロジェクトに分割します。
"Project_A" や "Project_B" など、ローカル ドライブに 2 つのフォルダーを作成します。
プロジェクトを作成するQ#手順の手順に従って、各フォルダーにプロジェクトをQ#作成します。
Project_A、呼び出し元のプログラムで、次のコードをマニフェスト ファイルにコピーし、必要に応じてパスを編集Project_B
{ "author": "Microsoft", "license": "MIT", "dependencies": { "MyTeleportLib": { "path": "/Project_B" } } }
Project_Aで、次のコードを 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); } }
Project_Bで、次のコードを 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
Note
PrepareBellPair
この操作は、Project_Aのプログラムから直接呼び出されないため、エクスポートする必要はありません。 Project_Bのローカル スコープ内にあるため、操作によって既にTeleport
アクセスできます。プログラムを実行するには、VS Code で /Project_A/Main.qs を開き、[実行] を選択します。
プロジェクトと暗黙的な名前空間
プロジェクトでは Q# 、*.qs プログラムで名前空間が指定されていない場合、コンパイラはファイル名を名前空間として使用します。 外部依存関係から呼び出し可能な呼び出し可能オブジェクトを参照すると、構文 <dependencyName が使用されます>。<名前空間>。<呼び出し可能。> ただし、ファイルの名前が "Main.qs" の場合、コンパイラは名前空間を想定し、呼び出し元の構文は <dependencyName です>。<前の例import MyTeleportLib.Teleport
のように、呼び出し可能>です。
複数のプロジェクト ファイルを持つことは珍しくないため、呼び出し可能ファイルを参照する場合は、正しい構文を考慮する必要があります。 たとえば、次のファイル構造を持つプロジェクトの場合
- src/
- Main.qs
- MathFunctions.qs
外部依存関係への呼び出しは次のようになります。
import MyTeleportLib.MyFunction; // "Main" namespace is implied
import MyTeleportLib.MathFunctions.MyFunction; // "Math" namespace must be explicit
名前空間の動作の詳細については、「ユーザー名前空間」を参照してください。