Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
çağrılabilen bildirimler hakkında bölümünde açıklandığı gibi, şu anda işlevler için özelleştirmeleri açıkça bildirmek için bir neden yoktur. Bu konu, işlemler için geçerlidir ve belirli functor'ları desteklemek için gerekli özelleştirmelerin nasıl bildirilmesi gerektiği hakkında ayrıntılı bilgi sağlar.
Belirli bir dönüşümün bitişik olmasını gerektirmek kuantum bilişiminde oldukça yaygın bir sorundur. Birçok kuantum algoritması, hesaplama gerçekleştirmek için hem işlemi hem de bitişikliğini gerektirir.
Q#, belirli bir gövde uygulaması için karşılık gelen bitişik uygulamayı otomatik olarak oluşturabilen sembolik hesaplamalar çalıştırır. Bu nesil, klasik ve kuantum hesaplamalarını serbestçe karıştıran uygulamalar için bile mümkündür. Ancak, bu durumda geçerli olan bazı kısıtlamalar vardır. Örneğin, uygulama değiştirilebilir değişkenleri kullanıyorsa otomatik oluşturma performans nedenleriyle desteklenmez. Ayrıca, gövde içinde çağrılan her işlem, Adjoint functor'ın kendisini desteklemek için karşılık gelen bitişiklik gereksinimlerini oluşturur.
Çok kubitli durumdaki ölçümleri kolayca geri alamasa da, uygulanan dönüşümün ünitesel olması için ölçümleri birleştirmek mümkündür. Bu durumda, vücut uygulaması kendi başına Adjoint funktörünü desteklemeyen ölçümler içerse de, gövdenin tamamen bitişik olduğu anlamına gelir. Yine de, bu durumda adjoint uygulamasını otomatik olarak oluşturma işlemi başarısız olur. Bu nedenle, uygulamayı el ile belirtmek mümkündür.
Derleyici, conjugations gibi yaygın desenler için otomatik olarak iyileştirilmiş uygulamalar oluşturur.
Bununla birlikte, elle daha iyileştirilmiş bir uygulama tanımlamak için açık bir özelleştirme tercih edilebilir. Herhangi bir uygulamayı ve herhangi bir sayıda uygulamayı açıkça belirtmek mümkündür.
Uyarı
Derleyici, el ile belirtilen böyle bir uygulamanın doğruluğunu doğrulamaz.
Aşağıdaki örnekte, bir işlemin bildirimi, q1 ve q2iki kubitin durumunu değiş tokuş eden SWAP, bitişik sürümü ve denetimli sürümü için açık bir özelleştirme bildirir.
Adjoint SWAP ve Controlled SWAP için uygulamalar bu nedenle kullanıcı tanımlı olsa da, derleyicinin yine de her iki functor 'ın (Adjoint Controlled SWAPile aynı olanControlled Adjoint SWAP) birleşimi için uygulamayı oluşturması gerekir.
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);
}
}
Otomatik oluşturma yönergeleri
Belirli bir özelleştirmenin nasıl oluşturulacağı belirlenirken, derleyici kullanıcı tanımlı uygulamalara öncelik tanır. Başka bir deyişle, bir bitişik özelleştirme kullanıcı tanımlıysa ve denetimli bir özelleştirme otomatik olarak oluşturulduysa, denetimli bitişiklik özelleştirmesi kullanıcı tanımlı bitişiklik temelinde oluşturulur ve tam tersi de geçerlidir. Bu durumda, her iki özelleştirme de kullanıcı tanımlıdır. Bir bitişik uygulamanın otomatik olarak oluşturulması daha fazla sınırlamaya tabi olduğundan, denetimli bitişiklik özelleştirmesi varsayılan olarak adjoint özelleştirmesinin açıkça tanımlanmış uygulamasının denetimli uzmanlığını oluşturmaya ayarlanır.
SWAP uygulaması söz konusu olduğunda, denetim kubitlerinin durumu üzerinde birinci ve son CNOT yürütülmesini gereksiz yere koşullandırmamak için denetimli özelleştirmeyi bitişik hale getirmek daha iyi bir seçenektir.
Denetimli adjoint sürümü için uygun bir oluşturma yönergesi belirten açık bir bildirim ekleme derleyiciyi denetimli sürümün el ile belirtilen uygulamasına göre denetimli bitişiklik özelleştirmesi oluşturmaya zorlar. Derleyici tarafından oluşturulan bir özelleştirmenin böyle açık bir bildirimi formu alır
controlled adjoint invert;
ve SWAPbildiriminin içine eklenir.
Öte yandan, satırı ekleme
controlled adjoint distribute;
derleyiciyi, tanımlanan (veya oluşturulan) bitişik özelleştirmeye göre özelleştirme oluşturmaya zorlar. Daha fazla bilgi için bu kısmi özelleştirme çıkarımı teklifine bakın.
SWAPişlemi için daha iyi bir seçenek vardır.
SWAP kendi kendine bitişik , yani kendi tersidir; adjoint'in tanımlı uygulaması yalnızca SWAP gövdesini çağırır ve yönergesi ile ifade edilir
adjoint self;
Bitişik özelleştirmenin bu şekilde bildirilmesi, derleyicinin otomatik olarak eklendiği denetimli bitişik özelleştirmenin yalnızca denetimli özelleştirmeyi çağırmasını sağlar.
Aşağıdaki oluşturma yönergeleri vardır ve geçerlidir:
| Uzmanlığı | Yönerge -leri |
|---|---|
body uzmanlığı: |
- |
adjoint uzmanlığı: |
self, invert |
controlled uzmanlığı: |
distribute |
controlled adjoint uzmanlığı: |
self, invert, distribute |
Tüm nesil yönergelerinin denetimli bir bitişiklik uzmanlığı için geçerli olması tesadüf değildir; functors olduğu sürece, functors bir bileşimi için uzmanlık uygulamak için geçerli nesil yönergeleri kümesi her zaman her biri için geçerli oluşturucular kümesinin birleşimidir.
Daha önce listelenen yönergelere ek olarak, auto yönergesi bodydışındaki tüm uzmanlıklar için geçerlidir; derleyicinin otomatik olarak uygun bir oluşturma yönergesi seçmesi gerektiğini gösterir.
Bildirim
operation DoNothing() : Unit {
body ... { }
adjoint auto;
controlled auto;
controlled adjoint auto;
}
eşittir
operation DoNothing() : Unit
is Adj + Ctl { }
Bu örnekteki ek açıklama is Adj + Ctl,belirli bir işlemin hangi functor'ları desteklediğiyle ilgili bilgileri içerenişlem özelliklerini belirtir.
Okunabilirlik açısından, her işleme özelliklerinin tam bir açıklamasıyla açıklama eklemenizi öneririz, ancak derleyici açıkça bildirilen özelleştirmelere göre ek açıklamayı otomatik olarak ekler veya tamamlar. Buna karşılık, derleyici açıkça bildirilmeyen ancak açıklamalı özelliklere göre var olması gereken özelleştirmeler de oluşturur. Verilen ek açıklamanın bu özelleştirmelerin örtük olarak bildirileceğini söylüyoruz. Derleyici, uygun bir yönerge seçerek gerekli özelleştirmeleri otomatik olarak oluşturur. Q# bu nedenle hem işlem özelliklerinin hem de (kısmi) ek açıklamalara ve açıkça tanımlanmış özelleştirmelere dayalı mevcut özelleştirmelerin çıkarımını destekler.
Bir anlamda, özelleştirmeler aynı çağrılabilen için tek tek aşırı yüklemelere benzer ve bildirebileceğiniz aşırı yüklemeler için belirli kısıtlamaların geçerli olduğu uyarısını gösterir.