Ana içeriğe geç
Dil v0.2.0 · Ön izleme

Tipli program sonuçları ve sembolik hatalar

main için tipli Result değerlerini, tam ok payload'larını, sınırlı sembolik program hatalarını ve motor arızalarından açık ayrımı uzlaştırın.

Program sonuçlarını motor arızalarından ayırın

NM-RFC-0007, kararlı N/M 0.1 return davranışını değiştirmeden main için sınırlı bir Result<T, Error> sözleşmesi sunar. Her yüzey özelliği açıkça uzlaştırmalıdır.

NM-RFC-0007deneysel0.2.0-runtime-experimental
64
hata-kodu byte
1
son return
2
sonuç türü

Tek bildirilmiş sonuç tipi

Bit, Int, Float ve sabit sınırlı diziler kabul edilir. ok(value), T ile tam eşleşmelidir; örtük sayı ve dizi dönüşümü yasaktır.

fn main() -> Result<Array<Int, 4>, Error>

Sınırlı program hataları

error("UPPER_SNAKE_CODE") bilinçli bir kullanıcı-program sonucunu temsil eder. Kodlar sembolik ve sınırlıdır; stack trace veya sağlayıcı ayrıntısı içermez.

return error("NO_VALID_SAMPLE");

İki bağımsız sonuç

SimulationResult.success; parser, compiler, taşıma ve simülatör yürütmesini bildirir. programResult.status programın ok/error sonucunu bildirir; bu nedenle program hatası motor başarısını true bırakır.

success: true · programResult.status: error

Deterministik kontrol akışı

Temel 0.2 sözleşmesi tam bir son top-level return ister ve iç içe dönüşleri reddeder. classicalFunctions ve typedClassicalValues da açıldığında aşağıdaki ölçüm dalları ve yardımcı Result kontrol akışı eklenir; erişilebilir her yol bildirilen tipte dönmelidir.

exactly-one-final-top-level-return

Tipli ölçüm sonucu

module typed_result; fn main() -> Result<Int, Error> {  let q: QReg<1> = qreg[1];  H(q[0]);  let measured: Bit = measure(q[0]);  let encoded: Int = bit_to_int(measured);  return ok(encoded);}

Runtime sonuç sözleşmesi

{
  "success": true,
  "programResult": {
    "contractVersion": "0.2.0-runtime-experimental",
    "status": "error",
    "error": { "code": "NO_VALID_SAMPLE" },
    "line": 8
  }
}

Her yüzeyde açık uzlaşma

parseNMCode(source, { experimental: { functionResults: true, typedClassicalValues: true } })
nm run main.nm --experimental-function-results --experimental-typed-classical-values --json
initializationOptions.nm.experimental.functionResults = true
nm.experimental.functionResults = true
Playground: yeni oturumlarda açık; kayıtlı seçimler korunur

Kararlı fail-closed tanılar

NM-PARSE-066NM-PARSE-067NM-TYPE-025NM-TYPE-026NM-RUNTIME-033

Adlandırılmış klasik fonksiyonlar ve parametreler aşağıda açıklanan ayrı bir deneysel sözleşmeye (NM-RFC-0035) sahiptir. Özyineleme, koşula bağlı dönüşler, genel hata tipleri, serbest metin mesajlar, istisnalar, catch/finally ve sonuç aktarım operatörleri bu sonuç sözleşmesinin dışındadır.

Klasik fonksiyonlar — deneysel

Skaler, sabit dizi, Matrix/Complex ve record/enum parametre ve dönüş tipleriyle hesapları yeniden kullanın; desteklenen türler ve sınırları aşağıdaki bölümlerde açıklanır. checked_observations sarmalayıcısı tipli Result döndürür. Örnek Float: 1 üretir; enabled değerini false yapınca Float: 0, 0.5 argümanını -0.5 yapınca kapı çalışmadan NEGATIVE_THETA hatası döner.

Örneği Playground’da açıp çalıştırın. Klasik fonksiyonlar, tipli değerler ve tipli sonuçlar bu oturumda etkinleşir. Araçlar menüsünden seçenekleri değiştirebilirsiniz; kaydedilen çalışmalar ve paylaşım bağlantıları bunları korur.

Klasik fonksiyonları dene

average(samples) → Float: 1

module classical_runtime; fn double(x: Int) -> Int {  return x * 2;} fn square(x: Float) -> Float {  return x * x;} fn energy(theta: Float, weight: Float) -> Float {  let scaled: Float = weight * square(theta);  return scaled + 0.5;} fn observations(theta: Float, enabled: Bool) -> Array<Float, 2> {  if (!enabled) {    return [0.0, 0.0];  }  return [energy(theta, int_to_float(double(1))), square(1.0)];} fn average(values: Array<Float, 2>) -> Float {  return mean(values);} fn checked_observations(theta: Float, enabled: Bool) -> Result<Array<Float, 2>, Error> {  if (theta < 0.0) {    return error("NEGATIVE_THETA");  }  return ok(observations(theta, enabled));} fn main() -> Result<Float, Error> {  let q = qreg[1];  let enabled: Bool = true;  let samples: Array<Float, 2> = checked_observations(0.5, enabled)?;  let result: Float = average(samples);  Ry(q[0], average(samples));  return ok(result);}

Fonksiyonlar 1–256 elemanlı Array<Int, N> veya Array<Float, N> alabilir, saklayabilir ve döndürebilir. Eleman tipi ve uzunluk tam eşleşmelidir. Yardımcı fonksiyonda ve main içinde Int ifadeyi indis olarak kullanabilir veya mean(values) ile ortalama hesaplayabilirsiniz. Sınırlar çalışma anında denetlenir. Yardımcı dizileri ve normal let dizileri değişmezdir. Main, aşağıdaki dizi mutasyonu sözleşmesiyle açık let mut Int/Float dizilerini destekler; iç içe diziler desteklenmez. Main dinamik indislemesi classicalFunctions ve typedClassicalValues gerektirir.

Bool, Int ve ölçüm Bit tipinden ayrıdır: true/false, !, karşılaştırmalar ve kısa devreli &&/|| kullanılır. Yardımcı fonksiyonlar if (condition) { ... } else { ... } destekler; sonraki bir return kalan yolu kapsıyorsa else yazılmayabilir. Her yol bildirilen tipte dönmelidir. Yalnız seçilen dal çalışır. Dal içindeki yereller dışarı çıkmaz ve dış kapsamdaki bir adı yeniden tanımlayamaz; kardeş dallar aynı adı kullanabilir. Main üst düzey let enabled: Bool ve Result<Bool, Error> destekler. Bool dizileri desteklenmez.

Temel örnek Result<T, Error> döndürür; T, Int, Float, Bool veya 1–256 elemanlı Array<Int, N>/Array<Float, N> olabilir. Yardımcılar temel değer ve Result parametreleri kabul eder. Yardımcılar ve main, Result yerellerini saklayıp eksiksiz ok/error match kollarıyla ele alabilir. Aşağıdaki bölümler bu temel örnekleri tipli hatalar ve bileşik Result değerleriyle genişletir. Main ayrıca örtük sayısal dönüşüm olmadan Bit değerlerini destekler. ok(value), error("CODE") veya err("CODE") eş adıyla dönün. Hata kodu [A-Z][A-Z0-9_]{0,63} biçimine uyar. Result yardımcı çağrısının sonundaki ?, başarılı değeri açar veya hatayı kapsayan fonksiyondan döndürür; bu yardımcı veya main, Result dönüşü bildirmelidir. Main içinde tipli yerel değer helper(...)? ile başlatılabilir; return helper(...) ya da return ok(helper(...)?) kullanılabilir. Argümanlar ve seçilen dallar kaynak değerlendirme sırasını korur; tipli hatalar çalışma zamanı arızalarından ayrıdır. classicalFunctions ve typedClassicalValues yanında functionResults açıkça etkinleştirilmelidir. Sayısal helper(...)? değerleri desteklenen kapı açılarına çalışma anında verilebilir; belgelenen tipli Result kurtarma yolları analitik türevi destekler. Yerleşik Error Result yardımcı türevleri ve parametreye bağlı ayrık yollar reddedilir. Kuantum kaynak taşıyıcıları statik olarak başarılı hata yayılımını destekler; hata üreten veya değeri belirlenemeyen yayılım sayısal devreye aktarılamaz. Zorunlu yan kaydı koruyun.

Sayısal yardımcı sonuçlarını Ry(q[0], average(samples)) gibi dönüş kapılarının açılarında doğrudan kullanabilirsiniz. Argümanlar ve açılar kapıdan hemen önce soldan sağa bir kez hesaplanır. Önceki tipli değerler, sabitler, parametreler ve açıkça dönüştürülen ölçüm sonuçları giriş olabilir. U üç açıyı ayrı ayrı denetler; Bool veya dizi sonuçları açı olamaz. Örnek, enabled açıkken 1 radyan, kapalıyken 0 radyan döndürür. Kuantum aktarımı çözülebilen açıları aktarım anındaki parametre değerleriyle sabitler; ölçüme bağlı veya hata üreten açılar N/M çalışma zamanı gerektirir ve sayısal devre olarak aktarılamaz.

Masaüstü editörde Ctrl+Space, kapsam içindeki fonksiyon ve değerleri önerir; üzerine gelince tipleri gösterilir. Ctrl+Shift+Space çağrı imzasını, F12 tanımını gösterir. Fonksiyonlar, parametreler ve yereller farklı renklerle gösterilir; yalnız değiştirilemeyen bağlamalar salt okunur işareti taşır. Shift+F12 referansları bulur; F2 bu dosyadaki çözümlenmiş fonksiyon, parametre veya yerel değişkeni yeniden adlandırır. İşlem, yardımcı fonksiyon dallarını ve main blok yerellerini kapsar; eksiksiz ve geçerli kod gerektirir. Çakışan veya başka bir kullanımın bağlandığı tanımı değiştiren adlar reddedilir. Mevcut main ve modül param/const başvuruları kendi tanımlarına bağlı kalır.

Yardımcı çağrılarını kaynak hata ayıklayıcısıyla inceleyin. İçine gir çağrıya girer, Üzerinden geç iç çağrıları atlar, Dışına çık çağırana döner. Yığın; argümanları, başlatılmış yerelleri ve dizi/Result dahil tipli dönüş ve hata değerlerini gösterir. Import edilen yardımcı kendi modül konumuyla gösterilir; ana editörde satır vurgulanmaz. Kayıtlı adımlarda gezinmek etkileri tekrarlamaz. Giriş kaynağı, bağımlılık veya deneysel seçenek değişince yeni kayıt gerekir. Kaydedilmiş çalışma hatası önceki adımları incelerken görünür kalır; tipli Result hataları ayrı program sonuçlarıdır.

Optimize, main üst düzeyindeki komşu sabit ters kuantum kapı çiftlerini kaldırabilir; yorumlar, yardımcı gövdeleri, çağrılar ve workspace kaynakları korunur. Klasik ifadelerin üzerinden atlamaz; yardımcı gövdelerini yeniden yazmaz, dönüş kapılarını birleştirmez veya indirgenmiş yardımcı AST'sini optimize etmez. Önizleme tam kaynağı gösterir. Uygula yalnız yapısal denetimden sonra aynı girdi ve bağımlılıklardaki program sonucu, görünür klasik değerler ve tam karmaşık kuantum genlikleri eşleşirse açılır. Eksik tam durum kanıtı, çalıştırma hatası veya atlanan doğrulama özgün kaynağı korur. Tam denetim 14 qubit ile sınırlıdır; ölçüm için açık seed gerekir. Gürültü, eğitim ve kapsam dışı çalışma/kaynak duyarlı programlar değiştirilmez. Kaynak, seçenek veya bağımlılık değişince doğrulanmış önizleme geçersiz olur.

Başka bir yerel .nm modülünün public yardımcılarını use workspace.helpers ile alın. Öneksiz fn public kabul edilir; public/private fn için modül görünürlüğü seçeneği gerekir. Public fonksiyon kendi private yardımcılarına erişir; çağıran yalnız doğrudan public importları görür. Kaynak taşıyıcıları gerekli dosyaları da içerir; geri yüklerken workspaceModules haritasını koruyun. VS Code eklentisi tanıma gitme, imza yardımı ve yeniden adlandırmayı dosyalar arasında çözer. Eksik modüller, döngüler ve belirsiz adlar reddedilir.

main içindeki çağrılar tipli let veya ok(...) içindeki aritmetikte kullanılabilir; helper(1 + helper(2)) de desteklenir. +, -, *, /, %, eksi işareti ve parantezlerde değerlendirme sırası korunur. Int sonuçlar int_to_float(helper(2)) ile açıkça dönüştürülebilir; bu ifade başka bir fonksiyonun argümanı da olabilir. Aynı tipte 1–256 Int veya Float elemanı olan sabit diziler çağrı içerebilir; mean(...) doğrudan veya değişkende saklanan dizinin ortalamasını alır. Saklanan diziler sabit veya çalışma zamanı Int indisleriyle, yardımcı çağrıları dahil okunabilir. Desteklenen iç içe türler ve boyut sınırları aşağıdaki bileşik değer rehberlerinde açıklanır. Main döngüleri ve dinamik indis/hedefler aşağıdaki sınırlı çalışma zamanı örneklerini izler. Main ölçüm dalları ve desteklenen sınırlı bloklar yardımcı çağırabilir; mevcut kontrol grameri geçerliliğini korur. Özyineleme desteklenmez. Workspace importu aşağıdaki ayrı sözleşmeyi kullanır. Core özgün kaynağı koruyabilir ve sürümlü JSON IR üretebilir; CLI komutu, üç deneysel seçenekle birlikte nm export main.nm --to ir şeklindedir. QASM3 aktarımı zorunlu kaynak yan kaydıyla kullanılabilir: --to qasm3 --strict --json. QASM kuantum işlemlerini yürütür; klasik sonuçlar yan kayıt ve N/M çalışma zamanı gerektirir. Qiskit/Cirq/PennyLane, üniter devre alt kümesini zorunlu kaynak paketiyle destekler; CLI için --to pennylane --json kullanın. Ölçüm, reset, gürültü ve kuantum kontrol akışı bu framework diliminin dışındadır; yardımcı fonksiyon dalları kaynak paketinde korunur. Python klasik sonuçları veya hataları yürütmez. Kaynağı koruyan optimizasyon aşağıdaki ayrı sınırlı sözleşmeyi kullanır. Yalın klasik fonksiyonların QASM2 aktarımı kullanılamaz; üniter compute/apply için ayrı doğrulanan QASM2 yan kayıt sözleşmesi vardır.

Sayısal yardımcıyı eğit — deneysel

Bu gürültüsüz beklenti değeri örneği theta parametresini square(theta) üzerinden eğitir. Adjoint gradyanı klasik zincir kuralını içerir: cost = cos(theta²), dolayısıyla dcost/dtheta = −2theta · sin(theta²). theta = 0.8 için başlangıç gradyanı yaklaşık −0.955513’tür; maliyeti en aza indirmek değeri düşürmelidir. Bu bir simülatör alıştırmasıdır; kuantum üstünlüğü kanıtı değildir.

Örneği açıp Çalıştır’ı seçin. Bağlantı classicalFunctions ve typedClassicalValues seçeneklerini bu oturum için açıkça etkinleştirir. @optimize, 16 Adam güncellemesi yapar; GD ve momentum da desteklenir. Optimizasyon sonucunda maliyet geçmişini, son parametreleri ve raporlanan adjoint yöntemini inceleyin. Kaynak, bağımlı dosya veya seçenek değişirse eski çalışma iptal edilir ve sonucu temizlenir.

Yerel yardımcı: main.nm

module helper_training;@optimize(method: "adam", steps: 16, learningRate: 0.1, objective: "minimize");param theta: Angle = 0.8; fn square(x: Float) -> Float {  return x * x;} fn main() {  let q = qreg[1];  Ry(q[0], square(theta));  let cost = expect Z(q[0]);  return cost;}

Bu dilim, gürültüsüz beklenti değeri eğitiminde sayısal yardımcı açılarını destekler. Yerleşik Error Result döndüren yardımcılar, parametreye bağlı Bool kararları, gürültülü eğitim ve desteklenmeyen gradyan yolları reddedilir. Tipli Result kurtarma yardımcıları belgelenmiş sayısal türev yollarını kullanabilir. Main’in Result dönüşü, Result döndüren yardımcıdan ayrıdır; functionResults gerektirir. Kaynağa bağlı gözetimli eğitim de saf sayısal yardımcıları ve özel kayıpları destekler; aşağıdaki özel kayıp örneğine bakın. SPSA ve optimizer karşılaştırması bu desteği devralmaz. Normal yardımcı beklenti değeri eğitiminde Core maliyet yüzeyi ve Bloch vektörü hesapları aynı açık seçenekleri ve bağımlılık kopyasını kabul eder. Veri seti üzerinden ortalaması alınan özel kayıp için bu görünümler sunulmaz.

Aşağıdaki iki dosyalı aktarımla ana kaynak ve helpers.nm dosyasını birlikte yükleyin. Playground’da kaynak ve bağlamı inceleyip yükleyin, ardından Çalıştır’ı seçin. Aktarım classicalFunctions ve typedClassicalValues seçeneklerini korur; otomatik çalıştırmaz. Sonra Çalışma alanı bölümünden iki dosyayı birlikte kaydedin. Öneksiz fn varsayılan olarak public’tir; açık public/private fn ayrıca moduleVisibility gerektirir. helpers.nm değişikliği önceki sonucu geçersiz kılar.

Import edilen yardımcı: main.nm

module helper_training;@optimize(method: "adam", steps: 16, learningRate: 0.1, objective: "minimize");use workspace.helpers;param theta: Angle = 0.8; fn main() {  let q = qreg[1];  Ry(q[0], square(theta));  let cost = expect Z(q[0]);  return cost;}

Bağımlılık: helpers.nm

module helpers;fn square(x: Float) -> Float {  return x * x;}

İki dosyayı çalışma alanı projesi olarak kaydedin. Yardımcıyla eğitim henüz kuantum QASM/framework aktarım taşıyıcılarında desteklenmiyor; bu aktarımlar başlangıç açılarını üretmek yerine programı reddeder. Normal QASM eğitim aktarımları başarılı son parametre kanıtı gerektirir. Yalnız kaynak taşıyan Quantum AI aktarımı, model JSON ve eğitim checkpoint’leri henüz bu deneysel seçenekleri ve yardımcı bağımlılıklarını taşımıyor. Bu aktarımın reddedilmesi Playground eğitiminin başarısız olduğu anlamına gelmez. Projeyi geri yükleyin, gerekli seçenekleri açıkça etkinleştirip yeniden çalıştırın; yalnız giriş kaynağını eksiksiz eğitim kaydı olarak kullanmayın.

Kendi kayıp fonksiyonunla eğit — deneysel

Bu örnek moons_2d veri setinde iki gradyan güncellemesi yapar. residual, iki turlu sınırlı döngü ve değiştirilebilir Float birikimiyle karesel hatanın iki katını hesaplar; sonuç özel kayıp adıyla gösterilir. İlk Float argüman [-1, 1] aralığında kuantum beklenti değeri, ikinci argüman sabit -1 veya +1 etikettir. Bu bir simülatör alıştırmasıdır; kuantum üstünlüğü kanıtı değildir.

Playground’da açıp Çalıştır’ı seçin. Bağlantı classicalFunctions ve typedClassicalValues seçeneklerini açar; otomatik çalıştırmaz. Sonuçta residual adını, kayıp geçmişini, son parametreleri ve ayrı doğrulama/test kayıplarını inceleyin. Test verisi parametre seçimine katılmaz. Kaynak veya seçenek değişince yeniden çalıştırın.

custom-training.nm

module custom_training;@dataset("moons_2d", split: "train");param theta: Angle = 0.37;fn residual(prediction: Float, label: Float) -> Float {  let mut total: Float = 0.0;  for i in 0..2 {    total = total + (prediction - label) * (prediction - label);  }  return total;}fn main() {  let q = qreg[2];  encode(sample_row(0), q, method: "reupload");  Ry(q[0], theta);  let cost = expect Z(q[0]);  train {    objective: minimize cost;    optimizer: gd(lr = 0.1);    steps: 2;    dataset: moons_2d;    loss: custom(residual);  }  return cost;}

Giriş fonksiyonu generic olmayan iki Float parametre ve Float dönüşü kullanır. İç içe saf sayısal yardımcılar desteklenir. Analitik eğitim, yardımcı fonksiyonlarda 0–256 aralığında kaynakta yazılmış tam sayı sınırlarıyla (bitiş hariç) döngüleri, Int/Float yerel birikimlerini ve türevi alınan girdiden bağımsız, sınır denetimli Int indislerini destekler. İç içe çağrılar ve döngüler ortak 4096 adım bütçesini kullanır. Parametreye bağlı ayrık kararlar/indisler ve çalışma zamanında belirlenen döngü sınırları desteklenmez. Tipli Result kurtarma ve sınırlı main döngüsü türevleri kendi belgelenmiş sözleşmelerine tabidir. Quantum etkisi, özyineleme ve dış değişken yakalama desteklenmez. Gürültüsüz statevector üzerinde angle, reupload, iqp ve amplitude kodlamaları kullanılabilir; amplitude kendi yazmacındaki ilk işlem olmalıdır. Doğrulama sıklığı, erken durdurma veya checkpoint eklerseniz qmlTrainingControls seçeneğini de açın.

Alan hatası veya türev/bütçe hatası eğitimi durdurur; sıfır türevle devam edilmez. Tanı konumu ile yalnızca fonksiyon girişini gösteren konum ayrı sunulur. İş sayaçları kabul edilen hesapları gösterir; donanım kapı sayısı veya süre garantisi değildir. Özel kayıp için maliyet yüzeyi ve Bloch eğrisi gösterilmez. QASM/framework, model JSON ve checkpoint dışa aktarımları bu özel kayıp sözleşmesini henüz taşımaz; kaynak ve yardımcı dosyaları saklayın.

Float matematiği ve aktivasyonlar

Trigonometrik, üstel, logaritmik ve aktivasyon fonksiyonlarıyla sayısal hesaplar veya dönüş açıları oluşturun. Bu katalogdaki fonksiyonlar bir Float argümandan Float sonuç üretir; Int için int_to_float(...) kullanın. Sinüs/kosinüs ayrıca Angle kabul eder. Float açılar radyandır; derece için degrees(...) ile açık bir Angle oluşturun.

  • sin(value: Float) -> Float — Radyan cinsinden Float açının sinüsü. Angle girdisini de kabul eder ve kanonik radyan miktarından Float sonuç üretir.
  • cos(value: Float) -> Float — Radyan cinsinden Float açının kosinüsü. Angle girdisini de kabul eder ve kanonik radyan miktarından Float sonuç üretir.
  • sqrt(value: Float) -> Float — Negatif olmayan Float değerin karekökü.
  • exp(value: Float) -> Float — Float değerin doğal üstel fonksiyonu; Float sınırını aşan sonuçlar reddedilir.
  • log(value: Float) -> Float — Sıfırdan büyük Float değerin doğal logaritması.
  • log1p(value: Float) -> Float — 1 + değerin sıfır yakınında hassas doğal logaritması; girdi -1 değerinden büyük olmalıdır.
  • expm1(value: Float) -> Float — Doğal üstel fonksiyon eksi bir; sıfır yakınında hassastır, Float sınırını aşan sonuçlar reddedilir.
  • tanh(value: Float) -> Float — Float değerin [-1, 1] aralığındaki hiperbolik tanjantı.
  • sigmoid(value: Float) -> Float — Float değerin [0, 1] aralığındaki sayısal olarak kararlı lojistik sigmoid değeri.
  • abs(value: Float) -> Float — Float değerin mutlak değeri; parametreye bağlı sıfırda analitik türev tanımsızdır.
  • floor(value: Float) -> Float — Aşağı yuvarlanmış tam sayı değerli Float; parametreye bağlı tam sayı girdilerde analitik türev reddedilir.
  • ceil(value: Float) -> Float — Yukarı yuvarlanmış tam sayı değerli Float; parametreye bağlı tam sayı girdilerde analitik türev reddedilir.
  • round(value: Float) -> Float — En yakın tam sayı değerli Float; yarımlar pozitif sonsuz yönüne yuvarlanır, parametreye bağlı yarım sayılarda analitik türev reddedilir.

Vektörler ve sayısal işlemler

  • min(Float, Float) -> Float — En küçük değer
  • max(Float, Float) -> Float — En büyük değer
  • clamp(Float, Float, Float) -> Float — Kapalı aralığa sınırla
  • sum(Array<T, N>) -> T — Sınır denetimli toplam
  • dot(Array<T, N>, Array<T, N>) -> T — İç çarpım
  • norm(Array<Float, N>) -> Float — Öklid normu
  • add(Array<T, N>, Array<T, N>) -> Array<T, N> — Eleman bazlı toplama
  • sub(Array<T, N>, Array<T, N>) -> Array<T, N> — Eleman bazlı çıkarma
  • scale(Array<T, N>, T) -> Array<T, N> — Skaler çarpma
  • variance(Array<Float, N>) -> Float — Popülasyon varyansı
  • stddev(Array<Float, N>) -> Float — Popülasyon standart sapması
  • argmin(Array<T, N>) -> Int — İlk minimum indisi
  • argmax(Array<T, N>) -> Int — İlk maksimum indisi

T, Int veya Float; N ise 1–256 arasında sabit dizi uzunluğudur. İki vektörün tipi ve uzunluğu aynı olmalı; scale çarpanı eleman tipiyle eşleşmelidir. sum/dot eleman tipini korur. min/max/clamp yalnız Float alır; clamp alt sınırı üst sınırı aşamaz. norm/variance/stddev yalnız Float dizisi alır. variance popülasyon varyansıdır (N değerine bölünür); stddev bunun kareköküdür. argmin/argmax sıfır tabanlı Int indis döndürür; eşitlikte ilk elemanı seçer. Örnekte bend, dot ile aynı dönüş açısını hesaplar; magnitude vektör uzunluğunu, spread varyansı gösterir.

Analitik türev; parametreye bağlı argmin/argmax, min/max eşitliği, norm sıfırı ve birden çok elemanlı stddev sıfırında reddedilir. clamp için parametreye bağlı sınır temasları reddedilir; iki sabit sınır eşitse sonuç sabittir ve türev sıfırdır. Tek elemanlı stddev sıfır türev verir. Sabit işlemler türev kısıtlamalarından etkilenmez; sayısal aralık ve şekil denetimleri yine uygulanır. Vektör işlemleri yardımcı yürütme bütçesinden eleman sayısına göre pay tüketir.

Tipli main ifadesi için typedClassicalValues yeterlidir. Yardımcı gövdesi veya doğrudan kapı açısında kullanım için classicalFunctions da gerekir. Örnek iki seçeneği açar; scale = 2, wave ≈ 0.389418 ve Z beklentisi ≈ 0.952382 olur. sin/cos/sqrt çağrıları import edilen yardımcıların içinde de kullanılabilir; standart kütüphane importu gerekmez.

Float matematiği örneğini aç

Float / Array → Float

module float_math;param theta: Angle = 0.4; fn bend(x: Float) -> Float {  return dot([sin(x), cos(x)], [1.0, 0.25]);} fn main() {  let q = qreg[1];  let scale: Float = sqrt(int_to_float(4));  let wave: Float = sin(theta);  let probability: Float = sigmoid(theta);  let activation: Float = tanh(theta);  let features: Array<Float, 2> = [wave, activation];  let magnitude: Float = norm(features);  let spread: Float = variance(features);  let bounded: Float = clamp(probability, 0.0, 1.0);  Ry(q[0], bend(theta) / scale);  Rz(q[0], cos(theta));  let cost = expect Z(q[0]);  return cost;}

sqrt(-1.0) bir çalışma hatasıdır; sıfır ya da NaN sonucu olarak gizlenmez. sqrt(0.0) normal hesapta geçerlidir. Bu sürüm, sıfırda parametreye bağlı sqrt üzerinden analitik türev hesaplamayı desteklemez; eğitim/gradient bunu açıkça reddeder. Parametreden bağımsız sqrt(0.0) sabit kalır. Seçilmeyen kısa devre dalı değerlendirilmez.

log sıfırdan büyük, log1p ise -1 değerinden büyük girdi ister. exp ve expm1 sonuçları 10¹² Float sınırını aşarsa hata verir. log1p/expm1 sıfır yakınındaki hassasiyeti korur. Sigmoid ve tanh büyük girdilerde taşmayı önler; kayan nokta yuvarlaması uç değerleri üretebilir. Örnekte probability ≈ 0.598688 ve activation ≈ 0.379949 olur.

abs, floor, ceil ve round Float döndürür. round yarım değerleri pozitif sonsuz yönüne yuvarlar: round(-1.5) = -1.0. Parametreye bağlı abs sıfırda, floor/ceil tam sayılarda, round yarım sayılarda analitik türev hatası verir. Diğer noktalarda yuvarlama türevi sıfırdır; yalnız yuvarlama üzerinden bağlı bir parametre gradyanla değişmez. Parametreden bağımsız sabitler bu türev kısıtlamasına girmez.

Tek argümanlı Float kataloğundaki adlar ayrılmıştır; özel yardımcı fonksiyonlara bu adları vermeyin. Aşağıdaki sayısal katalogda ise aynı adlı kullanıcı fonksiyonu, import edilenler dahil, yerleşik işlemden önce çözülür.

Açının birimini açıkça belirtin

degrees(30.0) ile 30 derecelik bir Angle oluşturun. Angle radyan cinsinden saklanır; degrees ve radians birim tahmini yapmaz. Sinüs, kosinüs ve desteklenen dönüş kapıları bu miktarı kullanır.

  • radians(value: Float) -> Angle — Radyan cinsindeki Float değerden Angle oluşturur. Açıyı otomatik olarak bir tura sarmaz.
  • degrees(value: Float) -> Angle — Derece cinsindeki Float değerden Angle oluşturur. Değer ve türev pi/180 ile ölçeklenir.
  • to_radians(value: Angle) -> Float — Kanonik radyan miktarını Float olarak döndürür.
  • to_degrees(value: Angle) -> Float — Açıyı derece cinsinden Float olarak döndürür. Değer ve türev 180/pi ile ölçeklenir.

Derece, radyan ve türev

Playground'da aç

Derece, radyan ve türev

module angle_units;param theta:Angle=30.0;fn heading(value:Float)->Angle{return degrees(value);}fn main(){ let q=qreg[1]; let angle:Angle=heading(theta); let radians_value:Float=to_radians(angle); let degrees_value:Float=to_degrees(angle); Ry(q[0],radians(radians_value)); let cost=expect Z(q[0]); let slope=gradient cost wrt theta; return cost;}

Angle değerini kayıt ve Result ile taşıyın

Playground'da aç

Angle değerini kayıt ve Result ile taşıyın

module angle_result;param theta:Angle=30.0;record Heading{angle:Angle}enum Problem{Unavailable}fn checked(value:Float)->Result<Heading,Problem>{ return ok(Heading{angle:degrees(value)});}fn main()->Result<Angle,Problem>{ let q=qreg[1]; let item:Heading=checked(theta)?; Ry(q[0],item.angle); let cost=expect Z(q[0]); let slope=gradient cost wrt theta; return ok(item.angle);}

Yerleşik hata koduyla Angle sonucu

Playground'da aç

Yerleşik hata koduyla Angle sonucu

module angle_builtin_result;fn checked(value:Float,available:Bool)->Result<Angle,Error>{ if(!available){return error("UNAVAILABLE");} return ok(degrees(value));}fn main()->Result<Angle,Error>{ let q=qreg[1]; let attempt:Result<Angle,Error>=checked(30.0,true); match(attempt){  ok(angle)=>{Ry(q[0],angle);}  error=>{X(q[0]);} } let cost=expect Z(q[0]); return attempt;}

İlk örnekte degrees_value = 30, radians_value ≈ 0.523599, cost ≈ 0.866025 ve slope ≈ -0.008727 olur. Türev derece girdisine göredir: -sin(π/6) × π/180. Dönüşüm katsayısı eğitim sırasında da korunur.

Mevcut param theta:Angle bildirimi sayısal parametre köprüsünü kullanır; bu örnekte heading(theta), sayıyı açıkça derece olarak yorumlar. degrees olmadan doğrudan kapıya verilen eski sayısal açılar radyandır.

Son örnekte true değerini false yapınca UNAVAILABLE hata kodu döner ve error kolundaki X uygulanır. true ile 30 derecelik dönüş uygulanır. Yerleşik Error kullanan yardımcıların mevcut analitik türev/eğitim kısıtı sürer; bu örnek yalnız çalıştırma ve hata ele almayı gösterir.

Angle + Angle ve Angle - Angle geçerlidir. Float ile ölçekleyebilir, Angle / Angle ile boyutsuz Float oranı alabilirsiniz. Angle + Float ve Angle * Angle hatadır; açı otomatik olarak 0–360 aralığına sarılmaz.

İkinci örnek özel enum hata tipli Result kullanır; son örnek yerleşik Error yoludur. Array<Angle, N> henüz desteklenmiyor. Değerler sonlu ve sınırlandırılmıştır; geçersiz işlemler sıfır sonucu gibi gösterilmez. Parametreye bağlı koşullarla analitik türev desteklenmez.

Compute/apply: hazırlığı tersine yürütün

compute bloğu hazırlığı yapar, apply bloğu işlemi uygular; ardından hazırlığın ters kapıları çalışır. Hazırlık argümanları bir kez hesaplanır ve geri almada aynı değerler kullanılır. Yeni oturumlarda seçenek açıktır; Araçlar bölümünden kapatabilirsiniz. Kayıtlı seçimler korunur; aşağıdaki bağlantılar bu seçeneği açık taşır.

HZH ile X işlemi

H, Z, H sırası |0⟩ durumunu |1⟩ yapar. Çalıştırdıktan sonra Durum panelinde |1⟩ olasılığı 1 olur.

Playground'da aç

HZH ile X işlemi

module compute_demo;fn main(){ let q=qreg[1]; compute {H(q[0]);} apply {Z(q[0]);}}

Hazırlık açısının türevi

theta = 0.3 için cost = cos(2 × theta²) ≈ 0.983844 ve slope = -4 × theta × sin(2 × theta²) ≈ -0.214835. Theta değerini değiştirip yeniden çalıştırın; türev hazırlık ve geri almanın ikisini de hesaba katar.

Playground'da aç

Hazırlık açısının türevi

module compute_gradient;param theta:Angle=0.3;fn main(){ let q=qreg[1]; compute {Ry(q[0],theta*theta);} apply {Z(q[0]);} let cost=expect Z(q[0]); let slope=gradient cost wrt theta; return slope;}

Geri alma, sıfırlama garantisi değildir

Başlangıç |00⟩ iken apply içindeki X kontrol kübitini değiştirir. Ters CNOT yardımcı kübiti de değiştirir ve sonuç |11⟩ olur. Hazırlığı tersine yürütmek yardımcı kübitlerin her zaman |0⟩ olacağını garanti etmez.

Playground'da aç

Geri alma, sıfırlama garantisi değildir

module ancilla_example;fn main(){ let q=qreg[2]; compute {CNOT(q[0],q[1]);} apply {X(q[0]);}}

Compute/apply gövdeleri üniter olmalıdır; ölçüm, reset ve gürültü bu bölgelerde kullanılamaz. Analitik türev gürültüsüz kesin beklenti hesabıyla sınırlıdır. QASM/framework çıktısı dışa aktarma anındaki sabit devredir; özgün kaynak ve bağımlılıkları geri almak için eşleşen JSON yan kaydını saklayın. Gözlem ve eğitim programlarının bu üniter aktarımı desteklenmez.

Parametreleri birlikte tarayın

Bir paramgroup, mevcut parametreleri aynı deneye bağlar. Playground'ın Tarama sekmesinde grubu seçin, her eksenin değerlerini girin ve çalıştırmadan önce toplam nokta sayısını görün.

main.nm

module grouped_rotations;param theta:Angle=0.3;param phi:Angle=0.4;paramgroup angles=[theta,phi];fn main(){  let q=qreg[1];  Ry(q[0],theta);  Rx(q[0],phi);  let cost=expect Z(q[0]);  return cost;}

  1. Örneği açın ve istenirse Kaynak ve bağlamı yükle düğmesine basın. Mobilde Sonuçlar görünümüne geçin.
  2. theta için 0, 0.4; phi için 0, 0.5 girin. Bütün birleşimler dört nokta, sırayla eşleştirme iki nokta oluşturur.
  3. Grup taramasını çalıştırın. Her noktanın başlangıç değerleri ve maliyeti ayrı gösterilir. Bu örnekte maliyet cos(theta) × cos(phi) olur; son nokta yaklaşık 0.808307'dir.
  4. Bir noktayı hata ayıklayıcıda açın, adımlayın veya sonuna ilerleyin. Kaydı indirip yeniden açabilirsiniz; ana editördeki kod değişmez.

Ondalık ayırıcı noktadır; virgül veya boşluk değerleri ayırır. Zip eksenleri aynı uzunlukta olmalıdır. En fazla 256 nokta oluşturulur; eğitim ve türevler ortak işlem bütçesini daha erken tüketebilir. İptal, eksik işi başarılı sonuç gibi göstermez. Debugger eğitim sonrası ağırlıkları değil, seçilen başlangıç devresini inceler.

Parametre taraması örneğini aç

Matrisler ve boyut güvenliği

Değişmez Float ve Complex matrisleriyle transpoz, matris çarpımı ve norm hesaplayın. Her boyut 1–16 arasında olmalıdır. matrix yapıcısı literal Int boyutları ve satır sıralı Float elemanları ister. Diziden matrise örtük dönüşüm yoktur.

  • complex_matrix(rows: Int, columns: Int, reals: Array<Float, R*C>, imaginaries: Array<Float, R*C>) -> Matrix<Complex, R, C>

    İki Float dizisinden satır sıralı Complex matris; boyutlar 1–16 arasında literal Int olmalıdır.

  • conjugate_transpose(value: Matrix<Complex, R, C>) -> Matrix<Complex, C, R>

    Satır ve sütunları değiştirir, sanal bileşenlerin işaretini ters çevirir.

  • matrix(rows: Int, columns: Int, values: Array<Float, R*C>) -> Matrix<Float, R, C>

    Satır sıralı matris; boyutlar 1–16 arasında literal Int olmalıdır.

  • transpose(value: Matrix<T, R, C>) -> Matrix<T, C, R>

    Elemanları değiştirmeden satır ve sütunları değiştirir. T, Float veya Complex olabilir; girdilerin eleman türleri aynı olmalıdır.

  • matmul(left: Matrix<T, R, K>, right: Matrix<T, K, C>) -> Matrix<T, R, C>

    Matris çarpımı; iç boyutlar eşleşmelidir. T, Float veya Complex olabilir; girdilerin eleman türleri aynı olmalıdır.

  • matvec(matrix: Matrix<Float, R, C>, vector: Array<Float, C>) -> Array<Float, R>

    Sütun sayısı ve vektör uzunluğu eşleşen matris-vektör çarpımı.

  • trace(value: Matrix<T, N, N>) -> T

    Köşegen toplamı; kare matris gerektirir. T, Float veya Complex olabilir; girdilerin eleman türleri aynı olmalıdır.

  • frobenius(value: Matrix<T, R, C>) -> Float

    Kararlı Frobenius normu; parametreye bağlı sıfır normda türev tanımsızdır. T, Float veya Complex olabilir; girdilerin eleman türleri aynı olmalıdır.

  • matrix_at(value: Matrix<T, R, C>, row: Int, column: Int) -> T

    Sıfır tabanlı, sınır denetimli erişim; türev indisleri parametreden bağımsız olmalıdır. T, Float veya Complex olabilir; girdilerin eleman türleri aynı olmalıdır.

  • complex(re: Float, im: Float) -> Complex

    Gerçek ve sanal Float bileşenlerden Complex değer oluşturur.

  • real(value: Complex) -> Float

    Gerçek bileşeni döndürür.

  • imag(value: Complex) -> Float

    Sanal bileşeni döndürür.

  • conj(value: Complex) -> Complex

    Sanal bileşenin işaretini ters çevirir.

  • complex_add(left: Complex, right: Complex) -> Complex

    İki Complex değeri toplar.

  • complex_sub(left: Complex, right: Complex) -> Complex

    Sağ Complex değeri soldakinden çıkarır.

  • complex_mul(left: Complex, right: Complex) -> Complex

    İki Complex değeri çarpar.

  • complex_div(left: Complex, right: Complex) -> Complex

    Complex değerleri böler; sıfıra bölme hata verir.

  • complex_abs(value: Complex) -> Float

    Kararlı büyüklük; parametreye bağlı sıfırda türev tanımsızdır.

  • complex_abs2(value: Complex) -> Float

    Büyüklüğün karesi; sıfırda da türevlenebilir.

Yardımcılar en fazla üç const Int boyutunu girdilerden çıkarır. Çarpımın ortak K boyutu eşleşmelidir; trace yalnız kare matris alır. Boyutlar yalnız tiplerde kullanılabilir; matrix(R,C,...) geçersizdir. Katalogdaki R*C eleman sayısını anlatır, yazılabilir bir tip ifadesi değildir.

İndisler sıfırdan başlar ve iki boyutta denetlenir. Her ara çarpım/toplam Float sınırına ve ortak işlem bütçesine tabidir. Geçerli bir 16×16 şekil, her işlemin bütçeye sığacağını garanti etmez. Tipli Matrix Result yükleri bileşik Result sözleşmesiyle desteklenir. Bu örneğin yalnız kuantum devresi aktarımı desteklenmez; compute/apply unitary aktarımı ayrı sözleşmedir.

Matris işlemleri kapı açıları, adjoint eğitim ve özel kayıplarda zincir kuralını korur. Parametreye bağlı sıfır Frobenius normunda türev tanımsızdır ve hata verilir; sabit sıfır matrisin türevi sıfırdır. Türevde indisler parametreden bağımsız olmalıdır.

Örnekte gram matrisinin satırları [14, 32] ve [32, 77], answer değeri 77 olur. Playground bağlantısı typedClassicalValues ve classicalFunctions seçeneklerini açar.

Matrix<Float, R, C>

module matrix_example;fn flip<const R:Int,const C:Int>(a:Matrix<Float,R,C>)->Matrix<Float,C,R>{  return transpose(a);}fn product<const R:Int,const K:Int,const C:Int>(a:Matrix<Float,R,K>,b:Matrix<Float,K,C>)->Matrix<Float,R,C>{  return matmul(a,b);}fn main(){  let q=qreg[1];  let a:Matrix<Float,2,3>=matrix(2,3,[1.0,2.0,3.0,4.0,5.0,6.0]);  let gram:Matrix<Float,2,2>=product(a,flip(a));  let answer:Float=matrix_at(gram,1,1);  H(q[0]);}

Matris örneğini aç

Complex örneğinde Gram matrisi [[6, 3+i], [3-i, 3]], izi 9+0i olur. complex_matrix iki ayrı Float dizisi alır. T, Float veya Complex anlamındadır; karışık matris çarpımı ve Complex matvec desteklenmez. complex_abs2 sıfırda türevlenebilir, parametreye bağlı sıfır complex_abs ise hata verir.

Matrix<Complex, R, C>

module complex_gram;fn dag<const R:Int,const C:Int>(a:Matrix<Complex,R,C>)->Matrix<Complex,C,R>{  return conjugate_transpose(a);}fn main(){  let q=qreg[1];  let a:Matrix<Complex,2,2>=complex_matrix(2,2,[1.0,2.0,0.0,1.0],[1.0,0.0,1.0,-1.0]);  let gram:Matrix<Complex,2,2>=matmul(a,dag(a));  let total:Complex=trace(gram);  Ry(q[0],real(total)/10.0);}

Complex matris örneğini aç

Ölçüm dallarında yardımcı fonksiyonlar

Seçilen main dalında tipli yerel değer, yardımcı çağrısı ve matematik içeren kapı açısı kullanın. classicalFunctions ve typedClassicalValues açıkken Bool değerleri ve Bool döndüren yardımcılarla iç içe if/else kullanılabilir; mevcut ölçüm koşulları da korunur.

Örnek classicalFunctions, typedClassicalValues ve functionResults seçeneklerini açar. X kapısı ölçümü 1 yapar: angle ≈ 0.479426 döner. X(q[0]) satırını kaldırınca ZERO_MEASUREMENT hatası döner. checked_angle(0.5)? çağrısını checked_angle(-0.5)? yapınca NEGATIVE_ANGLE hatası Ry kapısından önce döner. Yalnız seçilen dal çalışır; erken Result dönüşü sonraki işlemleri durdurur.

Ölçümlü yardımcı örneğini aç

measured → checked_angle → Result<Float, Error>

module measured_helpers; fn checked_angle(value: Float) -> Result<Float, Error> {  if (value < 0.0) {    return error("NEGATIVE_ANGLE");  }  return ok(sin(value));} fn main() -> Result<Float, Error> {  let q = qreg[2];  X(q[0]);  let measured: Bit = measure(q[0]);  if (measured == 1) {    let angle: Float = checked_angle(0.5)?;    Ry(q[1], cos(angle));    return ok(angle);  } else {    return error("ZERO_MEASUREMENT");  }}

Blok yerelleri blok dışında görünmez. Kardeş dallar aynı adı kullanabilir; dış kapsamdaki değeri aynı adla gölgelemek reddedilir. Editör tamamlama, tür bilgisi, başvuru ve yeniden adlandırmada bu sınırları korur. Yeniden adlandırma tam ve geçerli kaynak gerektirir. Int/Float let mut ve sabit aralıklı for döngüleri ortak 4096 işlem adımı bütçesiyle çalışır; sınırsız tekrar desteklenmez.

Statevector motoru observe/test/snapshot bloklarında yardımcıları destekler. MPS bu rapor bloklarını ve until akışını açıkça reddeder; stabilizer rapor bloklarında statevector motoruna geçer. Dinamik kontrol içindeki yardımcı çağrılarını QASM veya framework devresine yansıtma NM-CFN-011 ile reddedilir; özgün N/M kaynağını saklayın.

Main içinde döngüler, dinamik indeksler ve Result

Örnekleri açan bağlantılar classicalFunctions, typedClassicalValues ve functionResults seçeneklerini birlikte etkinleştirir. Kaynak statevector, MPS ve stabilizer motorlarında çalışır; her motorun kapı desteği sınırları geçerlidir.

Diziyi okuyun, toplamı güncelleyin, qubit seçin

Sonuç ok(4.5), kuantum durum |11> olur. Bu örnekte weights değişmez, total güncellenir. 0..2 aralığının üst sınırı dahil değildir. weights[i] ve q[i] her turda güncel Int indeksini kullanır. Aralığı 0..3 yapınca üçüncü turda dizi sınırı hatası oluşur; üçüncü X uygulanmaz. Önceki kapılar geri alınmaz.

Playground'da aç

Diziyi okuyun, toplamı güncelleyin, qubit seçin

module indexed_accumulation;fn main() -> Result<Float, Error> {  let q = qreg[2];  let weights: Array<Float, 2> = [1.5, 3.0];  let mut total: Float = 0.0;  for i in 0..2 {    total = total + weights[i];    X(q[i]);  }  return ok(total);}

Main içinde Result saklayın ve iki sonucu ele alın

checked(1.5) ile ok(3) döner ve X çalışır. checked(-1.5) ile error("NEGATIVE") korunur, X çalışmaz. İki match kolu zorunludur; value yalnız ok kolunda görünür. return attempt özgün hata kodunu korur. Alternatif olarak Result döndüren main içinde let value: Float = attempt?; başarısızlıkta sonraki işlemleri durdurur. Bilinçli kurtarma için error kolunda return ok(0.0); kullanabilirsiniz.

Playground'da aç

Main içinde Result saklayın ve iki sonucu ele alın

module main_result_recovery;fn checked(value: Float) -> Result<Float, Error> {  if (value < 0.0) { return error("NEGATIVE"); }  return ok(value * 2.0);}fn main() -> Result<Float, Error> {  let q = qreg[1];  let attempt: Result<Float, Error> = checked(1.5);  match (attempt) {    ok(value) => {      X(q[0]);      return ok(value);    }    error => {      return attempt;    }  }}

Güncellenen toplamın türevini hesaplayın

total ve cursor her turda güncellenir; dizi değişmez. Son açı 4*theta + theta*theta olur. theta=0.3 için slope = -sin(1.29)*4.6. Adjoint türevi atama sırasını korur. İndeksler ve koşullar parametreden bağımsız olmalıdır; sıfır türev tek başına bağımsızlık göstermez.

Playground'da aç

Güncellenen toplamın türevini hesaplayın

module mutation_gradient;param theta:Angle=0.3;fn main(){ let q=qreg[1]; let xs:Array<Float,3>=[theta,theta*theta,theta*3.0]; let mut total:Float=0.0; let mut cursor:Int=2; for i in 0..3 {  total=total+xs[cursor];  cursor=cursor-1; } Ry(q[0],total); let cost=expect Z(q[0]); let slope=gradient cost wrt theta; return slope;}

Dizi elemanlarını değiştirin, eski kopyayı koruyun

let mut ile sabit Int/Float dizilerinin elemanlarını veya dizinin tamamını değiştirebilirsiniz. xs[i] atamasında indeks önce denetlenir; hata olursa eski değer korunur. original eski kopyayı tutar. Son açı theta + theta² + theta³, theta=0.3 için slope = -sin(0.417)*1.87 olur. Türev hesabı yalnız değiştirilen elemanın türevini yeniler.

Playground'da aç

Dizi elemanlarını değiştirin, eski kopyayı koruyun

module array_mutation_gradient;param theta:Angle=0.3;fn main(){ let q=qreg[1]; let mut xs:Array<Float,2>=[theta,theta*theta]; let original:Array<Float,2>=xs; for i in 0..2 {  xs[i]=xs[i]*theta; } xs[0]=xs[0]+original[0]; Ry(q[0],xs[0]+xs[1]); let cost=expect Z(q[0]); let slope=gradient cost wrt theta; return slope;}

Döngü sınırları sabit tamsayılardır: 0 ≤ başlangıç ≤ bitiş ≤ 256. İç içe döngüler, ifadeler ve yardımcılar ortak 4096 adım bütçesini tüketir. Kapı hedefleri Int olmalı, register sınırında kalmalı ve çok hedefli kapılarda birbirinden farklı olmalıdır. Dinamik indeks desteği ölçüm/reset hedeflerine genişletilmez.

Main Result payload'ı Int, Float, Bool, Bit veya sabit Int/Float/Bit dizisi olabilir; iç içe Result ve Bool dizileri desteklenmez. Bit, Int'e örtük dönüştürülmez. Sayısal yardımcılar Result parametresi kabul eder, ancak Bit payload için açık dönüşüm gerekir. Result hata sonucu başarılı bir motor yürütmesidir; sınır aşımı veya sıfıra bölme çalışma zamanı hatasıdır.

N/M kaynağı ve JSON IR bu örnekleri korur. Skaler main atamaları, sınırlı döngüler ve parametreden bağımsız dizi okumaları adjoint eğitiminde desteklenir; parametreden bağımsız Int qubit hedefleri sınır denetimiyle desteklenir. QASM/framework aktarımı ve optimizasyon bu dinamik akışı reddeder. Statik devre görünümü çözülmemiş hedefi q[?] olarak gösterir; kesin hesaplanamayan kaynak sınırları belirsiz olarak bildirilir.

Yardımcıda Result saklama ve hata kurtarma

Saf yardımcı fonksiyon içinde Result<T, Error> değerini tipli bir yerelde saklayın; match (attempt) ile ok(value) ve error kollarını açıkça ele alın. Her iki kol tam bir kez bulunmalıdır; sıraları değişebilir. Seçici bir Result yerelinin adı olmalıdır. ok içindeki değer T tipindedir ve yalnız o kolda görünür; error kolu ayrı bir hata değişkeni oluşturmaz.

Örnek üç deneysel seçeneği açar. recover(-1.0), NEGATIVE_ROOT hatasını bilinçli olarak Float: 0 değerine çevirir. recover(4.0), Float: 2 döndürür. main içindeki çağrıyı forward(-1.0)? yaparsanız özgün NEGATIVE_ROOT kodu korunur ve Ry çalışmadan programdan dönülür. Hatalar kendiliğinden başarıya çevrilmez; fallback değeri kaynakta açıkça seçilir.

Result kurtarma örneğini aç

Result → match → fallback / original error

module result_recovery; fn checked_root(value: Float) -> Result<Float, Error> {  if (value < 0.0) {    return error("NEGATIVE_ROOT");  }  return ok(sqrt(value));} fn recover(value: Float) -> Float {  let attempt: Result<Float, Error> = checked_root(value);  match (attempt) {    ok(root) => {      return root;    }    error => {      return 0.0;    }  }} fn forward(value: Float) -> Result<Float, Error> {  let attempt: Result<Float, Error> = checked_root(value);  match (attempt) {    ok(root) => {      return ok(root);    }    error => {      return attempt;    }  }} fn main() -> Result<Float, Error> {  let q = qreg[1];  let value: Float = recover(-1.0);  Ry(q[0], value);  return ok(value);}

Result yerelleri ve eksiksiz iki kollu match, üç deneysel seçenek açıkken yardımcılarda ve main içinde kullanılabilir. Yardımcılar Result parametreleri de kabul eder. İç içe Result desteklenmez. T; Int, Float, Bool veya sabit Int/Float dizisi olabilir. Yerel attempt? Result döndüren bir yardımcıda veya main içinde başarıyı açar veya özgün hatayı iletir. Örneğin return ok(attempt?);. error kolunda return attempt; özgün hata kodunu korur. ok bağlaması da 32 yerel sınırına dahildir. Bu yerleşik Error Result örneğindeki yardımcıların analitik türevi desteklenmez. Tipli hata kurtarma türevleri ayrı sözleşmeyle desteklenir.

Editör Result yerelinin ve ok değerinin tipini gösterir. Tamamlama, tanıma gitme, başvuru ve yeniden adlandırma kol sınırını korur; başka bir yardımcının aynı adlı değerini değiştirmez. Dış kapsamdaki bir adı gölgeleyen yeniden adlandırma reddedilir.

Result içinde kayıt ve enum taşıma

Bir yardımcı başarılı olduğunda tek sayı yerine bir kayıt veya enum döndürebilir. Result<Sample,Problem> içindeki Sample başarı tipidir; Problem hata enumudur. match başarı kolunda kaydın alanlarını, hata kolunda hata varyantını açar. Tiplerin modül kimliği dosyalar arası çağrılarda da korunur.

checked(0.5), energy alanı 0.25 olan bir kayıt üretir; devrenin beklentisi cos(0.25) olur. Girdiyi -1.0 yaparsanız yalnız hata kolu çalışır ve kaynakta seçilen 0.5 açısı uygulanır. Örnek üç deneysel seçeneği açar.

Kayıt sonucu örneğini aç

Result<Sample,Problem>

module aggregate_result;record Sample {energy:Float}enum Problem {Negative} fn checked(value:Float)->Result<Sample,Problem>{ if(value<0.0){return error(Problem.Negative);} return ok(Sample {energy:value*value});} fn main(){ let q=qreg[1]; let attempt:Result<Sample,Problem>=checked(0.5); match(attempt){  ok(sample)=>{Ry(q[0],sample.energy);}  error(reason)=>{Ry(q[0],0.5);} } let cost=expect Z(q[0]); return cost;}

Başarı kaydı ve hata enumu farklı dosyalarda da tanımlanabilir. Dört dosyalı örnek kayıt ve enum sonuçlarını birlikte kullanır; beklenti cos(0.5) olur. Ana dosyadaki iki 0.5 girdisini -1.0 yaparsanız hata kolları çalışır ve beklenti cos(0.75) olur.

main de kaydı doğrudan program sonucu olarak döndürebilir. Bu örnekte sonuç energy: 0.25 olur. checked girdisini -1.0 yaparsanız ? hatayı döndürür; ilk X kapısı korunur, ikinci X çalışmaz. Programın tipli hata dönmesi, simülatörün çalıştırma hatası vermesinden farklıdır.

Dizi, Complex ve matris sonuçları

Bu örnek iki elemanlı bir Complex matris döndürür: complex(0.25, 0) ve complex(0.5, 1). checked girdisini -1.0 yaparsanız Negative hatası döner; ilk X uygulanır, ikinci X atlanır. Dizi uzunluğu ile matrisin boyutları ve eleman tipi başarı ve hata yollarında korunur.

Matris sonucu örneğini aç

Result<Matrix<Complex,1,2>,Problem>

module compound_result_lesson;enum Problem {Negative}fn checked(x:Float)->Result<Matrix<Complex,1,2>,Problem>{ if(x<0.0){return error(Problem.Negative);} return ok(complex_matrix(1,2,[x,0.5],[0.0,1.0]));}fn main()->Result<Matrix<Complex,1,2>,Problem>{ let q=qreg[1]; X(q[0]); let value:Matrix<Complex,1,2>=checked(0.25)?; X(q[0]); return ok(value);}

Kayıt/enum ve sayısal dizi/Complex/matris başarı değerleri yardımcı dönüşlerinde, Result parametrelerinde, main yerellerinde ve main program sonucunda kullanılabilir. Aynı hata enumuna sahip Result döndüren fonksiyonlarda ? başarıyı açar veya hatayı iletir. Generic kayıt ve enum tipleri aşağıdaki örnekte gösterilir. İç içe Result desteklenmez. Tipli hata kurtarma hesaplarının sayısal türevleri desteklenir; parametreye bağlı ayrık kol seçimleri reddedilir.

Generic kayıtlar ve değer taşıyan enumlar

Box<T>, farklı tipleri aynı kayıt yapısında saklar: Box<Sample> bir örnek, Box<Int> bir tam sayı taşır. Problem<T>.Bad(T) hata ile birlikte bir değer döndürür. Tip argümanları iç içe yazılabilir; her alanın tipi derleme sırasında denetlenir.

Playground’da kaynak ve bağlamı yükleyip Çalıştır’ı seçin. attempt(false), energy: 0.25 içeren bir kayıt döndürür. İki X kapısı birbirini geri alır; son durum |0⟩ olur.

attempt(false) yerine attempt(true) yazıp yeniden çalıştırın. Hata, Box<Int> içinde 7 değerini taşır. ? ikinci X kapısından önce programı bitirir; son durum |1⟩ olur. Bu bir tipli program sonucudur; simülatörün çalıştırma hatası değildir.

model.nm

module model;pub record Box<T> { value: T }

values.nm

module values;pub record Sample { energy: Float }

problem.nm

module problem;pub enum Problem<T> { Missing, Bad(T) }

app.nm

module app;use workspace.model as m;use workspace.values as v;use workspace.problem as e; fn attempt(failed: Bool) -> Result<m.Box<v.Sample>, e.Problem<m.Box<Int>>> {  if (failed) {    return error(e.Problem<m.Box<Int>>.Bad(m.Box<Int> { value: 7 }));  }  return ok(m.Box<v.Sample> { value: v.Sample { energy: 0.25 } });} fn main() -> Result<m.Box<v.Sample>, e.Problem<m.Box<Int>>> {  let q = qreg[1];  X(q[0]);  let sample: m.Box<v.Sample> = attempt(false)?;  X(q[0]);  return ok(sample);}

Box tipinin kullanımlarına gidin, kaydın value alanını yeniden adlandırın veya .Bad( çağrısında yük tipini inceleyin. match ile açılan enum değişkenleri yalnız kendi kolunda görünür. Dosyalar arası yeniden adlandırma, etkilenen kodun geçerliliğini denetler.

m, v ve e dosya takma adlarıdır. Takma adlar tip kimliğini değiştirmez; başka bir modüldeki aynı alanlara sahip Sample farklı bir tiptir. Yalnız pub bildirimleri başka dosyalardan kullanılabilir.

Deneyseldir. Bildirim başına en çok 4 tip parametresi, enum varyantı başına 8 yük öğesi ve derleme başına 256 somut nominal tip desteklenir. Özyinelemeli tipler ve iç içe Result desteklenmez. İç içe kayıt, enum yükleri ve tipli hata kurtarmanın sayısal türevleri desteklenir; parametreye bağlı ayrık kararlar reddedilir. Main skaler/dizi güncellemelerinin türevleri aşağıdaki main çalışma zamanı sözleşmesine tabidir.

İç içe değerlerden kapı açısına ve türeve

Bu örnekte açı, Box → Choice.Some → Box içinden geçer. Kaynak ve bağlamı yükleyip çalıştırın: slope, theta değiştiğinde Z beklentisinin nasıl değiştiğini verir. Beklenen türev −sin(0.29/1.04) × 0.6/1.04 olur. match yalnız seçilen yükü açar; sayısal değerin türevini korur.

nested_gradient.nm

module nested_gradient;param theta:Angle=0.3;param phi:Angle=0.2;record Box<T>{value:T}enum Choice<T>{None,Some(T)}fn make(x:Float,y:Float)->Box<Choice<Box<Float>>> {  return Box<Choice<Box<Float>>>{value:Choice<Box<Float>>.Some(Box<Float>{value:(x*x+y)/(y*y+1.0)})};}fn angle(item:Box<Choice<Box<Float>>>)->Float {  return match(item.value){Choice<Box<Float>>.None=>0.0,Choice<Box<Float>>.Some(sample)=>sample.value};}fn main(){  let q=qreg[1];  let item:Box<Choice<Box<Float>>>=make(theta,phi);  Ry(q[0],angle(item));  let cost=expect Z(q[0]);  let slope=gradient cost wrt theta;  return slope;}

Hata yükünden kurtarma ve türev

checked, theta² değerini hata yükünde taşır. ? sonraki hesabı atlar; recover yükü ikiyle çarpar. Kapı açısı 2 × theta² olur. Çalıştırınca slope yaklaşık −0.214835488111 çıkar. Hata kolunun seçimi parametreden bağımsızdır; hata içindeki sayı ise türevini korur.

recovery_gradient.nm

module recovery_gradient;param theta:Angle=0.3;record Box<T>{value:T}enum Problem<T>{Bad(T),Empty}fn checked(x:Float)->Result<Box<Float>,Problem<Box<Float>>>{ return error(Problem<Box<Float>>.Bad(Box<Float>{value:x*x}));}fn forwarded(x:Float)->Result<Float,Problem<Box<Float>>>{ let item:Box<Float>=checked(x)?; return ok(item.value*3.0);}fn recover(result:Result<Float,Problem<Box<Float>>>)->Float{ match(result){  ok(value)=>{return value;}  error(reason)=>{return match(reason){Problem<Box<Float>>.Bad(item)=>item.value*2.0,Problem<Box<Float>>.Empty=>0.0};} }}fn main(){ let q=qreg[1]; let result:Result<Float,Problem<Box<Float>>>=forwarded(theta); Ry(q[0],recover(result)); let cost=expect Z(q[0]); let slope=gradient cost wrt theta; return slope;}

Sınırlı yardımcı döngüsü ve değiştirilebilir sayısal yereller

Saf yardımcıda let mut ile açıkça bildirilen Int veya Float yereline aynı tipte yeni değer atayın. for i in 0..4 gövdesi i = 0, 1, 2, 3 için çalışır; bitiş sınırı dahil değildir. Sınırlar kaynakta yazılmış 0–256 tam sayı sabitleri olmalıdır. Eşit sınırlar sıfır tekrar demektir; ters aralık reddedilir.

Örnek dört Float değerini toplar: [0.1, 0.2, 0.3, 0.4] → Float: 1. 0..4 yerine 0..0 yazınca toplam 0 olur. 0..5 yaparsanız values[4] sınır hatası verir; dizi dışından sessiz değer okunmaz. Örnek classicalFunctions ve typedClassicalValues yanında main Result dönüşü için functionResults seçeneğini açar.

Sınırlı toplama örneğini aç

sum_values(Array<Float, 4>) → Float: 1

module bounded_sum; fn sum_values(values: Array<Float, 4>) -> Float {  let mut sum: Float = 0.0;  for i in 0..4 {    sum = sum + values[i];  }  return sum;} fn main() -> Result<Float, Error> {  let q = qreg[1];  let values: Array<Float, 4> = [0.1, 0.2, 0.3, 0.4];  let total: Float = sum_values(values);  Ry(q[0], total);  return ok(total);}

Döngü indisi Int ve değiştirilemez; yalnız gövdede görünür. Parametreler, normal let yerelleri, ok payload ve diziler değiştirilemez. Yalnız let mut Int/Float yeniden atanabilir; örtük Int/Float dönüşümü yoktur. Döngü yerelleri her turda yeniden oluşturulur, blok dışına taşmaz ve dış adı gölgeleyemez. Döngüden sonra dönüş gerekir; yalnız döngü içindeki return yeterli sayılmaz. İç içe döngüler ve yardımcı çağrıları aynı 4096 değerlendirme adımı bütçesini paylaşır; while eklenmez.

Yardımcı içinde dizi indisi herhangi bir Int ifade olabilir: parametre, yerel, döngü indisi veya hesap. Negatif ya da dizi boyunu aşan indis çalışma hatasıdır. Main de classicalFunctions ve typedClassicalValues açıkken çalışma zamanı Int indislerini destekler; bu sayfadaki main çalışma zamanı örneklerine bakın. Analitik eğitim, yardımcı fonksiyonlarda 0–256 aralığında kaynakta yazılmış tam sayı sınırlarıyla (bitiş hariç) döngüleri, Int/Float yerel birikimlerini ve türevi alınan girdiden bağımsız, sınır denetimli Int indislerini destekler. İç içe çağrılar ve döngüler ortak 4096 adım bütçesini kullanır. Parametreye bağlı ayrık kararlar/indisler ve çalışma zamanında belirlenen döngü sınırları desteklenmez. Tipli Result kurtarma ve sınırlı main döngüsü türevleri kendi belgelenmiş sözleşmelerine tabidir.

Editör mut yerelini değiştirilebilir, döngü indisini salt okunur olarak gösterir. Referanslar ve yeniden adlandırma atamanın okuma/yazma taraflarını birlikte izler; kardeş döngünün aynı adlı indisini değiştirmez.

Modül takma adlarıyla aynı adlı yardımcıları ayırın

use workspace.scale as linear; yalnız linear.adjust(...) üzerinden erişim sağlar. İki modül aynı adjust adını dışa aktarabilir; düz adjust(...) adı takma adlı importtan gelmez. Örnekte linear.adjust(0.25) ve shifted.adjust(0.25) ayrı modüllerden 0.5 döndürür; sonuç Float: 1 olur.

Aktarım ana kaynakla scale ve offset modüllerini birlikte taşır. Playground'da kaynak ve bağlamı yüklemeyi açıkça onaylayın; classicalFunctions, typedClassicalValues, functionResults ve moduleVisibility özellikleri gösterilir. Ardından kendiniz çalıştırın. Aktarım otomatik çalıştırma yapmaz.

alias_demo.nm → Float: 1

module alias_demo;use workspace.scale as linear;use workspace.offset as shifted; fn main() -> Result<Float, Error> {  let q = qreg[1];  let first: Float = linear.adjust(0.25);  let second: Float = shifted.adjust(0.25);  let angle: Float = first + second;  Ry(q[0], angle);  return ok(angle);}

scale.nm

module scale;pub fn adjust(value: Float) -> Float {  return value * 2.0;}

offset.nm

module offset;private fn offset_value(value: Float) -> Float {  return value + 0.25;}pub fn adjust(value: Float) -> Float {  return offset_value(value);}

Takma ad yalnız onu içe aktaran modülde geçerlidir. private yardımcılar ve dolaylı bağımlılıklar dışarı açılmaz; shifted.offset_value(...) reddedilir. Takma ad başka yardımcı, parametre veya yerel adını gölgeleyemez. Bu sözdizimi saf yardımcı importlarına aittir; genel modül nesnesi ya da yeniden dışa aktarım eklemez.

linear. sonrasında yalnız erişilebilir üyeler tamamlanır. Üye üzerinde F12 asıl yardımcı bildirgesine, takma ad üzerinde F12 import bildirgesine gider. Üyeyi yeniden adlandırmak asıl yardımcı ve tüketicilerini; takma adı yeniden adlandırmak yalnız bu modülün importunu ve niteleyicilerini değiştirir. Kaynak haritalı debugger asıl modül satırlarını korur.

Kayıtları ve tipli hataları dosyalar arasında kullanın

Bir dosya Sample kaydını ve Problem hata enumunu tanımlar; ana program bunları a takma adıyla kullanır. Takma ad değişse de tipin kimliği aynı kalır. Örnekte ilk X kapısı çalışır; negatif girişte ? ana programı hata ile bitirir ve ikinci X çalışmaz.

main.nm

module workspace_import_example;use workspace.imported_types as a;@target("browser-statevector");fn main()->Result<Float,a.Problem>{ let q=qreg[1]; let sample:a.Sample=a.make(0.5); let angle:Float=a.read(sample); if(angle>0.0){X(q[0]);} let input:Result<Float,a.Problem>=a.checked(-1.0); let value:Float=input?; X(q[0]); return ok(value);}

imported_types.nm

module imported_types;pub record Sample {energy:Float}pub enum Problem {Negative}private fn square(x:Float)->Float{return x*x;}pub fn make(x:Float)->Sample{return Sample{energy:square(x)};}pub fn read(sample:Sample)->Float{return sample.energy;}pub fn checked(value:Float)->Result<Float,Problem>{ if(value<0.0){return error(Problem.Negative);} return ok(value);}

Çalıştırdıktan sonra Çalışma alanı dosyalarında kütüphanenin return error(Problem.Negative); satırını return ok(0.4); ile değiştirip tekrar çalıştırın. Bu kez ikinci X de çalışır ve program Float: 0.4 döndürür.

Deneysel özelliktir. Kaynak ve bağlamı yükledikten sonra çalıştırın. Özel üyeler dışarı açılmaz. Helper dönüşleri, main yerelleri ve main program sonucunda Result başarı değeri skaler, kayıt, enum, sabit boyutlu sayısal dizi, Complex veya matris olabilir. Generic kayıt/enum tipleri de dosyalar arasında kullanılabilir. Dosyalar arası tamamlama, tanıma gitme ve güvenli yeniden adlandırma desteklenir.

Kayıp fonksiyonunu ayrı dosyada geliştirin

losses.nm, tahmin ile etiket arasındaki farkı bir kayıtta tutar ve karesini hesaplar. Ana program a.loss fonksiyonunu iki adımlık eğitimde kullanır. Sonuç, aynı devrede yerleşik MSE kaybıyla eşleşir; bu bir simülatör alıştırmasıdır.

Kaynak ve bağlamı yükleyip Çalıştır'ı seçin. Sonuçtaki a.loss adını, eğitim geçmişini ve doğrulama/test kayıplarını inceleyin. Çalışma alanı dosyalarında losses.nm kaynağını düzenleyip yeniden çalıştırabilirsiniz.

main.nm

module learner;use workspace.losses as a;@dataset("moons_2d",split:"train");param theta:Angle=0.37;fn main(){ let q=qreg[2]; encode(sample_row(0),q,method:"angle"); Ry(q[0],theta); let cost=expect Z(q[0]); train { objective:minimize cost; optimizer:gd(lr=0.1); steps:2; dataset:moons_2d; loss:custom(a.loss); validation: split = validation, every = 1; checkpoint: best(metric = validation_loss); } return cost;}

losses.nm

module losses;pub record Residual {delta:Float}enum State {Ready,Failed}private fn squared(item:Residual)->Float{return item.delta*item.delta;}pub fn loss(p:Float,y:Float)->Float { let item:Residual=Residual {delta:p-y}; return match(State.Ready){State.Ready=>squared(item),State.Failed=>1.0/0.0};}

Hata konumunu görmek için kütüphanede State.Ready=>squared(item) ifadesini State.Ready=>1.0/0.0 ile değiştirin. Eğitim durur; hata kartı losses modülünde fonksiyon başlangıcını gösterir. İfadeyi geri yükleyip yeniden çalıştırın.

Deneysel ve gürültüsüz statevector eğitimi. Kayıp iki Float alır ve Float döndürür. Tipli Result kurtarma türevleri desteklenir; tahmine bağlı ayrık kararlar reddedilir. Kütüphane değişince yeniden çalıştırın; eski sonuç yeni kaynak için geçerli değildir.

Bu, deneysel bir simülatör özelliğidir. Kuantum donanımında çalıştırma veya yayımlanmış paket sürümü anlamına gelmez.