C ++에서 매개 변수 연구를 실행하는 좋은 방법은 무엇입니까


29

문제

현재 유한 요소 탐색기 스토크 스 시뮬레이션에서 작업 중이며 다양한 매개 변수의 효과를 조사하고 싶습니다. 일부 매개 변수는 입력 파일 또는 명령 행 옵션을 통해 지정됩니다. 다른 매개 변수는 Makefile에 플래그로 제공되므로 해당 옵션을 변경할 때마다 코드를 다시 컴파일해야합니다. 매개 변수 공간을 체계적으로 탐색하는 좋은 방법에 대한 조언을 얻고 싶습니다.

  • 이런 종류의 일을 도울 수있는 유용한 C ++ / Python 라이브러리 / 프레임 워크가 있습니까? 예를 들어 boost.Program_options 발견 은 명령 줄 인수로 입력 파일 옵션을 오버로드 할 수 있기 때문에 큰 도움이되었습니다. 또한 일부 사람들은 각 사례를 매우 효과적으로 설명하는 작업 파일을 사용하는 것을 보았으며 동료는 주석 블록으로 매개 변수를 vtu 파일에 쓰는 것도 효과가 있다고 제안했습니다.
  • 아마도 이것에 많은 시간을 투자 할 가치가 없을 것입니다. 그것은 산만하고 시간이 걸리는가? 테스트 과정의 무차별적인 힘과 특별 함을 통해 근육을 만드는 것이 가장 좋습니까?

일부 생각

나는 현재 주로 손으로 일을하고 있으며 다음과 같은 문제가 발생했습니다.

  • 이름 지정 테스트 사례 . 밑줄로 구분 된 실행 매개 변수로 이름이 지정된 폴더에 결과를 저장하려고했습니다 (예 :) Re100_dt02_BDF1.... 너무 많이 축약하면 빠르게 길거나 읽기 / 암호화하기 어려워집니다. 또한, 실수 파라미터 .는 어색하거나 못생긴를 포함합니다.
  • 실행 데이터를 로깅 . 때로는 터미널에 결과를 쓰고 텍스트 파일로 저장하고 싶습니다. 예를 들어 StackOverflow의 답변 은 다소 도움이되지만 솔루션은 약간 방해가되는 것처럼 보입니다.
  • 파라미터에 따라 데이터 플로팅 . 다양한 로그 파일에서 관련 데이터를 단일 파일로 수집 한 다음 플롯 할 수있는 시간이 꽤 오래 걸립니다.
  • 데이터에 대한 설명을 기록합니다 . 결과를 검토 한 후 텍스트 파일에 주석을 쓰지만 결과 폴더와 동기화 된 상태로 유지하기가 어려운 경우가 있습니다.

``explore ''의 의미에 따라 다릅니다. 목표를보다 정확하게 설명하십시오.
Arnold Neumaier

답변:


10

두 가지 요점에 대한 의견이 있습니다.

  • 실행 데이터 기록 : 가장 좋은 방법은 대부분의 쉘에서 사용할 수 있는 tee 명령을 통해 출력을 파이핑하는 것입니다 .

  • 매개 변수에 따라 데이터 플로팅 : 맛의 문제라고 생각하지만 복잡한 데이터 집계를 수행 해야하는 경우 결과를 일반 텍스트로 저장하고 결과를 행렬로 Matlab에 읽고 모든 계산, 플로팅 및 LaTeX 출력을 수행합니다 거기에서. 가장 친숙한 프로그래밍 / 스크립트 언어가 무엇이든 최상의 결과를 얻을 수 있습니다.


감사합니다,이 tee명령은 매우 유용합니다
Matija Kecman 13:06의

11

범용적인 것을 작성하려면, Pedro가 제안한 것처럼 매우 간단한 것이면 쉘 스크립트를 사용 하거나 Python 또는 MATLAB과 같은 고급 수학 프로그래밍 언어로 집계 할 수 있습니다. 일반 텍스트 파일은 적은 양의 데이터에 유용하지만 몇 메가 바이트보다 큰 이진 데이터로 전환해야한다는 데 동의합니다.

당신이 경우 다른 한편으로는, 단지 매개 변수 추정을하고, 내가 특별히이 적합한 소프트웨어의 조각을 사용하는 것이 좋습니다 것입니다. 우리 대학의 몇몇 연구원들은 Sandia National Laboratories ( GNU Lesser General Public License하에 입수 가능) 의 불확실성 정량화 도구 상자 인 DAKOTA 를 사용하여 행운을 빕니다 .

다음은 DAKOTA를 설명하는 Sandia 페이지에서 발췌 한 것입니다.

우리는 사용자가 컴퓨터 시뮬레이션 모음을 실행하여 모델 입력에 대한 모델 출력의 감도를 평가할 수있는 다양한 방법을 제공합니다. 일반적인 범주에는 매개 변수 연구, 샘플링 방법 및 실험 설계가 포함됩니다. 매개 변수 연구에서 한 입력 매개 변수는 범위를 통해 단계를 거치면서 다른 입력 매개 변수는 고정 된 상태로 유지하고 출력이 어떻게 변하는 지 평가합니다. 샘플링 방법에서는 입력 공간 분포에서 샘플을 생성하고 입력 값에서 출력 응답을 계산합니다. DAKOTA 내에서 사용 가능한 특정 샘플링 방법에는 Monte Carlo, Latin Hypercube 및 (곧 제공 될) quasi-Monte Carlo가 있습니다. 실험 설계에서 출력은 대표 방식으로 공간을 샘플링하기 위해 선택된 일련의 입력 "디자인"포인트에서 평가됩니다. DAKOTA 내에서 사용 가능한 실험 방법의 특정 설계에는 Box-Behnken, Central Composite 및 Factorial 설계가 포함됩니다. 민감도 메트릭은 입력에 대한 출력의 의존성을 표현하는 수학적 방법입니다. 다코타에서는 단순 및 부분 상관 계수 및 순위 상관 관계와 같은 다양한 민감도 메트릭을 사용할 수 있습니다. 우리의 현재 연구는 최소 횟수의 실행으로 민감도 메트릭을 생성하는 방법과 베이지안 분석 기법을 사용하여 컴퓨터 모델에서 최적의 파라미터 추정에 중점을 둡니다.


이와 같은 또 다른 도구는 독일의 GRS에서 개발 한 SUSA입니다. 그러나 이것은 무료가 아닙니다.
GertVdE

이진 형식의 문제점은 유지 관리가 더 어렵다는 것입니다. 파일 형식이 시간이 지남에 따라 발전하는 것은 드문 일이 아니므로 이진 형식을 구문 분석하고 지원하는 것은 쉽지 않습니다. 내 경험상 평범한 텍스트, 압축 (gzip) 및 약간의 명령 줄 또는 파이썬은 모두 수백 GB에서도 잘 작동합니다.
fcruz

1
@fcruz 예, 또는 bzip27zip텍스트에 대한 더 나은 압축 비율을 제공한다.
Ajasja

8

내 박사 과정을 위해, 당신과 비슷한 문제가 발생합니다. 그러나 내가 사용하는 코드는 아니기 때문에 유연성이 없습니다. 즉, 몇 가지 제안이 있습니다.

페드로가 제안했듯이 티 명령이 있습니다. 그러나 사용할 수 없거나 소프트웨어 자체에 내장 된 것을 원한다면 boost::iostreams라이브러리를 살펴 보는 것이 좋습니다 . 표준 라이브러리가하지 않는 입력 소스 및 출력 싱크를 정의하는 메커니즘을 제공합니다. 특히 tee_device두 개의 출력 싱크를 스트림과 다른 스트림 에 연결할 수 있습니다. 수 은 싱크로 작동 할 수 있습니다. 이를 통해 동시 출력 stdout과 로그 파일 구성에 종속적 으로 만들 수 있습니다 .

boost::program_options1iniboost::program_optionsboost::property_tree 파일 하고 나중에 재사용하기 위해 트리를 저장하는 . 이는 코드를 체크 포인트해야하는 경우 다시 시작할 때 현재 상태를 입력으로 저장할 수 있다는 추가 이점이 있습니다.

다른 계산에서 데이터를 수집하기 위해 세트에 포함하려는 모든 데이터 파일을 반복하여 사용합니다. awk 를 하여 파일에 단일 행을 생성하고 모든 결과를 출력으로 파이프합니다. 이 작업에는 몇 분이 걸릴 수 있지만 불행히도 더 좋은 방법은 없습니다.

귀하의 데이터 처리 / 코멘트에 관해서는 Mathematica 노트북 형식의 유용성을 충분히 강조 할 수 없습니다. 관찰, 추론 및 시각화를 한 곳에서 모두 구성 할 수 있습니다. 내 노트북은 정기적으로 100MB를 차지합니다. 좋은 측정을 위해 Mathematica 는 Matlab과 마찬가지로 매트릭스 작업을 수행합니다. 또한 전체 수학적 형식의 메모 를 실시간으로 작성 하는 데 사용할 수 있습니다 .

명명 문제에 대한 더 나은 해결책이 있었으면 좋겠습니다. 이 때문에 일부 데이터를 데이터베이스로 출력하는 것이 좋습니다. 그러나이를 원하지 않으면 XFS 의 확장 된 속성 을 사용 하여 시뮬레이션에 대한보다 완전한 정보를 캡처하고 생성에 사용 된 데이터와 함께 구성 파일을 저장하십시오.

1. 계층 적 구성 파일이 필요한 예로, 내 친구는 AFM 에서 서로 다른 팁 형상의 영향을 조사하고 있으며 각 형상마다 매개 변수 세트가 다릅니다. 또한 이와 함께 여러 계산 체계를 테스트하여 실험과 비교할 수 있었으며 매개 변수가 크게 다릅니다.


1
내가 최근에하는 일은 Mathematica에서 시뮬레이션을 유도한다는 것입니다. 구성 파일, 입력 파일 등을 사용하고 시뮬레이션을 명령 줄 프로그램으로 만드는 대신 Mathematica에 대한 LibraryLink 인터페이스를 정의합니다. 이런 식으로 매개 변수 또는 데이터를 구조화 된 방식으로 전달할 수 있으며 모든 종류의 명령 행 옵션 / 입력-출력 파일 형식을 처리해야하는 번거 로움을 피할 수 있습니다. 시각화 / 플로팅에 즉시 액세스 할 수 있으며 복잡한 시나리오에 대해 다양한 매개 변수에 대한 시뮬레이션 실행을 쉽게 자동화 할 수 있습니다.
Szabolcs가

(이것은 적응 형 샘플링 문제를 해결하는 방법입니다. 명령 줄에서 프로그램을 호출하는 경우 이와 같은 것을 구현하는 것은 너무 많은 노력과 너무 큰 이유없이 시작하기에는 너무 많은 문제입니다. 아이디어는 아닙니다. Mathematica와 같은 고급 시스템을 사용하면 아이디어가 자연스럽게 나올 정도로 실험이 쉬워졌습니다. 다른 고급 시스템을 같은 방식으로 사용할 수있을 것 같습니다.)
Szabolcs

유용한 답변을 보내 주셔서 감사합니다 boost::property_tree. 에서 살펴 보겠습니다 . 또 다른 문제 boost::program_options는 헤더 전용 라이브러리로 사용할 수없는 것으로 보이며 헤더 만 향상 된 컴퓨터에서 응용 프로그램을 실행하려는 경우 어색합니다. 덧붙여서, 이것이 왜 그런지 아는 사람이 있습니까? 어쨌든 그것은 꽤 작은 도서관입니다. (아마 부스트 사용자 목록에 이것을 게시하는 것이 좋습니다)
Matija Kecman

@ mk527 나는 boost::program_options그것이 라이브러리로 만들어지기 위해 무엇이 필요한지 모른다 . 그러나 부스트의 서브 세트를 추출하기위한 bcp 유틸리티 를 살펴 보셨습니까?
rcollyer

3

PETSC를 설치할 때 PyTables를 알게됩니다. 그리고 아직 시도하지는 않았지만 테이블 (또는 데이터베이스) 방법이 매개 변수 공간을 탐색하는 데 적합하다고 생각합니다. 특정 매개 변수를 사용하여 모든 실행을 기록한 다음 일부 조건을 만족하는 집계를 참조 할 수 있습니다. 예를 들어 dt, BDF1을 수정하고 모든 관련 레코드를 조회하여 다른 매개 변수로 인한 변동을 연구 할 수 있습니다.

매개 변수 공간을 탐색하기 위해 실제로 테이블 (또는 데이터베이스) 방법을 사용하는 사람들의 의견을 듣고 싶습니다. 자세한 설명을 부탁드립니다.


3

당신이하려고하는 것처럼 매개 변수 공간을 탐색하면 매우 다루기 어려워 질 수 있습니다. 이 작업을 수행하는 방법에는 여러 가지가 있으므로 실제 솔루션은 없습니다.

일반적으로 작업에서이 한계에 도달하면 계층 적 데이터 형식 HDF5 를 조사 할 수 있습니다 . HDF5를 사용하면 시뮬레이션의 복잡한 출력을 잘 정의 된 파일 형식으로 저장할 수 있습니다. 장점은 데이터가 잘 정의 된 단일 파일 형식으로 저장된다는 것입니다. 다른 매개 변수로 식별 된 여러 시뮬레이션 런을 파일에 추가하고 나중에 조작 할 수 있습니다. 데이터를 압축 할 수 있으며 다양한 도구를 사용하여 추출하기가 매우 쉽습니다. c / c ++ / python 등을 위해 API를 작성하기 쉽고 파일을 조작하는 많은 명령 행 도구가 있습니다. 단점은 hdf5에 쓰는 것이 콘솔에 쓰는 것만 큼 간단하지 않다는 것입니다. HDF5 예제 에는 많은 예제 프로그램이 있습니다 .


2

인덱싱 된 변수 값 테이블을 유지하려고합니다. 인덱스는 각 시뮬레이션 입력 및 출력을 유지하는 폴더에 해당합니다. 따라서 인덱스 일 뿐이므로 각 폴더에 해당하는 매개 변수 값을 찾을 수 있으므로 명명 규칙이나 폴더 계층 구조에 대해 걱정할 필요가 없습니다.

이제이 테이블을 사용하여 사후 처리, 플로팅 (분석), 로깅 및 주석을 구성 할 수 있습니다. 테이블은 워크 플로우의 중심입니다.

이것이 기본 아이디어이며, 개념적으로 만하고 싶은 일을 설명하고 있습니다. 초기 응답에서, 내가 개발 한 프레임 워크를 살펴볼 것을 제안했습니다. 더 최근에는 수마트라를 발견했습니다 . 개인적으로 개발하고 어려움을 겪고있는 대학원생보다 훨씬 발전했으며 파이썬 노력에 익숙하지 않지만 너무 많이 시도한다고 생각합니다. 내 프레임 워크는 워크 플로 효율성에 중점을 둔 반면 출처 정보에 중점을 둡니다. 또한이 jobman , 신성 , 그리고 lencet는 .

무엇을 선택하든 파이썬으로 전체 워크 플로를 관리 할 수 ​​있기 때문에 이러한 유형의 작업을 처리하기 위해 파이썬을 강력히 권장합니다. 작은 이야기처럼, 나는 동료들이 DAKOTA, bash, GNUplot, 파일 명명 규칙, sed / awk octave 등과 함께 작업하는 것을 보았습니다. 그들의 계산 작업을 수행합니다. 이러한 각 도구는 자체적으로는 훌륭하지만 통합 접착제 언어로서의 파이썬의 힘은 파이썬 과학 스택과 함께 작업을 관리하기 위해 파이썬을 사용할 때 실제로 빛납니다. 나는 프레임 워크를 개발 한 후 계산 작업을 관리하는 데 아무런 문제가 없었습니다.

/ 내 초기 응답은 다음과 같습니다 /

파이썬을 사용 하여이 문제를 해결했다고 생각합니다. 나는이 모든 문제를 생각했다.

내 저장소를 확인하십시오 http://msdresearch.blogspot.com/2012/01/parameter-study-management-with-python.html

그러나 현재 프레임 워크를 더 잘 문서화하고 있습니다. (추가 정보를 작성하는 것보다 더 복잡합니다!)

-마지드 알도 사리


1
안녕하세요 Majid, SciComp에 기여해 주셔서 감사합니다. 일반적으로 StackExchange 사이트는 외부 페이지로의 연결을 권장하지 않으며 사이트 자체에 대한 자세한 답변을 권장합니다. 단일 링크 "광고"는 권장하지 않습니다. 이 답변은 현재 양식으로는 잘 수신되지 않을 것이므로이 답변을 수정하거나 삭제하는 것이 좋습니다.
Aron Ahmadia

이해했다. 나는 해결책이 게시물의 형태로 제공 될 수 있다고 생각하지 않습니다. 문제는 매우 일반적입니다.
majidaldosari

1
당신이 생각한 이러한 이슈들에 대한 당신의 접근법을 최소한 요약 해 주시겠습니까?
Christian Clason

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 를 확인할 수 있습니다 . 또한 샘플 Navier Stokes 문제가 있습니다. sfepy의 작동 절차는 매우 쉽습니다.


1
이 답변이 질문에 답하는 것 같지 않습니다. 포스터에는 시뮬레이션이 있습니다. 다른 소프트웨어에서 시뮬레이션을 완전히 다시 실행하지 않고 기존 시뮬레이션을 중심으로 프레임 워크를 감싸고 싶다는 인상을 받았습니다.
제프 옥스 베리

sfepy는 프레임 워크로도 작동하므로 블랙 박스 PDE 솔버로 사용할 수 있습니다. 그러나 포스터가 이미 코딩에 많은 시간을 소비했기 때문에 당신이 옳다고 생각합니다.
ShadowWarrior

0

MySQL 데이터베이스 사용에 대해 생각해 보셨습니까? 나는 그것을 한 적이 없지만, 당신은이 시스템을 아주 잘 쿼리 할 수 ​​있다고 상상할 수 있습니다! 아마도 MongoDB와 같은 다른 시스템이 더 좋습니다. 그래서 이것은 단지 아이디어입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.