Parametre çalışmalarını C ++ ile çalıştırmanın iyi bir yolu nedir


29

Sorun

Halen bir Sonlu Elemanlar Navier Stokes simülasyonu üzerinde çalışıyorum ve çeşitli parametrelerin etkilerini araştırmak istiyorum. Bazı parametreler bir giriş dosyasında veya komut satırı seçenekleriyle belirtilir; diğer parametreler Makefile'de bayraklar olarak sağlanmıştır, bu yüzden bu seçenekleri değiştirdiğimde kodum yeniden derlenmelidir. Parametre alanını sistematik olarak araştırmanın iyi bir yolu hakkında bir tavsiye almak isterim.

  • Bu tür şeylerle yardımcı olabilecek faydalı C ++ / Python kütüphaneleri / çerçeveleri var mı? Örneğin, boost.Program_options öğesinin keşfedilmesi , girdi dosyası seçeneklerini komut satırı argümanları ile aşırı yüklemek mümkün olduğundan, çok yardımcı oldu. Ayrıca bazı kişilerin her vakayı etkili bir şekilde tanımlayan bir iş dosyası kullandıklarını gördüm ve bir meslektaşım yorum bloklarının da çalışabileceği gibi parametreleri vtu dosyalarına yazmayı önerdi.
  • Belki de bu konuda çok fazla zaman harcamak değmez? Bu sadece bir dikkat dağıtıcı ve zaman geçiriyor mu ve test sürecinde kaba kuvvet ve geçici olarak kas kullanmak en iyisi mi?

Bazı düşünceler

Şu anda çoğunlukla el ile şeyler yapıyorum ve aşağıdaki sorunlarla karşılaştım:

  • Test vakalarını adlandırmak . Sonuçları, alt çizgi ile ayrılmış çalışma parametreleriyle adlandırılmış klasörlere kaydetmeyi denedim Re100_dt02_BDF1.... Bunlar çok kısaltılırsa hızlıca okunması veya şifrelenmesi zorlaşır. Ayrıca, gerçek sayı parametreleri .garip / çirkin olanı içerir .
  • Günlük çalıştırma verileri . Bazen terminale yazılan sonuçları görmek ve ayrıca bir metin dosyasına kaydetmek istiyorum. Örneğin StackOverflow'un bu cevabı biraz yardımcı olabilir, ancak çözümler biraz müdahaleci görünüyor.
  • Parametreye göre veri çizmek . Çeşitli günlük dosyalarından ilgili verileri tek bir dosyaya toplayabilmem biraz zaman alabilir, daha sonra da daha kolay bir sistem olabilirdi.
  • Verilere yorum yapılması . Sonuçları inceledikten sonra bir metin dosyasına bazı yorumlar yazıyorum ama bunun sonuç klasörleriyle senkronize edilmesini sağlamak bazen zor.

Çok '' keşfetmek '' ile ne demek istediğinizi bağlıdır. Lütfen hedeflerinizi daha kesin olarak belirtin.
Arnold Neumaier

Yanıtlar:


10

Sadece iki puanınız hakkında yorum yapın:

  • Günlük verilerinin günlüğe kaydedilmesi : En iyi bahsiniz, muhtemelen çoğu kabukta bulunması gereken tee komutundan çıkan boru çıkışıdır .

  • Parametreye göre veri çizme : Sanırım bu bir zevk meselesi ama karmaşık veri toplama yapmak zorunda kaldığımda sonuçları düz metin olarak saklıyorum, Matlab'a matriks olarak okudum ve tüm hesaplamaları, komploları ve hatta LaTeX çıktısını okudum Buradan. Açıkçası, en aşina olduğunuz hangi programlama / komut dosyası dili size en iyi sonuçları verecektir.


Teşekkürler, teekomut çok kullanışlıdır
Matija Kecman

11

Genel amaçlı bir şey yazmak istiyorsanız, çok basit bir şeyse, kabuk komut dosyaları ile yapabilirsiniz. Pedro'nun önerdiği da Python veya MATLAB gibi daha üst düzey bir matematiksel programlama dilinde toplanabilirsiniz. Düz metin dosyalarının daha az miktarda veri için yararlı olduğunu kabul ediyorum, ancak birkaç megabayttan daha büyük bir şey için muhtemelen ikili verilere geçmelisiniz.

Öte yandan, sadece parametre tahmini yapıyorsanız, bunun için özellikle uygun bir yazılım kullanmanızı tavsiye ederim. Üniversitemdeki bazı araştırmacılar DAKOTA'ya iyi şanslar verdi. Sandia Ulusal Laboratuvarları'ndan ( GNU Daha Az Genel Kamu Lisansı altında temin edilebilir) bir Belirsizlik Miktarı araç kutusu .

İşte DAKOTA'yı tanımlayan Sandia sayfasından bir bölüm:

Bir kullanıcının, model çıktılarının model girdilerine göre hassasiyetini değerlendirmek için bir bilgisayar simülasyonları koleksiyonu çalıştırmasına izin vermek için çeşitli yöntemler sunuyoruz. Ortak kategoriler parametre çalışmaları, örnekleme yöntemleri ve deney tasarımını içerir. Parametre çalışmalarında bir tanesi bazı girdi parametrelerini bir aralıktan geçirirken diğer girdi parametrelerini sabit tutar ve çıktının nasıl değiştiğini değerlendirir. Örnekleme yöntemlerinde, bir girdi alan dağılımından örnekler üretilir ve girdi yanıtındaki çıktı tepkisini hesaplar. DAKOTA'da mevcut olan spesifik örnekleme yöntemleri, Monte Carlo, Latin Hypercube ve (yakında) quasi-Monte Carlo'dur. Deneylerin tasarımında, çıktı alanı temsili bir şekilde örneklemek için seçilen bir dizi giriş "tasarım" noktasında değerlendirilir. DAKOTA'da mevcut olan deney yöntemlerinin özel tasarımı, Box-Behnken, Merkezi Kompozit ve Faktörel tasarımları içerir. Duyarlılık ölçümleri, çıktıların girdilere bağımlılığını ifade etmenin matematiksel bir yoludur. Dakota içinde, basit ve kısmi korelasyon katsayıları ve sıra korelasyonları gibi çeşitli hassasiyet ölçümleri mevcuttur. Mevcut araştırmamız, minimum sayıda çalışma ile hassasiyet ölçümleri üretme yöntemlerine ve bilgisayar modellerinde Bayesian analiz tekniklerini kullanarak parametrelerin optimal tahminine odaklanmaktadır.


Bunun gibi bir başka araç, GRS tarafından Almanya'da geliştirilen SUSA'dır. Ancak bu ücretsiz değil.
GertVdE

İkili formatlarla ilgili sorun, bakımı daha zor olmaları, bir dosya formatının zamanla gelişmesi nadir değildir, bu nedenle bir ikili formatın ayrıştırılması ve desteklenmesi acı verici olabilir. Benim tecrübeme göre, düz metin, sıkıştırma (gzip) ve bir miktar komut satırı veya pitonu bir araya getirmek için birkaç yüz GB için bile iyi çalışıyor.
fcruz

1
@fcruz evet ya bzip2ve 7zipmetin için daha iyi sıkıştırma oranı sunmaktadırlar hangi.
Ajasja

8

Doktora çalışmalarım için ben de sizin gibi benzer konularla karşılaşıyorum. Kullandığım kod benim olmadığım halde, sizlerle aynı esnekliğe sahip değilim. Bu, birkaç önerim var dedi.

Pedro'nun önerdiği gibi, tee komutu var. Ancak, mevcut değilse veya yazılımınıza eklenmiş bir şey istiyorsanız, boost::iostreamskütüphaneye bakmanızı öneririm . Standart kütüphanenin yapmadığı giriş kaynaklarını ve çıkış havuzlarını tanımlamak için mekanizmalar sağlar. Özellikle, tee_deviceiki çıkış lavabosunu akışınıza bağlamanıza izin veren var ve diğer akışlar lavabo gibi davranabilir. Bu, eşzamanlı çıktıya stdoutve bir günlük dosyasına config bağımlı yapmanıza izin verir .

boost::program_options1iniboost::program_optionsboost::property_tree

Farklı hesaplamalardan veri toplamak için bir kümeye dahil etmek istediğim tüm veri dosyalarının üzerinden geçiyorum , sonra awk kullanıyorum dosyada tek bir satır üretmek ve tüm sonuçları çıktılarıma aktarıyorum. Bu birkaç dakika sürebilir, fakat ne yazık ki daha iyi bir yöntemim yok.

Verilerinizi işleme koyma / yorumlama konusunda Mathematica notebook formatının ne kadar yararlı olduğunu vurgulayamıyorum. Gözlemlerimi, spekülasyonlarımı ve görselleştirmelerimi tek bir yerde düzenlememe izin veriyor. Not defterlerim düzenli olarak en fazla 100 MB tutar. İyi bir ölçüm için Mathematica , Matlab'ın yanı sıra matris görevlerinde de performans gösterir. Ek olarak, gerçek zamanlı olarak tam matematiksel biçimlendirme ile not almak için kullanılabilir .

Keşke isimlendirme problemine daha iyi bir çözüm bulabilseydim ve bu oldukça tehlikeli. Bundan dolayı verilerinizin bir kısmını bir veritabanına aktarmayı düşünmek faydalı olabilir. Ancak, bunu yapmak istemiyorsanız , simülasyonunuz hakkında daha ayrıntılı bilgi almak için XFS'deki genişletilmiş öznitelikleri kullanmayı düşünün ve config dosyanızı oluşturmak için kullanılan verilerle birlikte saklayın.

Hiyerarşik yapılandırma dosyaları gereklidir Örnek olarak 1. bir arkadaşım farklı uç geometrileri etkilerini inceleyen oldu AFM ve her geometri parametreleri farklı bir dizi vardı. Ek olarak, bunun yanında, birkaç deneme şemasını test ediyordu, böylece onları deneyle karşılaştırabildi ve çok farklı parametrelere sahipti.


1
Son zamanlarda yaptığım, simülasyonu Mathematica'dan sürdüğüm. Konfigürasyon dosyaları, giriş dosyaları vb. Kullanmak ve simülasyonu bir komut satırı programı yapmak yerine, sadece Mathematica'ya bir LibraryLink arayüzü tanımladım. Bu şekilde parametreleri veya verileri yapılandırılmış bir şekilde iletebilirim ve her türlü komut satırı seçeneğini / giriş-çıkış dosyası formatlarını kullanmak zorunda kalmanın acısını çekebilirim. Görselleştirme / çizime anında erişebiliyorum ve karmaşık senaryolar için farklı parametreler için simülasyon çalışmasını kolayca otomatikleştirebiliyorum.
Szabolcs

(Bu şekilde uyarlanabilir örnekleme olayını yakalarım . Programımı komut satırından çağırıyor olsaydım, bunun gibi bir şeyi uygulamak çok fazla iş ve çok iyi bir neden olmadan çalışmaya başlamak için çok fazla sorun. muhtemelen saf deney çıkıp yüksek düzeyde sisteminin kullanılması Mathematica deneyler kolay yeterince yapılmış gibi fikri doğal olarak geldiğini bir aynı şekilde diğer üst düzey sistemleri kullanan sanırım)...
Szabolcs

Yararlı cevabın için teşekkürler, bir göz atacağım boost::property_tree. Başka bir sorun boost::program_options, uygulamanızın yalnızca üstbilgileri artıran bir makinede çalışmasını istiyorsanız, garip olan yalnızca başlık içeren bir kütüphane olarak kullanılamaz görünmesidir. Bu arada, bunun neden olduğunu bilen var mı? Görünüşe göre zaten oldukça küçük bir kütüphane. (Belki de bu yükseltme kullanıcılar listesine göndermek için daha iyidir)
Matija Kecman

@ mk527 boost::program_optionsBir kütüphaneye yapılmasını sağlamak için neyin gerekli olduğunu bilmiyorum . Bununla birlikte, bir artırma alt kümesi çıkarmak için bcp yardımcı programına baktınız mı?
rcollyer

3

PETSC'yi kurarken PyTables'ı tanıyorum. Ve sanırım henüz denememiş olsam da, tablo (veya veritabanı) yöntemi parametre alanını araştırmak için çok uygun. Her koşuyu belirli parametrelerle kaydedebiliriz ve sonra bazı koşulları sağlayan herhangi bir topluluğa bakabiliriz, örneğin, dt, BDF1'i düzeltebilir ve diğer parametreler nedeniyle varyasyonları incelemek için tüm ilgili kayıtları arayabiliriz.

Parametre alanını araştırmak için tablo (veya veri tabanı) metodunu kullanan kişilerden haber almak istiyorum. Detaylı örnekler için teşekkür ederiz.


3

Yapmaya çalıştığınız gibi parametre alanını keşfetmek çok çabuk hantallaşabilir. Bunu yapmanın çok farklı yolları var, tek bir gerçek çözüm yok.

Genellikle işinizde bu sınıra ulaştığınızda, HDF5 hiyerarşik veri formatlarını araştırmak isteyebilirsiniz . HDF5, simülasyonunuzun karmaşık çıktısını iyi tanımlanmış bir dosya biçiminde saklamanızı sağlar. Avantajları, verilerinizin tek bir iyi tanımlanmış dosya biçiminde depolanmasıdır. Dosyanıza farklı parametrelerle tanımlanan birden fazla simülasyon işlemi ekleyebilir ve ardından bunları işleyebilirsiniz. Veriler sıkıştırılabilir ve çeşitli araçlar kullanılarak elde edilmesi oldukça kolaydır. Dosyaları işlemek için c / c ++ / python etc ve birçok komut satırı aracı için apis uygulaması kolaydır. Dezavantajı ise hdf5'e yazmanın konsola yazmak kadar kolay olmadığıdır. HDF5 örneklerinde pek çok örnek program var .


2

İndekslenmiş bir değişken değerleri tablosu tutmak istiyorsunuz. Dizin, her bir simülasyon girişini ve çıkışını sakladığınız bir klasöre karşılık gelir. Yani bu sadece bir indeks ve konvansiyon veya klasör hiyerarşilerini adlandırma konusunda endişelenmenize gerek yok çünkü her bir klasöre hangi parametre değerlerinin karşılık geldiğine bakacaksınız.

Şimdi bu tabloyu son işlem, komplo (analiz), kayıt ve yorum yapmak için kullanabilirsiniz. Tablo iş akışının merkezindedir.

Bu temel fikir ve ben sadece kavramsal olarak ne yapmak isteyebileceğinizi açıklıyorum. İlk cevabımda geliştirdiğim çerçeveye bakmayı önerdim. Daha yakın zamanda Sumatra'yı keşfettim . Bireysel olarak geliştirilen, zorlayan mezun öğrencimden çok daha gelişmiş ve python için yeni bir çaba ama bence çok fazla şey yapmaya çalışıyor. Çerçevem ​​iş akışı verimliliğine odaklanırken provenans bilgilerine odaklanmıştır. Ayrıca iş adamı , kutsal ve lencet var .

Ne yapmayı seçerseniz seçin, tüm iş akışınızı python ile yönetebildiğiniz için bu tür görevlerle başa çıkmak için python'u şiddetle tavsiye ederim. Tıpkı küçük bir hikaye gibi, meslektaşlarımın DAKOTA, bash, GNUplot, dosya adlandırma kuralları, sed / awk oktav ... vb. hesaplamalı işlerini yapmak için. Bu araçların her biri kendi başına gayet iyi ancak pitonun entegre tutkal dili olarak gücü, pitonu bilimsel yığınla birlikte çalışmanızı yönetmek için pitonu kullanırken gerçekten parlıyor. Tam anlamıyla, çerçevemi geliştirdikten sonra hesaplamalı çalışmamı yöneten sıfır sorun yaşadım.

/ ilk cevabım /

Python kullanarak bu sorunu çözdüğüme inanıyorum. Bütün bu meseleleri düşündüm.

Depomu inceleyin http://msdresearch.blogspot.com/2012/01/parameter-study-management-with-python.html

Şu an itibariyle, çerçevemi daha iyi belgelemek için çalışıyorum. (Benioku doldurmaktan daha fazla söz konusudur!)

-Majid alDosari


1
Merhaba Majid, katkılarınız için teşekkürler ve SciComp'a hoş geldiniz. Genel olarak, StackExchange siteleri dış sayfalara bağlantı vermekten vazgeçer ve sitenin kendisiyle ilgili ayrıntılı yanıtları teşvik eder. Tek bağlantılı "reklamlar" kesinlikle önerilmez. Bu cevabı gözden geçirmeyi ya da silmeyi öneriyorum, çünkü halihazırdaki haliyle iyi karşılanmayacak.
Aron Ahmadia,

anladım. Ben sadece çözümün yazı biçiminde verilebileceğine inanmıyorum. sorun oldukça genel.
majidaldosari

1
En azından düşündüğünüz bu konulara yaklaşımınızı özetleyebilir misiniz?
Christian Clason

1

Burada , burada ve burada bulunabileceği gibi, araştırma çalışmaları sırasında geliştirdiğim aşağıdaki uygulamaya katılıyorum .

Değişkenleri programa geçirmek ve daha sonra değiştirebilmek için tanımladığım bash betiğini kullanma paradigmasını kullanıyorum

export aValue=10
export bValue=2
export idName=test

ve sonra C / C ++ ile kullanın.

char *env_aValue = getenv("aValue");
char *env_bValue = getenv("bValue");
char *env_idName = getenv("idName");

aValue = atoi(env_aValue)
...

Bunun en büyük avantajı şudur:

  • küresel bir kapsamda erişilebilir,
  • güneş ızgarası motoruna (kümeler) taşınabilir,
  • bash betiğinde kolayca değiştirilebilir,
  • platformdan bağımsız
  • Parametre sayısı çok fazla olabilir (potansiyel olarak sonsuz)

Ayrıca, her zaman o yürütülebilir dosya tarafından yazılan her dosyanın ilk kimliğini alacağı (eğer istersen diğer parametreler tarafından takip edilebileceği) bir idName geçiririm ve ayrıca bunlar üzerinde oluşturulan bir export dizini alırlar = idName, bash betiği ve bu çalıştırılabilir dosyaların tümü ona kaydedilir. Bu şekilde sonuçlar dizinler tarafından düzenlenir (isteğe bağlı).


0

Dışarı kontrol edebilirsiniz sfepy neredeyse tamamen python kodlu bir sonlu elemanlar programı. Aynı zamanda Navier Stokes problemi var. Sfepyenin işletim prosedürü çok kolaydır.


1
Bu cevabın soruyu cevapladığı gibi hissetmiyorum. Posterin bir simülasyonu var; Simülasyonunu farklı bir yazılımla tamamen yeniden yapmak yerine, mevcut simülasyonuna bir çerçeve sarmak istediği izlenimini edindim.
Geoff Oxberry

sfepy bir çerçeve olarak da çalışır, bunu kara kutu PDE çözücü olarak kullanabilirsiniz. Ancak, afişin kodlamada çok zaman harcadığı için haklı olduğunuzu düşünüyorum.
ShadowWarrior

0

MySQL veritabanı kullanmayı düşündünüz mü? Bunu hiç yapmadım, ama bu sistemi çok iyi sorgulayabileceğinizi hayal edebiliyorum! Belki de MongoDB gibi diğer sistemler daha iyidir. Yani, bu sadece bir fikir.

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.