Что такое хороший способ проводить исследования параметров в C ++

29

Проблема

В настоящее время я работаю над симуляцией Навье-Стокса с помощью конечных элементов, и я хотел бы изучить влияние различных параметров. Некоторые параметры указываются во входном файле или через параметры командной строки; другие параметры предоставляются в виде флагов в Makefile, поэтому мой код должен перекомпилироваться всякий раз, когда я изменяю эти параметры. Мне было бы интересно получить несколько советов о хорошем способе систематического изучения пространства параметров.

  • Существуют ли полезные библиотеки / фреймворки C ++ / Python, которые могут помочь с такими вещами? Например, обнаружение boost.Program_options было большой помощью, поскольку возможно перегрузить параметры входного файла аргументами командной строки. Я также видел, как некоторые люди используют файл задания, достаточно эффективно описывающий каждый случай, и коллега предположил, что запись параметров в файлы vtu как блоки комментариев тоже может сработать.
  • Возможно, вообще не стоит тратить на это много времени? Это просто отвлечение внимания и трата времени, и лучше всего просто тренироваться в процессе тестирования грубой силой и ad hoc?

Некоторые мысли

В настоящее время я делаю вещи в основном вручную, и я столкнулся со следующими проблемами:

  • Именование тестовых случаев . Я попытался сохранить результаты в папках с именами параметров запуска, разделенных подчеркиванием, например Re100_dt02_BDF1.... Они быстро становятся длинными или трудными для чтения / шифрования, если их слишком сокращать. Кроме того, параметры действительного числа включают в себя, .что неудобно / некрасиво.
  • Регистрация данных прогона . Иногда я хотел бы видеть результаты, записанные в терминал, а также сохраненные в текстовом файле. Этот ответ от StackOverflow, например, несколько полезен, но решения кажутся немного навязчивыми.
  • Построение данных в соответствии с параметром . Требуется довольно много времени, чтобы собрать соответствующие данные из различных файлов журналов в один файл, который я затем могу построить, с лучшей системой, возможно, это станет проще.
  • Запись комментариев на данные . После изучения результатов я записываю некоторые комментарии в текстовый файл, но иногда это сложно синхронизировать с папками результатов.
Матия Кечман
источник
Многое зависит от того, что вы подразумеваете под «исследовать». Пожалуйста, укажите ваши цели более точно.
Арнольд Ноймайер

Ответы:

10

Просто несколько комментариев по двум вашим пунктам:

  • Регистрация данных прогона : Ваша лучшая ставка, вероятно, заключается в передаче результатов через команду tee , которая должна быть доступна в большинстве оболочек.

  • Построение данных в соответствии с параметром : я полагаю, это дело вкуса, но когда мне нужно выполнить сложное агрегирование данных, я сохраняю результаты в виде простого текста, считываю их в Matlab в виде матриц и выполняю все вычисления, построение графиков и даже вывод в формате LaTeX. оттуда. Очевидно, что любой язык программирования / скриптинга, с которым вы наиболее знакомы, даст вам лучшие результаты.

Pedro
источник
Спасибо, teeкоманда очень полезна
Matija Kecman
11

Если вы хотите написать что-то общего назначения, вы можете сделать это либо с помощью сценариев оболочки, если это что-то очень простое, как предлагает Педро , либо агрегировать на языке математического программирования более высокого уровня, таком как Python или MATLAB. Я согласен, что простые текстовые файлы полезны для меньших объемов данных, но вам, вероятно, следует перейти на двоичные данные для чего-то большего, чем несколько мегабайт.

С другой стороны, если вы просто проводите оценку параметров, я бы рекомендовал использовать программное обеспечение, специально предназначенное для этого. Некоторым исследователям в моем университете повезло с DAKOTA , набором инструментов для определения неопределенности из национальных лабораторий Sandia ( доступным по лицензии GNU Lesser General Public License ).

Вот выдержка из страницы Sandia, описывающая DAKOTA:

Мы предоставляем множество методов, позволяющих пользователю запускать набор компьютерных симуляций для оценки чувствительности выходных данных модели по отношению к входным данным модели. Общие категории включают исследования параметров, методы отбора проб и дизайн экспериментов. В исследованиях параметров вводятся некоторые входные параметры через диапазон при сохранении фиксированных других входных параметров и оценивается, как изменяется выходной сигнал. В методах выборки генерируются выборки из распределения входного пространства и вычисляется выходной отклик по входным значениям. Конкретные методы отбора проб, доступные в DAKOTA, включают Монте-Карло, Латинский гиперкуб и (в ближайшее время) квази-Монте-Карло. При планировании экспериментов выход оценивается в наборе входных «проектных» точек, выбранных для выборочной выборки пространства. Конкретный дизайн методов эксперимента, доступных в DAKOTA, включает проекты Бокса-Бенкена, Центрального Композитного и Факториального. Метрики чувствительности представляют собой математический способ выражения зависимости результатов от входных данных. В Дакоте доступны различные метрики чувствительности, такие как простые и частичные коэффициенты корреляции и ранговые корреляции. Наше текущее исследование сосредоточено на методах генерации метрик чувствительности с минимальным числом прогонов и на оптимальной оценке параметров в компьютерных моделях с использованием методов байесовского анализа.

Арон Ахмадия
источник
Другим подобным инструментом является SUSA, разработанный GRS в Германии. Но этот не бесплатный.
GertVdE
Проблема с двоичными форматами заключается в том, что их сложнее поддерживать, и формат файла нередко развивается со временем, поэтому анализ и поддержка двоичного формата могут быть проблемой. По моему опыту, простой текст, сжатие (gzip) и немного командной строки или python для сшивания все вместе прекрасно работает даже для нескольких сотен ГБ.
fcruz
1
@fcruz да или bzip2и 7zipкоторые предлагают еще лучшие коэффициенты сжатия для текста.
Аяся
8

В моей докторской работе я сталкиваюсь с такими же проблемами, как и вы. Поскольку я использую не мой код, у меня не такая гибкость, как у вас. Тем не менее, у меня есть несколько предложений.

Как предположил Педро, есть команда тройника. Но, если он недоступен, или вы хотите что-то встроенное в ваше программное обеспечение, я бы посоветовал взглянуть на boost::iostreamsбиблиотеку. Он предоставляет механизмы для определения входных источников и выходных приемников, чего не делает стандартная библиотека. В частности, есть один, tee_deviceкоторый позволяет вам подключить два выходных приемника к вашему потоку, а другие потоки могут действовать как приемники. Это позволит вам сделать одновременный вывод в stdoutзависимости от конфигурации файла журнала.

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

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

Что касается обработки / комментирования ваших данных, я не могу не подчеркнуть полезность формата ноутбука Mathematica. Это позволяет мне организовывать свои наблюдения, предположения и визуализации в одном месте. Мои ноутбуки регулярно превышают 100 МБ. Для правильной оценки Mathematica выполняет так же хорошо, как Matlab для матричных задач. Кроме того, его можно использовать для заметок с полным математическим форматированием в режиме реального времени.

Хотелось бы, чтобы у меня было лучшее решение проблемы с именами, и это довольно пагубно. Возможно, стоит подумать о выводе некоторых ваших данных в базу данных из-за этого. Однако, если вы не хотите этого делать, рассмотрите возможность использования расширенных атрибутов в XFS для сбора более полной информации о моделировании и сохранения файла конфигурации вместе с данными, которые он использовал для создания.

1. В качестве примера, где требуются файлы иерархической конфигурации, мой друг изучал влияние различных геометрий наконечника в AFM, и каждая геометрия имела свой набор параметров. Кроме того, он тестировал несколько схем расчета, чтобы сравнить их с экспериментом, и у них были совершенно разные параметры.

rcollyer
источник
1
В последнее время я управляю симуляцией от Mathematica. Вместо того чтобы использовать файлы конфигурации, входные файлы и т. Д. И делать симуляцию программой командной строки, я просто определяю интерфейс LibraryLink для Mathematica. Таким образом, я могу передавать параметры или данные в структурированном виде, и я могу избежать боли при необходимости обрабатывать все виды параметров командной строки / файлов ввода-вывода. Я получаю мгновенный доступ к визуализации / построению графиков и могу легко автоматизировать запуск симуляции для различных параметров в сложных сценариях.
Сабольч
(Вот как я использую адаптивную выборку . Если бы я вызывал свою программу из командной строки, реализовать что-то вроде этого было бы слишком много работы и слишком много проблем, чтобы начать делать это без веской причины. Идея не в том, может привести к чистым экспериментам. Использование системы высокого уровня, такой как Mathematica, сделало эксперименты достаточно простыми, чтобы идея возникла естественным образом. Я думаю, можно использовать другие системы высокого уровня таким же образом.)
Сабольч
Спасибо за ваш полезный ответ, я посмотрю boost::property_tree. Другая проблема boost::program_optionsзаключается в том, что она непригодна для использования в качестве библиотеки только для заголовков, что неудобно, если вы хотите, чтобы ваше приложение запускалось на машине с только повышенными заголовками. Кстати, кто-нибудь знает, почему это так? В любом случае, это довольно маленькая библиотека. (Возможно, лучше разместить это в списке
активных
@ mk527 Я не знаю, что нужно для того, boost::program_optionsчтобы заставить его быть превращенным в библиотеку. Тем не менее, вы смотрели на утилиту bcp для извлечения подмножества наддува?
rcollyer
3

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

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

Хуэй Чжан
источник
3

Исследование пространства параметров, которое вы пытаетесь сделать, может очень быстро стать громоздким. Есть так много разных способов сделать это, что нет единственного реального решения.

Обычно, когда вы достигаете этого предела в своей работе, вы можете исследовать иерархические форматы данных HDF5 . HDF5 позволяет хранить сложные выходные данные вашего моделирования в четко определенном формате файла. Преимущества в том, что ваши данные хранятся в одном четко определенном формате файла. Вы можете добавить в свой файл несколько прогонов симуляции, идентифицируемых различными параметрами, и управлять ими впоследствии. Данные могут быть сжаты, и их довольно легко извлечь с помощью различных инструментов. Есть простой apis для c / c ++ / python и т. Д. И множество инструментов командной строки для манипулирования файлами. Недостатком является то, что запись в hdf5 не так проста, как запись в консоль. Есть много примеров программ на примерах HDF5 .

УТС
источник
2

Вы хотите сохранить индексированную таблицу значений переменных. Индекс соответствует папке, в которой вы храните каждый ввод и вывод симуляции. Так что это всего лишь индекс, и вам не нужно беспокоиться об именовании или иерархиях папок, потому что вы посмотрите, какие значения параметров соответствуют каждой папке.

Теперь вы можете использовать эту таблицу для организации пост-обработки, построения графиков (анализа), ведения журналов и комментирования. Таблица занимает центральное место в рабочем процессе.

Это основная идея, и я описываю то, что вы можете сделать только концептуально. В своем первоначальном ответе я предложил изучить структуру, которую я разработал. Совсем недавно я открыл Суматру . Это намного более развито, чем мой индивидуально разработанный, изо всех сил аспирант, и плохо знакомы с усилиями Python, но я думаю, что он пытается сделать слишком много. Он сфокусирован на информации о происхождении, а моя структура - на эффективности рабочего процесса. Есть также наемный , священный и ленцет .

Что бы вы ни выбрали, я настоятельно рекомендую Python для решения этих типов задач, поскольку вы можете управлять всем своим рабочим процессом с помощью Python. В качестве небольшой истории я наблюдал, как мои коллеги работают с DAKOTA, bash, GNUplot, соглашениями по именованию файлов, sed / awk октавой ... и т. Д. делать свою вычислительную работу. Каждый из этих инструментов хорош сам по себе, но мощь Python как интегрирующего связующего языка действительно блестит, когда вы используете python для управления своей работой вместе с научным стеком python. У меня буквально не было проблем с управлением моей вычислительной работой после того, как я разработал свою среду.

/ мой первоначальный ответ следует /

Я считаю, что я решил эту проблему с помощью Python. Я думал обо всех этих проблемах.

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

На данный момент я работаю над улучшением документирования моей структуры. (это более сложный процесс, чем заполнение файла readme!)

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

majidaldosari
источник
1
Привет Маджид, спасибо за вклад и добро пожаловать в SciComp. В целом, сайты StackExchange не рекомендуют размещать ссылки на внешние страницы и поощряют подробные ответы на самом сайте. Одиночная ссылка "реклама" настоятельно не рекомендуется. Я бы посоветовал пересмотреть или удалить этот ответ, так как он, скорее всего, не будет хорошо принят в его нынешнем виде.
Арон Ахмадиа
понят. я просто не верю, что решение может быть дано в форме поста. проблема довольно общая.
Маджидалдосари
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, и все файлы этого исполняемого файла сохраняются на нем. Таким образом, результаты упорядочены по каталогам (необязательно).

Хорхе Лейтао
источник
0

Вы можете проверить sfepy, которая является программой с конечными элементами, почти полностью написанной на python. У этого также есть типовая проблема Навье Стокса. Порядок работы сфепов очень прост.

Воин Тени
источник
1
Я не чувствую, что этот ответ отвечает на вопрос. Плакат имеет симуляцию; У меня складывается впечатление, что он хочет обернуть структуру вокруг своей существующей симуляции, а не полностью переделывать свою симуляцию в другом программном обеспечении.
Джефф Оксберри
sfepy также работает как фреймворк, его можно использовать как решатель PDE черного ящика. Но я думаю, что вы правы, поскольку автор уже потратил значительное количество времени на кодирование.
ShadowWarrior
0

Вы думали об использовании базы данных MySQL? Я никогда не делал этого, но я мог представить, что вы можете запросить эту систему очень хорошо! Возможно, другие системы, такие как MongoDB, лучше. Итак, это всего лишь идея.

vanCompute
источник