Cách tốt để chạy các nghiên cứu tham số trong C ++ là gì


29

Vấn đề

Tôi hiện đang làm việc trên một mô phỏng Finier Element Navier Stokes và tôi muốn nghiên cứu các hiệu ứng của một loạt các tham số. Một số tham số được chỉ định trong tệp đầu vào hoặc thông qua tùy chọn dòng lệnh; các tham số khác được cung cấp dưới dạng cờ trong Makefile để mã của tôi phải được biên dịch lại bất cứ khi nào tôi thay đổi các tùy chọn đó. Tôi sẽ quan tâm để có được một số lời khuyên về một cách tốt để khám phá một cách có hệ thống không gian tham số.

  • Có thư viện / khung công tác C ++ / Python hữu ích nào có thể giúp với loại điều này không? Ví dụ: khám phá boost.Program_options là một trợ giúp lớn vì có thể quá tải các tùy chọn tệp đầu vào với các đối số dòng lệnh. Tôi cũng đã thấy một số người sử dụng một tệp công việc mô tả từng trường hợp khá hiệu quả và một đồng nghiệp đề nghị rằng việc viết tham số vào các tệp vtu vì các khối nhận xét cũng có thể hoạt động.
  • Có lẽ nó không đáng để đầu tư nhiều thời gian vào việc này? Có phải nó chỉ là một sự xao lãng và lãng phí thời gian và tốt nhất là chỉ cơ bắp thông qua quá trình thử nghiệm sức mạnh vũ phu và ad hoc?

Một vài suy nghĩ

Tôi hiện đang làm mọi thứ chủ yếu bằng tay và tôi đã gặp phải các vấn đề sau:

  • Đặt tên các trường hợp thử nghiệm . Tôi đã thử lưu trữ kết quả trong các thư mục có tên với các tham số chạy được phân tách bằng dấu gạch dưới, ví dụ Re100_dt02_BDF1.... Chúng nhanh chóng trở nên dài hoặc khó đọc / khó hiểu nếu chúng được viết tắt quá nhiều. Ngoài ra, các tham số số thực bao gồm một .lúng túng / xấu xí.
  • Ghi nhật ký dữ liệu chạy . Đôi khi tôi muốn xem kết quả được ghi vào thiết bị đầu cuối và cũng được lưu vào một tệp văn bản. Câu trả lời này từ StackOverflow chẳng hạn có phần hữu ích nhưng các giải pháp có vẻ hơi khó chịu.
  • Vẽ dữ liệu theo tham số . Phải mất khá nhiều thời gian để thu thập dữ liệu có liên quan từ nhiều tệp nhật ký khác nhau thành một tệp mà sau đó tôi có thể vẽ, với một hệ thống tốt hơn có lẽ điều này sẽ trở nên dễ dàng hơn.
  • Ghi nhận xét về dữ liệu . Sau khi kiểm tra kết quả, tôi viết một số bình luận trong một tệp văn bản nhưng việc giữ cho nó được đồng bộ hóa với các thư mục kết quả đôi khi rất khó.

Phần lớn phụ thuộc vào ý của bạn bằng cách 'khám phá'. Hãy nêu mục tiêu của bạn chính xác hơn.
Arnold Neumaier

Câu trả lời:


10

Chỉ cần một số ý kiến ​​về hai điểm của bạn:

  • Ghi nhật ký dữ liệu chạy : Đặt cược tốt nhất của bạn có lẽ là đầu ra đường ống thông qua lệnh tee , cần có sẵn trong hầu hết các shell.

  • Vẽ dữ liệu theo tham số : Tôi đoán đó là vấn đề của hương vị, nhưng khi tôi phải thực hiện tổng hợp dữ liệu phức tạp, tôi lưu trữ kết quả bằng văn bản thuần túy, đọc chúng vào Matlab dưới dạng ma trận và thực hiện tất cả các tính toán, vẽ và thậm chí là đầu ra LaTeX từ đó. Rõ ràng, bất cứ ngôn ngữ lập trình / kịch bản nào mà bạn quen thuộc nhất đều mang lại cho bạn kết quả tốt nhất.


Cảm ơn, teelệnh này rất hữu ích
Matija Kecman

11

Nếu bạn muốn viết một cái gì đó có mục đích chung, bạn có thể thực hiện nó bằng shell script nếu nó rất đơn giản, như Pedro gợi ý , hoặc tổng hợp bằng ngôn ngữ lập trình toán học cấp cao hơn như Python hoặc MATLAB. Tôi đồng ý rằng các tệp văn bản thuần túy rất hữu ích cho lượng dữ liệu nhỏ hơn, nhưng có lẽ bạn nên chuyển sang dữ liệu nhị phân cho bất cứ thứ gì lớn hơn vài megabyte.

Mặt khác, nếu bạn chỉ đang thực hiện ước tính tham số, tôi khuyên bạn nên sử dụng một phần mềm đặc biệt phù hợp cho việc này. Một số nhà nghiên cứu tại Đại học của tôi đã gặp may mắn với DAKOTA , một hộp công cụ Định lượng không chắc chắn từ Phòng thí nghiệm quốc gia Sandia ( có sẵn theo Giấy phép Công cộng GNU Ít hơn ).

Đây là một đoạn trích từ trang Sandia mô tả DAKOTA:

Chúng tôi cung cấp nhiều phương pháp khác nhau để cho phép người dùng chạy bộ sưu tập mô phỏng máy tính để đánh giá độ nhạy của đầu ra mô hình đối với đầu vào mô hình. Các loại phổ biến bao gồm nghiên cứu tham số, phương pháp lấy mẫu và thiết kế thí nghiệm. Trong nghiên cứu tham số một bước một số tham số đầu vào thông qua một phạm vi trong khi giữ cố định các tham số đầu vào khác và đánh giá đầu ra thay đổi như thế nào. Trong các phương pháp lấy mẫu, người ta tạo các mẫu từ phân phối không gian đầu vào và tính toán đáp ứng đầu ra ở các giá trị đầu vào. Các phương pháp lấy mẫu cụ thể có sẵn trong DAKOTA bao gồm Monte Carlo, Latin Hypercube và (sắp ra mắt) quasi-Monte Carlo. Trong thiết kế thí nghiệm, đầu ra được đánh giá tại một tập hợp các điểm "thiết kế" đầu vào được chọn để lấy mẫu không gian theo cách đại diện. Thiết kế cụ thể các phương pháp thử nghiệm có sẵn trong DAKOTA bao gồm các thiết kế Box-Behnken, Central Composite và Factorial. Số liệu độ nhạy là một cách toán học để thể hiện sự phụ thuộc của đầu ra vào đầu vào. Một loạt các số liệu độ nhạy có sẵn trong Dakota, chẳng hạn như các hệ số tương quan đơn giản và một phần, và tương quan xếp hạng. Nghiên cứu hiện tại của chúng tôi tập trung vào các phương pháp để tạo ra các số liệu độ nhạy với số lần chạy tối thiểu và ước tính tối ưu các tham số trong các mô hình máy tính bằng kỹ thuật phân tích Bayes.


Một công cụ khác như thế này là SUSA được phát triển bởi GRS ở Đức. Nhưng cái này không miễn phí.
GertVdE

Vấn đề với các định dạng nhị phân là chúng khó bảo trì hơn, không có gì lạ khi định dạng tệp phát triển theo thời gian, do đó phân tích và hỗ trợ định dạng nhị phân có thể là một nỗi đau. Theo kinh nghiệm của tôi, văn bản đơn giản, nén (gzip) và một chút dòng lệnh hoặc python để stich tất cả cùng hoạt động tốt ngay cả trong vài trăm GB.
fcruz

1
@fcruz có, hoặc bzip27zipcung cấp tỷ lệ nén tốt hơn cho văn bản.
Ajasja

8

Đối với công việc tiến sĩ của tôi, tôi đang gặp vấn đề tương tự như bạn. Vì đó không phải là mã mà tôi đang sử dụng, tuy nhiên, tôi không hoàn toàn linh hoạt như bạn. Điều đó nói rằng, tôi có một vài gợi ý.

Như Pedro đề nghị, có lệnh tee. Nhưng, nếu nó không có sẵn, hoặc bạn muốn một cái gì đó được tích hợp trong chính phần mềm của bạn, tôi khuyên bạn nên xem boost::iostreamsthư viện. Nó cung cấp các cơ chế để xác định nguồn đầu vào và đầu ra chìm mà thư viện chuẩn không làm được. Cụ thể, có một tee_devicecái cho phép bạn kết nối hai bồn đầu ra với luồng của mình và các luồng khác có thể đóng vai trò là các bồn. Điều này sẽ cho phép bạn tạo đầu ra đồng thời stdoutvà phụ thuộc vào cấu hình tệp nhật ký.

Tôi đồng ý rằng boost::program_optionscó thể rất hữu ích trong việc cấu hình phần mềm của bạn. Tuy nhiên, nó có một vài sai sót có thể ảnh hưởng đến cách bạn làm mọi thứ. Đầu tiên, nếu bạn cần một cấu hình phân cấp, thì các tệp là một cách khó khăn để hoàn thành nó. Thứ hai, và quan trọng hơn, không có khả năng đầu ra, vì vậy bạn không thể lưu trạng thái của mình dưới dạng tệp cấu hình để kiểm tra sau hoặc tiếp tục mã bị dừng. Để thay thế, tôi sẽ đề nghị sử dụng hỗ trợ các tệp cấu hình phân cấp và lưu cây để sử dụng lại sau này. Điều này có thêm lợi ích là nếu bạn cần kiểm tra mã của mình, bạn có thể lưu trạng thái hiện tại của nó làm đầu vào khi bạn khởi động lại.1iniboost::program_optionsboost::property_tree

Để thu thập dữ liệu từ các tính toán khác nhau, tôi lặp qua tất cả các tệp dữ liệu tôi muốn đưa vào một bộ, sau đó tôi sử dụng awk để tạo một dòng duy nhất trong tệp và chuyển tất cả các kết quả vào đầu ra của tôi. Việc này có thể mất vài phút, nhưng thật không may, tôi không có phương pháp nào tốt hơn.

Khi xử lý / nhận xét về dữ liệu của bạn, tôi không thể nhấn mạnh đủ tính hữu ích của định dạng sổ ghi chép Mathicala. Nó cho phép tôi tổ chức các quan sát, suy đoán và trực quan hóa tất cả ở một nơi. Máy tính xách tay của tôi thường xuyên hàng đầu 100 MB, mặc dù. Đối với biện pháp tốt, Mathicala thực hiện tốt như Matlab trong các nhiệm vụ ma trận. Ngoài ra, nó có thể được sử dụng để ghi chú với định dạng toán học đầy đủ trong thời gian thực.

Tôi ước tôi có một giải pháp tốt hơn cho vấn đề đặt tên, và nó khá nguy hiểm. Có thể đáng để xem xét xuất một số dữ liệu của bạn vào cơ sở dữ liệu vì điều này. Tuy nhiên, nếu bạn không muốn làm điều đó, hãy xem xét sử dụng các thuộc tính mở rộng trong XFS để nắm bắt thông tin đầy đủ hơn về mô phỏng của bạn và lưu trữ tệp cấu hình của bạn với dữ liệu được sử dụng để tạo.

1. Như một ví dụ khi cần các tệp cấu hình phân cấp, một người bạn của tôi đã kiểm tra tác động của các hình học đầu khác nhau trong AFM và mỗi hình học có một bộ tham số khác nhau. Ngoài ra, bên cạnh đó, anh ta đang thử nghiệm một số sơ đồ tính toán để anh ta có thể so sánh chúng với thử nghiệm và chúng có các thông số rất khác nhau.


1
Những gì tôi làm gần đây là tôi lái mô phỏng từ Mathematica. Thay vì sử dụng các tệp cấu hình, các tệp đầu vào, v.v. và biến mô phỏng thành chương trình dòng lệnh, tôi chỉ định nghĩa giao diện LibraryLink cho Mathicala. Bằng cách này, tôi có thể truyền tham số hoặc dữ liệu theo cách có cấu trúc và tôi có thể tránh được việc phải xử lý tất cả các loại tùy chọn dòng lệnh / định dạng tệp đầu vào-đầu ra. Tôi có quyền truy cập ngay vào trực quan hóa / vẽ đồ thị và tôi có thể dễ dàng tự động hóa việc chạy mô phỏng cho các tham số khác nhau cho các tình huống phức tạp.
Szabolcs

(Đây là cách tôi xử lý việc lấy mẫu thích ứng . Nếu tôi gọi chương trình của mình từ dòng lệnh, việc thực hiện một cái gì đó như thế này chỉ là quá nhiều công việc và quá nhiều rắc rối để bắt đầu thực hiện mà không có lý do chính đáng. Có khả năng ra khỏi thử nghiệm thuần túy. Sử dụng một hệ thống cấp độ cao như Mathicala đã thực hiện thử nghiệm đủ dễ dàng để ý tưởng xuất hiện một cách tự nhiên. Tôi đoán người ta có thể sử dụng các hệ thống cấp cao khác theo cách tương tự.)
Szabolcs

Cảm ơn câu trả lời hữu ích của bạn, tôi sẽ xem xét boost::property_tree. Một vấn đề khác boost::program_optionslà nó dường như không thể sử dụng được như một thư viện chỉ có tiêu đề, thật khó xử nếu bạn muốn ứng dụng của mình chạy trên một máy chỉ tăng tiêu đề. Ngẫu nhiên, có ai biết tại sao điều này là? Rõ ràng dù sao nó cũng là một thư viện nhỏ. (Có lẽ tốt hơn là đăng bài này lên danh sách người dùng tăng cường)
Matija Kecman

@ mk527 Tôi không biết những gì được yêu cầu bằng cách boost::program_optionsbuộc nó được tạo thành một thư viện. Tuy nhiên, bạn đã xem tiện ích bcp để trích xuất một tập hợp con boost chưa?
rcollyer

3

Tôi làm quen với PyTables khi cài đặt PETSC. Và tôi đoán phương thức bảng (hoặc cơ sở dữ liệu) rất phù hợp để khám phá không gian tham số, mặc dù tôi chưa thử. Chúng tôi có thể ghi lại mọi lần chạy với các tham số cụ thể và sau đó chúng tôi có thể tham khảo bất kỳ tập hợp nào thỏa mãn một số điều kiện, giả sử, chúng tôi có thể sửa dt, BDF1 và tìm kiếm tất cả các bản ghi liên quan để nghiên cứu biến thể do các tham số khác.

Tôi muốn nghe từ những người thực sự sử dụng phương thức bảng (hoặc cơ sở dữ liệu) để khám phá không gian tham số. Tôi sẽ đánh giá cao cho các chi tiết chi tiết.


3

Khám phá không gian tham số như bạn đang cố gắng có thể rất nhanh chóng trở nên khó sử dụng. Có rất nhiều cách khác nhau để làm điều này mà không có một giải pháp thực sự.

Thông thường khi bạn đạt đến giới hạn này trong công việc, bạn có thể muốn điều tra các định dạng dữ liệu phân cấp HDF5 . HDF5 cho phép bạn lưu trữ đầu ra phức tạp của mô phỏng theo định dạng tệp được xác định rõ. Ưu điểm là dữ liệu của bạn được lưu trữ trong một định dạng tệp được xác định rõ. Bạn có thể thêm nhiều lần chạy mô phỏng, được xác định bởi các tham số khác nhau vào tệp của mình và thao tác chúng sau đó. Dữ liệu có thể được nén và khá dễ dàng để trích xuất bằng nhiều công cụ khác nhau. Có dễ dàng để apis cho c / c ++ / python vv và nhiều công cụ dòng lệnh để thao tác các tệp. Một nhược điểm là việc ghi vào hdf5 không hoàn toàn đơn giản như viết lên bàn điều khiển. Có nhiều chương trình ví dụ tại các ví dụ HDF5 .


2

Bạn muốn giữ một bảng được lập chỉ mục của các giá trị biến. Chỉ mục tương ứng với một thư mục nơi bạn giữ từng đầu vào và đầu ra mô phỏng. Vì vậy, nó chỉ là một chỉ mục và bạn không phải lo lắng về việc đặt tên quy ước hoặc phân cấp thư mục vì bạn sẽ tìm kiếm các giá trị tham số tương ứng với mỗi thư mục.

Vì vậy, bây giờ bạn có thể sử dụng bảng này để tổ chức xử lý hậu kỳ, âm mưu (phân tích), ghi nhật ký và nhận xét của bạn. Bảng là trung tâm của quy trình làm việc.

Đây là ý tưởng cơ bản và tôi đang mô tả những gì bạn có thể muốn làm chỉ về mặt khái niệm. Trong phản hồi ban đầu của mình, tôi đề nghị xem xét khuôn khổ mà tôi đã phát triển. Gần đây tôi đã phát hiện ra Sumatra . Nó phát triển hơn nhiều so với học sinh tốt nghiệp đang phát triển, đang gặp khó khăn của tôi và mới nỗ lực trăn nhưng tôi nghĩ nó cố gắng làm quá nhiều. Nó tập trung vào thông tin xuất xứ trong khi khuôn khổ của tôi tập trung vào hiệu quả của quy trình làm việc. Ngoài ra còn có người làm việc , thiêng liênglencet .

Dù bạn chọn làm gì, tôi thực sự khuyên bạn nên dùng python để giải quyết các loại nhiệm vụ này vì bạn có thể quản lý toàn bộ quy trình làm việc của mình với python. Chỉ là một câu chuyện nhỏ, tôi đã xem các đồng nghiệp của mình làm việc với DAKOTA, bash, GNUplot, quy ước đặt tên tệp, octave sed / awk ... vv. để làm công việc tính toán của họ. Mỗi công cụ này đều ổn, nhưng sức mạnh của python như một ngôn ngữ keo tích hợp thực sự tỏa sáng khi bạn sử dụng python để quản lý công việc của bạn cùng với ngăn xếp khoa học của python. Tôi thực sự không có vấn đề gì trong việc quản lý công việc tính toán của mình sau khi tôi phát triển khuôn khổ của mình.

/ phản hồi ban đầu của tôi sau /

Tôi tin rằng tôi đã giải quyết vấn đề này bằng cách sử dụng python. Tôi đã nghĩ về tất cả những vấn đề này.

Kiểm tra repo của tôi http://msdresearch.blogspot.com/2012/01/parameter-study-man quản lý- with- python.html

Cho đến bây giờ, tôi đang nghiên cứu tài liệu tốt hơn về khung của mình. (nó liên quan nhiều hơn là điền vào một readme!)

-Majid alDosari


1
Xin chào Majid, cảm ơn sự đóng góp và chào mừng đến với SciComp. Nói chung, các trang web StackExchange không khuyến khích liên kết ra các trang bên ngoài và khuyến khích các câu trả lời chi tiết trên chính trang web đó. "Quảng cáo" liên kết đơn được khuyến khích mạnh mẽ. Tôi đề nghị sửa đổi hoặc xóa câu trả lời này, vì nó có thể sẽ không được nhận tốt ở dạng hiện tại.
Aron Ahmadia

hiểu. tôi chỉ không tin rằng giải pháp có thể được đưa ra dưới dạng một bài viết. vấn đề khá chung chung.
majidaldosari

1
Ít nhất bạn có thể tóm tắt cách tiếp cận của bạn đối với những vấn đề mà bạn đã nghĩ đến?
Christian Clason

1

Tôi có xu hướng đồng ý trong việc thực hiện sau đây, mà tôi đã phát triển trong quá trình điều tra của mình, như có thể tìm thấy ở đây , đâyđây .

Để truyền biến cho chương trình và có thể thay đổi sau đó, tôi sử dụng mô hình sử dụng tập lệnh bash nơi tôi xác định

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

và sau đó sử dụng trong C / C ++

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

aValue = atoi(env_aValue)
...

Những lợi thế lớn của điều này là:

  • nó có thể được truy cập trong phạm vi toàn cầu,
  • nó là di động để động cơ lưới mặt trời (cụm),
  • có thể dễ dàng thay đổi trên tập lệnh bash,
  • nó là nền tảng độc lập,
  • số lượng tham số có thể rất lớn (có khả năng vô hạn)

Ngoài ra, tôi luôn truyền một idName, trên đó mọi tệp được viết bởi tệp thực thi đó sẽ có một nhận dạng ban đầu về nó (có thể được theo sau bởi các tham số khác nếu bạn muốn) và chúng cũng nhận được một thư mục export = idName, được tạo trên bash script và tất cả các tệp của tệp thực thi đó được lưu trên nó. Bằng cách này, kết quả được sắp xếp theo thư mục (tùy chọn).


0

Bạn có thể kiểm tra sfepy , một chương trình phần tử hữu hạn gần như được mã hóa hoàn toàn bằng python. Nó cũng có vấn đề mẫu Navier Stokes. Quy trình vận hành của sfepy rất dễ dàng.


1
Tôi không cảm thấy câu trả lời này trả lời câu hỏi. Các poster có một mô phỏng; Tôi có ấn tượng rằng anh ấy muốn bọc một khung xung quanh mô phỏng hiện có của mình, thay vì làm lại hoàn toàn mô phỏng của mình trong các phần mềm khác nhau.
Geoff Oxberry

sfepy cũng hoạt động như một khung công tác, người ta có thể sử dụng nó như một bộ giải PDE hộp đen. Nhưng tôi nghĩ bạn đã đúng vì người đăng đã dành thời gian đáng kể cho việc viết mã.
ShadowWar Warrior

0

Bạn đã nghĩ về việc sử dụng một cơ sở dữ liệu MySQL? Tôi chưa bao giờ làm điều đó, nhưng tôi có thể tưởng tượng rằng bạn có thể truy vấn hệ thống này rất tốt! Có lẽ các hệ thống khác như MongoDB là tốt hơn. Vì vậy, đây chỉ là một ý tưởng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.