Tüm yazılar

Aynı model, aynı sayılar: determinizm ve köken bilgisi

Aynı modelin aynı oturumdaki iki çözümü son basamaklarda farklılaşabiliyordu. Bunun neden olduğunu, nasıl düzelttiğimizi ve artık her raporun kendisini hangi sürümün ve hangi verilerin ürettiğini nasıl belirttiğini, böylece herkesin onu yeniden üretebildiğini anlatıyoruz.

İmzalı bir hesap raporu yeniden üretilebilir olmalıdır. Biri projeyi bir yıl sonra yeniden açtığında ya da başka bir mühendis onu incelediğinde aynı model aynı sayıları vermeli ve bu sayıları programın hangi sürümünün ürettiği açıkça belli olmalıdır.

Bunu ölçtüğümüzde her zaman geçerli olmadığını gördük: aynı modelin aynı oturumdaki iki çözümü son basamaklarda farklılaşabiliyor, bazı sonuçlar da farklı bir sırayla çıkıyordu. Farklar çok küçüktü; ama hiçbir şey değişmemişken değişen bir sayı, kontrol edilemeyen bir sayıdır.

Fark nereden geliyordu

Hesap motoru düğümleri, çubukları, mesnetleri ve yükleri hash tablolarında tutar ve her tablo rastgele bir tohumla oluşturulur: iki kez okunan aynı dosya iki farklı sırayla dolaşılır. Kayan noktalı sayıları başka bir sırayla toplamak son biti değiştirebilir, çünkü bilgisayardaki toplama işlemi birleşmeli değildir. 3B rijitlik kurucuları çubukları zaten sıralıyordu; ama 2B olanlar, yük ve mesnet döngüleri ve diğer analizlerin çoğu sıralamıyordu.

  • Bir girdi tablosu üzerindeki her dolaşma artık sabit bir sırayla, anahtarlarının sırasıyla yapılıyor: hesap motorunun genelinde 587 yer.
  • Denge toplamları ve eğik mesnetlerin çapraz terimleri de sabit bir sırayla dolaşılıyor.
  • Uyarılar rastgele değil, düğüm veya çubuk numarasına göre sıralı çıkıyor.
NeSayı
Sabit bir sıraya bağlanan girdi tablosu dolaşmaları587
Her rastgele modelin bit bit karşılaştırılan okuma sayısı6
Hesap motorunda neyin değiştiği ve nasıl kontrol edildiği.

Bir test her rastgele modeli altı kez okur, çözer ve sonuçları doğrusal, modal, burkulma ve P-Delta analizlerinde metin olarak, bit bit karşılaştırır. Bir sonucu değiştiren sırasız bir dolaşma, çalıştırmalar arasında bir fark olarak ortaya çıkar.

Her rapor nereden geldiğini söyler

Her hesap raporu, PRO raporu, çalışma kitabı ve CSV dosyası artık bir köken bilgisi bloğu taşıyor: uygulamanın ve hesap motorunun sürümü ve commit’i, çözümü yapan WebAssembly modülünün SHA-256 parmak izi, tam modelin, ayarların ve gösterilen sonuçların parmak izi ile sertifikaların durumu (gezici yük zarfı daha azını kaydeder: modelini ve ayarlarını). Dışa aktarma hazırlanırken proje değiştiyse hiçbir şey dışa aktarılmaz: bir rapor hiçbir zaman bir durumun sayılarını başka bir durumun köken bilgisiyle taşımaz.

Bu blok sayesinde uygulama bir raporu yeniden üretebilir: projeyi yeniden çözer ve her parmak izini karşılaştırır. Sonuç yalnızca hepsi eşleştiğinde “yeniden üretildi” olur (farklı bir WebAssembly derlemesi yanında belirtilir, fark sayılmaz); biri yeniden hesaplanamadıysa sonuç “yeniden üretildi” değil, “eksik” olur. Aynı girdiyi iki kez çözüp parmak izlerini kontrol eden bir komut satırı aracı da var.

Eski projeler bunu belirtir

Kaydedilen her proje, hangi sonuç sürümüyle çözüldüğünü kaydeder. Özelliklerini ilgilendiren bir değişiklikten önce çözülmüş bir proje açıldığında uygulama bu değişiklikleri sizin dilinizde açıklayarak listeler ve proje yeniden çözülene kadar sonuçları güncelliğini yitirmiş olarak işaretler. Şüphe durumunda değişiklik geçerli sayılır: fazladan bir bildirim bir dakikaya mal olur, eksik bir bildirim ise değişmiş bir sayıyı gizleyebilir.

Bir sınır

Uygulama her zaman WebAssembly’yi WebAssembly ile karşılaştırır. Yerel araç, test modelinde tarayıcının parmak izlerini bit bit yeniden üretti; ancak trigonometrik fonksiyonlar her platformda farklı kütüphanelerden gelir. Bu yüzden rijitlik matrisinin kurulmasında bu fonksiyonları iki kütüphanenin farklı yuvarladığı bir biçimde kullanan bir model, komut satırı ile tarayıcı arasında son bitte farklılaşabilir.

Tüm yazılar

Okumaya devam et