자세한 GAMS 출시 노트 22.6

표현식 평가가 포함된 슬롯 나라e 문

슬롯 나라 문은 상수 표현식 평가를 허용하도록 향상되었습니다. 기본 슬롯 나라 문의 특징에 맞게 두 가지 형식을 도입했습니다.

슬롯 나라e expr1 == expr2 true if (expr1-expr2)/(1+abs(expr2)) < 1e-12
슬롯 나라e expr expr1 <> 0인 경우 true

표현식은 표준 GAMS 구문을 따르며 아래에 더 자세히 설명되어 있습니다. .==. 반올림 오류가 예상되는 경우 양식이 편리합니다. 예를 들어 다음과 같이 쓸 수 있습니다.

슬롯 나라e log2(16)^2 == 16 (true문)

글을 쓰는 것보다 더 편리합니다

슬롯 나라e NOT round(log2(16)^2-16,10) (참 진술)
슬롯 나라e round(log2(16)^2,10)=16 (참 진술)

슬롯 나라then/elseif/else/endif 문

슬롯 나라 문의 새로운 변형이 도입되었습니다. 이는 일반적인 구조를 따르며 적절한 중첩을 허용합니다. 조건 구문은 슬롯 나라 문의 구문과 동일합니다.슬롯 나라then그리고$elseif슬롯 나라 문과 동일한 수정자가 있습니다. 즉, 대소문자를 구분하지 않는 비교를 위한 I와 상수 표현식 평가를 위한 E입니다. 아래 예에서는 해당 문의 모든 블록을 실행합니다.

$maxgoto 10 $set x a
$라벨 2
슬롯 나라then %x% == a $set x 'c' $log 슬롯 나라then with x=%x%
$elseif %x% == b $set x 'k' $log $elseif 1 with x=%x%
$elseif %x% == c $set x 'b' $log $elseif 2 with x=%x%
$else $set x 'e' $log $else(x=%x%)
$endif 슬롯 나라 NOT %x% == e $goto two

$평가 x 1
$라벨 3
'x=%x%'를 표시;
슬롯 나라then %x% == 1 $eval x %x%+1
$elseif %x% == 2 $eval x %x%+1
$elseif %x% == 3 $eval x %x%+1
$elseif %x% == 4 $eval x %x%+1
$else $set x 완료
$endif 슬롯 나라 NOT %x% == 완료 $goto three

이것은 약간 인위적이지만 좀 더 미묘한 기능을 보여줍니다. $goto 문을 통해 반복 구성을 사용할 때마다 우리는 무한 루프의 가능성으로부터 자신을 보호해야 합니다. 라벨로 다시 이동하는 횟수가 계산되며 한도에 도달하면 GAMS에서 오류가 발생합니다. %string% 참조는 한 번만 대체된다는 점에 유의하는 것이 중요합니다.

길고 중첩된 ithen/else 구조는 디버그하기 어려울 수 있습니다. 시작의 태그 지정,슬롯 나라then그리고 마지막은$endif도움이 될 수 있어요. 예를 들어 다음 줄은 태그가 일치하지 않기 때문에 실패합니다.

슬롯 나라then.one x == x
$endif.one

슬롯 나라 문과 마찬가지로, 다음 줄에 있는 문은슬롯 나라then스타일 문은 선택사항입니다. 다음 두 문은 동일한 결과를 제공합니다.

슬롯 나라theni %type% == 낮음 $include abc  
$elseifi %type% == med $include efg
$else $include xyz
$endif

슬롯 나라theni %type% == 낮음 
$include abc  
$elsefi %type% == 의료 
$include efg
$else                  
$include xyz
$endif

직접 다음 문장은 a슬롯 나라then, $elseif또는$else같은 줄에는 다른 달러 제어문의 시퀀스가 있거나 적절한 GAMS 구문이 포함될 수 있습니다. 다음의 진술은 직접적으로 a$endif다른 달러 제어문만 포함할 수 있습니다.

슬롯 나라then.two c==c는 '태그 2에 대해 true'를 표시합니다.
슬롯 나라then.3 a==a $log 태그 3의 경우 true
'태그 3에 대한 then 절'을 표시합니다.
슬롯 나라then.four x==x는 '태그 4에 대해 true'를 표시합니다. 
태그 4에 대해 $log true
$else
'태그 4에 대한 else 절'을 표시합니다.
$endif.four $log endif 4
$endif.3 $log endif 3
$endif.two $log endif 2

이렇게 하면 다음과 같은 GAMS 프로그램이 생성됩니다.

1 '태그 2의 경우 true'를 표시합니다.
3 '태그 3에 대한 then 절'을 표시합니다.
4는 '태그 4에 대해 true'를 표시합니다.

다음 로그 출력 포함

--- 컴파일 시작 중
태그 3의 경우 true
태그 4의 경우 true
엔디프 4
엔디프 3
endif 2

$eval $evallocal $evalglobal

이 세 가지 새로운 달러 제어 옵션은 $set, $setlocal 및 $setglobal과 유사합니다. 이러한 명령문은 %var% 참조로 대체될 문자열이라는 이름의 '환경 변수'에 값을 할당하는 데 사용됩니다.$평가옵션은 인수를 상수 표현식으로 해석하고(자세한 내용은 아래 참조) 결과를 문자열로 인코딩합니다. 예를 들면:

$설정되지 않은 경우 d $eval d 5
$eval h '24*%d%' $eval 그는 '0' $eval dd '0'
d일 / day1*day%d%/로 설정
     h 시간 / 시간1*시간%h% /
     dh(d,h) /
$label more $eval dd '%dd%+1' $eval hs '%he%+1' $eval he %he%+24
        일%dd%.시간%hs%*시간%he%
슬롯 나라e %dd%<%d% $goto 더 보기
             /;

아래 확장된 입력 소스 코드를 생성합니다:

3 세트 d일 / day1*day5/
   4시간 시간 / 시간1*시간120 /
   5dh(d,h) /
   7일1.시간1*시간24
  10일2.시간25*시간48
  13일3.시간49*시간72
  16일4.시간73*시간96
  19일5.시간97*시간120
  21 /;

지속적인 평가를 위한 구문

데이터 문과 $conditions에서 상수 표현식 사용의 구문은 GAMS 구문을 따르지만 아래에 요약된 것처럼 스칼라 값과 함수의 하위 집합으로 제한됩니다:

데이터 문에서 사용될 때 상수 표현식은 대괄호 [ ] 또는 중괄호 또는 중괄호 쌍으로 묶어야 합니다. 해당 괄호 안의 공백은 자유롭게 사용할 수 있습니다. $eval 또는 슬롯 나라 문과 같은 달러 제어 옵션에 사용될 때 대괄호는 필요하지 않지만 공백을 포함하거나 같은 줄에 추가 $옵션을 계속 사용하려면 표현식을 따옴표(단일 또는 이중)로 묶어야 할 수도 있습니다. 예를 들어, $eval 다음에 또 다른 $statement를 사용하는 경우:

$평가 x 3 / 5 * 파이     
$eval y "3/5*pi" $eval z 파이 / 2  
$eval a ' exp(1) / pi ' $set b 여기에는 무엇이든 들어갑니다.
$쇼
.
레벨 SetVal 유형 텍스트
-------------------------------
    0 x 범위 1.88495559215388
    0년 범위 1.88495559215388
    0 z 범위 1.5707963267949
    0 범위 지정 0.865255979432265
    0 b 여기에는 범위가 지정된 모든 항목이 포함됩니다.

다른 달러 제어문과 마찬가지로 따옴표가 없으면 나머지 줄 전체가 하나의 인수로 해석됩니다.

슬롯 나라e그리고슬롯 나라thene/$elseife문에는 Windows bat 및 cmd 스크립팅 규칙을 모방하여 상속된 관련 문제가 있습니다. 상수 표현식에 공백이 포함된 경우 아래와 같이 따옴표로 묶어야 합니다.

슬롯 나라e (2+3)>=(2+2) 표시 '확인, 공백 없음';
슬롯 나라e ' (2 + 3) >= (2 + 2) ' display '이제 따옴표가 필요합니다';

마지막으로 다음은 몇 가지 데이터 예시입니다:

스칼라 x PI 절반 / pi/2 /, e 유명한 숫자 / [ exp( 1 ) ] /;
매개변수 y 데모 / USA.(높음,낮음) [1/3], USA.medium 1/4 /;

추가 라이센스 정보

라이센스 프로세스에 대한 정보는 이제 컴파일 및 실행 시간에 제공됩니다.

컴파일 시

두 개의 새로운 시스템 환경 변수라이센스상태그리고LicenseStatusText기타 라이센스 관련 변수를 보완합니다. 또한 라이센스 수준 및 상태를 검색하는 두 가지 기능이 추가되었습니다. 이러한 변수의 사용은 업데이트된 라이브러리 모델 .licememo에 설명되어 있습니다. 다음은 추출된 내용입니다.

$set 파일 이름 %gams.license%
슬롯 나라 '%filename' == '' $set 파일 이름 %gams.sysdir%gamslice.txt
if(%system.licensestatus%,
   '**** 오류 메시지: %system.licensestatustext%'를 입력하세요.
     / '**** 라이센스 파일 : %filename%'
     / '**** 시스템이 데모 모드로 다운그레이드되었습니다.'// );

잘못된 라이센스로 호출하면 보고서에 다음이 포함될 수 있습니다:

**** 오류 메시지: 지정된 라이센스 파일을 열 수 없습니다.
**** 라이센스 파일 : 쓰레기
**** 시스템이 데모 모드로 다운그레이드되었습니다.

변수system.licensestaus라이센스 프로세스에서 오류가 발생하지 않은 경우 0을 반환합니다. 변수system.licensestatustext라이센스 실패에 대한 각각의 설명이 포함되어 있습니다. 위의 예는 컴파일 시간 문자열 대체를 사용하며 사전 컴파일된 작업 파일을 실행할 때 업데이트되지 않습니다.

런타임에

두 가지 새로운 기능,라이센스레벨그리고라이센스상태, 런타임에 다음 정보를 제공하세요.

Put 인수의 <name>.TN 속성

옵션 파일이나 기타 정보 파일의 일부 특수 기능을 사용하려면 변수나 방정식과 같은 색인 식별자의 완전한 확장 참조를 작성해야 합니다. 예를 들어, 이제 CPLEX 표시기 변수에 대한 옵션을 더 간결하게 작성할 수 있습니다. 예를 들어 다음과 같이 쓸 수 없습니다.

루프(lt(j,jj),
   put / 'indic' seq.tn(j,jj) '$' y.tn(j,jj) 예
       / 'indic' seq.tn(jj,j) '$' y.tn(j,jj) NO );

이것은 다음을 생성합니다

인딕 시퀀스('A','B')$y('A','B') 예
indic seq('B','A')$y('A','B') 아니요
인도어 seq('A','C')$y('A','C') 예
indic seq('C','A')$y('A','C') 아니요
인도어 seq('B','C')$y('B','C') 예
인도어 seq('C','B')$y('B','C') NO

더 컴팩트한 GAMS 코드 외에도 컴파일 타임에 완전한 구문 검사를 제공합니다.

세트 제어 기능 강화

제어 세트에 대한 추가 정보를 추출하기 위해 새로운 구문이 추가되었습니다. ord(i) 연산자와 유사하지만 점 표기법을 사용합니다. 새로운 기능은 다음과 같습니다:

다음 예는 이러한 새로운 기능 중 일부를 보여줍니다.

set i / '-inf',1,12,24,'13.14',inf /; 매개변수 보고서;
보고서(i,'값') = i.val;
보고서(i,'길이') = i.len;
Report(i,'offset') = i.off;
보고서(i,'위치') = i.pos;
보고서 표시;

디스플레이에 다음이 표시됩니다.

---- 6 매개변수 보고서  

            값 길이 오프셋 위치

-inf -INF 4.000 1.000
1 1.000 1.000 1.000 2.000
12 12.000 2.000 2.000 3.000
24 24.000 2.000 3.000 4.000
13.14 13.140 5.000 4.000 5.000
inf +INF 3.000 5.000 6.000