GAMS는 다양한 기본 제공 또는내장 함수방정식에 사용됩니다. 그럼에도 불구하고 GAMS가 사용되는 매우 다양한 응용 분야로 인해 새롭고 때로는 정교하고 전문화된 기능을 추가해야 한다는 요구가 생길 수 있습니다. 이러한 요청을 충족하는 것과 대부분의 사용자에게 필요하지 않은 복잡성을 피하는 것 사이에는 균형이 있습니다. GAMS 슬롯 무료체험 방정식 기능은 사용자가 슬롯 무료체험 라이브러리에서 함수를 가져와 GAMS 모델에서 방정식을 정의할 수 있도록 해주기 때문에 이러한 균형을 관리하기 위한 한 가지 수단을 제공합니다. 그러나 이러한 슬롯 무료체험 라이브러리는 현재 한 지점에서 함수(1차 파생물 포함)를 평가하기 위한 기능만 제공할 수 있습니다. 따라서 모델 인스턴스의 대수적 구조를 분석해야 하는 솔버는 슬롯 무료체험 방정식을 사용할 수 없습니다. 여기에는 다음 클래스가 포함됩니다.결정적글로벌 솔버, "글로벌" 열 참조이 테이블, 예를 들어,확률적전역 솔버는 슬롯 무료체험 방정식을 사용할 수 있습니다.
- 참고
- 슬롯 무료체험 방정식과 모두슬롯 무료체험 함수사용자가 제공한 수학 함수를 통해 GAMS를 확장할 수 있는 가능성을 제공하는 것을 목표로 합니다. 그러나 두 가지 모두의 사용과 구현에는 근본적인 차이점이 있습니다. 대부분의 상황에서,슬롯 무료체험 함수슬롯 무료체험 방정식보다 선호되어야 합니다. 또한 참조하세요슬롯 무료체험 함수와 슬롯 무료체험 방정식.
- 주의
- 슬롯 무료체험 방정식 라이브러리를 구축하려면 일반 프로그래밍 언어(예: C/C++, FORTRAN, ...)에 대한 지식이 필요하며 동적으로 링크된 라이브러리를 구축하기 위해 컴파일러 및 링커를 처리한 경험이 필요합니다.
- 참고
- 슬롯 무료체험 방정식 인터페이스는 NLP 솔버로 해결되는 모델에 대해 GAMS에서 수행하는 매우 유용한 모델 검사 중 일부를 우회하는 방법으로 고안되지 않았습니다. 슬롯 무료체험 방정식은 여전히 정확하고 매끄러운 1차 도함수를 사용하여 연속적인 것으로 가정됩니다. 연속성 가정은 슬롯 무료체험 방정식이 솔버에서 사용하는 실현 가능성 허용오차보다 훨씬 낮은 매우 낮은 노이즈 수준을 가져야 함을 의미합니다. 정확한 도함수에 대한 가정은 도함수가 표준 유한 차분을 사용하여 수행할 수 있는 것보다 더 정확하게 계산되어야 함을 의미합니다. 이러한 가정이 충족되지 않으면 NLP 솔버가 로컬 최적의 수학적 특성을 갖는 솔루션, 즉 솔버에서 사용하는 표준 허용오차 내에서 Karush-Kuhn-Tucker 조건을 충족하는 솔루션을 찾을 수 있다는 보장이 없습니다.
다음에는 FORTRAN, C, Delphi 또는 기타 프로그래밍 언어로 작성된 코드를 GAMS 모델의 방정식 및 변수에 연결하는 방법이 설명되어 있습니다. 이러한 GAMS 방정식은 다음과 같이 지칭됩니다.슬롯 무료체험 방정식그리고 프로그래밍 루틴의 컴파일된 버전은 다음과 같이 참조됩니다.슬롯 무료체험 모듈슬롯 무료체험 기능을 정의합니다. 슬롯 무료체험 모듈의 형태는 사용되는 운영 체제에 따라 다릅니다. Windows의 슬롯 무료체험 모듈은 동적 링크 라이브러리입니다(.dll) 그리고 Unix의 슬롯 무료체험 모듈은 공유 객체입니다(.so또는.dylib). 원칙적으로 인터페이스 규칙이 변경되지 않는 한 모든 언어나 시스템을 사용하여 슬롯 무료체험 모듈을 정의하는 DLL 또는 공유 객체를 빌드할 수 있습니다.
GAMS 테스트 라이브러리는 GAMS 모델과 C, Delphi, Java 및 FORTRAN 코드로 구성된 슬롯 무료체험 방정식의 예를 제공합니다. 자세한 내용은 섹션을 참조하세요.GAMS 테스트 라이브러리의 예.
슬롯 무료체험 방정식의 기본 메커니즘은 일반적인 GAMS 구문을 사용하여 모든 방정식과 변수를 선언하는 것입니다. 슬롯 무료체험 방정식의 해석은 특별한 방법으로 수행됩니다. 일반적인 의미론적 내용 대신 슬롯 무료체험 방정식은 다음을 지정합니다.매핑28624_28784모델 인터페이스. 슬롯 무료체험 모듈은 C, FORTRAN 또는 대부분의 다른 프로그래밍 언어로 작성될 수 있습니다. 섹션프로그래밍 인터페이스은 프로그래밍 언어 관점에서 C, Delphi 및 FORTRAN용 슬롯 무료체험 모듈에 대한 일반적인 정의를 설명합니다. 프로그램이 컴파일되고 슬롯 무료체험 모듈로 변환되는 방식은 시스템 및 컴파일러에 따라 다릅니다. 다음 섹션구현슬롯 무료체험 모듈 구현의 다양한 측면에 대한 자세한 조언을 제공합니다.
GAMS 테스트 라이브러리의 예
모델[TESTEXEQ]는 GAMS 테스트 라이브러리의 모든 예에 대한 개요를 제공하며 이를 컴파일하고 실행하는 데 사용될 수 있습니다. 이 장의 나머지 부분에서는 이 모델에 나열된 예를 참조할 것입니다. 또한, 모델[COMPLINK]슬롯 무료체험 방정식 라이브러리를 컴파일하고 연결하기 위한 스크립트로 사용될 수 있습니다. 이러한 모델은 Java 컴파일러 및 라이브러리에 대한 경로를 하드코딩하며 Java 예제를 실행할 때 사용자가 이러한 경로를 조정해야 합니다.
슬롯 무료체험 라이브러리가 어떻게 구축되었는지에 관계없이 예제(예:[EX1])는 기본적으로 슬롯 무료체험 방정식을 사용하지 않고 모델을 해결합니다. 다양한 슬롯 무료체험 방정식 라이브러리를 사용하여 예제 모델을 풀기 위해 인수를 사용하여 실행할 수 있습니다.
--runall=1
또는 다음 명령줄 매개변수 중 하나 이상을 사용하여 선택한 라이브러리만 사용할 수 있습니다.
--runC=1 --runC_cb=1 --runD=1 --runD_cb=1 --runF=1 --runF_cb=1 --runJ=1
모델 인터페이스
슬롯 무료체험 방정식 구문
슬롯 무료체험 모듈에 대한 인터페이스를 지정하는 데 사용되는 슬롯 무료체험 방정식은 다음과 같습니다.선언GAMS에서는 다른 방정식과 같습니다. 슬롯 무료체험 방정식의 구문정의문은 다음과 같습니다:
eqn_name(index_list)[$logical_condition(s)].. 표현식 =x= 표현식 ;
평소와 유일한 차이점을 참고하세요방정식 정의방정식 유형의 사용입니다=x=.
슬롯 무료체험 모듈에 의해 정의된 방정식은 항상 우변이 0인 등식 제약 조건으로 해석됩니다. 따라서 부등식은 추가적인 슬롯 무료체험 변수 역할을 하는 명시적인 여유 변수를 추가하여 등식으로 변환되어야 합니다. 0이 아닌 우변은 슬롯 무료체험 방정식 구현에서 처리되어야 합니다.
슬롯 무료체험 방정식 및 변수를 인덱스에 매핑
슬롯 무료체험 모듈을 GAMS 모델에 연결하려면 일부 매핑을 지정해야 합니다. 슬롯 무료체험 방정식은 지수로 정의되는 것으로 가정됩니다.i = 1...m. 이러한 색인은 GAMS 방정식 이름에 매핑되어야 합니다. 마찬가지로 슬롯 무료체험 함수 내부에서 사용되는 변수는 인덱스로 정의되는 것으로 가정됩니다.j = 1...n. 이러한 색인은 GAMS 변수 이름에 매핑되어야 합니다. 마지막으로 슬롯 무료체험 모듈의 이름을 지정해야 합니다. GAMS 솔버는 일반적으로 대형 모델용으로 설계되었으며 희소성에 의존합니다. 따라서 슬롯 무료체험 방정식 세트 사양의 마지막 부분은 슬롯 무료체험 방정식의 희소성 패턴, 즉 어떤 변수가 어떤 방정식에 나타나는지입니다.
값은상수슬롯 무료체험 방정식의 항은 정수여야 합니다. 왜냐하면 상수 값은 GAMS 방정식의 행을 색인(in에 매핑하기 때문입니다.1...m) 슬롯 무료체험 방정식의 GAMS 방정식의 여러 블록은 다음을 사용하여 슬롯 무료체험 방정식에 매핑될 수 있습니다.=x=표기법. 유형의 GAMS 방정식 간의 매핑=x=및 색인1...m전단사적(일대일)이어야 합니다. 이는 두 개의 GAMS 방정식이 동일한 슬롯 무료체험 방정식 색인에 매핑될 수 없으며 슬롯 무료체험 방정식 색인 목록에 구멍이 없을 수 있음을 의미합니다. GAMS 슬롯 무료체험 방정식의 블록 수에는 제한이 없을 수 있지만 모두 하나의 단일 슬롯 무료체험 모듈에 매핑되고 구현되어야 합니다.
그변수33515_339931...n34009_340725*Y슬롯 무료체험 방정식이 GAMS 변수에 따라 다름을 나타냅니다.Y그리고 그거Y은 슬롯 무료체험 변수 벡터의 5번째 요소에 매핑됩니다. 분명히, 변수가 둘 이상의 슬롯 무료체험 방정식에 나타나는 경우 해당 계수의 값은 각 경우에서 동일해야 합니다.
GAMS 변수의 여러 블록이 슬롯 무료체험 방정식에 사용될 수 있습니다. 방정식 블록의 모든 행이 슬롯 무료체험에 있거나 슬롯 무료체험에 있는 방정식과 달리 변수 블록의 일부 열은 슬롯 무료체험에 있을 수 있고 다른 열은 그렇지 않을 수 있습니다. 유형의 방정식에 나타나는 GAMS 변수 간의 매핑=x=및 슬롯 무료체험 변수 인덱스1...n전단사적(일대일)이어야 합니다. 이는 두 개의 GAMS 열이 동일한 슬롯 무료체험 변수 인덱스에 매핑되지 않을 수 있으며 슬롯 무료체험 변수 인덱스 목록에 구멍이 없을 수 있음을 의미합니다. 슬롯 무료체험 변수에 매핑된 GAMS 변수 블록은 얼마든지 있을 수 있지만 모두 슬롯 무료체험 모듈의 서브루틴에 전달된 하나의 단일 벡터로 매핑되어야 합니다.
일부 GAMS 변수는 슬롯 무료체험 변수이지만 이를 슬롯 무료체험 변수로 표시하기 위해 제공되는 구문이 없음을 관찰하십시오. 이는 슬롯 무료체험 방정식뿐만 아니라 비슬롯 무료체험 GAMS 방정식에도 사용될 수 있습니다. 실제로 이 기능이 없으면 모델은 분리 가능하며 슬롯 무료체험 방정식과 매핑되는 함수는 거의 쓸모가 없습니다.
- 참고
- 슬롯 무료체험 방정식의 GAMS 정의에서 계수와 우변은 지수로 해석되므로 사용자는 슬롯 무료체험 방정식과 변수의 크기를 조정할 수 없습니다.
- 슬롯 무료체험 방정식은 특별한 방식으로 처리되므로 명령줄 매개변수와 모델 속성보류 고정고정된 슬롯 무료체험 변수는 상수로 처리하지 않습니다.
슬롯 무료체험 모듈 이름
슬롯 무료체험 방정식이 구현되는 슬롯 무료체험 모듈의 이름은 다양한 방법으로 정의될 수 있습니다. 기본적으로 슬롯 무료체험 모듈은 운영 체제에 따라 달라지는 확장자를 가진 GAMS 모델과 동일한 이름을 갖는 것으로 간주됩니다. 확장자는.dllWindows의 경우,.dylibmacOS의 경우 및.so기타 Unix의 경우.
슬롯 무료체험 모듈의 사용자 정의 이름은 다음으로 지정할 수 있습니다.파일 설명. 이 경우 파일 이름은에 추가 항목으로 나열되어야 합니다.모델 진술. 파일 문에서 라이브러리 확장자가 생략된 경우 GAMS는 시스템 종속 확장자를 자동으로 추가합니다. 이는 다양한 운영 체제 간에 모델을 이식하는 데 도움이 됩니다.
다음의 간단한 예를 생각해 보십시오:
파일 myextfile / extern /;
모델 mymodel / all, myextfile /;
모델일 때내모델해결되면 GAMS는 이름이 지정된 슬롯 무료체험 모듈 파일을 로드하려고 시도합니다.extern.so, extern.dylib, 또는extern.dll, 현재 운영 체제에 따라 다름.
기본적으로 슬롯 무료체험 모듈은 디렉토리에 있는 것으로 가정됩니다.external_equations에서GAMS 표준 위치또는 GAMS가 호출되는 디렉토리. 파일 문에 추가된 경로를 사용하여 다른 위치를 지정할 수 있습니다.
프로그래밍 인터페이스
이 섹션에서는 GAMS 슬롯 무료체험 방정식 기능에 대한 C, Delphi 및 FORTRAN 인터페이스에 대해 설명합니다.
슬롯 무료체험 방정식 모듈은 다음과 같은 함수를 제공해야 합니다.GEFUNC. 슬롯 무료체험 방정식 모듈의 시작 부분은 일반적으로 다음과 같습니다.
C:
#define GE_EXPORT#include "geheader.h"GE_APIintGE_CALLCONVgefunc(int* ICNTR,더블* x,더블* 에프,더블* d, msgcb_t msgcb)헤더 파일
geheader.h다음에서 찾을 수 있습니다.testlib_mlGAMS 배포판의 하위 디렉토리입니다. 정의합니다GE_API그리고GE_CALLCONV그리고 함수의 서명GEFUNC.GE_API은 함수를 내보내야 하는지 아니면 가져와야 하는지 컴파일러에 나타내는 데 사용됩니다. 정의로 인해GE_EXPORT포함 전geheader.h,GE_API함수가 내보내기용으로 표시되도록 정의되었습니다(__declspec(dllexport)Windows 및__가시성__("기본값")GCC 포함). 더 나아가,GE_CALLCONV은 Windows에서 사용해야 하는 호출 규칙을 나타냅니다. 현재 이는 다음과 같이 정의됩니다.__stdcall. 다른 운영 체제에서는 비어 있습니다.
포트란:
정수기능gefunc(icntr, x, f, d, msgcb)C 제어 버퍼:정수icntr(*)C 수치 입력 및 출력:이중 정밀도x(*), f, d(*)C 메시지 콜백 루틴슬롯 무료체험msgcb
델파이:
사용geheader_d;GeFunc 함수(var Icntr: ticntr;var x: tarray;var F: 더블;var D: tarray;MsgFunc: tMsgCallBack): 정수; 표준 호출;유닛 파일
geheader_d.pas다음에서 찾을 수 있습니다.testlib_mlGAMS 배포판의 하위 디렉토리.
다음에서,의 인수는GEFUNC자세히 설명되어 있습니다.
제어 벡터 icntr
배열icntr은 GAMS와 슬롯 무료체험 모듈 간에 제어 정보를 압축하고 전달하는 데 사용되는 제어 벡터입니다. 작업에 도움이 되는 몇 가지 정의icntr배열은 파일에서 제공됩니다.geheader.h(C),geheader_d.pas(델파이) 및gehelper.f90(포트란 90). 배열 요소는 다음과 같습니다.
| 요소 | 설명 |
|---|---|
icntr[I_Length] | 배열의 길이를 유지icntr요소 수. 이는 GAMS에서 제공됩니다. |
icntr[I_Neq] | GAMS 모델에 표시된 슬롯 무료체험 방정식 행 수. 이는 GAMS에서 제공됩니다. |
icntr[I_Nvar] | GAMS 모델에 표시된 슬롯 무료체험 변수의 수. 이는 GAMS에서 제공됩니다. |
icntr[I_Nz] | GAMS 모델에 표시된 0이 아닌 도함수 또는 야코비안 요소의 수입니다. 이는 GAMS에서 제공됩니다. |
icntr[I_Mode] | 현재 작동 모드. 이는 GAMS에서 제공됩니다. 다음 값이 가능합니다:DOINIT: 초기화합니다. 이것은 다음의 첫 번째 호출이 될 것입니다.GEFUNC, 슬롯 무료체험 모듈에 필요한 초기화가 수행될 수 있습니다.DOTERM: 종료합니다. 이것이 마지막 통화가 될 것입니다.GEFUNC, 슬롯 무료체험 모듈에 필요한 정리 작업이 수행될 수 있습니다.DOEVAL: 함수 평가. 슬롯 무료체험 방정식을 평가해야 합니다.DOCONSTDERIV: 상수 파생 상품. 에 관한 정보상수 파생상품제공되어야 합니다.DOHVPROD: 헤센-벡터 곱. 슬롯 무료체험 방정식의 헤세 행렬과 벡터 간의 곱을 계산해야 합니다. 참조두 번째 도함수: 헤센 곱하기 벡터자세한 내용은. |
icntr[I_Eqno] | 이 호출 중에 평가할 슬롯 무료체험 방정식의 인덱스GEFUNC. 이는 함수 평가 모드에서 GAMS에 의해 제공됩니다(icntr[I_Mode]=DOEVAL)이며 1에서 사이의 숫자입니다.icntr[I_Neq], 포함. 슬롯 무료체험 방정식 인터페이스를 사용하면 한 번에 하나의 함수에 대한 정보만 전달할 수 있습니다. |
icntr[I_Dofunc] | 함수 값을 계산해야 하는지 여부를 플래그합니다.icntr[I_Dofunc]함수 평가 모드에서 GAMS에 의해 제공됩니다(icntr[I_Mode]=DOEVAL). 1로 설정하면 다음과 같습니다.GEFUNC다음으로 색인된 함수의 숫자 값을 반환해야 합니다.icntr[I_Eqno]스칼라에서f. |
icntr[I_Dodrv] | 도함수를 계산해야 하는지 여부를 표시합니다.icntr[I_Dodrv]함수 평가 모드에서 GAMS에 의해 제공됩니다(icntr[I_Mode]=DOEVAL). 1로 설정하면,GEFUNC다음으로 색인된 함수의 도함수의 숫자 값을 반환해야 합니다.icntr[I_Eqno]배열에서d. |
icntr[I_Newpt] | 새 지점을 위한 플래그입니다.icntr[I_Newpt]함수 평가 모드에서 GAMS에 의해 제공됩니다(icntr[I_Mode]=DOEVAL). 1로 설정하면 포인트x이전 호출과 다를 수 있음GEFUNC. 0으로 설정하면,x이전 호출 이후 변경되지 않았습니다. |
icntr[I_Debug] | 만약icntr[I_Debug]은 슬롯 무료체험 방정식 모듈에 의해 0이 아닌 값으로 설정된 다음 함수GEstat그리고GElog모든 문자열을 다음이라는 파일에 기록합니다.debugext.txt그리고 쓰기 후에 즉시 버퍼를 플러시합니다. GAMS가 메시지를 표시하기 전에 공유 객체가 충돌할 때 문자열 디버거를 사용할 수 있습니다. FORTRAN에서 문자열 디버거는 FORTRAN 단위를 사용합니다.icntr[I_Debug]. 자세한 내용은 섹션을 참조하세요.메시지 출력. |
icntr[I_Getfil] | GAMS에서 특수 디렉토리 또는 파일의 이름을 요청하는 플래그입니다. 다음 값이 가능합니다:I_Scr: 스크래치 디렉터리,I_Wrk: 작업 디렉터리,I_Sys: GAMS 시스템 디렉터리,I_Cntr: 제어 파일.자세한 내용은 섹션을 참조하세요.파일을 통해 슬롯 무료체험 모듈과 데이터 통신. |
icntr[I_Smode] | 문자열 모드에 대한 플래그입니다. 이는 GAMS에서 제공됩니다. 자세한 내용은 섹션을 참조하세요.파일을 통해 슬롯 무료체험 모듈과 데이터 통신. |
icntr[I_ConstDeriv] | 상수 미분 사용에 대한 표시자. 이 항목은 선택 사항입니다. 자세한 내용은 섹션을 참조하세요.상수 파생상품아래. |
icntr[I_HVProd] | 2차 도함수에 대한 헤시안-벡터 곱의 사용에 대한 표시기. 이 항목은 선택 사항입니다. 자세한 내용은 섹션을 참조하세요.두 번째 도함수: 헤센 시간 벡터아래. |
FORTRAN 프로그래머는 대괄호를 바꿔야 한다는 점을 관찰하십시오.[]괄호 포함().
평가 포인트 x
인수x다음을 포함하는 배열입니다icntr[I_Nvar]요소이며 다음과 같은 경우 GAMS에서 제공됩니다.GEFUNC함수 평가 모드에서 호출됩니다(icntr[I_Mode] = DOEVAL). 일반적으로 GAMS와 솔버는 다음의 개별 요소를 보장합니다.x는 GAMS 모델에 정의된 변수 범위 사이에 있거나 매우 가깝습니다. 초기화 및 종료 호출 중에x정의되지 않았으며 슬롯 무료체험 모듈은 참조하면 안 됩니다.x. C 프로그래머는 이 배열을 0부터 색인화해야 합니다. 즉, 첫 번째 슬롯 무료체험 변수는 다음과 같이 참조됩니다.x[0].
함수 값 f
만약icntr[I_Mode] = DOEVAL그리고icntr[I_Dofunc] = 1, 그러면 슬롯 무료체험 모듈은 슬롯 무료체험 방정식의 값을 반환해야 합니다.icntr[I_Eqno]스칼라에서f. 초기화 및 종료 호출 중에f참조하면 안 됩니다.
파생 벡터 d
만약icntr[I_Mode] = DOEVAL그리고icntr[I_Dodrv] = 1, 그러면 슬롯 무료체험 모듈은 슬롯 무료체험 함수의 파생 값을 반환해야 합니다.icntr[I_Eqno]배열의 모든 변수에 대하여d. 변수에 대한 미분x[i]반환됨d[i]. 해당 위치만 설정하면 충분합니다.d실제로 방정식에 나타나는 변수에 해당icntr[I_Eqno]. 다른 위치는 GAMS에서 사용되지 않으며 정의되지 않은 상태로 남아 있을 수 있습니다. 초기화 및 종료 호출 중에d참조하면 안 됩니다.
메시지 콜백 msgcb
이 인수는 GAMS 프로세스의 상태 및/또는 로그 파일에 메시지를 쓰는 데 사용할 수 있는 메시지 콜백 루틴의 주소입니다. C에서의 유형 정의는 다음과 같습니다.
인수모드은 메시지가 기록되어야 하는 위치를 나타내는 정수를 가리키는 데 사용됩니다. 이 정수는 다음 값으로 설정할 수 있습니다.
- LOGFILE (1): 로그 파일에만 메시지를 씁니다.
- STAFILE (2): 상태 파일에만 메시지를 씁니다.
- 로그파일 | STAFILE (3): 로그 파일과 상태 파일 모두에 메시지를 씁니다. 기호를 관찰하십시오.
|비트 논리를 나타냄또는C.
인수nchars메시지에 포함된 바이트 수를 지정하는 정수를 가리킵니다(\0-터미네이터가 있는 경우). 따라서 C에서는,nchars일반적으로 다음으로 설정됩니다.strlen(buf). 인수buf는 인쇄할 메시지가 포함된 문자 배열에 대한 포인터입니다. 마지막으로,len는 문자열의 크기 또는 길이입니다.buf, 따라서 일반적으로 다음과 같습니다.*nchars.
메시지 콜백 호출 중msgcbC에서는 간단합니다. 인수에 유의하세요.모드, nchars및buf모두 참조별 호출이므로 값이 아닌 주소를 사용해야 합니다. 그러나 주장len값별 호출이고*nchars값으로 전달되어야 합니다.
구현이 Delphi 또는 Visual Basic에서 수행되는 경우 모든 유형의 포인터는 32비트 시스템에서 4바이트 크기이고 64비트 시스템에서는 8바이트 크기입니다. 정수는 4바이트입니다.
FORTRAN 환경에서 이 루틴을 호출하는 것은 FORTRAN 컴파일러가 문자열을 처리하는 다양한 방식으로 인해 조금 더 복잡합니다. Unix 규칙(적어도 GAMS가 구축된 모든 시스템에서 관찰되는 규칙)은 문자열이 참조로 전달된다는 것입니다. 또한 문자열의 길이는 인수 목록 끝에 추가된 숨겨진 4바이트 수량으로 값으로 전달됩니다. 이것이 포함된 이유입니다len의 마지막 인수로msgcb. 인수len다음과 같이 Unix 환경에서 FORTRAN 콜백 생성을 용이하게 합니다.
반환 코드
함수GEFUNC다음 상태 코드 중 하나를 반환해야 합니다:
| 상태 코드 | 정의 |
|---|---|
0 | 오류가 발생하지 않았습니다. |
1 | 함수 평가 오류가 발생했습니다. GAMS는 다음의 콘텐츠를 사용해서는 안 됩니다.f및/또는d하지만GEFUNC오류에서 복구되었으며 새로운 지점에서 호출될 준비가 되었습니다. 이 상태 코드는 함수 평가 모드()에서만 사용해야 합니다.icntr[I_Mode]=DOEVAL). |
2 | 치명적인 오류. 초기화 호출 중에 이 값이 반환되면 GAMS는 즉시 중단되어야 합니다. 다음으로 반환될 수 있습니다.GEFUNC초기 호출 중에 일부 초기화가 올바르게 작동하지 않거나 크기 값 중 일부가 잘못된 경우icntr예상치 못한 값이 있었습니다. 함수 평가 모드(icntr[I_Mode]=DOEVAL) 슬롯 무료체험 모듈에 복구할 수 없는 문제가 발생한 경우. |
구현
기능 설명 후GEFUNC섹션에서프로그래밍 인터페이스위의 이 섹션에서는 구현에 대한 몇 가지 실용적인 설명을 제공합니다.GEFUNC.
컴파일 및 연결
그GAMS 슬롯 무료체험 방정식의 예다양한 컴파일러를 사용하여 다양한 시스템에서 코드를 컴파일하기 위한 GAMS 모델 세트가 포함되어 있습니다. 모듈이 인터페이스 표준을 준수하는지 확인하려면 이 예제에 표시된 컴파일러 및 링커 플래그를 사용해야 합니다. 또한 적절한 포함 파일(geheader.h, geheader_d.pas, gehelper.f90)을 사용해야 합니다.
초기화 모드
초기화 모드는 항상 슬롯 무료체험 방정식이 예상 크기를 가지고 있는지 확인해야 합니다.icntr[I_Neq], icntr[I_Nvar]그리고icntr[I_Nz]고정된 예상 값 또는 일부 슬롯 무료체험 데이터 세트에서 파생된 값에 대해 테스트해야 합니다.
초기화 모드는 메모리 할당, 숫자 정보 초기화 또는 이후 함수 평가에 필요한 정보 매핑과 같은 여러 목적으로 사용될 수 있습니다. 데이터는 슬롯 무료체험 데이터 소스에서 계산하거나 읽을 수 있으며, 슬롯 무료체험 데이터베이스에 대한 호출을 통해 파생될 수도 있습니다. GAMS와 공유되는 데이터는 다음을 사용하여 GAMS의 파일에 기록될 수 있습니다.put 문그런 다음 읽어보세요GEFUNC. 또한 사용자는 다음을 닫아야 합니다.파일 넣기와putclose 문solve 문 앞에. 한 번의 호출에서 정보를 보유하는 데 사용되는 메모리를 관찰하십시오.GEFUNC다음은 정적이어야 합니다. FORTRAN의 경우 다음 중 하나에 있어야 합니다.공통차단하지 않으면 a에 포함되어야 합니다.저장진술.
종료 모드
종료 모드는 통계 계산, 파일 닫기 및 메모리 반환과 같은 일부 정리 작업을 수행하는 데 사용될 수 있습니다.
평가 모드
대부분의 계산 작업은 일반적으로 평가 모드에서 수행됩니다. 그것을 관찰하십시오GEFUNC한 번에 하나의 방정식에만 작동합니다. 이 선택의 이유 중 하나는 파생 상품의 주소 지정이 매우 간단해진다는 것입니다. 각 변수에 대해 하나의 파생 상품이 있고 동일한 인덱스를 갖습니다.d그리고x각각.
일부 애플리케이션에서는 여러 기능이 자연스럽게 함께 평가됩니다. 예를 들어 모든 기능은 일부 공동 통합 루틴에서 계산되기 때문입니다.icntr[I_Newpt]58895_59031icntr[I_Newpt]은 1과 같으며 함수와 미분 값을 저장합니다. 또한 방정식에 해당하는 값을 반환합니다.icntr[I_Eqno]. 후속 호출에서GEFUNC, icntr[I_Newpt]0이 될 가능성이 높으며 이전에 계산된(및 저장된) 정보에서 함수와 도함수 값을 빠르게 추출할 수 있습니다.
평가 오류
모든 비선형 함수가 경계 내 변수의 모든 값에 대해 정의되는 방식으로 변수에 경계를 추가하는 것은 좋은 모델링 방법입니다. 또한 대부분의 솔버는 벡터의 모든 항목이 있을 때만 비선형 함수가 호출되도록 보장합니다.x경계 사이에 있습니다. 그러나 필요한 모든 경계와 구현을 추가하는 것은 실용적이지 않을 수 있습니다.GEFUNC따라서 0으로 나누기, 양수가 아닌 숫자의 로그 사용, 지수의 오버플로 등과 같은 평가 오류를 캡처해야 합니다. 주어진 지점에서 방정식을 평가할 수 없는 경우 함수GEFUNC값 1을 반환하여 솔버에게 이 상황을 알려야 합니다. 그런 다음 솔버는 안전한 지점으로 돌아가서 거기에서 최적화를 계속할 수 있습니다.
- 주의
- 평가 오류를 처리하는 시스템 기본 또는 사용자 정의 함수(예: C 라이브러리 함수
매더())은 때때로 a 내에서 같은 방식으로 작동하지 않습니다.DLL또는 자체 포함된 프로그램이나 정적 라이브러리에서와 같은 공유 객체입니다.
메시지 출력
슬롯 무료체험 모듈은 GAMS 상태 파일(일반적으로 목록 파일)과 GAMS 로그 파일(일반적으로 화면)에 메시지를 보낼 수 있습니다. GAMS 상태 파일에 포함될 메시지는 다음을 사용하여 버퍼링될 수 있습니다.GEstat아래에 설명된 유틸리티 루틴과 GAMS 로그 파일에 포함될 메시지는 다음을 사용하여 버퍼링될 수 있습니다.GElog유틸리티 루틴. GAMS 또는 솔버 프로세스가 파일을 제어하므로 슬롯 무료체험 모듈에 쓰기 위해 이러한 파일을 열 수는 없습니다.
또한 메시지 콜백을 사용하면 버퍼링 없이 상태 파일과 로그 파일 모두에 메시지를 보낼 수 있습니다.msgcb. 이렇게 하면 메시지 버퍼 크기에 따른 제한이 제거되고 버퍼에서 플러시되지 않은 메시지에 대해 걱정할 필요가 없기 때문에 디버깅이 다소 단순해질 수도 있습니다. 일부 환경에서는 메시지 콜백을 사용하는 것이 어렵거나 불가능할 수 있으므로 버퍼링된 기술과 버퍼링되지 않은 기술을 모두 제공합니다.
메시지를 보내는 두 가지 기술(버퍼링을 통해)GEstat그리고GElog그리고 메시지 콜백을 통해 버퍼링되지 않음msgcb)은 보완적입니다. 둘 중 하나를 사용할 수 있지만 둘 다 동일한 슬롯 무료체험 모듈에서 사용되는 경우 버퍼링된 메시지는 버퍼링되지 않은 메시지 뒤에 인쇄됩니다.
GEstat: 상태 파일에 메시지를 쓰기 위한 유틸리티 루틴
GEstat은 적절한 포함 파일에 제공됩니다(Fortran 90:gehelper.f90, C:geheader.h, 델파이:geheader_d.pas). GAMS 상태 파일에 기록되어야 하는 메시지를 전달하는 데 사용됩니다. 함수 정의는 다음과 같습니다.
포트란:
C:
델파이:
첫 번째 인수에 주목하세요.icntr, 함수 호출을 통해 전달되어야 합니다.GEFUNC. 주장의 내용라인(또는sin Delphi)는 제어 버퍼에 한 줄로 압축됩니다. 언제GEFUNC반환하면 버퍼의 내용이 GAMS 상태 파일에 기록됩니다.GEstat매번 한 줄로 여러 번 호출될 수 있습니다. 그것을 관찰하십시오라인132자를 초과할 수 없으며 한 번의 호출에 기록된 전체 정보의 양은GEFUNC1000자를 초과할 수 없습니다. 더 나아가,라인줄바꿈이나 탭과 같은 특수 문자를 포함해서는 안 됩니다.
실제로는,GEstat다음과 같은 호출에 자주 사용됩니다.
포트란:
C:
델파이:
GElog: 로그 파일에 메시지를 쓰기 위한 유틸리티 루틴
좋아요GEstat, GElog은 적절한 포함 파일에 제공됩니다. GAMS 로그 파일에 기록되어야 하는 메시지를 전달하는 데 사용됩니다. 기본적으로 로그 파일은 화면입니다. 또는 GAMS 명령줄 매개변수로 지정된 파일에 로그를 작성할 수 있습니다.로그파일. 함수 정의GElog다음과 같습니다.
포트란:
C:
델파이:
참고하세요GElog정확히 다음과 같이 동작합니다GEstat, 상태 파일이 로그 파일로 대체됩니다. 내용은라인다음 경우에 로그 파일에 기록되는 버퍼에 기록됩니다.반환합니다.GEFUNC
운영 체제와 컴파일러의 일부 조합에서는 화면에 직접 쓸 수 없다는 점을 관찰하십시오. 이는 슬롯 무료체험 모듈을 빌드하는 데 사용되는 옵션이나 플래그에 따라 달라질 수도 있습니다.
- 주의
- 일부 시스템에서는 화면에 직접 쓰는 경우 슬롯 무료체험 모듈이 충돌할 수 있습니다. 따라서 디버깅을 위한 방법으로 화면에 동작하는지 확실하지 않은 이상 쓰지 않는 것이 좋습니다. 그렇지 않으면 다른 모든 오류가 제거된 후에도 디버깅 문으로 인해 모듈이 계속 충돌할 수 있습니다. 안전한 대안으로 파일에 쓰고 버퍼를 플러시하는 것이 좋습니다.
파일을 통해 슬롯 무료체험 모듈과 데이터 통신
일부 슬롯 무료체험 방정식에는 GAMS 프로그램의 데이터가 필요합니다. 이 데이터는 다음을 사용하여 작성된 하나 이상의 파일을 통해 전달될 수 있습니다.put 문. 보통 이런파일 넣기은 현재 디렉토리에 기록되며 슬롯 무료체험 모듈은 현재 디렉토리에서 이를 찾습니다. 그러나 사용자가 동일한 모델의 여러 복사본을 동시에 실행해야 하는 경우 데이터 파일은 GAMS 스크래치 디렉터리에 작성되어야 하며 슬롯 무료체험 모듈은 스크래치 디렉터리에서 데이터 파일을 찾도록 지시되어야 합니다.
Put 파일은 다음과 같이 스크래치 디렉토리에 위치하도록 정의될 수 있습니다.파일 설명GAMS 모델에서:
파일 f / '%gams.scrdir%파일 이름' /;
확장인 경우 관찰.dat을 사용하면 GAMS는 실행 후 스크래치 디렉터리에서 파일을 제거합니다. 다른 확장자를 사용하고 파일이 삭제되지 않으면 GAMS는 실행 후 정리할 때 예기치 않은 파일에 대해 불평합니다. 슬롯 무료체험 모듈은 다음 설정을 통해 초기화 중에 GAMS로부터 스크래치 디렉터리 이름을 받을 수 있습니다.icntr[I_Getfil]에I_Scr그리고 즉시 돌아옵니다. 그런 다음 GAMS는 스크래치 디렉터리의 이름과 이름의 길이를 통신 버퍼에 저장하고 호출합니다.GEFUNC다시 초기화 모드에 있습니다. 참고하세요GEFUNC이제 하위 모드로 호출됩니다icntr[I_Smode]다음으로 설정됨I_Scr. 그런 다음 다음 FORTRAN 호출을 사용하여 이름을 추출할 수 있습니다.
여기,스크디르(다음과 같이 선언됨문자*255)은 스크래치 디렉터리를 수신하고스크렌(정수로 선언됨)은 다음의 실제 길이를 받습니다.스크디르. C에서 호출은 다음 형식을 취합니다.
여기서 루틴은 버퍼로 전송된 숫자 또는 문자를 반환합니다.scratchDir성공하면 값은 -1입니다. 공백이 있으면 종료 '\0' 바이트가 기록됩니다.scratchDir. 반환된 값이 다음과 같은 경우:크기(scratchDir), 그러면 반환된 문자열은 '\0'으로 끝나지 않으며 잘렸을 수도 있습니다.
다음에 다른 값을 지정하여 다른 디렉토리나 파일 이름을 얻을 수 있음을 관찰하십시오.icntr[I_Getfil]. 이 플래그를 설정한 후,GEFUNC항상 즉시 반환해야 합니다.
예를 보려면 모델을 참조하세요.[EX5]그리고[EXMCP3]및 각각의 FORTRAN 및 C 소스 파일.
상수 파생상품
CONOPT 솔버와 같은 일부 솔버는 선형 항의 결과인 방정식의 상수 도함수에 대한 지식을 활용할 수 있습니다. 이는 슬롯 무료체험 방정식이 다음과 같은 방정식을 나타내는 경우 특히 유용할 수 있습니다.Y=f(X), 여기서Y변수이므로 제한이 없습니다.Y다음으로 대체될 수 있음f(X).
그러나 지금까지 설명한 슬롯 무료체험 모듈 인터페이스를 사용하면 솔버는 어떤 변수가 슬롯 무료체험 방정식에 선형으로 나타나는지 알 수 없습니다. 선택적 확장을 사용하면 일부 관계가 선형임을 나타낼 수 있습니다. 1 in을 반환하여 활성화할 수 있습니다.icntr[I_ConstDeriv]통화 중GEFUNC초기화 모드에서.
GEFUNC다음과 같이 반복적으로 다시 호출됩니다.icntr[I_모드]다음으로 설정됨DOCONSTDERIV, 각 슬롯 무료체험 방정식에 대해 한 번씩, 색인은 평소와 같이 지정됨icntr[I_Eqno]. 이러한 각 호출에 대해 모든 상수 도함수 값이 배열에 지정되어야 합니다.d. 의 나머지 요소d72401_72646icntr[I_Dofunc]그리고icntr[I_Dodrv]그리고 배열x정의되지 않습니다.
예를 보려면 모델을 참조하세요.[EX4X]해당 Fortran 90 및 C 소스 파일 포함ex4xf_cb.f90그리고ex4xc_cb.c입니다. 이러한 파일을 상수 파생물 없이 해당 파일과 비교하는 것이 좋습니다.ex4f_cb.f90그리고ex4c_cb.c.
두 번째 도함수: 헤센 곱하기 벡터
슬롯 무료체험 모듈은 슬롯 무료체험 방정식의 헤시안 행렬을 솔버에 제공할 수 없습니다. 그러나 일부 솔버에는 헤세 행렬을 내부적으로 근사화하기 위한 특별한 옵션이 있습니다. 예를 들어, 다음을 참조하세요.hessian_appimation 옵션IPOPT의 경우 또는헤솝트KNITRO용. 또한 솔버 CONOPT는 헤세 행렬 \(\nabla^2 f(x)\) 곱하기 벡터 \(v\)의 형태로 2차 정보를 활용할 수 있습니다. 이 특수 형식은 다음 설정을 통해 슬롯 무료체험 방정식에 사용할 수 있습니다.icntr[I_HVprod]통화 중 1로GEFUNC초기화 모드에서.
솔버가 이 정보를 사용할 수 있다면(모든 솔버가 그렇지는 않음), 그러면GEFUNC다음으로 호출할 수 있음icntr[I_모드]이 작업을 요청하려면 DOHVPROD로 설정하세요.icntr[I_Eqno]방정식 번호와 배열을 보유합니다x첫 번째 변수(\(x\))의 값을 보유합니다.icntr[I_NVar]다음 위치와 벡터 \(v\)icntr[I_Nvar]위치.GEFUNC특정 지점 \(x\)에서 특정 슬롯 무료체험 방정식 \(f\)에 대해 \(d = \nabla^2 f(x)\, v\)를 평가하고 반환해야 합니다. \(d\)(그렇지 않은 경우에는파생 벡터)는 GAMS에 의해 0으로 초기화되었습니다.
\(\nabla^2 f(x)\, v\)는 종종 여러 벡터에 필요합니다v같은 지점에서x. 그러므로icntr[I_Newpt]다음의 변경 사항을 나타내는 데 사용됩니다.x일반적인 방법으로.
해당 모델을 참고하세요[EX1X]해당 Fortran 90 소스 파일과 함께 상수 및 2차 도함수를 모두 사용하는 방법을 보여줍니다.
디버깅
슬롯 무료체험 방정식을 구현하면 순수 GAMS 모델뿐만 아니라 GAMS가 보호할 수 없는 수많은 새로운 잠재적 오류 원인이 발생합니다. 예를 들어 C 또는 FORTRAN 코드의 인수 목록이 올바르지 않거나 연결 프로세스에서 잘못된 슬롯 무료체험 모듈을 만들 수 있습니다. 이러한 유형의 오류가 있는 사용자를 돕기 위해 GAMS가 할 수 있는 일은 거의 없습니다. 예제를 주의 깊게 따르고 설정 호출 중에 유틸리티 루틴을 사용하여 디버그 메시지를 출력하는 것이 좋습니다.GEstat그리고GElog.
전체 설정이 정확하고 GAMS가 슬롯 무료체험 모듈과 적절한 통신을 설정할 수 있으면 함수 값과 파생 항목이 일치하지 않는 수치 오류가 여전히 있을 수 있습니다.
솔버 CONOPT는 기본적으로 다음을 호출합니다.함수 및 파생 디버거초기점에서 모델에 슬롯 무료체험 방정식이 있는 경우. 디버거는 함수가에 정의된 변수에만 의존하는지 확인합니다.희소성패턴을 가지며 수치 섭동으로 계산된 도함수는 슬롯 무료체험 모듈에서 계산한 도함수와 일치합니다. 오류가 발견되면 CONOPT는 적절한 메시지와 함께 즉시 중지됩니다. 예를 보려면 GAMS 테스트 라이브러리 모델을 참조하세요.[er1], [er2]및[er3], 다양한 유형의 오류를 보여줍니다. CONOPT를 NLP 솔버로 사용하는 경우 해당 오류 메시지가 나타납니다. 오류에 대한 설명은 C 또는 FORTRAN 소스 코드에서 찾을 수 있습니다.
여러 유형의 오류를 감지할 수 없음을 관찰하십시오. 슬롯 무료체험 모듈에서 계산되고에 정의되지 않은 위치에 반환되는 파생 상품입니다.희소성77504_77861