이 문서는 설계 목표 및 철학에 대한 설명을 포함하여 GAMS의 메가 슬롯 해결사 API에 대한 간략한 소개를 제공합니다. 이 문서는 사용자 매뉴얼로 사용하기 위한 것이 아니라 새 API가 수행할 수 있는 작업에 대한 그림과 새 API의 일부 개념적 토대에 대한 설명을 제공하기 위한 것입니다.
추가 자료:ICS 2011 프레젠테이션
소개
역사적으로 다양한 GAMS 솔버 인터페이스 라이브러리가 있었습니다. 즉, 솔버가 GAMS 메가 슬롯에서 필요한 모든 정보를 가져오고, 솔루션을 계산하고, 솔루션, 상태 정보 및 기타 정보(예: 솔버 로그 메시지, 비선형 함수 평가 오류 메시지, 노드 수, 사용된 시간)를 GAMS에 반환할 수 있는 라이브러리였습니다. 각 라이브러리는 어떤 면에서 독특했습니다. 지원하는 컴퓨터 언어 또는 GAMS 메가 슬롯 유형의 하위 집합입니다. 각 라이브러리에는 고유한 장점과 단점이 있었지만 모두 기능이 부족했고 제한된 작동 방식을 지원했습니다. GAMS/Base는 다음과 같이 작성했습니다.스크래치 파일해결할 메가 슬롯이 포함된 경우 GAMS 솔버 링크 실행 파일은 솔버 인터페이스 라이브러리 중 하나를 사용하여 스크래치 파일에서 메가 슬롯을 읽고 솔루션 파일을 작성하며 GAMS/Base는 이 솔루션 파일을 읽습니다. 이 계획은 수년 동안 효과가 있었지만 도서관 사용자에게는 불편했고 유지 관리가 어려웠으며 속도가 느리고 추가 개발에 장벽이 되었습니다.
이러한 문제와 기타 문제를 해결하기 위해 GAMS는 GMO(GAMS 메가 슬롯 개체)라고 하는 새로운 메가 슬롯 해결 인터페이스 라이브러리와 GEV(GAMS 환경 개체)라는 동반 라이브러리를 개발했습니다. 두 라이브러리는 서로 구별되며 GEV가 처리하고 메가 슬롯이 해결될 컴퓨팅 및 솔버 환경에서 GMO가 처리하는 순전히 메가 슬롯별 작업 및 정보를 분리하는 데 도움이 됩니다. 두 라이브러리는 일반적으로 함께 사용되며 때로는 간단히 GMO라고도 합니다. 레거시 이유로 새 라이브러리는 스크래치 파일을 통해 메가 슬롯을 전달하기 위해 기존 파일 기반 구성표를 지원합니다.
다음에서는 먼저 GMO의 기본 구조, 조직 및 사용법을 설명합니다(기본 조직). 클라이언트 애플리케이션은 메가 슬롯을 정의하거나 업데이트하는 두 가지 유형으로 나눌 수 있습니다(GMO에 대한 메가 슬롯러 액세스) 및 메가 슬롯을 솔버에 전달하는 것(GMO에 대한 해결자 액세스). 다음으로 메가 슬롯을 업데이트하는 몇 가지 방법을 설명합니다.GMO 인스턴스 업데이트 중.
기본 조직
이 섹션에서는 GMO의 기본 조직에 대해 설명합니다. GMO는 언어별 헤더 파일과 인터페이스 코드를 통해 다양한 언어와 인터페이스하는 공유 라이브러리로 구현됩니다. 헤더 파일과 코드는 GAMS 배포와 함께 소스 형식에 포함됩니다. 인터페이스 코드는 동적 로딩을 사용하므로 각 GMO 세션은 필요한 공유 라이브러리를 초기화하고(즉, 해당 라이브러리와 해당 기호를 모두 로드) 빈 메가 슬롯 객체를 반환하는 호출로 시작됩니다.
다음 단계는 메가 슬롯을 메가 슬롯 개체에 로드하는 것입니다. 이는 일반적으로 GAMS 솔버 링크 중 하나에서 해결하기 전에 메가 슬롯 스크래치 파일에서 메가 슬롯을 로드하는 경우와 같이 단일 래퍼 호출로 수행됩니다. 열 단위 또는 행 단위 메가 슬롯을 제공하기 위해 일련의 호출을 사용하여 처음부터 메가 슬롯을 구축할 수도 있습니다. 메가 슬롯이 열 단위 또는 행 단위로 구축된 경우 기본 구조가 구축된 후 추가 정보(예: 비선형성에 대한)가 객체에 전달될 수 있습니다. 메가 슬롯이 완성되면 마무리 루틴이 호출됩니다. 이 루틴은 사용자가 효율적으로 액세스할 수 있도록 메가 슬롯 객체를 준비합니다. 일반적으로 이 시점 이후에는 메가 슬롯이 변경되지 않습니다. 이에 대한 예외가 있습니다(참조GMO 인스턴스 업데이트 중), 그러나 일반적으로 기존 메가 슬롯에 대한 작은 수정(예: 대체 경계 추가) 또는 다음을 요구하는 제약 조건 및 변수 추가가 포함됩니다.재완성메가 슬롯의.
메가 슬롯이 완전히 로드되면 GMO 클라이언트가 메가 슬롯에 액세스하기 시작할 수 있습니다. 일반적으로 이 작업을 수행하는 GMO 클라이언트는 솔버가 되지만 다른 클라이언트(예: CONVERT해결사, Examiner 유틸리티 또는 메가 슬롯 구조 브라우저)도 존재합니다. 메가 슬롯을 쿼리하는 것 외에도 클라이언트는 메가 슬롯이 다양한 방식으로 표시되거나 표시되도록 요청할 수도 있습니다. 예를 들어 GMO에 목적 함수나 목적 변수를 사용하도록 요청할 수 있습니다. 대부분의 정보 유형은 메가 슬롯이 로드될 때 즉시 사용할 수 있지만 일부 유형의 쿼리(예: 헤세 행렬, 대체 QP 형식)는 덜 일반적이고 시간 및/또는 공간 측면에서 상대적으로 비용이 많이 듭니다. 이러한 경우 정보를 요청하기 전에 초기화 루틴을 호출해야 합니다. 클라이언트가 작업을 완료하면 발견된 솔루션에 대해 보고합니다. 일반적으로 메가 슬롯 개체는 이 시점에서 삭제됩니다. 클라이언트, 특히 솔버의 메가 슬롯 액세스는 다음에서 논의되는 중요한 주제입니다.GMO에 대한 해결자 액세스.
메가 슬롯이 정의될 때 인터페이스 라이브러리에 들어가고 해결 중에 솔버가 요청할 수 있는 다양한 데이터가 있지만 데이터는 메가 슬롯을 정의하는 데이터(예: 행 및 열 수, 계수, 비선형 함수)와 솔버 환경을 정의하는 데이터(예: 사용 가능한 기본 GAMS 솔버, 라이센스 정보, 알고리즘 허용 오차 및 제한)의 두 가지 유형으로 나눌 수 있습니다. 때로는 이러한 두 가지 유형의 데이터를 분리하여 메가 슬롯이 존재하는 환경에 대해 아무것도 지정하지 않고 메가 슬롯을 정의하고 작업할 수 있도록 하는 것이 유용합니다. 환경은 별도로 지정할 수 있으며 여러 메가 슬롯이 동일한 기본 환경을 사용할 수 있습니다. 이를 용이하게 하기 위해 솔버 인터페이스는 두 부분으로 구성됩니다. GMO 인터페이스는 메가 슬롯별 정보를 처리하고 GEV 인터페이스는 환경에 대한 정보를 처리합니다. 두 환경은 일반적으로 하나의 환경에 존재하는 하나(또는 여러 개의) 메가 슬롯과 함께 사용되기 때문에 연결되어 있지만 분리로 인해 환경 등을 정의하지 않고도 메가 슬롯을 정의할 수 있습니다. 정보와 코드의 대부분이 GMO에 있으므로 일반적으로 두 라이브러리를 GMO라고 하는 하나로 이야기하지만 GEV는 별도의 개체라는 점을 기억할 가치가 있습니다.
GMO에 대한 해결자 액세스
GMO의 주요 목적 중 하나는 메가 슬롯에 대한 편리하고 효율적인 액세스를 제공하는 것입니다. GAMS는 많은 솔버에 연결되며, 각 솔버는 GMO를 사용하여 서로 다른 방식으로 메가 슬롯에 액세스하므로 GMO에서 메가 슬롯에 액세스할 수 있는 방법이 매우 다양합니다. 이 섹션에서 이에 대해 설명합니다.
동일한 메가 슬롯에 대해 여러 개의 동일한 보기가 가능합니다. 예를 들어, 목적 함수나 목적 변수를 사용하여 메가 슬롯을 공식화할 수 있습니다. 사용 가능한 행은 제거하거나 그대로 둘 수 있으며 행 및/또는 열은 순열될 수 있습니다. 메가 슬롯에 액세스하기 전에 솔버 링크는 사용할 뷰를 선택할 수 있습니다. 뷰는 나중에 변경될 수 있지만 이로 인해 이전에 얻은 데이터가 제거될 수 있으므로 일반적으로 뷰 선택은 초기에 이루어지며 변경되지 않은 상태로 유지됩니다. 또한 여러 사용자가 동일한 메가 슬롯에 액세스하는 경우 뷰를 저장하고 복원할 수 있습니다.
모든 솔버는 메가 슬롯에 대한 기본 정보(행 및 열 개수, 0이 아닌 개수 등과 같은 간단한 정보)를 얻어야 합니다. 이러한 정보는 단순 액세스 루틴을 통해 사용할 수 있습니다. 메가 슬롯은 본질적으로 고정되어 있으므로(뷰가 변경되지 않는다고 가정) 기본 정보는 메가 슬롯이 최종 형태를 취할 때 미리 계산되며 기본적으로 무료로 사용할 수 있습니다. 행과 열에 대한 정보(예: 가변 수준 값, 한계 값, 가변 우선순위, 행 유형)도 단일 행/열에 대해 또는 모든 행/열에 대한 배열로 한 번에 사용할 수 있습니다.
선형 메가 슬롯의 경우, 얻을 수 있는 유일한 정보는 계수 행렬입니다. 이는 다양한 형태로 제공됩니다. 열 단위 또는 행 단위(한 번의 호출로 반환된 완전한 행렬 또는 여러 호출을 통해 반환된 별도의 행 또는 열) 비선형 메가 슬롯의 경우 이 주제에 대한 더 많은 변형이 있습니다. 즉, 함수 값 또는 함수 값과 도함수를 반환하기 위한 호출, 제약 조건에 대한 호출 및 목적 함수에 대한 호출입니다. 비선형 메가 슬롯이 특정 지점 주위의 선형화로 처리되도록 요청할 수 있습니다. 함수와 기울기의 간격 평가를 수행하는 루틴도 있습니다. GMO 라이브러리는 메가 슬롯이 최종 형태를 취할 때 이러한 모든 호출을 효율적으로 처리할 수 있도록 메가 슬롯 객체를 준비합니다.
비선형 메가 슬롯은 몇 가지 추가 과제를 제시합니다. NL 함수를 평가할 때 수학적 오류가 발생할 수 있습니다(예: sqrt(-1)). GMO는 이러한 오류를 기록하고 처리하는 다양한 방법을 지원합니다. 일부 알고리즘에는 2차 정보가 필요하거나 필요합니다. 이는 계산하는 데 상대적으로 비용이 많이 들 수 있으므로 솔버는 먼저 원하는 것(예: 헤세 벡터 곱, 라그랑주 헤세 행렬, 단일 행 헤세 행렬)을 지정하고 잠재적으로 헤세 계산 전용 메모리에 대한 제한을 지정하는 초기화 루틴을 호출해야 합니다. 이 초기화 후에는 2차 정보를 사용할 수 있습니다.
솔버가 완료되면 솔루션(있는 경우) 및 관련 상태 값을 GMO에 다시 보고해야 합니다. 이러한 목적을 위해 GMO에는 여러 편의 루틴이 포함되어 있습니다.
편리한 인터페이스는 특히 메가 슬롯에 대한 솔버 액세스 영역에서 GMO의 중요한 설계 목표였으며 지금도 그렇습니다. 편의성은 다양한 형태를 취합니다. 다양한 솔버 라이브러리를 지원하기 위해 동일한 메가 슬롯 데이터를 얻는 다양한 방법, 올바른 동작을 위한 이전 설정에 대한 최소한의 요구 사항을 갖춘 자체 포함된 호출, 정보 숨기기, 캡슐화 및 개체 메가 슬롯과 같은 설계 원칙을 준수하는 최신 인터페이스입니다. GMO를 설계할 때 이러한 목표를 최우선으로 유지함으로써 메가 슬롯에 편리하고 효율적으로 액세스할 수 있게 되었으며, 이로 인해 올바르게 작동하는 솔버 링크를 구축하는 작업이 크게 단순화되었습니다.
메가 슬롯에 대한 편리한 액세스를 제공하는 것 외에도 솔버 링크는 GAMS 시스템에서 인식할 특정 API를 노출해야 합니다. GMO API 자체에 직접 연결되는 것은 아니지만 예상되는 솔버 링크 라이브러리 API에 대한 지식이 필요하므로 여기에 포함합니다.
GAMS는 GEV API 함수를 통해 솔버를 호출gevCallSolver결국 솔버 링크 라이브러리의 함수에 대한 일련의 호출이 발생합니다. GAMS는 런타임에 솔버 링크 라이브러리를 동적으로 로드합니다. 라이브러리 이름은구성 파일세 글자 감사 코드와 함께, 예:cpxCPLEX용. 솔버 링크 라이브러리의 모든 함수에는 이 감사 코드가 앞에 붙습니다(우리는xyz이 예에서는). 다음 기능이 인식됩니다.
void xyzInitialize(void)(지원 중단됨): 솔버 링크 라이브러리를 로드할 때 호출되는 함수입니다. 구현하지 마십시오. 이 기능이 있으면 향후 GAMS 버전에서 오류가 발생할 것입니다.void xyzFinalize(void)(지원 중단됨): 솔버 링크 라이브러리를 언로드할 때 호출되는 함수입니다. 구현하지 마십시오. 이 기능이 있으면 향후 GAMS 버전에서 오류가 발생할 것입니다.int xyzCreate(void** 핸들, char* msg, int sizeBuf): 솔버 링크를 생성하는 함수객체. 0을 반환하고 NULL이 아닌 개체에 대한 포인터를에 저장합니다.처리성공 시, 그렇지 않으면 오류 메시지가 다음에 저장되어야 합니다.msg.void xyzFree(void** 핸들): 솔버 링크 객체를 파괴하는 함수입니다.
에 따라솔버 인터페이스 유형(다음의 일부로 다시 전달됨구성 파일) API에는 다양한 기능이 있어야 합니다. 솔버 인터페이스 유형 1의 경우 다음이 있습니다.
int xyzReadyAPI(void* 핸들, void* gmoHandle): 솔버 공간에 메가 슬롯 인스턴스를 설정하는 함수입니다. 성공하면 0을 반환합니다.int xyzCallSolver(void* 핸들): 실제 해결 및 해결 보고를 수행하는 기능입니다. 성공하면 0을 반환합니다.int xyzModifyProblem(void* 핸들)(선택): 문제를 수정하는 기능입니다. 성공하면 0을 반환합니다.
솔버 인터페이스 유형 2의 경우 단일 호출만 있습니다:
int xyzCallSolver(void* 핸들, void* gmoHandle): 설정하고 해결하는 기능입니다. 성공하면 0을 반환합니다.
보통, a해결GAMS에서 다음과 같은 일련의 기능을 트리거합니다.xyzCreate, xyzReadyAPI, xyzCallSolver, xyzFree(인터페이스 유형 1) 또는xyzCreate, xyzCallSolver, xyzFree(인터페이스 유형 2) 및의 분리xyzReadyAPI그리고xyzCallSolver불필요해 보입니다.
함께수집-업데이트-해결-분산(GUSS)그리고GAMSModelInstance34975_35202xyzModify문제다음 시퀀스가 호출됩니다:xyzCreate, xyzReadyAPI, xyzCallSolver, xyzReadyAPI, xyzCallSolver, xyzReadyAPI, xyzCallSolver, ...,xyzFree(인터페이스 유형 1) 또는xyzCreate, xyzCallSolver, xyzCallSolver, xyzCallSolver, ...,xyzFree(인터페이스 유형 2). 따라서 다시 링크 작업을 분할할 여지가 거의 없습니다(그러나 가능함).xyzReadyAPI그리고xyzCallSolver존재하지 않고xyzModify문제. 만일xyzModify문제존재합니다(플레이버 1에만 해당). 다음 시퀀스가 호출됩니다.xyzCreate, xyzReadyAPI, xyzCallSolver, xyzModify문제, xyzCallSolver, xyzModify문제, xyzCallSolver, ...,xyzFree.
GMO에 대한 메가 슬롯러 액세스
정상 작동에서 메가 슬롯러는 GAMS 소스 형식으로 메가 슬롯을 생성하고 GAMS/기본 모듈은 GMO에서 메가 슬롯 인스턴스를 구축하는 데 필요한 모든 세부 사항을 처리합니다. 그러나 GAMS/Base 외부에서 GMO 인스턴스에 액세스하고 수정하는 것이 유용한 경우(예: 다양한 시나리오 데이터를 사용하여 여러 번 메가 슬롯을 해결하는 경우)가 있습니다. GMO는 이를 지원하는 루틴, 특히 메가 슬롯을 업데이트하는 루틴을 제공합니다(참조GMO 인스턴스 업데이트 중), GAMS 환경 및 GEV의 일부로 제공되는 GAMS 솔버 중 하나로 메가 슬롯을 풀고 솔루션을 검색합니다.
GMO 인스턴스에 대한 액세스는 일반적으로 정수 인덱스를 사용하여 수행됩니다.[1..m]행 및[1..n]열용. 그러나 원래 GAMS 메가 슬롯의 표기법을 사용하여 행과 열을 참조하는 것도 가능합니다.x('시애틀','토피카')또는수요('시카고'). 이는 새 시나리오를 정의하기 위해 업데이트해야 하는 데이터를 지정할 때 더 편리합니다. 이 경우 메가 슬롯 인스턴스를 업데이트하려면 행 및 열 인덱스를 한 형식에서 다른 형식으로 변환하는 편리하고 효율적인 방법을 갖는 것이 유용합니다. 이 번역은메가 슬롯 사전인터페이스 DCT.
DCT API는 GMO 메가 슬롯 인스턴스를 정의하는 데 사용되는 변수, 방정식 및 집합에 대한 정보를 제공합니다. 또한 행 또는 열 인덱스가 주어지면 이 인덱스를 방정식 또는 변수 이름과 이 인덱스에 해당하는 세트 레이블 목록으로 변환합니다. 또한 방정식/변수 이름과 레이블 목록을 행 또는 열 인덱스로 변환하는 역 작업을 수행합니다. GAMS는 이러한 번역을 매우 효율적으로 만드는 방식으로 메가 슬롯을 구축합니다.
이 조직은 메가 슬롯을 업데이트하여 새로운 시나리오를 만들 때도 유용합니다. 메가 슬롯은 다음과 같이 구성됩니다.
- 주어진 메가 슬롯의 변수와 방정식에 나타나는 모든 레이블로 구성된 하나의 정렬된 우주가 있습니다. 라벨링 순서는 메가 슬롯 내 기호에서 기호로 변경되지 않습니다.
- 주어진 변수에 해당하는 메가 슬롯의 모든 열은 연속되어 있습니다. (행과 방정식도 마찬가지)
- 주어진 변수에 해당하는 열은 보편적인 순서를 사용하여 색인 레이블별로 정렬되며 가장 왼쪽의 색인이 가장 느리게 변합니다. (행과 방정식도 마찬가지)
- GDX 데이터는 같은 방식으로 정렬됩니다. 즉, 인덱스 라벨 순서로 정렬되며, 가장 왼쪽 인덱스가 가장 느립니다. 이는 매우 유용할 수 있습니다.메가 슬롯과 GDX 데이터가 동일한 라벨 순서를 사용하도록 제공.
다양한 GAMS 구성요소 라이브러리를 사용하면 사용자에게 편리하고(GAMS 소스에서 참조된 기호 이름을 사용하여) 메가 슬롯 데이터 업데이트에 효율적인 메가 슬롯 업데이트 인터페이스를 생성할 수 있습니다.
GMO 인스턴스 업데이트
GMO 인스턴스에 포함된 메가 슬롯을 수정하는 방법에는 여러 가지가 있습니다. 업데이트란 솔루션 세트를 변경하지 않는 관점의 변경이 아니라 실제 메가 슬롯 변경을 의미합니다.
아마도 가장 간단한 경우, 사용자는 대체 변수 경계를 지정할 수 있으며 이는 분기 및 경계 코드를 구현할 때 유용합니다. 이 경우 원래 경계는 유지되므로 단일 호출로 메가 슬롯을 원래 경계로 되돌릴 수 있습니다.
주어진 지점을 중심으로 메가 슬롯을 선형화하는 것이 가능합니다. 이 작업은 선형화하기 위해 해당 지점의 정보가 필요하지 않으며 쉽게 취소할 수 있습니다. 이는 거의 관점의 변화이지만 원래 메가 슬롯과 선형화된 메가 슬롯의 솔루션이 상당히 다를 수 있으므로 이를 메가 슬롯 업데이트로 간주할 수도 있습니다.
많은 알고리즘(예: 외부 근사, 벤더 분해, Danzig-Wolfe 분해)에는 행과 이러한 행에 부수적인 열을 핵심 메가 슬롯에 추가하는 작업이 포함됩니다. 이러한 알고리즘은 행과 열을 추가하는 GMO 기능을 활용하여 GMO를 사용하여 효과적으로 구현할 수 있습니다. 행과 열을 추가할 때마다 사용할 GMO 인스턴스를 준비하는 데는 약간의 작업만 필요합니다. 이 경우 메가 슬롯에 대한 모든 변경 사항은 다음과 같습니다.추가사항: 기존 구조와 데이터는 그대로 유지됩니다.
마지막으로 GMO에는 변수 범위(앞서 언급한 대로), 변수 유형(예: 단일 이산 변수 완화) 및 제약 조건의 오른쪽을 업데이트하는 기능이 있습니다. 사용자는 행렬 계수를 직접 수정할 수 없습니다. 메가 슬롯의 외생 데이터를 안전하게 업데이트하는 훨씬 더 나은 방법이 있습니다. GAMS는 GAMS 매개변수가 표시되고 업데이트될 수 있는 메가 슬롯 인스턴스를 제공할 수 있습니다. 메가 슬롯의 표현식을 재평가하면 업데이트된 행렬 요소가 제공됩니다. 기본 개념은 다음에서도 사용됩니다.수집-업데이트-해결-분산(GUSS)자세한 내용은이 문서. 이는 효율적으로 작업을 수행할 수 있는 강력한 도구입니다. 전체 메가 슬롯을 반복해서 재생성하기 위해 GAMS가 필요 없는 Monte-Carlo 시뮬레이션입니다.