Algoritma parametrelerini kolayca değiştirmek için hangi programlama stratejilerini alabilirim?


17

Bilimsel algoritmalar geliştirmek, çoğunlukla deneysel tasarımımın bir parçası olarak veya ince ayar algoritması performansının bir parçası olarak değişmek isteyeceğim birçok parametreyi değiştirmeyi içeren oldukça yinelemeli bir süreçtir. Bu parametreleri, yinelemeler arasında kolayca değiştirebilmem ve kolayca yenilerini ekleyebilmem için yapılandırmak için hangi stratejileri alabilirim?

Yanıtlar:


14

Kullanıcının bir algoritmanın her yönünü belirtmesi zahmetlidir. Algoritma iç içe bileşenlere izin veriyorsa, sınırlı sayıda seçenek yeterli olmaz. Bu nedenle, açık argümanlarda veya şablon parametrelerinde olduğu gibi seçeneklerin mutlaka en üst düzeye "kabarması" gerekmez. Buna bazen yazılım mühendisliğinde "yapılandırma sorunu" da denir. PETSc'nin konfigürasyon yönetimi için benzersiz bir güçlü sistemi olduğuna inanıyorum . Martin Fowler'in kontrolü tersine çevirme denemesindeki Servis Bulucu modeline benzer .

PETSc'nin yapılandırma sistemi, çözücü nesneleri (alma ve ayarlama sorguları ile) ve Seçenekler Veri Tabanı tarafından yönetilen kullanıcı tanımlı yapılandırmanın bir kombinasyonu ile çalışır. Simülasyonun herhangi bir bileşeni, bir yapılandırma seçeneği, varsayılan bir değer ve sonucu koymak için bir yer bildirebilir. İç içe nesnelerin, yapılandırılması gereken her nesnenin bağımsız olarak ele alınabileceği şekilde oluşturulabilen önekleri vardır. Seçeneklerin kendisi komut satırından, ortamdan, yapılandırma dosyalarından veya koddan okunabilir. Bir seçenek bildirildiğinde, -helpseçeneğin anlaşılabilir olması ve düzgün şekilde bağlanmış bir GUI'nin yazılabilmesi için bir yardım dizesi ve kılavuz sayfası belirtilir .

Kullanıcı SetFromOptions, bir nesneyi komut satırı seçeneklerine göre yapılandırmak için bir yöntem çağırır . Bu işlevin çağrılması isteğe bağlıdır ve kullanıcı (PETSc'yi çağıran kişi kodu yazarken) seçenekleri başka bir arabirim üzerinden açıyorsa çağrılmayabilir. Son kullanıcıya (uygulamayı çalıştıran kişi) çok fazla güç sağladığı için, kullanıcının seçenekler veritabanını göstermesini önemle tavsiye ederiz, ancak gerekli değildir.

Yoluyla adlandırılan tipik bir yapılandırma

PetscObjectOptionsBegin(object); /* object has prefix and descriptive string */
PetscOptionsReal("-ts_atol",                                      /* options database key */
                 "Absolute tolerance for local truncation error", /* long description */
                 "TSSetTolerances",                               /* function and man page on topic */
                  ts->atol,                                       /* current/default value *?
                  &ts->atol,                                      /* place to store value */
                  &option_set);                                   /* TRUE if the option was set */
PetscOptionsList("-ts_type","Time stepping method","TSSetType",TSList,
                 defaultType,typeName,sizeof typeName,&option_set);
TSAdaptSetFromOptions(ts->adapt);                                 /* configures adaptive controller method */
/* ... many others */
/* ... the following is only called from implicit implementations */
SNESSetFromOptions(ts->snes);                                     /* configure nonlinear solver. */
PetscOptionsEnd();

Notlar:

  • PetscOptionsList()kullanıcıya dinamik listeden bir seçenek sunar. Yeni uygulamaların kendilerini birinci sınıf olarak arayanlara göstermek için kullanabileceği bir eklenti mimarisi vardır. (Bu uygulamalar paylaşılan kütüphanelere yerleştirilebilir ve programları yeniden derlemeden birinci sınıf olarak kullanılabilir.)
  • SNESSetFromOptions() doğrusal çözücüler, önkoşullar ve yapılandırmaya ihtiyaç duyan diğer bileşenleri özyinelemeli olarak yapılandırır.

11

Kendi simülasyon kodlarımı sıfırdan geliştirirken bu problemle birkaç kez karşılaştım: hangi parametrelerin komut satırından alınması gereken bir giriş dosyasına gitmesi gerekir. Bazı deneylerden sonra, aşağıdakilerin etkili olduğu ortaya çıktı. (PETSc kadar gelişmiş değildir.)

Deneysel bir simülasyon programı yazmak yerine, simülasyonu çalıştırmak için gereken tüm fonksiyonları ve sınıfları içeren bir Python paketi yazmaya daha yatkınım. Geleneksel girdi dosyası daha sonra 5 ila 10 satırlık kod içeren küçük Python betiği ile değiştirilir. Bazı satırlar genellikle veri dosyalarının yüklenmesi ve çıktıların belirlenmesi ile ilgilidir. Diğerleri gerçek hesaplama için talimatlardır. Python paketindeki isteğe bağlı bağımsız değişkenler için iyi varsayılan değerler, yeni başlayanların kütüphaneyi basit simülasyonlar için kullanmalarını sağlarken, gelişmiş kullanıcı hala tüm çan ve ıslıklara erişebilir.

Birkaç örnek:


Bu harika, ama yapılandırma problemine dik olduğunu düşünüyorum. Hiyerarşik veya iç içe bir algoritma belirtmeniz gerekiyorsa, birçok iç nesne için belirtme seçenekleriniz vardır. Bunları çağıran kod, varoluşlarını gerçekten bilmemelidir çünkü seviye sayısı ve yuvalama türleri değişebilir. Tüm bu seçeneklerin "kabarması" sorunu budur. Üst düzey Python kodunuzla, bu seçenekleri belirtmeyi "kolay" hale getirebilirsiniz, ancak yine de kodda belirtmeniz gerekir. Bence bu genellikle iyi bir şey değil.
Jed Brown

xmonad , X için pencere yöneticilerini yapılandırmak için bu yöntemi kullanır.
rcollyer 15

2

İlk olarak, algoritmayı VE yazılımını olabildiğince genel yapardım. Bunu zor yoldan öğrendim.

Diyelim ki basit bir test senaryosuyla başlıyorsunuz. Bunu daha hızlı yapabilirsiniz. Ancak, yazılımı bu ilk durum için çok spesifik hale getirdiyseniz (çok az parametre), her yeni özgürlük derecesi eklediğinizde, uyarlamaya daha fazla zaman kaybedersiniz. Şimdi yaptığım şey başlangıçta daha genel bir şey yapmak için daha fazla zaman harcamak ve ilerledikçe parametrelerin varyasyonunu arttırmak.

Bu, başlangıç ​​noktasından daha fazla parametreye sahip olacağınız için başlangıçtan itibaren daha fazla test yapılmasını gerektirir, ancak algoritma ile sıfır veya çok düşük bir maliyetle çok fazla oynayabileceğiniz anlamına gelir.

Örnek: algoritma, iki vektör fonksiyonunun nokta çarpımının yüzey integralinin hesaplanmasını içerir. Gelecekte bunu değiştirmek isterseniz, başlangıçtan itibaren yüzeyin boyutunu, geometrisini ve ayrıklığını varsaymayın. Nokta-ürün fonksiyonu yapın, yüzeyi olabildiğince genel yapın, integrali güzel ve resmi bir şekilde hesaplayın. Yaptığınız her işlevi ayrı ayrı test edebilirsiniz.

Başlangıçta, basit geometriler üzerinde entegrasyona başlayabilir ve başlangıçta sabit olarak başlangıç ​​parametrelerini bildirebilirsiniz. Zaman geçtikçe, geometriyi değiştirmek istiyorsanız, bunu kolayca yapabilirsiniz. Başlangıçta varsayımlar yapmış olsaydınız, her defasında tüm kodu değiştirmeniz gerekir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.