implset1.gms : 암시적 집합 정의 테스트

설명

슬롯 25.2에서는 "암시적 집합 정의"라는 새로운 기능을 도입했습니다.
(또는: 도메인 정의 기호 선언)".
여기서는 예상되는 동작을 테스트합니다.

기고자: Lutz Westermann, 2018년 10월

소형 모델 유형 :슬롯


카테고리 : 슬롯 테스트 라이브러리


메인 파일 : implset1.gms

$title '암시적 집합 정의 테스트' (IMPLSET1,SEQ=788)

$onText
슬롯 25.2에서는 '암시적 집합 정의'라는 새로운 기능을 도입했습니다.
(또는: 도메인 정의 기호 선언)".
여기서는 예상되는 동작을 테스트합니다.

기고자: Lutz Westermann, 2018년 10월
$offText

* 문서의 간단한 예부터 시작하세요.
$onEcho > test.gms
세트
   i(*) '통조림 공장'
   j(*) '시장';

테이블 d(i<,j<) '거리(천 마일)'
              뉴욕 시카고 토피카
   시애틀 2.5 1.7 1.8
   샌디에고 2.5 1.8 1.4;

별칭(u,*);
세트 iWant / 시애틀, 샌디에고 /
    jWant / 뉴욕, 시카고, 토피카 /
    아이테스트(u)
    jTest(u);

iTest(u) = iWant(u) xor i(u);
중단$card(iTest) iTest;

jTest(u) = jWant(u) xor j(u);
중단$카드(jTest) jTest;
$offEcho

$call 슬롯 test.gms lo=%슬롯lo% gdx d
$ifE errorLevel<>0 $abort %system.line% 라인의 문제

* 하나의 세트를 정의하는 여러 기호를 사용하는 문서의 또 다른 예
$onEcho > test.gms
세트
   음식(*)
   과일(음식<) / 사과, 오렌지 /
$onMulti
   야채(음식<) / 당근, 콜리플라워 /
   고기(음식<) / 쇠고기, 돼지고기 /;

별칭(u,*);
세트음식원함 / 사과, 오렌지, 당근, 콜리플라워, 쇠고기, 돼지고기 /
    foodTest(u);

foodTest(u) = foodWant(u) xor food(u);
중단$카드(foodTest) foodTest;
$offEcho

$call 슬롯 test.gms lo=%슬롯lo%
$ifE errorLevel<>0 $abort %system.line% 라인의 문제

* 이전 예와 유사하지만 $onMultiR을 사용하면 마지막 정의만 유지합니다.
$onEcho > test.gms
세트
   음식(*)
   과일(음식<) / 사과, 오렌지 /
$onMultiR
   야채(음식<) / 당근, 콜리플라워 /
   고기(음식<) / 쇠고기, 돼지고기 /;

별칭(u,*);
세트음식원함 / 쇠고기, 돼지고기 /
    foodTest(u);

foodTest(u) = foodWant(u) xor food(u);
중단$카드(foodTest) foodTest;
$offEcho

$call 슬롯 test.gms lo=%슬롯lo%
$ifE errorLevel<>0 $abort %system.line% 라인의 문제

* onMulti를 사용하면 암시적으로 정의된 세트를 미리 채울 수도 있습니다.
$onEcho > test.gms
세트
   음식(*) / 사과, 오렌지 /
$onMulti
   야채(음식<) / 당근, 콜리플라워 /
   고기(음식<) / 쇠고기, 돼지고기 /;

별칭(u,*);
세트음식원함 / 사과, 오렌지, 당근, 콜리플라워, 쇠고기, 돼지고기 /
    foodTest(u);

foodTest(u) = foodWant(u) xor food(u);
중단$카드(foodTest) foodTest;
$offEcho

$call 슬롯 test.gms lo=%슬롯lo%
$ifE errorLevel<>0 $abort %system.line% 라인의 문제

* 집합은 암시적으로 정의된 후에도 비어 있을 수 있지만 이 경우에도 할당되어야 합니다.
$onEcho > test.gms
세트
   나;

매개변수
   p(i<) / i1 0 /;

디스플레이 i;
$offEcho

$call 슬롯 test.gms lo=%슬롯lo%
$ifE errorLevel<>0 $abort %system.line% 라인의 문제

* $load를 사용한 간단한 예
$onEcho > test.gms
세트
   i(*) '통조림 공장'
   j(*) '시장';

매개변수 d(i<,j<) '거리(천 마일)';

$gdxIn d.gdx
$로드 d

별칭(u,*);
세트 iWant / 시애틀, 샌디에고 /
    jWant / 뉴욕, 시카고, 토피카 /
    아이테스트(u)
    jTest(u);

iTest(u) = iWant(u) xor i(u);
중단$card(iTest) iTest;

jTest(u) = jWant(u) xor j(u);
중단$카드(jTest) jTest;
$offEcho

$call 슬롯 test.gms lo=%슬롯lo%
$ifE errorLevel<>0 $abort %system.line% 라인의 문제

* 필터링된 로딩을 실행하는 $load의 예
$onEcho > test.gms
ab / a1.b1 설정
         a2.b1
               a3.b2 /;
$gdxOut ab.gdx
$unLoad ab
$gdx아웃

/a1,a2/, b(*), c(*)를 설정합니다.
    xx(a,b<);

$gdxIn ab.gdx
$로드xx=abc<ab.dim2

별칭(u,*);
bWant / b1 / 설정
    c원하다 / b1, b2 /
    b테스트(u)
    c테스트(u);

bTest(u) = bWant(u) xor b(u);
중단$카드(bTest) bTest;

cTest(u) = cWant(u) xor c(u);
중단$카드(cTest) cTest;
$offEcho

$call 슬롯 test.gms lo=%슬롯lo%
$ifE errorLevel<>0 $abort %system.line% 라인의 문제

* 변수에서도 작동
$onEcho > test.gms
세트
   i(*) '통조림 공장'
   j(*) '시장';

변수 테이블 d(i<,j<)
                   내가
Seattle.new-york 300
시애틀.시카고 400
시애틀.토피카 500
샌디에고.시카고 600 ;

별칭(u,*);
세트 iWant / 시애틀, 샌디에고 /
    jWant / 뉴욕, 시카고, 토피카 /
    아이테스트(u)
    jTest(u);

iTest(u) = iWant(u) xor i(u);
중단$card(iTest) iTest;

jTest(u) = jWant(u) xor j(u);
중단$카드(jTest) jTest;
$offEcho

$call 슬롯 test.gms lo=%슬롯lo%
$ifE errorLevel<>0 $abort %system.line% 라인의 문제

$log --- Python 라이브러리 %sysEnv.GMSPYTHONLIB% 사용

* EmbeddedCode를 사용한 간단한 예
$onEcho > test.gms
세트
   i(*) '통조림 공장'
   j(*) '시장';

매개변수 d(i<,j<) '거리(천 마일)';

$onEmbeddedCode 파이썬:
슬롯set('d',[('시애틀', '뉴욕',2.5),('시애틀', '시카고',1.7),('시애틀', '토피카',1.8),
              ('샌디에고','뉴욕',2.5),('샌디에고','시카고',1.8),('샌디에고','토피카',1.4)])
$offEmbeddedCoded

별칭(u,*);
세트 iWant / 시애틀, 샌디에고 /
    jWant / 뉴욕, 시카고, 토피카 /
    아이테스트(u)
    jTest(u);

iTest(u) = iWant(u) xor i(u);
중단$card(iTest) iTest;

jTest(u) = jWant(u) xor j(u);
중단$카드(jTest) jTest;
$offEcho

$call 슬롯 test.gms lo=%슬롯lo%
$ifE errorLevel<>0 $abort %system.line% 라인의 문제

* 필터링된 로딩을 실행하는 임베디드 코드의 예
$onEcho > test.gms
a /a1,a2/, b(*), c(*)를 설정합니다.
xx(a,b<)를 설정합니다.

$onEmbeddedCode 파이썬:
슬롯set('xx',[('a1','b1'),('a2','b1'),('a3','b2')])
$offEmbeddedCode xx c<xx.dim2

별칭(u,*);
bWant / b1 / 설정
    c원하다 / b1, b2 /
    b테스트(u)
    c테스트(u);

bTest(u) = bWant(u) xor b(u);
중단$카드(bTest) bTest;

cTest(u) = cWant(u) xor c(u);
중단$카드(cTest) cTest;
$offEcho

$call 슬롯 test.gms lo=%슬롯lo%
$ifE errorLevel<>0 $abort %system.line% 라인의 문제

* EmbeddedCode를 사용한 간단한 예 - 실행 시에는 실패할 것으로 예상됩니다.
$onEcho > test.gms
세트
   i(*) '통조림 공장'
   j(*) '시장';

매개변수 d(i<,j<) '거리(천 마일)';

임베디드 코드 파이썬:
슬롯set('d',[('시애틀', '뉴욕',2.5),('시애틀', '시카고',1.7),('시애틀', '토피카',1.8),
              ('샌디에고','뉴욕',2.5),('샌디에고','시카고',1.8),('샌디에고','토피카',1.4)])
endEmbeddedcode d

별칭(u,*);
세트 iWant / 시애틀, 샌디에고 /
    jWant / 뉴욕, 시카고, 토피카 /
    아이테스트(u)
    jTest(u);

iTest(u) = iWant(u) xor i(u);
중단$card(iTest) iTest;

jTest(u) = jWant(u) xor j(u);
중단$카드(jTest) jTest;
$offEcho

$call 슬롯 test.gms lo=%슬롯lo%
$ifE errorLevel=0 $abort %system.line% 라인의 문제

$label noEmbeddedPython

* Michael이 보고한 일시적인 문제
$onEcho > test.gms
p, xs, ys를 설정합니다.
테이블 탭(p<,xs<,ys<) 
        y1 y2 y3 y4 y5
p1.x1 1 1 1 1 1   
;
매개변수 pend(p) /p1 2/;
$offEcho

$call 슬롯 test.gms lo=%슬롯lo%
$ifE errorLevel<>0 $abort %system.line% 라인의 문제

* 기존 데이터의 시작 부분에 병합하면 데이터 순서가 잘못되어서는 안 됩니다(GDX로 언로드할 때 오류가 발생함). #4340을 참조하세요.
$onEcho > test.gms
별칭(u,*);
t1 / 2021*2024/ 설정;
t2 / 2022 / 설정;
$onMulti
t(t2<) / 2021 / 설정
    티투원트 / 2021, 2022 /
    t2테스트(u);

t2Test(u) = t2Want(u) xor t2(u);
중단$카드(t2Test) t2Test;

Execute_unload 'all.gdx';
$offEcho

$call 슬롯 test.gms lo=%슬롯lo%
$ifE errorLevel<>0 $abort %system.line% 라인의 문제

* 첫 번째 UEL을 사용하여 기존 데이터를 시작하기 위해 첫 번째 UEL을 병합하면 UEL이 중복되어서는 안 됩니다(GDX로 언로드할 때 오류가 발생함). #3657 참조
$onEcho > test.gms
세트
   나는 '통조림 식물' / 시애틀, kk /;

$onMulti
별칭(u,*);
매개변수
   a(i<) '경우에 따라 식물 i의 용량'
        / 시애틀 350/;

iWant 세트 / 시애틀, kk /
    iTest(u);

iTest(u) = iWant(u) xor i(u);
중단$card(iTest) iTest;

Execute_unload 'all.gdx';
$offEcho

$call 슬롯 test.gms lo=%슬롯lo%
$ifE errorLevel<>0 $abort %system.line% 라인의 문제

* 도메인으로 여러 용도로 사용되는 다중 암시적 세트 정의는 해당 도메인 목록이 중간에 업데이트되는지 확인해야 합니다. #5014를 참조하세요.
$onEcho > test.gms
sSuper를 설정하십시오.
x_set(sSuper<) /1*2/ 설정;
매개변수 x(sSuper) /1 1
                     2 2/;
$onMulti
y_set(sSuper<) /1*3/ 설정;
매개변수 y(sSuper) /1 1
                     2 2
                     3 3/;
$offEcho

$call 슬롯 test.gms lo=%슬롯lo%
$ifE errorLevel<>0 $abort %system.line% 라인의 문제

* 소스가 1차원 세트인 경우 요소 텍스트도 복사해야 합니다. 마지막 텍스트가 중복됩니다.
$onEcho > test.gms
세트
   에프
   과일(f<) / 사과 레드
                  오렌지 오렌지 /
$onMulti
   과일(f<) / 당근 오렌지
                  애플 그린 /;

파일 FX / 'fruit.txt' /
     fy / 'f.txt' /;

루프(f,
  fx f.te(f)를 넣어 /;
  fyfruit.te(f)를 넣으세요 /;
)
$offEcho

$call.checkErrorLevel 슬롯 test.gms lo=%슬롯lo%
$call.checkErrorLevel diff f.txt 과일.txt

* 다음 테스트에서는 오류가 예상됩니다.
* 재정의는 기본적으로 잘못되어야 함
$onEcho > test.gms
세트
   음식(*) / 사과, 오렌지 /
   야채(음식<) / 당근, 콜리플라워 /
   고기(음식<) / 쇠고기, 돼지고기 /;
$offEcho

$call 슬롯 test.gms lo=%슬롯lo%
$ifE errorLevel=0 $abort %system.line% 라인에 예상된 문제가 있습니다.

* 도메인 집합의 암시적 정의는 유니버스에 적용할 수 없습니다.
$onEcho > test.gms
별칭(음식,*);
세트
   고기(음식<) / 쇠고기, 돼지고기 /;
$offEcho

$call 슬롯 test.gms lo=%슬롯lo%
$ifE errorLevel=0 $abort %system.line% 라인에 예상된 문제가 있습니다.

* 도메인이 기호와 동일한 경우 도메인 집합의 암시적 정의를 적용할 수 없습니다.
$onEcho > test.gms
세트
   고기(고기<) / 쇠고기, 돼지고기 /;
$offEcho

$call 슬롯 test.gms lo=%슬롯lo%
$ifE errorLevel=0 $abort %system.line% 라인에 예상된 문제가 있습니다.

* 도메인이 하위 집합인 경우 도메인 집합의 암시적 정의를 적용할 수 없습니다.
$onEcho > test.gms
세트
   너
   음식(유)
   고기(음식<) / 쇠고기, 돼지고기 /;
$offEcho

$call 슬롯 test.gms lo=%슬롯lo%
$ifE errorLevel=0 $abort %system.line% 라인에 예상된 문제가 있습니다.

* 두 개의 불일치 선언을 허용하지 마십시오
$onEcho > test.gms
세트
   음식
   고기(음식)
   고기(음식<);
$offEcho

$call 슬롯 test.gms lo=%슬롯lo%
$ifE errorLevel=0 $abort %system.line% 라인에서 예상되는 문제