Apa cara yang baik untuk menjalankan studi parameter di C ++

29

Masalah

Saat ini saya sedang mengerjakan simulasi Elemen Hingga Navier Stokes dan saya ingin menyelidiki efek dari berbagai parameter. Beberapa parameter ditentukan dalam file input atau melalui opsi baris perintah; parameter lain disediakan sebagai flag dalam Makefile sehingga kode saya harus dikompilasi ulang setiap kali saya mengubah opsi itu. Saya akan tertarik untuk mendapatkan beberapa saran tentang cara yang baik untuk secara sistematis menjelajahi ruang parameter.

  • Apakah ada pustaka / kerangka kerja C ++ / Python yang berguna yang dapat membantu dengan hal semacam ini? Misalnya menemukan boost.Program_options sangat membantu karena dimungkinkan untuk membebani opsi file input dengan argumen baris perintah. Saya juga melihat beberapa orang menggunakan file pekerjaan yang menggambarkan masing-masing kasus dengan cukup efektif dan seorang kolega menyarankan agar menulis parameter ke file vtu sebagai blok komentar bisa berfungsi juga.
  • Mungkin tidak layak menginvestasikan banyak waktu dalam hal ini? Apakah ini hanya pengalih perhatian dan waktu-menguras dan yang terbaik untuk hanya otot melalui proses pengujian brute force dan ad hoc?

Beberapa pemikiran

Saat ini saya melakukan banyak hal dengan tangan dan saya mengalami masalah berikut:

  • Penamaan kasus uji . Saya mencoba menyimpan hasil di folder bernama dengan parameter run dipisahkan dengan garis bawah misalnya Re100_dt02_BDF1.... Ini dengan cepat menjadi panjang atau sulit dibaca / samar jika disingkat terlalu banyak. Juga, parameter bilangan real termasuk .yang canggung / jelek.
  • Log menjalankan data . Terkadang saya ingin melihat hasil yang ditulis ke terminal dan juga disimpan ke file teks. Jawaban dari StackOverflow ini misalnya agak membantu tetapi solusi tampaknya agak mengganggu.
  • Merencanakan data sesuai dengan parameter . Butuh beberapa waktu mengumpulkan data yang relevan dari berbagai file log ke dalam satu file yang kemudian dapat saya plot, dengan sistem yang lebih baik mungkin ini akan menjadi lebih mudah.
  • Merekam komentar pada data . Setelah memeriksa hasil saya menulis beberapa komentar dalam file teks tetapi menjaga ini disinkronkan dengan folder hasil kadang-kadang sulit.
Matija Kecman
sumber
Banyak tergantung pada apa yang Anda maksud dengan '' jelajahi ''. Silakan sebutkan tujuan Anda dengan lebih tepat.
Arnold Neumaier

Jawaban:

10

Hanya beberapa komentar tentang dua poin Anda:

  • Mencatat data yang berjalan : Taruhan terbaik Anda mungkin memipis output melalui perintah tee , yang seharusnya tersedia di sebagian besar shell.

  • Memplot data sesuai dengan parameter : Saya rasa ini masalah selera, tetapi ketika saya harus melakukan agregasi data yang kompleks, saya menyimpan hasilnya dalam teks biasa, membacanya di Matlab sebagai matriks, dan melakukan semua perhitungan, memplot dan bahkan output LaTeX dari sana. Jelas, bahasa pemrograman / scripting apa pun yang paling Anda kenal akan memberikan hasil terbaik.

Pedro
sumber
Terima kasih, teeperintah ini sangat berguna
Matija Kecman
11

Jika Anda ingin menulis sesuatu untuk keperluan umum, Anda bisa melakukannya dengan skrip shell jika itu adalah sesuatu yang sangat sederhana, seperti yang disarankan Pedro , atau digabungkan dalam bahasa pemrograman matematika tingkat tinggi seperti Python atau MATLAB. Saya setuju bahwa file teks biasa berguna untuk jumlah data yang lebih kecil, tetapi Anda mungkin harus beralih ke data biner untuk hal yang lebih besar dari beberapa megabita.

Di sisi lain, jika Anda hanya melakukan estimasi parameter, saya akan merekomendasikan menggunakan perangkat lunak yang khusus cocok untuk ini. Beberapa peneliti di Universitas saya memiliki keberuntungan dengan DAKOTA , kotak Kuantifikasi Ketidakpastian dari Sandia National Laboratories ( tersedia di bawah GNU General Public License ).

Berikut kutipan dari halaman Sandia yang menggambarkan DAKOTA:

Kami menyediakan berbagai metode untuk memungkinkan pengguna menjalankan koleksi simulasi komputer untuk menilai sensitivitas output model sehubungan dengan input model. Kategori umum meliputi studi parameter, metode pengambilan sampel, dan desain eksperimen. Dalam studi parameter, satu langkah beberapa parameter input melalui rentang sambil menjaga parameter input lainnya tetap dan mengevaluasi bagaimana output bervariasi. Dalam metode pengambilan sampel, seseorang menghasilkan sampel dari distribusi ruang input dan menghitung respons keluaran pada nilai input. Metode pengambilan sampel khusus yang tersedia dalam DAKOTA termasuk Monte Carlo, Latin Hypercube, dan (segera hadir) Monte Carlo. Dalam desain eksperimen, output dievaluasi pada set input "desain" poin yang dipilih untuk sampel ruang dengan cara yang representatif. Desain khusus metode eksperimen yang tersedia dalam DAKOTA meliputi desain Box-Behnken, Central Composite, dan Factorial. Metrik sensitivitas adalah cara matematika untuk mengekspresikan ketergantungan output pada input. Berbagai metrik sensitivitas tersedia di Dakota, seperti koefisien korelasi sederhana dan parsial, dan korelasi peringkat. Penelitian kami saat ini berfokus pada metode untuk menghasilkan metrik sensitivitas dengan jumlah minimal berjalan, dan pada estimasi optimal parameter dalam model komputer menggunakan teknik analisis Bayesian.

Aron Ahmadia
sumber
Alat lain seperti ini adalah SUSA yang dikembangkan oleh GRS di Jerman. Tapi yang ini tidak gratis.
GertVdE
Masalah dengan format biner adalah bahwa mereka lebih sulit untuk dipelihara, tidak jarang format file berevolusi seiring waktu, karenanya mem-parsing dan mendukung format biner dapat menyebalkan. Dalam pengalaman saya, teks biasa, kompresi (gzip), dan sedikit baris perintah atau python untuk mengatur semuanya bekerja dengan baik bahkan untuk beberapa ratus GB.
fcruz
1
@ fcruz ya, atau bzip2dan 7zipyang menawarkan rasio kompresi lebih baik untuk teks.
Ajasja
8

Untuk pekerjaan doktoral saya, saya mengalami masalah yang sama seperti Anda. Karena bukan kode saya yang saya gunakan, saya tidak memiliki fleksibilitas yang sama seperti Anda. Yang mengatakan, saya punya beberapa saran.

Seperti yang disarankan Pedro, ada perintah tee. Tetapi, jika itu tidak tersedia, atau Anda ingin sesuatu yang dibangun ke dalam perangkat lunak Anda sendiri, saya sarankan melihat boost::iostreamsperpustakaan. Ini menyediakan mekanisme untuk mendefinisikan sumber input dan output sinks yang tidak dilakukan oleh perpustakaan standar. Secara khusus, ada tee_deviceyang memungkinkan Anda untuk menghubungkan dua keluaran ke aliran Anda, dan aliran lainnya dapat bertindak sebagai tenggelam. Ini akan memungkinkan Anda untuk membuat keluaran simultan stdoutdan konfigurasi file log.

Saya setuju bahwa boost::program_optionsdapat sangat membantu dalam mengonfigurasi perangkat lunak Anda. Namun, ada beberapa kelemahan yang dapat memengaruhi cara Anda melakukan sesuatu. Pertama, jika Anda membutuhkan konfigurasi hierarkis,1iniboost::program_optionsboost::property_tree

Untuk mengumpulkan data dari perhitungan yang berbeda, saya mengulang semua file data yang ingin saya sertakan dalam satu set, saya kemudian menggunakan awk untuk menghasilkan satu baris dalam file, dan menyalurkan semua hasil ke dalam output saya. Ini bisa memakan waktu beberapa menit, tetapi sayangnya, saya tidak punya metode yang lebih baik.

Untuk memproses / mengomentari data Anda, saya tidak bisa menekankan kegunaan format notebook Mathematica. Ini memungkinkan saya untuk mengatur pengamatan, spekulasi, dan visualisasi saya semua di satu tempat. Notebook saya secara teratur mencapai 100 MB. Untuk ukuran yang baik, Mathematica melakukan sama baiknya dengan Matlab pada tugas-tugas matriks. Selain itu, dapat digunakan untuk membuat catatan dengan format matematika penuh secara real time.

Saya berharap saya punya solusi yang lebih baik untuk masalah penamaan, dan itu agak merusak. Mungkin bermanfaat mempertimbangkan mengeluarkan sebagian data Anda ke dalam basis data karena hal ini. Namun, jika Anda tidak ingin melakukan itu, pertimbangkan untuk menggunakan atribut diperluas di XFS untuk menangkap informasi yang lebih lengkap tentang simulasi Anda, dan simpan file konfigurasi Anda dengan data yang digunakan untuk menghasilkan.

1. Sebagai contoh di mana file konfigurasi hierarkis diperlukan, seorang teman saya sedang meneliti efek dari geometri tip yang berbeda dalam AFM dan masing-masing geometri memiliki serangkaian parameter yang berbeda. Selain itu, di samping ini, ia menguji beberapa skema perhitungan sehingga ia dapat membandingkannya dengan eksperimen, dan mereka memiliki parameter yang sangat berbeda.

rcollyer
sumber
1
Apa yang saya lakukan baru-baru ini adalah saya menggerakkan simulasi dari Mathematica. Alih-alih menggunakan file konfigurasi, input file, dll. Dan menjadikan simulasi program command-line, saya hanya mendefinisikan antarmuka LibraryLink ke Mathematica. Dengan cara ini saya dapat melewatkan parameter atau data dengan cara terstruktur, dan saya dapat menghindari rasa sakit karena harus menangani semua jenis opsi baris perintah / format file input-output. Saya mendapatkan akses instan ke visualisasi / merencanakan dan saya dapat dengan mudah mengotomatiskan menjalankan simulasi untuk parameter yang berbeda untuk skenario yang kompleks.
Szabolcs
(Ini adalah bagaimana saya terhubung dengan hal pengambilan sampel adaptif . Jika saya memanggil program saya dari baris perintah, menerapkan sesuatu seperti ini terlalu banyak pekerjaan dan terlalu banyak kesulitan untuk mulai melakukan tanpa alasan yang sangat bagus. Idenya bukanlah kemungkinan keluar dari eksperimen murni. Menggunakan sistem tingkat tinggi seperti Mathematica membuat eksperimen cukup mudah sehingga idenya muncul secara alami. Saya kira orang dapat menggunakan sistem tingkat tinggi lainnya dengan cara yang sama.)
Szabolcs
Terima kasih atas jawaban Anda yang bermanfaat, saya akan melihatnya boost::property_tree. Masalah lain dengan boost::program_optionsitu tampaknya tidak dapat digunakan sebagai pustaka header-saja yang canggung jika Anda ingin aplikasi Anda berjalan pada mesin yang hanya memiliki tajuk. Kebetulan, ada yang tahu mengapa ini terjadi? Ternyata itu perpustakaan yang cukup kecil. (Mungkin lebih baik untuk memposting ini di daftar pengguna boost)
Matija Kecman
@ mk527 Saya tidak tahu apa yang diperlukan boost::program_optionsuntuk memaksa itu dibuat menjadi perpustakaan. Namun, sudahkah Anda melihat utilitas bcp untuk mengekstraksi subset dorongan?
rcollyer
3

Saya mengenal PyTables saat menginstal PETSC. Dan saya kira metode tabel (atau basis data) sangat cocok untuk menjelajahi ruang parameter, meskipun saya belum mencoba. Kami dapat merekam setiap proses dengan parameter tertentu dan kemudian kami dapat berkonsultasi setiap agregasi yang memenuhi beberapa kondisi, katakanlah, kami dapat memperbaiki dt, BDF1 dan mencari semua catatan yang relevan untuk mempelajari variasi karena parameter lainnya.

Saya ingin mendengar dari orang-orang yang benar-benar menggunakan metode tabel (atau database) untuk menjelajahi ruang parameter. Saya akan menghargai contoh-contoh terperinci.

Hui Zhang
sumber
3

Menjelajahi ruang parameter seperti yang Anda coba lakukan dapat dengan cepat menjadi berat. Ada begitu banyak cara untuk melakukan ini sehingga tidak ada satu solusi nyata.

Biasanya ketika Anda mencapai batas ini dalam pekerjaan Anda, Anda mungkin ingin menyelidiki format data hirarki HDF5 . HDF5 memungkinkan Anda untuk menyimpan hasil simulasi yang kompleks dalam format file yang terdefinisi dengan baik. Keuntungannya adalah bahwa data Anda disimpan dalam format file tunggal yang terdefinisi dengan baik. Anda dapat menambahkan beberapa simulasi berjalan, diidentifikasi oleh parameter yang berbeda, ke file Anda, dan memanipulasi mereka setelah itu. Data dapat dikompresi dan cukup mudah untuk diekstraksi menggunakan berbagai alat. Ada mudah untuk apis untuk c / c ++ / python dll dan banyak alat baris perintah untuk memanipulasi file. Kerugiannya adalah menulis ke hdf5 tidak sesederhana menulis ke konsol. Ada banyak contoh program di contoh HDF5 .

tcb
sumber
2

Anda ingin menyimpan tabel nilai variabel yang diindeks. Indeks terkait dengan folder tempat Anda menyimpan setiap input dan output simulasi. Jadi ini hanya indeks dan Anda tidak perlu khawatir tentang penamaan konvensi atau hierarki folder karena Anda akan mencari nilai parameter apa yang sesuai dengan setiap folder.

Jadi sekarang Anda dapat menggunakan tabel ini untuk mengatur post-processing, plotting (analysis), logging, dan commenting Anda. Tabel adalah pusat alur kerja.

Ini adalah ide dasar, dan saya menjelaskan apa yang ingin Anda lakukan hanya secara konseptual. Dalam tanggapan awal saya, saya menyarankan untuk melihat ke dalam kerangka yang telah saya kembangkan. Baru-baru ini saya menemukan Sumatra . Ini jauh lebih berkembang daripada mahasiswa pascasarjana saya yang dikembangkan secara individu, berjuang, dan baru untuk usaha python tapi saya pikir itu mencoba untuk melakukan terlalu banyak. Ini berfokus pada informasi sumber sementara kerangka kerja saya berfokus pada efisiensi alur kerja. Ada juga pekerja , sakral , dan lencet .

Apa pun yang Anda pilih untuk dilakukan, saya sangat merekomendasikan python untuk menangani jenis tugas ini karena Anda dapat mengatur seluruh alur kerja Anda dengan python. Sama seperti sedikit cerita, saya melihat rekan kerja saya bekerja dengan DAKOTA, bash, GNUplot, konvensi penamaan file, sed / awk oktaf ... dll. untuk melakukan pekerjaan komputasi mereka. Masing-masing alat ini baik-baik saja pada mereka sendiri tetapi kekuatan python sebagai bahasa lem yang terintegrasi benar-benar bersinar ketika Anda menggunakan python untuk mengelola pekerjaan Anda bersama dengan tumpukan ilmiah python. Saya benar-benar tidak memiliki masalah mengelola pekerjaan komputasi saya setelah saya mengembangkan kerangka kerja saya.

/ Respons awal saya mengikuti /

Saya yakin saya telah memecahkan masalah ini menggunakan python. Saya sudah memikirkan semua masalah ini.

Lihat repo saya http://msdresearch.blogspot.com/2012/01/parameter-study-management-with-python.html

Sampai sekarang, saya sedang berusaha mendokumentasikan kerangka kerja saya dengan lebih baik. (Ini lebih terlibat daripada mengisi readme!)

-Majid alDosari

majidaldosari
sumber
1
Hai Majid, terima kasih atas kontribusinya dan selamat datang di SciComp. Secara umum, situs StackExchange mencegah tautan keluar ke halaman eksternal, dan mendorong jawaban rinci di situs itu sendiri. "Iklan" tautan tunggal sangat tidak disarankan. Saya sarankan merevisi atau menghapus jawaban ini, karena kemungkinan tidak akan diterima dengan baik dalam bentuk saat ini.
Aron Ahmadia
dimengerti. Saya hanya tidak percaya solusinya dapat diberikan dalam bentuk posting. masalahnya cukup umum.
majidaldosari
1
Bisakah Anda setidaknya meringkas pendekatan Anda untuk masalah ini yang telah Anda pikirkan?
Christian Clason
1

Saya cenderung setuju dalam implementasi berikut ini, yang saya kembangkan dalam perjalanan pekerjaan investigasi saya, seperti dapat ditemukan di sini , di sini dan di sini .

Untuk meneruskan variabel ke program dan kemudian bisa berubah, saya menggunakan paradigma menggunakan skrip bash di mana saya mendefinisikan

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

dan kemudian gunakan di C / C ++

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

aValue = atoi(env_aValue)
...

Keuntungan besar dari ini adalah:

  • dapat diakses dalam lingkup global,
  • itu portabel untuk mesin grid matahari (cluster),
  • dapat dengan mudah diubah pada skrip bash,
  • itu adalah platform independen,
  • jumlah parameter bisa sangat besar (berpotensi tidak terbatas)

Selain itu, saya selalu memberikan idName, di mana setiap file yang ditulis oleh executable itu akan memiliki identifikasi awal (dapat diikuti oleh parameter lain jika Anda mau), dan mereka juga menerima direktori ekspor = idName, yang dibuat pada skrip bash, dan semua file yang dapat dieksekusi disimpan di dalamnya. Dengan cara ini hasilnya diatur oleh direktori (opsional).

Jorge Leitao
sumber
0

Anda dapat memeriksa sfepy yang merupakan program elemen hingga hampir seluruhnya dikodekan dengan python. Ini juga memiliki sampel masalah Navier Stokes. Prosedur operasi sfepy sangat mudah.

Pejuang bayangan
sumber
1
Saya merasa jawaban ini tidak menjawab pertanyaan. Poster memiliki simulasi; Saya mendapat kesan bahwa dia ingin membungkus kerangka di sekitar simulasi yang ada, daripada sepenuhnya mengulang simulasi dalam perangkat lunak yang berbeda.
Geoff Oxberry
sfepy juga berfungsi sebagai framework, seseorang dapat menggunakan ini sebagai pemecah PDE kotak hitam. Tapi saya pikir Anda benar karena poster telah menghabiskan banyak waktu dalam pengkodean.
ShadowWarrior
0

Pernahkah Anda berpikir tentang menggunakan database MySQL? Saya belum pernah melakukannya, tetapi saya bisa membayangkan, Anda dapat menanyakan sistem ini dengan sangat baik! Mungkin sistem lain seperti MongoDB lebih baik. Jadi, ini hanya sebuah ide.

vanCompute
sumber