gams2numpy02.gms : 크레이지 슬롯core.numpy Python API 원시 모드 테스트

설명

크레이지 슬롯 임베디드 코드 기능을 사용하여 크레이지 슬롯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가 다릅니다';