설명
슬롯 임베디드 코드 기능을 사용하여 슬롯core.numpy Python API 원시 모드 테스트 기고자: Clemens Westphal, 2020년 7월
소형 모델 유형 :슬롯
카테고리 : 슬롯 테스트 라이브러리
메인 파일 : 슬롯.gms
$title '슬롯core.numpy API 원시 모드 테스트' (GAMS2NUMPY02,SEQ=827)
$onText
슬롯 임베디드 코드 기능을 사용하여 슬롯core.numpy Python API 원시 모드 테스트
기고자: Clemens Westphal, 2020년 7월
$offText
$log --- Python 라이브러리 %sysEnv.GMSPYTHONLIB% 사용
내가 /i1*i10/으로 설정;
j /j1*j10/ 설정;
k /1*10/을 설정;
l /1*10/을 설정;
매개변수 p(i,j), p2(k,l);
p(i,j) = 균일(0,10);
p2(k,l) = 균일(0,10);
p2('1','1') = +inf;
Execute_unload 'p_reference.gdx', p;
Execute_unload 'ijp_reference.gdx', i j p;
Execute_unload 'klp2_reference.gdx', k l p2;
*원시 모드 테스트
임베디드 코드 Python:
numpy를 np로 가져오기
슬롯core.numpy를 gnp로 가져오기
슬롯core.gdx에서 가져오기 *
슬롯core.gmd에서 가져오기 *
gams2np = gnp.Gams2Numpy(r"%슬롯sysdir%.")
gdx = new_gdxHandle_tp()
gmd1 = new_gmdHandle_tp()
gmd2 = new_gmdHandle_tp()
rc, msg = gmdCreate(gmd1, GMS_SSSIZE)
RC가 아닌 경우:
예외 발생(msg)
rc, msg = gmdCreate(gmd2, GMS_SSSIZE)
RC가 아닌 경우:
예외 발생(msg)
rc, msg = gdxCreate(gdx, GMS_SSSIZE)
RC가 아닌 경우:
예외 발생(msg)
gdxOpenRead(gdx, 'ijp_reference.gdx')[0]이 아닌 경우:
raise Exception("GDX 파일 'ijp_reference.gdx' 열기 오류")
i_keys, i_values = gams2np.gdxReadSymbolRaw(gdx, 'i')
j_keys, j_values = gams2np.gdxReadSymbolRaw(gdx, 'j')
p_keys, p_values = gams2np.gdxReadSymbolRaw(gdx, 'p')
uels = 목록(슬롯get('*'))
gdx닫기(gdx)
gdxFree(gdx)가 아닌 경우:
raise Exception("gdxFree 오류")
rc, msg = gdxCreate(gdx, GMS_SSSIZE)
RC가 아닌 경우:
예외 발생(msg)
gdxOpenWrite(gdx, 'p_gdx1.gdx', '')[0]이 아닌 경우:
raise Exception("GDX 파일 'p_gdx1.gdx' 생성 중 오류 발생")
gdxUELRegisterStrStart(gdx)
l의 경우:
gdxUELRegisterStr(gdx, l)
gdxUEL등록완료(gdx)
gams2np.gdxWriteSymbolRaw(gdx, 'p', '', 2, GMS_DT_PAR, 0, p_keys, p_values)
gdxClose(gdx)인 경우:
raise Exception("GDX 파일을 닫는 동안 오류가 발생했습니다.")
gdxFree(gdx)가 아닌 경우:
raise Exception("gdxFree 오류")
rc, msg = gdxCreate(gdx, GMS_SSSIZE)
RC가 아닌 경우:
예외 발생(msg)
gdxOpenWrite(gdx, 'ijp_gdx.gdx', '')[0]이 아닌 경우:
raise Exception("GDX 파일 'ijp_gdx.gdx' 생성 중 오류 발생")
gdxUELRegisterStrStart(gdx)
l의 경우:
gdxUELRegisterStr(gdx, l)
gdxUEL등록완료(gdx)
gams2np.gdxWriteSymbolRaw(gdx, 'i', '', 1, GMS_DT_SET, 0, i_keys, i_values)
gams2np.gdxWriteSymbolRaw(gdx, 'j', '', 1, GMS_DT_SET, 0, j_keys, j_values)
gams2np.gdxWriteSymbolRaw(gdx, 'p', '', 2, GMS_DT_PAR, 0, p_keys, p_values, ['i', 'j'])
gdxClose(gdx)인 경우:
raise Exception("GDX 파일을 닫는 동안 오류가 발생했습니다.")
gdxFree(gdx)가 아닌 경우:
raise Exception("gdxFree 오류")
rc = new_intp()
l의 경우:
gmdMergeUel(gmd1, l)
p_symPtr = gmdAddSymbolPy(gmd1, 'p', 2, GMS_DT_PAR, 0, '', rc)
intp_value(rc)가 아닌 경우:
raise Exception("GMD에 기호를 추가하는 중 오류가 발생했습니다.")
p_values2 = p_values.copy()
p_values2[:,-1] = 3.14 # 잘못된 값 추가
gams2np.gmdFillSymbolRaw(gmd1, p_symPtr, p_keys, p_values2)
# 배열에 중복 레코드를 추가하고 merge=True를 사용하여 올바른 값을 씁니다.
p_keys = np.insert(p_keys, 0, np.array([1, 11]), 축=0)
p_values = np.insert(p_values, 0, np.array([1.23]), 축=0)
gams2np.gmdFillSymbolRaw(gmd1, p_symPtr, p_keys, p_values, merge=True)
gmdWriteGDX(gmd1, 'p_gmd1.gdx', 거짓)
rc = new_intp()
p_keys, p_values = gams2np.gmdReadSymbolRaw(gmd1, 'p')
uels = gams2np.gmdGetUelList(gmd1)
uels[1:]의 l에 대해:
gmdMergeUel(gmd2, l)
p_symPtr = gmdAddSymbolPy(gmd2, 'p', 2, GMS_DT_PAR, 0, '', rc)
intp_value(rc)가 아닌 경우:
raise Exception("GMD에 기호를 추가하는 중 오류가 발생했습니다.")
gams2np.gmdFillSymbolRaw(gmd2, p_symPtr, p_keys, p_values)
gmdWriteGDX(gmd2, 'p_gmd2.gdx', 거짓)
gmdFree(gmd1)가 아닌 경우:
raise Exception("gmdFree에 오류가 있습니다")
gmdFree(gmd2)가 아닌 경우:
raise Exception("gmdFree에 오류가 있습니다")
# 테스트 매개변수 RelaxedType=True(GMD)
gmd3 = new_gmdHandle_tp()
rc, msg = gmdCreate(gmd3, GMS_SSSIZE)
RC가 아닌 경우:
예외 발생(msg)
rc = new_intp()
uels = 목록(슬롯get('*'))
l의 경우:
gmdMergeUel(gmd3, l)
k_symPtr = gmdAddSymbolPy(gmd3, 'k', 1, GMS_DT_SET, 0, '', rc)
intp_value(rc)가 아닌 경우:
raise Exception("GMD에 기호를 추가하는 중 오류가 발생했습니다.")
k_keys = np.array([[str(uel)] for uel in 슬롯get('k', keyType=KeyType.INT)])
k_값 = 없음
gams2np.gmdFillSymbolRaw(gmd3, k_symPtr, k_keys, k_values, RelaxedType=True)
l_symPtr = gmdAddSymbolPy(gmd3, 'l', 1, GMS_DT_SET, 0, '', rc)
intp_value(rc)가 아닌 경우:
raise Exception("GMD에 기호를 추가하는 중 오류가 발생했습니다.")
gams2np.gmdFillSymbolRaw(gmd3, l_symPtr, k_keys, k_values, RelaxedType=True)
p2_symPtr = gmdAddSymbolPy(gmd3, 'p2', 2, GMS_DT_PAR, 0, '', rc)
intp_value(rc)가 아닌 경우:
raise Exception("GMD에 기호를 추가하는 중 오류가 발생했습니다.")
p2_keys = np.array(슬롯get("p2", keyFormat=KeyFormat.FLAT, keyType=KeyType.INT, valueFormat=ValueFormat.SKIP), dtype=str)
p2_values = np.array(슬롯get("p2", keyFormat=KeyFormat.SKIP, valueFormat=ValueFormat.TUPLE), dtype=object)
p2_values[0] = 'inf'
gams2np.gmdFillSymbolRaw(gmd3, p2_symPtr, p2_keys, p2_values, RelaxedType=True)
gmdWriteGDX(gmd3, 'klp2_gmd.gdx', 거짓)
gmdFree(gmd3)가 아닌 경우:
raise Exception("gmdFree에 오류가 있습니다")
# 테스트 매개변수 RelaxedType=True(GDX)
rc, msg = gdxCreate(gdx, GMS_SSSIZE)
RC가 아닌 경우:
예외 발생(msg)
gdxOpenWrite(gdx, 'klp2_gdx.gdx', '')[0]이 아닌 경우:
raise Exception("GDX 파일 'klp2_gdx.gdx' 생성 중 오류 발생")
gdxUELRegisterStrStart(gdx)
l의 경우:
gdxUELRegisterStr(gdx, l)
gdxUEL등록완료(gdx)
gams2np.gdxWriteSymbolRaw(gdx, 'k', '', 1, GMS_DT_SET, 0, k_keys, k_values, RelaxedType=True)
gams2np.gdxWriteSymbolRaw(gdx, 'l', '', 1, GMS_DT_SET, 0, k_keys, k_values, RelaxedType=True)
gams2np.gdxWriteSymbolRaw(gdx, 'p2', '',2, GMS_DT_PAR, 0, p2_keys, p2_values, RelaxedType=True)
gdxClose(gdx)인 경우:
raise Exception("GDX 파일을 닫는 동안 오류가 발생했습니다.")
gdxFree(gdx)가 아닌 경우:
raise Exception("gdxFree 오류")
# 테스트 맵 모드(GDX)
rc, msg = gdxCreate(gdx, GMS_SSSIZE)
RC가 아닌 경우:
예외 발생(msg)
gdxOpenWrite(gdx, 'ijp_gdx_map.gdx', '')[0]이 아닌 경우:
raise Exception("GDX 파일 'ijp_gdx_map.gdx' 생성 중 오류 발생")
gdxUELRegisterStrStart(gdx)
l의 경우:
gdxUELRegisterStr(gdx, l)
gdxUEL등록완료(gdx)
np.random.shuffle(i_keys)
np.random.shuffle(j_keys)
p = np.random.permutation(len(p_keys))
p_keys = p_keys[p]
p_값 = p_값[p]
gams2np.gdxWriteSymbolMap(gdx, 'i', '', 1, GMS_DT_SET, 0, i_keys, 없음)
gams2np.gdxWriteSymbolMap(gdx, 'j', '', 1, GMS_DT_SET, 0, j_keys, 없음)
gams2np.gdxWriteSymbolMap(gdx, 'p', '', 2, GMS_DT_PAR, 0, p_keys, p_values)
gdxClose(gdx)인 경우:
raise Exception("GDX 파일을 닫는 동안 오류가 발생했습니다.")
gdxFree(gdx)가 아닌 경우:
raise Exception("gdxFree 오류")
# 테스트 고양이 모드(GDX와 GMD 비교)
rc, msg = gdxCreate(gdx, GMS_SSSIZE)
RC가 아닌 경우:
예외 발생(msg)
gdxOpenRead(gdx, 'ijp_reference.gdx')[0]이 아닌 경우:
raise Exception("GDX 파일 'ijp_reference.gdx' 열기 오류")
i_keys_cat_gdx, i_values_cat_gdx, i_labels_cat_gdx = gams2np.gdxReadSymbolCat(gdx, 'i')
j_keys_cat_gdx, j_values_cat_gdx, j_labels_cat_gdx = gams2np.gdxReadSymbolCat(gdx, 'j')
p_keys_cat_gdx, p_values_cat_gdx, p_labels_cat_gdx = gams2np.gdxReadSymbolCat(gdx, 'p')
gdxClose(gdx)인 경우:
raise Exception("GDX 파일을 닫는 동안 오류가 발생했습니다.")
gdxFree(gdx)가 아닌 경우:
raise Exception("gdxFree 오류")
gmd4 = new_gmdHandle_tp()
rc, msg = gmdCreate(gmd4, GMS_SSSIZE)
RC가 아닌 경우:
예외 발생(msg)
rc = gmdInitFromGDX(gmd4, 'ijp_reference.gdx')
RC가 아닌 경우:
예외 발생("오류 gmdInitFromGDX")
i_keys_cat_gmd, i_values_cat_gmd, i_labels_cat_gmd = gams2np.gmdReadSymbolCat(gmd4, 'i')
j_keys_cat_gmd, j_values_cat_gmd, j_labels_cat_gmd = gams2np.gmdReadSymbolCat(gmd4, 'j')
p_keys_cat_gmd, p_values_cat_gmd, p_labels_cat_gmd = gams2np.gmdReadSymbolCat(gmd4, 'p')
gmdFree(gmd4)가 아닌 경우:
raise Exception("gmdFree에 오류가 있습니다")
만약 (
np.array_equal(i_keys_cat_gdx, i_keys_cat_gmd)이 아님
또는 np.array_equal(i_values_cat_gdx, i_values_cat_gmd)이 아닙니다.
또는 np.array_equal(i_labels_cat_gdx, i_labels_cat_gmd)이 아닙니다.
):
raise Exception("'i'에 대한 cat 데이터 구조를 읽는 중이 같지 않습니다.")
만약 (
np.array_equal(j_keys_cat_gdx, j_keys_cat_gmd)이 아님
또는 np.array_equal(j_values_cat_gdx, j_values_cat_gmd)이 아닙니다.
또는 np.array_equal(j_labels_cat_gdx, j_labels_cat_gmd)이 아닙니다.
):
raise Exception("'j'에 대한 cat 데이터 구조를 읽는 중이 같지 않습니다.")
만약 (
np.array_equal(p_keys_cat_gdx, p_keys_cat_gmd)이 아님
또는 np.array_equal(p_values_cat_gdx, p_values_cat_gmd)이 아닙니다.
또는 np.array_equal(p_labels_cat_gdx, p_labels_cat_gmd)이 아닙니다.
):
raise Exception("'p'에 대한 cat 데이터 구조를 읽는 중이 같지 않습니다.")
endEmbeddedCode
'gdxdiff p_reference.gdx p_gdx1.gdx > %system.nullfile%'을 실행합니다.
abort$errorlevel 'p_reference.gdx와 p_gdx1.gdx가 다릅니다.'
'gdxdiff ijp_reference.gdx ijp_gdx.gdx > %system.nullfile%'를 실행합니다.
abort$errorlevel 'ijp_reference.gdx와 ijp_gdx.gdx가 다릅니다.'
'gdxdiff p_reference.gdx p_gmd1.gdx > %system.nullfile%'을 실행합니다.
abort$errorlevel 'p_reference.gdx와 p_gmd1.gdx가 다릅니다.'
'gdxdiff p_reference.gdx p_gmd2.gdx > %system.nullfile%'을 실행합니다.
abort$errorlevel 'p_reference.gdx와 p_gmd2.gdx가 다릅니다.'
'gdxdiff klp2_reference.gdx klp2_gmd.gdx > %system.nullfile%'을 실행합니다.
abort$errorlevel 'klp2_reference.gdx와 klp2_gmd.gdx가 다릅니다';
'gdxdiff klp2_reference.gdx klp2_gdx.gdx > %system.nullfile%'을 실행합니다.
abort$errorlevel 'klp2_reference.gdx와 klp2_gdx.gdx가 다릅니다';
'gdxdiff ijp_reference.gdx ijp_gdx_map.gdx > %system.nullfile%'을 실행합니다.
abort$errorlevel 'ijp_reference.gdx와 ijp_gdx_map.gdx가 다릅니다';