cagdxrw.gms : 테스트 연결 에이전트 GDXReader/Writer

설명

이 테스트는 Connect 에이전트 "GDXReader/Writer"의 정확성을 확인합니다.

기고자: Michael Bussieck, 2022년 3월

소형 모델 유형 :메가 슬롯


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


메인 파일 : cagdxrw.gms

$title '테스트 연결 에이전트 GDXReader/Writer' (CAGDXRW,SEQ=891)

$onText
이 테스트는 Connect 에이전트 "GDXReader/Writer"의 정확성을 확인합니다.

기고자: Michael Bussieck, 2022년 3월
$offText

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

$onEcho > t.gms
innew(*) 통조림 공장 설정 /
'시애틀',
'샌디에고' /;

j(*) 시장 설정 /
'뉴욕',
'시카고',
'토피카'/;

경우에 따라 플랜트 i의 매개변수 anew(inew) 용량 /
'시애틀'350,
'샌디에고' 600 /;

매개변수 b(j) 경우의 시장 j 수요 /
'뉴욕' 325,
'시카고'300,
'토피카' 275 /;

매개변수 d(inew,j) 거리(천 마일) /
'시애틀'.'뉴욕' 2.5,
'시애틀'.'시카고' 1.7,
'시애틀'.'토피카' 1.8,
'샌디에고'.'뉴욕' 2.5,
'샌디에고'.'시카고' 1.8,
'샌디에고'.'토피카' 1.4 /;

매개변수 e(*) 비어 있음;

스칼라 f 운임(1,000마일당 케이스당 달러) / 90 /;

케이스의 가변 xnew(inew,j) 배송 수량 /
'시애틀'.'뉴욕'.L 50,
'시애틀'.'시카고'.L 300,
'시애틀'.'토피카'.M 0.036,
'샌디에고'.'뉴욕'.L 275,
'샌디에고'.'시카고'.M 0.009,
'샌디에고'.'토피카'.L 275 /;

방정식 Supplynew(inew)는 공장 i의 공급 한도를 관찰합니다. /
'시애틀'.L 350,
'시애틀'.M Eps,
'시애틀'.LO -Inf,
'시애틀'.UP 350,
'샌디에고'.L 550,
'샌디에고'.LO -Inf,
'샌디에고'.UP 600 /;
$offEcho
$call.checkErrorLevel 게임 t.gms lo=%메가 슬롯lo% a=c gdx=ctgdxref.gdx

$onEchoV > t.gms
세트
   i(*) '통조림 공장'
   j(*) '시장';
매개변수
   a(i) '경우에 따라 식물 i의 용량'
   b(j) '경우에 따라 시장 j의 수요'
   d(i,j) '거리(천 마일)'
   e(*) '비어 있음';
스칼라
   f '1,000마일당 케이스당 운임(달러)';
변수
   x(i,j) '케이스의 배송 수량';
방정식
   Supply(i) '공장 i의 공급 제한을 준수합니다';  

$ifThenI %MODE%==gdxin
$gdxIn ctgdxref
$load i=inew j a=anew b d f x=xnew 공급=supplynew
$elseIf %MODE%==ecreadall
$onEmbeddedCode 연결:
- GDX리더:
    파일:ctgdxref.gdx
- 메가 슬롯작성기:
    기호:
      - 이름 : 이뉴
        새로운이름: i
      - 이름 : j
      - 이름 : 새로
        새 이름: a
      - 이름 : b
      - 이름 : d
      - 이름 : e
      - 이름 : f
      - 이름 : xnew
        새 이름: x
      - 이름 : Supplynew
        새로운 이름: 공급
- GDXWriter:
    파일:ctgdxout1.gdx
    기호:
      - 이름 : 이뉴
        새로운이름: i
      - 이름 : j
      - 이름 : 새로
        새 이름: a
      - 이름 : b
      - 이름 : d
      - 이름 : e
      - 이름 : f
      - 이름 : xnew
        새 이름: x
      - 이름 : Supplynew
        새로운 이름: 공급
$offEmbeddedCode
$else
$onEmbeddedCode 연결:
- GDX리더:
    파일:ctgdxref.gdx
    기호:
      - 이름 : 이뉴
        새로운이름: i
      - 이름 : j
      - 이름 : 새로
        새 이름: a
      - 이름 : b
      - 이름 : d
      - 이름 : e
      - 이름 : f
      - 이름 : xnew
        새 이름: x
      - 이름 : Supplynew
        새로운 이름: 공급
- 메가 슬롯작성기:
    기호: 모두
- GDXWriter:
    파일:ctgdxout2.gdx
$offEmbeddedCode    
$endIf
$offEcho
$call.checkErrorLevel 게임 t.gms lo=%메가 슬롯lo% --MODE=gdxin gdx=1.gdx
$call.checkErrorLevel 게임 t.gms lo=%메가 슬롯lo% --MODE=ecreadall gdx=2.gdx
$call.checkErrorLevel 메가 슬롯 t.gms lo=%메가 슬롯lo% --MODE=ecreadsym gdx=3.gdx

$call.checkErrorLevel gdxdiff ctgdxout1.gdx ctgdxout2.gdx > %system.NullFile%
$call.checkErrorLevel gdxdiff ctgdxout1.gdx 1.gdx > %system.NullFile%
$call.checkErrorLevel gdxdiff ctgdxout1.gdx 2.gdx > %system.NullFile%
$call.checkErrorLevel gdxdiff ctgdxout1.gdx 3.gdx > %system.NullFile%
$call.checkErrorLevel gdxdump ctgdxout1.gdx > ctgdxout1.txt
$call.checkErrorLevel gdxdump ctgdxout2.gdx > ctgdxout2.txt
$call.checkErrorLevel gdxdump 1.gdx > 1.txt
$call.checkErrorLevel gdxdump 2.gdx > 2.txt
$call.checkErrorLevel gdxdump 3.gdx > 3.txt
$call.checkErrorLevel diff ctgdxout1.txt ctgdxout2.txt > %system.NullFile%
$call.checkErrorLevel diff ctgdxout1.txt 1.txt > %system.NullFile%
$call.checkErrorLevel diff ctgdxout1.txt 2.txt > %system.NullFile%
$call.checkErrorLevel diff ctgdxout1.txt 3.txt > %system.NullFile%

$onEchoV > t.gms
i /i0*i2/를 설정합니다. 매개변수 p(i);
$onEmbeddedCode 연결:
- Python코드:
    코드: |
      메가 슬롯transfer를 gt로 가져오기
      gt.Parameter(connect.container, 'p', ['*'], records=[['i0',1],['i1',2],['i1',3],['i2',4]])
- GDXWriter:
    파일: dr.gdx
    기호:
      - 이름 : p
        중복 레코드: %DR%
- Python코드:
    코드: |
      데이터 = 연결.컨테이너['p'].records.values.tolist()
      예상 = [['i0',1],['i1',2],['i1',3],['i2',4]]
      데이터 != 예상되는 경우:
          raise Exception("중복 제거 후 데이터가 일치하지 않습니다.")
$offEmbeddedCode
$ifThenE.NotFail은(%EXPECTED%,'fail')과 동일하지 않습니다.
$gdxIn dr.gdx
$로드 p
중단$(p('i1')<>%EXPECTED%) p, 'p(i1) %EXPECTED%' 아님
$endIf.NotFail
$offEcho
$call.checkErrorLevel 메가 슬롯 t.gms lo=%메가 슬롯lo% --DR=first --EXPECTED=2
$call.checkErrorLevel 게임 t.gms lo=%메가 슬롯lo% --DR=마지막 --EXPECTED=3
$call.checkErrorLevel 게임 t.gms lo=%메가 슬롯lo% --DR=없음 --EXPECTED=0
$call 메가 슬롯 t.gms lo=%메가 슬롯lo% --DR=all --EXPECTED=실패
$ifE errorlevel=0 $abort는 GDXWriter가 실패할 것으로 예상합니다.

$onEchoV > t.gms
i /i0*i2/를 설정합니다. 매개변수 p(i), q(i);
$onEmbeddedCode 연결:
- Python코드:
    코드: |
      메가 슬롯transfer를 gt로 가져오기
      gt.Parameter(connect.container, 'p', ['*'], records=[['i0',1],['i1',2],['i1',3],['i2',4]])
      gt.Parameter(connect.container, 'q', ['*'], records=[['i0',5],['i1',6],['i1',7],['i2',8]])
- GDXWriter:
    파일: dr.gdx
    중복 레코드: %DR%
- Python코드:
    코드: |
      data_1 = 연결.컨테이너['p'].records.values.tolist()
      data_2 = connect.container['q'].records.values.tolist()
      예상_1 = [['i0',1],['i1',2],['i1',3],['i2',4]]
      예상_2 = [['i0',5],['i1',6],['i1',7],['i2',8]]
      data_1 != 예상_1인 경우:
          raise Exception("기호 p에서 중복을 제거한 후 데이터가 일관성이 없습니다.")
      data_2 != 예상_2인 경우:
          raise Exception("기호 q에서 중복을 제거한 후 데이터가 일관성이 없습니다.")
$offEmbeddedCode
$ifThenE.NotFail은(%EXPECTED1%,'fail')과 동일하지 않습니다.
$gdxIn dr.gdx
$로드 p, q
중단$(p('i1')<>%EXPECTED1%) p, 'p(i1) %EXPECTED1%' 아님
중단$(q('i1')<>%EXPECTED2%) q, 'q(i1)은 %EXPECTED2%가 아님'
$endIf.NotFail
$offEcho
$call.checkErrorLevel 메가 슬롯 t.gms lo=%메가 슬롯lo% --DR=first --EXPECTED1=2 --EXPECTED2=6
$call.checkErrorLevel 게임 t.gms lo=%메가 슬롯lo% --DR=마지막 --EXPECTED1=3 --EXPECTED2=7
$call.checkErrorLevel 게임 t.gms lo=%메가 슬롯lo% --DR=없음 --EXPECTED1=0 --EXPECTED2=0
$call 메가 슬롯 t.gms lo=%메가 슬롯lo% --DR=모두 --EXPECTED1=실패 --EXPECTED2=실패
$ifE errorlevel=0 $abort는 GAMSWriter가 실패할 것으로 예상합니다.

$onEchoV > t.gms
iii /i0*i2/를 설정합니다.
$gdx아웃 xxx.gdx
$unLoad
$gdx아웃
$onEmbeddedCode 연결:
- GDX리더:
    파일: xxx.gdx
    기호:
      - 이름: %RNAME%
- GDXWriter:
    파일: yyy.gdx
    기호:
      - 이름: %WNAME%
        신규이름: KKK
$offEmbeddedCode
$offEcho
$call.checkErrorLevel 게임 t.gms lo=%메가 슬롯lo% --RNAME=iii --WNAME=iii
$call.checkErrorLevel 게임 t.gms lo=%메가 슬롯lo% --RNAME=III --WNAME=III
$call.checkErrorLevel 게임 t.gms lo=%메가 슬롯lo% --RNAME=iii --WNAME=III

i / i1*i3 / 설정;
j(*,i)를 설정합니다;
매개변수 d(i,*,i,*);
변수 x(i,i,*);
매개변수 t(i,*,i,*) / i1.tr.i3.ty 10 / ;

$gdxout cagdxr_empty_df
$언로드 i j d x t
$gdxout

*** 예상 오류 테스트 ***

$errorFree가 아닌 경우 $abort '오류'
$log 기존 기호 이름에 대한 예외를 발생시키는 newName 테스트
$onEmbeddedCode 연결:
- GDX리더:
   파일: cagdxr_empty_df.gdx
   기호:
    - 이름 : x
    - 이름 : 나
      새 이름: x
$offEmbeddedCode
$if errorFree $abort '오류 예상'
$clearErrors

$log 기존 기호 이름 읽기 테스트(특정 기호)
$onEmbeddedCode 연결:
- GDX리더:
   파일: cagdxr_empty_df.gdx
   기호:
    - 이름 : 나
    - 이름 : x
- GDX리더:
   파일: cagdxr_empty_df.gdx
   기호:
    - 이름 : 나
    - 이름 : x
$offEmbeddedCode
$if errorFree $abort '오류 예상'
$clearErrors

$log 기존 기호 이름 읽기 테스트(기호: 모두)
$onEmbeddedCode 연결:
- GDX리더:
   파일: cagdxr_empty_df.gdx
   기호: 모두
- GDX리더:
   파일: cagdxr_empty_df.gdx
   기호: 모두
$offEmbeddedCode
$if errorFree $abort '오류 예상'
$clearErrors

$log 예외를 발생시키기 위해 GDXReader의 기호 범위에 대한 잘못된 옵션을 테스트합니다.
$onEmbeddedCode 연결:
- GDX리더:
   파일: cagdxr_empty_df.gdx
   기호:
    - 이름 : 나
      inavlidOption: 유효하지 않음
$offEmbeddedCode
$if errorFree $abort '오류 예상'
$clearErrors

$log 예외를 발생시키기 위해 GDXWriter의 기호 범위에 대한 잘못된 옵션을 테스트합니다.
$onEmbeddedCode 연결:
- GDX리더:
   파일: cagdxr_empty_df.gdx
   기호:
    - 이름 : 나
- GDXWriter:
    파일:valid.gdx
    기호:
      - 이름 : 나
        유효하지 않은 옵션: 유효하지 않음
$offEmbeddedCode
$if errorFree $abort '오류 예상'
$clearErrors

*********************************************************

$log test GDXReader는 None 레코드 대신 빈 dataFrame을 생성합니다.
$log ### 세트로 테스트
$onEmbeddedCode 연결:
- GDX리더:
   파일: cagdxr_empty_df.gdx
   기호:
    - 이름 : j
- Python코드:
    코드: |
      데이터 = connect.container['j'].records
      예상_cols = ['uni', 'i', 'element_text']

      데이터가 None이거나 data.empty가 아닌 경우:
        raise Exception(">j<에 빈 DataFrame이 있을 것으로 예상됩니다.")

      if (data.columns != Expect_cols).any():
        raise Exception(">j<에 대해 예기치 않은 열이 있습니다.")
$offEmbeddedCode

$log ### 매개변수를 사용한 테스트
$onEmbeddedCode 연결:
- GDX리더:
   파일: cagdxr_empty_df.gdx
   기호:
    - 이름 : d
    - 이름 : t
- 필터:
    이름: t
    새로운 이름: t2
    라벨필터:
      - 차원: 1
        유지: ['x']
- Python코드:
    코드: |
      데이터 = connect.container['d'].records
      예상 = connect.container['t2'].records

      데이터가 None이거나 data.empty가 아닌 경우:
        raise Exception(">d<에 빈 DataFrame이 있을 것으로 예상됩니다.")

      if (data.columns != 예상.열).any():
        raise Exception(">d<에는 >t2<와 동일한 열이 있을 것으로 예상됩니다.")
$offEmbeddedCode

$log ### 변수를 사용한 테스트
$onEmbeddedCode 연결:
- GDX리더:
   파일: cagdxr_empty_df.gdx
   기호:
    - 이름 : x
- Python코드:
    코드: |
      데이터 = connect.container['x'].records
      예상_cols = ['i_0', 'i_1', 'uni_2', '수준', '한계', '하위', '상위', '규모']

      데이터가 None이거나 data.empty가 아닌 경우:
        raise Exception(">x<에 빈 DataFrame이 있을 것으로 예상됩니다.")

      if (data.columns != Expect_cols).any():
        raise Exception(">x<에 대한 예상치 못한 열입니다.")
$offEmbeddedCode

$log ### DuplicateRecords!=all인 경우 테스트 기호가 유효하지 않습니다(Connect 컨테이너의 copy.deepcopy()를 수행하는 경우 발생).
$onEmbeddedCode 연결:
- GDX리더:
    파일:ctgdxref.gdx
- GDXWriter:
    파일: out.gdx
    중복 레코드: 첫 번째

    기호: 모두
$offEmbeddedCode