알고리즘 매개 변수를 쉽게 수정하기 위해 어떤 프로그래밍 전략을 사용할 수 있습니까?


17

과학 알고리즘을 개발하는 것은 실험 설계의 일부 나 알고리즘 성능의 일부로 변하기를 원하는 많은 매개 변수의 변경을 포함하는 반복 프로세스입니다. 반복 사이에서 쉽게 변경할 수 있고 쉽게 새로 추가 할 수 있도록 이러한 매개 변수를 구성하기 위해 어떤 전략을 취할 수 있습니까?

답변:


14

사용자가 알고리즘의 모든 측면을 지정하는 것은 번거 롭습니다. 알고리즘이 중첩 된 구성 요소를 허용하는 경우, 한정된 수의 옵션으로는 충분하지 않습니다. 따라서 명시 적 인수 또는 템플릿 매개 변수의 경우와 같이 옵션이 반드시 최상위 수준으로 "버블 링"될 필요는 없습니다. 이것을 소프트웨어 엔지니어링에서 "구성 문제"라고도합니다. PETSc 에는 구성 관리를위한 독창적 인 강력한 시스템이 있다고 생각 합니다. 제어 반전에 대한 Martin Fowler의 에세이 의 Service Locator 패턴과 유사합니다 .

PETSc의 구성 시스템은 솔버 객체 (get 및 set 쿼리 포함)와 옵션 데이터베이스가 관리하는 사용자 지정 구성을 조합하여 작동합니다. 시뮬레이션의 모든 구성 요소는 구성 옵션, 기본값 및 결과를 넣을 장소를 선언 할 수 있습니다. 중첩 객체에는 구성이 필요한 모든 객체를 독립적으로 처리 할 수 ​​있도록 구성 할 수있는 접두사가 있습니다. 옵션 자체는 명령 행, 환경, 구성 파일 또는 코드에서 읽을 수 있습니다. 옵션이 선언되면 도움말 문자열과 매뉴얼 페이지가 지정되어 -help옵션을 이해하고 올바르게 연결된 GUI를 작성할 수 있습니다.

사용자는 SetFromOptions메소드를 호출하여 명령 행 옵션을 기반으로 오브젝트를 구성합니다. 이 함수 호출은 선택 사항이며 사용자 (PETSc를 호출하는 코드를 작성하는 사람)가 다른 인터페이스를 통해 옵션을 노출하는 경우 호출되지 않을 수 있습니다. 최종 사용자 (애플리케이션을 실행하는 사람)에게 많은 권한을 부여하기 때문에 옵션 데이터베이스를 공개하는 것이 좋습니다. 그러나 필수는 아닙니다.

via를 통해 호출되는 일반적인 구성

PetscObjectOptionsBegin(object); /* object has prefix and descriptive string */
PetscOptionsReal("-ts_atol",                                      /* options database key */
                 "Absolute tolerance for local truncation error", /* long description */
                 "TSSetTolerances",                               /* function and man page on topic */
                  ts->atol,                                       /* current/default value *?
                  &ts->atol,                                      /* place to store value */
                  &option_set);                                   /* TRUE if the option was set */
PetscOptionsList("-ts_type","Time stepping method","TSSetType",TSList,
                 defaultType,typeName,sizeof typeName,&option_set);
TSAdaptSetFromOptions(ts->adapt);                                 /* configures adaptive controller method */
/* ... many others */
/* ... the following is only called from implicit implementations */
SNESSetFromOptions(ts->snes);                                     /* configure nonlinear solver. */
PetscOptionsEnd();

노트:

  • PetscOptionsList()사용자에게 동적 목록에서 선택 사항을 제공합니다. 새로운 구현이 호출자에게 일류로 노출 될 수있는 플러그인 아키텍처가 있습니다. (이러한 구현은 공유 라이브러리에 배치 할 수 있으며 프로그램을 다시 컴파일하지 않고도 일류 클래스로 사용할 수 있습니다.)
  • SNESSetFromOptions() 선형 솔버, 전제 조건 및 구성이 필요한 기타 구성 요소를 재귀 적으로 구성합니다.

11

필자는 자체 시뮬레이션 코드를 처음부터 개발할 때이 문제에 여러 번 직면했습니다. 어떤 매개 변수가 입력 파일에 들어가야하는지, 명령 행에서 가져와야합니다. (PETSc만큼 발전하지 않았습니다.)

실험적인 시뮬레이션 '프로그램'을 작성하는 대신 시뮬레이션을 실행하는 데 필요한 모든 함수와 클래스를 포함하는 Python 패키지를 작성하는 경향이 있습니다. 그런 다음 기존 입력 파일은 5-10 줄의 코드가있는 작은 Python 스크립트로 바뀝니다. 일부 행은 일반적으로 데이터 파일로드 및 출력 지정과 관련이 있습니다. 다른 것은 실제 계산에 대한 지침입니다. Python 패키지의 선택적 인수에 대한 기본값은 초보자가 간단한 시뮬레이션을 위해 라이브러리를 사용할 수있는 반면 고급 사용자는 여전히 모든 종과 휘파람에 액세스 할 수 있습니다.

몇 가지 예 :


이것은 훌륭하지만 구성 문제와 직각이라고 생각합니다. 계층 적 또는 중첩 알고리즘을 지정해야하는 경우 많은 내부 객체에 지정할 수있는 옵션이 있습니다. 레벨의 수와 중첩 유형이 변경 될 수 있으므로이를 호출하는 코드는 실제로 존재 여부를 알지 않아야합니다. 이것이 "버블 링"하는 모든 선택의 문제입니다. 고급 Python 코드를 사용하면 이러한 옵션을 "쉽게"지정할 수 있지만 여전히 코드로 지정해야합니다. 나는 그것이 일반적으로 좋지 않다고 생각합니다.
Jed Brown

xmonad 는이 방법을 사용하여 X 용 창 관리자를 구성합니다.
rcollyer

2

먼저 알고리즘과 소프트웨어를 가능한 한 일반적으로 수행하겠습니다. 나는 이것을 어려운 방법으로 배웠다.

간단한 테스트 사례로 시작한다고 가정 해 봅시다. 더 빨리 할 수 ​​있습니다. 그러나이 초기 사례에 대해 소프트웨어를 너무 구체적으로 설정하면 (너무 적은 매개 변수), 새로운 자유도를 추가 할 때마다 점점 더 많은 시간을 적용하게됩니다. 내가 지금하는 일은 일을 꽤 일반적으로 만들고 앞으로 나아갈 때 매개 변수의 변화를 늘리는 데 더 많은 시간을 소비합니다.

시작점에서 더 많은 매개 변수가 있기 때문에 처음부터 더 많은 테스트가 필요하지만 후자가 알고리즘을 사용하여 제로 또는 매우 저렴한 비용으로 많은 것을 할 수 있습니다.

예 : 알고리즘에는 두 벡터 함수의 내적을 계산하는 표면 적분이 포함됩니다. 장래에 표면을 변경하고 싶을 경우 표면의 크기, 형상 및 이산화를 가정하지 마십시오. 내적 함수를 만들고, 표면을 가능한 한 일반적으로 만들고, 공식적인 방식으로 적분을 계산하십시오. 각 기능을 별도로 테스트 할 수 있습니다.

처음에는 간단한 형상에 대한 통합을 시작하고 시작시 상수를 매개 변수로 선언 할 수 있습니다. 시간이 지남에 따라 지오메트리를 변경하려면 쉽게 할 수 있습니다. 처음에 가정을했다면 매번 전체 코드를 변경해야합니다.

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