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.
software
finite-element
python
c++
Matija Kecman
sumber
sumber
Jawaban:
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.
sumber
tee
perintah ini sangat bergunaJika 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:
sumber
bzip2
dan7zip
yang menawarkan rasio kompresi lebih baik untuk teks.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::iostreams
perpustakaan. Ini menyediakan mekanisme untuk mendefinisikan sumber input dan output sinks yang tidak dilakukan oleh perpustakaan standar. Secara khusus, adatee_device
yang memungkinkan Anda untuk menghubungkan dua keluaran ke aliran Anda, dan aliran lainnya dapat bertindak sebagai tenggelam. Ini akan memungkinkan Anda untuk membuat keluaran simultanstdout
dan konfigurasi file log.Saya setuju bahwa1
boost::program_options
dapat sangat membantu dalam mengonfigurasi perangkat lunak Anda. Namun, ada beberapa kelemahan yang dapat memengaruhi cara Anda melakukan sesuatu. Pertama, jika Anda membutuhkan konfigurasi hierarkis,ini
boost::program_options
boost::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.
sumber
boost::property_tree
. Masalah lain denganboost::program_options
itu 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)boost::program_options
untuk memaksa itu dibuat menjadi perpustakaan. Namun, sudahkah Anda melihat utilitas bcp untuk mengekstraksi subset dorongan?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.
sumber
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 .
sumber
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
sumber
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
dan kemudian gunakan di C / C ++
Keuntungan besar dari ini adalah:
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).
sumber
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.
sumber
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.
sumber