Rekomendasi untuk pemecah aljabar linier padat / tanpa-instal ringan C atau C ++

9

Sebagian besar pemrograman saya adalah kode penelitian satu kali dalam C untuk saya gunakan sendiri. Saya belum pernah mendistribusikan kode apa pun selain dari kolaborator dekat. Saya telah mengembangkan suatu algoritma yang saya terbitkan dalam jurnal ilmiah. Saya ingin memberikan kode sumber dan mungkin kode yang dapat dieksekusi dalam suplemen online ke artikel. Seorang kolega meminta saya membuat generalisasi untuk algoritma yang mengharuskan saya untuk menulis dalam C ++ (ack!) Dan yang mengharuskan saya menyelesaikan sistem linear padat kecil. Jika saya berhasil mendapatkan basis pengguna untuk algoritma itu akan sebagian karena bilah entri untuk menggunakannya rendah (seperti di lantai). Pengguna potensial tidak akan menginstal pustaka, dll. Untuk menggunakan kode. Saya ingin kode sepenuhnya berdiri sendiri dan tidak terbebani oleh lisensi apa pun. Saya mungkin menulis solver saya sendiri dengan mengambil sesuatu dari Golub dan van Loan, tetapi saya lebih suka menggunakan vanilla solver yang sudah ditulis orang lain jika ada di luar sana. Saran dihargai. Terima kasih!

jep
sumber
Dear jep, selamat datang di forum. Pertanyaan Anda sangat mirip dengan yang ada di sini: scicomp.stackexchange.com/questions/351/…
GertVdE
Pemecah perpustakaan cenderung kompleks dan besar demi ketahanan, efisiensi, dan generalisasi. Jika masalah Anda sangat kecil dan dikondisikan dengan cukup baik, saya sarankan Anda untuk menulis implementasi mini Anda sendiri.
Stefano M
@ GertVdE, terima kasih atas tanggapan cepat atas pertanyaan ini. Saya tidak nyaman menghubungkan ke pertanyaan "Rekomendasi ..." karena baik pertanyaan maupun jawaban teratas terlalu umum untuk memberikan bantuan dalam situasi seperti ini. Jika Anda ingin membahas ini lebih lanjut, saya sarankan kami membawanya ke ruang obrolan scicomp .
Aron Ahmadia
@AronAhmadia: Saya pikir satu-satunya cara untuk mulai menyelesaikan beberapa perdebatan ini adalah mulai menerapkan chrestomathy pemrograman sains komputasi yang bergantung pada bahasa dan perpustakaan. Jika kode jelas, dan masalah konfigurasi dapat diatasi (menggunakan skrip shell, Chef, atau Wayang), maka perdebatan tentang kinerja dapat diatasi (atau dibuat kongkrit) dengan hanya menjalankan kode dan mengatur waktu pada mesin referensi. Debat tentang kejelasan dapat diselesaikan (atau setidaknya, dibuat lebih konkret) dengan melihat kode. Kalau tidak, kami akan terus memiliki argumen yang sama.
Geoff Oxberry

Jawaban:

7

Saya akan menyarankan untuk menduplikasi antarmuka Lapack ke fungsi yang Anda butuhkan, kemungkinan besar Anda hanya perlu dgesv. Dengan begitu orang-orang yang telah menginstal Lapack dapat dengan mudah menautkannya dan itu hanya akan berfungsi. Untuk orang-orang yang tidak menginstal Lapack, Anda memberikan implementasi sederhana Anda sendiri dari fungsi ini, atau mungkin mengimplementasikannya menggunakan Eigen atau FLENS seperti yang disarankan orang lain.

Di tanah Fortran, perpustakaan Lapack adalah standar, sehingga kebanyakan orang hanya menggunakannya dan hanya itu, alih-alih menyediakan implementasi mereka sendiri.

Ondřej Čertík
sumber
+1 Menambahkan fakta bahwa sebagian besar distribusi Linux (setidaknya berbasis Debian) memiliki paket biner dalam repositori dan semua vendor menyediakan lib matematika (MKL, SunPerf, ACML, ESSL dll.) Membawanya. Anda harus selalu menggunakan lib standar sebanyak mungkin meskipun jika Anda menggunakan Windows / Mac Anda mungkin lebih baik dengan sesuatu yang berbasis C karena menginstal kompiler Fortran gratis (gfortran) pada mereka adalah sejumlah pekerjaan atau jadi saya dengar.
stali
Saya telah menggunakan lapack berkali-kali tetapi saat ini saya tidak di tanah fortran. Saya berharap bahwa distribusi statistik platform yang dijalankan oleh basis pengguna saya akan serupa dengan dunia pada arti besar terutama windows, persentase lebih kecil dari mac dan persentase lebih kecil dari * nix. Pengalaman saya dengan windows sangat minim dan saya lebih memilih untuk tetap seperti itu. Ini adalah alasan saya ingin kode C ++ yang berdiri sendiri. Saya pikir saya harus menyediakan beberapa pengguna saya dengan bantuan untuk mendapatkan kode untuk dikompilasi dan dijalankan. Saya perlu meminimalkan pekerjaan yang diperlukan untuk melakukan itu.
jep
Jika basis pengguna Anda adalah Windows / Mac maka Anda lebih baik dengan implementasi berbasis C sederhana (bahkan mungkin Anda sendiri). Paket yang sulit untuk diinstal atau bergantung pada 5 lib lainnya, khususnya ketika tidak ada repositori paket biner kelas satu (seperti Debian) yang tersedia, akan mematikan pengguna Anda untuk waktu yang lama. Ingat sebagian besar pengguna Windows / Mac terbiasa menginstal satu klik. Kemudahan penggunaan menang segala sesuatu yang lain.
stali
5

Kesalahan yang sangat awal yang dilakukan banyak orang ketika memulai dalam komputasi ilmiah adalah mengasumsikan bahwa Anda perlu menulis semua kode Anda dalam bahasa yang sama. Saya pikir ini sebagian besar karena alasan historis, ketika tidak jelas bagaimana membuat program yang dikompilasi berkomunikasi satu sama lain di seluruh versi genap dari kompiler yang sama. Yang mengatakan, dalam hal ini, jika Anda akan menggunakan C ++, ada beberapa pustaka template header C ++ yang sangat bagus yang mungkin sesuai dengan kebutuhan Anda.

Karena Anda mendistribusikan kode untuk alasan akademis, dan Anda ingin memasukkan pemecah aljabar linier yang padat ke dalam kode Anda, saya sangat menyarankan Anda mempertimbangkan Eigen . Eigen telah dilisensikan di bawah Lisensi Publik Mozilla dan merupakan perpustakaan khusus header. Ini berarti Anda dapat mendistribusikan Eigen dengan kode Anda dalam bentuk sumber (ini tidak memberlakukan batasan lisensi pada kode Anda), dan Anda akan menerima akses ke kemampuan umumnya, termasuk pemecah linear padat yang sangat efisien. Seperti yang disebutkan GertVdE, Anda memiliki beberapa opsi lain .

Aron Ahmadia
sumber
Saya berharap untuk satu file. Saya sudah melakukan pemrograman ilmiah cukup lama. Saya memiliki bahasa campuran seperti C dan fortran sedikit tetapi untuk proyek ini saya benar-benar hanya ingin satu file yang berisi semua kode sumber saya. Saya kira saya bisa meletakkan pemecah C dalam kode C ++ yang tidak akan menjadi masalah besar. Terutama saya ingin menjaga kode sesederhana mungkin. LU dengan pivoting harus memadai. Saya akan melihat Eigen. Terima kasih!
jep
@ jep, Anda juga bisa mencoba memetik ceri dari rutinitas yang Anda butuhkan dari CLAPACK jika Anda benar-benar tidak peduli sama sekali tentang kinerja.
Aron Ahmadia
Ada alasan bagus untuk menulis semua kode dependen dalam bahasa yang sama, khususnya, di lingkungan HPC, Anda memiliki masalah penyusun / penautan yang aneh dan masalah antarmuka 32/64-bit. Misalnya, bagaimana saya tahu lebar bilangan bulat untuk perpustakaan bawaan? Bagaimana saya tahu pasti kompiler apa yang digunakan untuk pustaka bawaan, dan dapatkah saya menghubungkannya dengan kompiler lain ini? Memiliki segalanya dalam satu bahasa menyederhanakan banyak masalah ini. Dan ya, harus ada dokumentasi yang disediakan oleh pengelola cluster, tetapi sebagian besar waktu tidak ada.
Victor Liu
@VictorLiu - Masalah yang Anda maksud lebih erat dengan implementasi daripada bahasa. Ruang komentar adalah tempat yang buruk untuk memulai diskusi serius, tapi saya senang mengajak Anda mengobrol atau di tempat lain jika Anda ingin saya memperluas pemikiran saya tentang hal ini.
Aron Ahmadia
4

Jika Anda menginginkan pemecah yang dapat diandalkan untuk sistem persamaan linear, saya akan merekomendasikan FLENS . Ini berisi implementasi ulang yang tepat dari LAPACK (itu bahkan mereproduksi kesalahan pembulatan yang sama seperti LAPACK jika implementasi BLAS single-threaded digunakan). Ini berlaku untuk semua fungsi FLENS-LAPACK (bersama dengan fungsi utilitas sekitar 100 rutin).

FLENS berada di bawah Lisensi BSD dan karena itu memungkinkan untuk dimasukkan ke dalam produk-produk berpemilik.

FLENS hanya header dan jika Anda hanya perlu subset dari FLENS saya bisa memberi Anda versi stripped-down yang hanya berisi fungsi-fungsi yang Anda butuhkan. FLENS dilengkapi dengan implementasi BLAS referensi sendiri. Tetapi secara opsional, pengguna Anda dapat menautkan pustaka BLAS yang dioptimalkan seperti ATLAS, OpenBLAS atau GotoBALS. Untuk matriks besar ini memberikan keuntungan kinerja sekitar 40% dibandingkan dengan Eigen.

Dan ya, Eigen juga menggunakan test suite LAPACK untuk memeriksa hasilnya. Mereka melakukan ini untuk 3 fungsi (Lu, Cholesky dan Eigenvalues ​​/ -vektor dari matriks simetris). Namun, perhitungan nilai eigen / -vektor dari matriks non-simetris akan gagal dalam test suite LAPACK.

Penafian: Ya, FLENS adalah bayi saya! Itu berarti saya mengkodekan sekitar 95% dari itu dan setiap baris kode tidak sia-sia.

Michael Lehn
sumber
1
Michael - Silakan anggap ini peringatan ramah bahwa Anda harus mengikuti aturan dalam faq tentang pengungkapan afiliasi .
Aron Ahmadia
Tentu, tetapi Anda juga dapat mengubah frase posting Anda dari 'Saya akan sangat menyarankan Anda mempertimbangkan Eigen' untuk sesuatu seperti 'ada misalnya Eigen'. Dalam hal ini saya menghapus komentar saya tentang Eigen (walaupun semuanya terbukti benar) termasuk yang ini.
Michael Lehn
1
Ucapan Anda tentang Eigen tidak dipermasalahkan di sini (meskipun sepertinya bukan topik bagi saya). Anda adalah pengembang utama FLENS, jika Anda akan merekomendasikannya dalam jawaban di sini, Anda harus mengungkapkan afiliasi Anda sebagai pengembang proyek.
Aron Ahmadia
Ah, baiklah kalau begitu. Saya pikir secara implisit jelas dengan '... Saya bisa memberi Anda ...'. Apakah pengungkapan dalam formulir ini ok?
Michael Lehn
2
Saya hanya ingin mengucapkan terima kasih untuk melakukan ini; Saya punya rencana serupa untuk mengimplementasikan kembali sebagian besar Lapack di C ++. Namun, tampaknya untuk sebagian besar rutinitas (eigenvalue) tingkat lanjut, Anda cukup menunda untuk memanggil Lapack, jadi itu sedikit iklan palsu untuk mengatakan bahwa Anda menerapkan kembali semuanya. Di sisi lain, saya sebenarnya telah mem-porting sumber ZGEEV ke C ++ di RNP , walaupun beberapa bagian masih dalam pengindeksan berbasis 1 dari konversi otomatis.
Victor Liu