Який хороший спосіб запустити дослідження параметрів у C ++


29

Проблема

Зараз я працюю над моделюванням Кінцевого елемента Нав'єр Стокса, і я хотів би дослідити вплив різних параметрів. Деякі параметри задаються у вхідному файлі або через параметри командного рядка; інші параметри надаються як прапори в Makefile, тому мій код повинен бути перекомпільований щоразу, коли я змінюю ці параметри. Мені буде цікаво отримати поради щодо хорошого способу систематичного дослідження простору параметрів.

  • Чи є корисні бібліотеки / рамки C ++ / Python, які можуть допомогти у подібній справі? Наприклад, виявлення boost.Program_options було великою підмогою, оскільки можна перевантажувати параметри вхідних файлів аргументами командного рядка. Я також бачив, як деякі люди досить ефективно використовують файл завдання, що описує кожен випадок, і колега запропонував, щоб записи параметрів у файли vtu як блоки коментарів могли працювати також.
  • Можливо, зовсім не варто вкладати в це багато часу? Це просто відволікання та затримка часу, і найкраще просто м'язити через процес тестування грубої сили та спеціальних дій?

Деякі думки

Зараз я займаюся руками переважно, і у мене виникли такі проблеми:

  • Назви тестових справ . Я намагався зберігати результати у папках, названих із параметрами запуску, розділеними підкресленнями, наприклад Re100_dt02_BDF1.... Вони швидко стають довгими або важкими для читання / виразними, якщо їх скорочено занадто багато. Крім того, параметри реального числа включають, .що незручно / негарно.
  • Журнал даних про виконання . Іноді я хотів би побачити результати, записані в термінал, а також збережені у текстовому файлі. Наприклад, ця відповідь StackOverflow дещо корисна, але рішення здаються трохи нав'язливими.
  • Складання даних за параметром . Збирати релевантні дані з різних файлів журналів у єдиний файл, який я можу потім скласти, потрібно досить багато часу, з кращою системою, можливо, це стане простішим.
  • Запис коментарів до даних . Після вивчення результатів я записую деякі коментарі у текстовий файл, але зберігати це синхронізується з папками результатів, іноді складно.

Багато що залежить від того, що ви маєте на увазі під «досліджувати». Будь ласка, уточніть свої цілі точніше.
Арнольд Ноймаєр

Відповіді:


10

Лише кілька коментарів до двох ваших пунктів:

  • Дані про запуск журналу : Ваша найкраща ставка - це, мабуть, трубопровід через команду tee , яка має бути доступною у більшості оболонок.

  • Складання даних за параметром : я думаю, це справа смаку, але коли мені доведеться робити складне агрегування даних, я зберігаю результати у простому тексті, читаю їх у Matlab як матриці та виконую всі обчислення, графіки та навіть вихід LaTeX звідти. Очевидно, будь-яка мова програмування / сценаріїв, з якою ви найбільше знайомі, дасть найкращі результати.


Дякую, teeкоманда дуже корисна
Matija Kecman

11

Якщо ви хочете написати щось загального призначення, ви можете зробити це або зі скриптами оболонки, якщо це щось дуже просте, як пропонує Педро , або об'єднати мову математичного програмування вищого рівня, наприклад, Python або MATLAB. Я погоджуюсь, що текстові файли в простому тексті корисні для меншої кількості даних, але ви, мабуть, повинні перейти на двійкові дані для чогось більшого, ніж кілька мегабайт.

З іншого боку, якщо ви лише робите оцінку параметрів, я рекомендую використовувати програмне забезпечення, яке спеціально підходить для цього. Кілька дослідників мого університету пощастило з DAKOTA , інструментом кількісного визначення невизначеності з Національних лабораторій Sandia ( доступний за меншою загальною ліцензією GNU ).

Ось уривок зі сторінки Санді, що описує DAKOTA:

Ми пропонуємо різноманітні методи, що дозволяють користувачеві запускати колекцію комп'ютерних симуляцій, щоб оцінити чутливість модельних результатів стосовно модельних входів. До загальних категорій належать дослідження параметрів, методи вибірки та розробка експериментів. У дослідженні параметрів можна переглядати деякі вхідні параметри через діапазон, зберігаючи інші вхідні параметри фіксованими, і оцінює, як змінюється вихід. У методах вибірки генеруються вибірки з розподілу вхідного простору та обчислюється вихідна відповідь на вхідні значення. Спеціальні методи відбору проб, доступні в DAKOTA, включають Монте-Карло, латинську гіперкубку та (незабаром) квазі-Монте-Карло. При проектуванні експериментів висновок оцінюється за набором вхідних "проектних" точок, обраних для вибіркового простору репрезентативно. Конкретні розробки методів експериментів, доступні в DAKOTA, включають конструкції Box-Behnken, Central Composite і Factorial. Метрики чутливості - це математичний спосіб вираження залежності виходів від входів. У Дакоті доступні різноманітні показники чутливості, такі як прості та часткові коефіцієнти кореляції та рангові кореляції. Наше сучасне дослідження зосереджується на методах генерування показників чутливості з мінімальною кількістю пробіжок, а також на оптимальній оцінці параметрів в комп'ютерних моделях за допомогою методів байєсівського аналізу.


Іншим подібним інструментом є SUSA, розроблений GRS в Німеччині. Але цей не є безкоштовним.
GertVdE

Проблема бінарних форматів полягає в тому, що їх складніше підтримувати, нечасто, щоб файл-формат розвивався з часом, отже, розбір та підтримка бінарного формату може бути болем. З мого досвіду, звичайний текст, стиснення (gzip) і трохи командного рядка або пітона для стихії всіх разом працює чудово навіть за кілька сотень ГБ.
fcruz

1
@fcruz так, або bzip2і 7zipякі пропонують навіть найкращі коефіцієнти стиснення для тексту.
Ajasja

8

У своїй докторській роботі я стикаюся з подібними питаннями, як і ви. Оскільки це не мій код, який я використовую, я не маю зовсім такої ж гнучкості, як ви. Однак, у мене є кілька пропозицій.

Як запропонував Педро, є команда трійника. Але, якщо вона недоступна, або ви хочете, щоб щось було вбудовано у ваше програмне забезпечення, я б запропонував переглянути boost::iostreamsбібліотеку. Він надає механізми визначення вхідних джерел і вихідних раковин, яких не робить стандартна бібліотека. Зокрема, є те, tee_deviceщо дозволяє підключити до потоку два вихідних раковини, а інші потоки можуть діяти як раковини. Це дозволить вам зробити одночасний вихід до stdoutта конфігурацію файлу журналу залежним.

Я погоджуюся, що boost::program_optionsможе бути дуже корисним у налаштуванні вашого програмного забезпечення. Однак у нього є кілька недоліків, які можуть вплинути на те, як ви все робите. По-перше, якщо вам потрібна ієрархічна конфігурація, тоді файли є болісним способом її виконання. По-друге, і, що значно важливіше, немає можливостей виводу, тому ви не можете зберегти свій стан як файл конфігурації для подальшого огляду або відновлення зупиненого коду. В якості альтернативи я б запропонував використовувати, які підтримують ієрархічні файли конфігурації та зберегти дерева для подальшого повторного використання. Це має додаткову перевагу, що якщо вам потрібно перевірити свій код, ви можете зберегти його поточний стан як вхідний при перезапуску.1iniboost::program_optionsboost::property_tree

Для збору даних з різних обчислень я перебираю всі файли даних, які я хотів би включити в набір, потім використовую awk для створення єдиного рядка у файлі та передаю всі результати у свій висновок. Це може зайняти пару хвилин, але, на жаль, у мене немає кращого методу.

Щодо обробки / коментування ваших даних, я не можу достатньо підкреслити корисність формату зошита Mathematica. Це дозволяє мені організувати свої спостереження, спекуляції та візуалізацію все в одному місці. Хоча мої ноутбуки регулярно перевищують 100 Мб. На користь, Mathematica виконує так само добре, як і Matlab у матричних завданнях. Крім того, він може бути використаний для ведення конспектів з повним математичним форматуванням в режимі реального часу.

Мені б хотілося, щоб я краще вирішив проблему називання, і це досить згубно. Можливо, варто розглянути можливість передачі деяких даних у базу даних через це. Однак, якщо ви цього не бажаєте, будь-ласка, подумайте про використання розширених атрибутів у XFS для отримання більш повної інформації про ваше моделювання та збережіть у своєму конфігураційному файлі дані, які були використані для створення.

1. Як приклад, коли потрібні ієрархічні файли конфігурації, мій друг вивчав ефекти різних геометричних наконечників в AFM, і кожна геометрія мала різний набір параметрів. Крім того, він протестував декілька схем обчислення, щоб порівняти їх з експериментом, і вони мали дуже різні параметри.


1
Що я роблю останнім часом, це те, що я веду симуляцію від Mathematica. Замість того, щоб використовувати конфігураційні файли, вхідні файли тощо та робити моделювання командним рядком, я просто визначаю інтерфейс LibraryLink до Mathematica. Таким чином я можу передавати параметри або дані структуровано, і я можу уникнути болю від необхідності обробляти всілякі формати командного рядка / формати вхідно-вихідних файлів. Я отримую миттєвий доступ до візуалізації / побудови графіків і можу легко автоматизувати запуск моделювання для різних параметрів для складних сценаріїв.
Саболч

(Ось як я розмовляю з можливістю адаптивного вибірки . Якщо я викликав свою програму з командного рядка, реалізувати щось подібне - це занадто багато роботи і занадто багато проблем, щоб почати робити без дуже вагомих причин. Ідея не в тому Можливо, вийде з чистого експерименту. Використання системи високого рівня, як Mathematica, зробило експерименти досить просто, щоб ідея вийшла природно. Я думаю, можна було б використовувати інші системи високого рівня таким же чином.)
Szabolcs

Дякую за вашу корисну відповідь, я погляну boost::property_tree. Ще однією проблемою boost::program_optionsє те, що вона видається непридатною як бібліотека, лише для заголовка, яка є незручною, якщо ви хочете, щоб ваша програма працювала на машині, яка має лише збільшити заголовки. До речі, хтось знає, чому це? Мабуть, це зовсім невелика бібліотека. (Можливо, краще розмістити це у списку користувачів, що
підсилюють

@ mk527 Я не знаю, що потрібно, boost::program_optionsщоб змусити його перетворитись у бібліотеку. Однак ви подивилися на утиліту bcp для вилучення підмножини boost?
rcollyer

3

Я знайомлюсь з PyTables під час встановлення PETSC. І я думаю, метод таблиці (або бази даних) добре підходить для дослідження простору параметрів, хоча я ще не намагався. Ми можемо записувати кожен пробіг з певними параметрами, а потім можемо проконсультуватися з будь-якими агрегатами, що відповідають деяким умовам, скажімо, ми можемо виправити dt, BDF1 і шукати всі відповідні записи для вивчення варіації за рахунок інших параметрів.

Мені хотілося б почути від людей, які фактично використовують метод таблиці (або бази даних) для дослідження простору параметрів. Буду вдячний за детальні приклади.


3

Вивчення простору параметрів, як ви намагаєтеся зробити, може дуже швидко стати непростим. Існує так багато різних способів зробити це, що немає жодного реального рішення.

Зазвичай, коли ви досягаєте цього обмеження у своїй роботі, можливо, ви захочете дослідити ієрархічні формати даних HDF5 . HDF5 дозволяє зберігати складний результат симуляції у чітко визначеному форматі файлу. Переваги полягають у тому, що ваші дані зберігаються у єдиному чітко визначеному форматі файлу. Ви можете додати у свій файл декілька запусків моделювання, визначених за різними параметрами, і потім ними маніпулювати. Дані можна стиснути і витягнути досить легко, використовуючи різні інструменти. Існує просто apis для c / c ++ / python тощо та безліч інструментів командного рядка для маніпулювання файлами. Недоліком є ​​те, що писати на hdf5 не так просто, як писати на консоль. На прикладах HDF5 є багато прикладних програм .


2

Ви хочете зберегти індексовану таблицю змінних значень. Індекс відповідає папці, в якій ви зберігаєте кожен вхід та вихід імітації. Отже, це лише індекс, і вам не доведеться турбуватися про іменування конвенцій або ієрархій папок, оскільки ви знайдете, які значення параметрів відповідають кожній папці.

Тепер ви можете використовувати цю таблицю для організації післяобробки, складання (аналізу), реєстрації та коментування. Таблиця є центральною для робочого процесу.

Це основна ідея, і я описую те, що ви можете хотіти робити лише концептуально. У своїй початковій відповіді я запропонував розглянути рамки, які я розробив. Зовсім недавно я відкрив для себе Суматру . Це набагато більш розвинене, ніж мій студент, що розгортається індивідуально, і новачок у пітонських зусиллях, але я думаю, що він намагається зробити занадто багато. Він орієнтований на інформацію про походження, в той час як моя основа фокусується на ефективності робочого процесу. Існує також jobman , священна , і lencet .

Що б ви не вирішили зробити, я настійно рекомендую python для вирішення цих завдань, оскільки ви можете керувати всім робочим процесом за допомогою python. Як невеличка історія, я спостерігав, як мої колеги працюють із DAKOTA, bash, GNUplot, умовами імен файлів, sed / awk octave ... тощо. виконувати свою обчислювальну роботу. Кожен з цих інструментів прекрасний сам по собі, але сила python як інтегруючої мови клею дійсно світиться, коли ви використовуєте python для управління вашою роботою разом із науковим стеком python. У мене буквально виникли нульові проблеми управління моєю обчислювальною роботою після того, як я розробив свої рамки.

/ моя перша відповідь випливає /

Я вважаю, що я вирішив цю проблему за допомогою python. Я продумав усі ці питання.

Перевірте мою репо http://msdresearch.blogspot.com/2012/01/parameter-study-management-with-python.html

На сьогоднішній день я працюю над тим, щоб краще документувати свої рамки. (це більше, ніж заповнення readme!)

-Маджід альДосарі


1
Привіт Majid, дякую за внесок і ласкаво просимо до SciComp. Загалом сайти StackExchange перешкоджають посиланням на зовнішні сторінки та заохочують детальні відповіді на самому сайті. Однопосилання "рекламні оголошення" сильно не рекомендується. Я б запропонував переглянути або видалити цю відповідь, оскільки вона, ймовірно, не буде добре отримана в її теперішній формі.
Арон Ахмадія

зрозумів. я просто не вірю, що рішення можна надати у вигляді допису. проблема досить загальна.
majidaldosari

1
Чи могли б ви хоча б узагальнити свій підхід до цих питань, про які ви думали?
Крістіан Класон

1

Я схильний погодитися в наступному здійсненні, яке я розробив в ході моєї слідчої роботи, як це можна знайти тут , тут і тут .

Щоб передати змінні програмі і потім мати змогу змінити, я використовую парадигму використання сценарію bash, де я визначаю

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

а потім використовувати в C / C ++

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

aValue = atoi(env_aValue)
...

Великими перевагами цього є те, що:

  • до нього можна отримати доступ у глобальному масштабі,
  • це портативний сонячний двигун (кластери),
  • можна легко змінити на скрипті bash,
  • це незалежно від платформи,
  • кількість параметрів може бути дуже великим (потенційно нескінченним)

Крім того, я завжди передаю idName, на якому кожен файл, написаний цим виконуваним файлом, матиме початкову ідентифікацію його (за цим можуть бути наступні інші параметри), і вони також отримують каталог експорту = idName, який створюється на bash script, і всі файли цього виконуваного файлу зберігаються на ньому. Таким чином результати впорядковуються за каталогами (на вибір).


0

Ви можете перевірити sfepy, що є програмою з кінцевими елементами, майже повністю кодованою в python. Він також має зразок проблеми Нав'є Стокса. Операційна процедура sfepy дуже проста.


1
Я не відчуваю, що ця відповідь відповідає на питання. Плакат має симуляцію; У мене складається враження, що він хоче обернути рамку навколо свого існуючого моделювання, а не повністю переробити своє моделювання в іншому програмному забезпеченні.
Джефф Оксберрі

sfepy також працює в якості основи, можна використовувати це як вирішувач PDE у чорному полі. Але я думаю, ти маєш рацію, оскільки плакат вже витратив чимало часу на кодування.
ShadowWarrior

0

Ви думали про використання бази даних MySQL? Я ніколи цього не робив, але міг уявити, що ви можете дуже добре запитати цю систему! Можливо, інші системи на зразок MongoDB є кращими. Отже, це лише ідея.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.