如 可呼叫宣告一節所述,目前沒有理由明確宣告函式的特製化。 本主題適用於作業,並詳細說明如何宣告必要的特製化以支援特定函式。
量子運算中相當常見的問題,需要特定轉換的相鄰。 許多量子演算法都需要運算和其相鄰來執行計算。
Q# 採用符號計算,可自動針對特定主體實作產生對應的相鄰實作。 即使實作可以自由混合傳統和量子計算,也有可能產生這個層代。 不過,在此案例中會套用一些限制。 例如,如果實作使用可變數,則基於效能考慮,不支援自動產生。 此外,主體內呼叫的每個作業都會產生對應的相鄰專案,以支援 Adjoint 函式本身。
雖然在多量子位案例中無法輕易復原測量,但可以合併度量,讓套用的轉換是一元的。 在此情況下,這表示即使主體實作包含本身不支援 Adjoint 函式的度量,其整體主體是相鄰的。 不過,在此情況下,自動產生相鄰實作會失敗。 基於這個理由,您可以手動指定實作。
編譯程式會自動為常見的模式產生優化實作,例如 串連。
不過,可能需要明確特製化,以手動方式定義更優化的實作。 您可以明確指定任何一個實作和任意數目的實作。
備註
編譯程式不會驗證這類手動指定實作的正確性。
在下列範例中,作業的宣告 SWAP,它會交換兩個量子位的狀態,q1 和 q2,宣告其相鄰版本及其受控制版本的明確特製化。 因此,雖然 Adjoint SWAP 和 Controlled SWAP 的實作是使用者定義的,但編譯程式仍需要產生這兩個函式組合的實作(Controlled Adjoint SWAP,這與 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);
}
}
自動產生指示詞
判斷如何產生特定特製化時,編譯程式會設定使用者定義實作的優先順序。 這表示,如果相鄰特製化是用戶定義的,並且自動產生受控制的特製化,則會根據使用者定義的相鄰項目產生受控制特製化,反之亦然。 在此情況下,這兩個特製化都是用戶定義的。 由於相鄰實作的自動產生受限於更多限制,受控制的相鄰特製化預設會產生明確定義的相鄰特製化實作的受控制特製化。
在 SWAP 實作的情況下,更好的選擇是與受控制特製化接在一起,以避免在控制量子位的狀態上,不必要地調理執行第一個和最後一個 CNOT。
為受控制的相鄰版本新增明確宣告,指定適當的 產生指示詞 強制編譯程式根據手動指定的受控制版本實作產生受控制的相鄰特製化。 編譯程式所產生之特製化的這類明確宣告會採用 格式
controlled adjoint invert;
和會插入至 SWAP的宣告內。
另一方面,插入行
controlled adjoint distribute;
強制編譯程式根據定義的 (或產生的) 相鄰特製化來產生特製化。 如需詳細資訊,請參閱此 部分特製化推斷 提案以取得詳細數據。
針對作業 SWAP,有較佳的選項。
SWAP 是 自我相鄰的,也就是說,它是它自己的反轉:已定義的相鄰實作只會呼叫 SWAP 主體,並以指示詞表示
adjoint self;
以這種方式宣告相鄰特製化可確保編譯程序自動插入的受控制相鄰特製化只會叫用受控制特製化。
下列世代指示詞存在且有效:
| 專業化 | 指令 |
|---|---|
body 特製化: |
- |
adjoint 特製化: |
self、invert |
controlled 特製化: |
distribute |
controlled adjoint 特製化: |
self、invert、distribute |
所有世代指示詞對於受控制的相鄰特製化而言都是有效的,並非巧合:只要函式通勤,實作函式組合特製化的有效產生指示詞集合一律是每一組有效產生器的聯集。
除了先前列出的指示詞之外,指示詞 auto 對所有特製化都有效,但 body除外;指出編譯程式應該自動挑選適當的世代指示詞。
宣告
operation DoNothing() : Unit {
body ... { }
adjoint auto;
controlled auto;
controlled adjoint auto;
}
相當於
operation DoNothing() : Unit
is Adj + Ctl { }
此範例中的註釋 is Adj + Ctl 會指定 作業特性,其中包含特定作業所支援之函式的相關信息。
雖然為了可讀性,我們建議您以其特性的完整描述來標註每個作業,編譯程式會根據明確宣告的特殊化自動插入或完成註釋。 相反地,編譯程式也會產生特製化,這些特製化不會明確宣告,但需要根據批注特性存在。 我們說指定的註釋 隱含宣告這些特製化。 編譯程式會在可以時自動產生必要的特製化,並挑選適當的指示詞。 因此,Q# 支援根據(部分)註釋和明確定義的特製化來推斷作業特性和現有的特製化。
從某種意義上說,特製化類似於相同可呼叫的個別多載,請注意某些限制適用於您可以宣告的多載。