gams2numpy01.gms : 무료 슬롯core.numpy Python API 문자열 모드 테스트

설명

무료 슬롯 임베디드 코드 기능을 사용하여 무료 슬롯core.numpy Python API 문자열 모드 테스트

기고자: Clemens Westphal, 2020년 7월

소형 모델 유형 :무료 슬롯


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


메인 파일 : gams2numpy01.gms

$title '무료 슬롯core.numpy API 문자열 모드 테스트' (GAMS2NUMPY01,SEQ=826)

$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.gdxReadSymbolStr(gdx, 'i')
    j_keys, j_values = gams2np.gdxReadSymbolStr(gdx, 'j')
    p_keys, p_values = gams2np.gdxReadSymbolStr(gdx, 'p')
    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)
    무료 슬롯get('*')의 l에 대해:
        gdxUELRegisterStr(gdx, l)
    gdxUEL등록완료(gdx)
    gams2np.gdxWriteSymbolStr(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)
    무료 슬롯get('*')의 l에 대해:
        gdxUELRegisterStr(gdx, l)
    gdxUEL등록완료(gdx)
    gams2np.gdxWriteSymbolStr(gdx, 'i', '', 1, GMS_DT_SET, 0, i_keys, i_values)
    gams2np.gdxWriteSymbolStr(gdx, 'j', '', 1, GMS_DT_SET, 0, j_keys, j_values)
    gams2np.gdxWriteSymbolStr(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()
    무료 슬롯get('*')의 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.gmdFillSymbolStr(gmd1, p_symPtr, p_keys, p_values2)

    # 배열에 중복 레코드를 추가하고 merge=True를 사용하여 올바른 값을 씁니다.
    p_keys = np.insert(p_keys, 0, np.array(['i1', 'j1']), 축=0)
    p_values = np.insert(p_values, 0, np.array([1.23]), 축=0)
    gams2np.gmdFillSymbolStr(gmd1, p_symPtr, p_keys, p_values, merge=True)
    gmdWriteGDX(gmd1, 'p_gmd1.gdx', 거짓)
    rc = new_intp()
    무료 슬롯get('*')의 l에 대해:
        gmdMergeUel(gmd2, l)
    p_symPtr = gmdAddSymbolPy(gmd2, 'p', 2, GMS_DT_PAR, 0, '', rc)
    intp_value(rc)가 아닌 경우:
        raise Exception("GMD에 기호를 추가하는 중 오류가 발생했습니다.")
    gams2np.gmdFillSymbolStr(gmd2, p_symPtr, *gams2np.gmdReadSymbolStr(gmd1, 'p'))
    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()
    무료 슬롯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( [[i+1] for i in range(10)] )
    k_값 = 없음
    gams2np.gmdFillSymbolStr(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.gmdFillSymbolStr(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, valueFormat=ValueFormat.SKIP), dtype=int)
    p2_values = np.array(무료 슬롯get("p2", keyFormat=KeyFormat.SKIP, valueFormat=ValueFormat.TUPLE), dtype=object)
    p2_values[0] = 'inf'
    gams2np.gmdFillSymbolStr(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)
    무료 슬롯get('*')의 l에 대해:
        gdxUELRegisterStr(gdx, l)
    gdxUEL등록완료(gdx)
    gams2np.gdxWriteSymbolStr(gdx, 'k', '', 1, GMS_DT_SET, 0, k_keys, k_values, RelaxedType=True)
    gams2np.gdxWriteSymbolStr(gdx, 'l', '', 1, GMS_DT_SET, 0, k_keys, k_values, RelaxedType=True)
    gams2np.gdxWriteSymbolStr(gdx, 'p2', '',2, GMS_DT_PAR, 0, p2_keys, p2_values, RelaxedType=True)
    gdxClose(gdx)인 경우:
        raise Exception("GDX 파일을 닫는 동안 오류가 발생했습니다.")
    gdxFree(gdx)가 아닌 경우:
        raise Exception("gdxFree 오류")
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가 다릅니다';