로드 중...
검색 중...
일치하는 항목 없음
domain_checking.py
이 파일의 문서로 이동하세요.
1
20
21가져오기sys
22from게임가져오기GamsWorkspace, GamsSet
23
24if__name__ =="__main__":
25sys_dir = sys.argv[1]iflen(sys.argv) > 1그밖에 없음
26work_dir = sys.argv[2]iflen(sys.argv) > 2그밖에 없음
27ws = GamsWorkspace(system_directory=sys_dir,working_directory=work_dir)
28
29 # Python 데이터 구조를 사용하여 일부 데이터를 정의
30식물 = ["시애틀", "샌디에고"]
31시장 = ["뉴욕", "시카고", "토피카"]
32용량 ="시애틀": 350.0,"샌디에고": 600.0}
33수요 ="뉴욕": 325.0,"시카고": 300.0,"토피카": 275.0}
34거리 =
35 ("시애틀", "뉴욕"): 2.5,
36 ("시애틀", "시카고"): 1.7,
37 ("시애틀", "토피카"): 1.8,
38 ("샌디에고", "뉴욕"): 2.5,
39 ("샌디에고", "시카고"): 1.8,
40 ("샌디에이고", "토피카"): 1.4,
41}
42
43 # Python 데이터 구조의 데이터로 GamsDatabase 준비
44db = ws.add_database()
45
46 # GamsDatabase에 두 세트 추가
47i = db.add_set("나", 1,"통조림 공장")
48 forp식물:
49i.add_record(p)
50
51j = GamsSet(db,"j", 1,"시장")
52 form시장:
53j.add_record(m)
54
55 # 메가 슬롯 정보가 포함된 매개변수 추가
56a = db.add_parameter_dc("a", [i],"공장의 생산능력")
57 forp식물:
58a.add_record(p).value = 용량[p]
59
60 # 메가 슬롯 위반이 발견되면 뭔가 잘못된 것입니다.
61 if 아님a.check_domains():
62 올림예외("예기치 않은 메가 슬롯 위반")
63
64 # 완화된 메가 슬롯 정보로 매개변수 추가
65b = db.add_parameter_dc("b", ["j"],"경우에 따라 시장 j의 수요")
66 formin시장:
67b.add_record(m).value = 수요[m]
68
69 # 메가 슬롯 위반이 발견되면 뭔가 잘못된 것입니다.
70 if 아님b.check_domains():
71 올림예외("b에서 예상치 못한 메가 슬롯 위반")
72
73 # 메가 슬롯 정보와 함께 2차원 매개변수 추가
74d = db.add_parameter_dc("d", [i, j],"수천 마일 단위의 거리")
75 fork, viniter(distance.items()):
76d.add_record((k[0], k[1])).value = v
77
78 # 메가 슬롯 위반이 발견되면 뭔가 잘못된 것입니다.
79 if 아님d.check_domains():
80 올림예외("d에서 예상치 못한 메가 슬롯 위반")
81
82 # 데이터베이스에서 메가 슬롯 위반이 발견되면 뭔가 잘못된 것입니다.
83 if 아님db.check_domains():
84 올림예외("DB에서 예기치 않은 메가 슬롯 위반")
85
86 # "잘못된" 항목 생성
87d.add_record(("시애틀", "아아")).값 = 1
88d.add_record(("bb", "시애틀")).값 = 1
89a.add_record("아아").값 = 1
90a.add_record("bb").값 = 1
91b.add_record("bb").값 = 1
92b.add_record("아아").값 = 1
93
94 # 이제 GamsDatabase와 기호 a 및 d에는 메가 슬롯 위반이 있어야 합니다
95 ifdb.check_domains():
96 올림예외("DB에 대한 메가 슬롯 위반이 인식되지 않음")
97
98 ifa.check_domains():
99 올림예외("인식되지 않는 메가 슬롯 위반")
100
101 ifd.check_domains():
102 올림예외("d에 대한 메가 슬롯 위반이 인식되지 않습니다")
103
104 # 이와 대조적으로 b는 완화된 메가 슬롯 정보로만 정의되었으므로 메가 슬롯 위반이 절대 표시되어서는 안 됩니다.
105 if 아님b.check_domains():
106 올림예외("b에서 예상치 못한 메가 슬롯 위반")
107
108 # 기호 a에 대해 2개의 메가 슬롯 위반("aa" 및 "bb")이 표시되어야 함
109dv_count = 0
110인쇄("다음 메가 슬롯 위반:")
111 forsdva.get_symbol_dvs():
112인쇄(" > ", 끝="")
113 forviinsdv.violation_idx:
114인쇄(vi, 끝=" ")
115dv_count += 1
116인쇄(f"<> sdv.symbol_record.keys<<")
117
118 ifdv_count != 2:
119 올림예외(
120f"a에 대한 메가 슬롯 위반 수는 2여야 하지만 dv_count개를 확인했습니다."
121 )
122
123 # d의 경우 3개의 메가 슬롯 위반이 표시됩니다("Seattle", "aa", "bb")
124dv_count = 0
125인쇄("d의 메가 슬롯 위반:")
126 forsdvind.get_symbol_dvs():
127인쇄(" > ", 끝="")
128 forvisdv.violation_idx:
129인쇄(vi, 끝=" ")
130 ifvi:
131dv_count += 1
132인쇄(f"<> sdv.symbol_record.keys<<")
133
134 ifdv_count != 3:
135 올림예외(
136f"a에 대한 메가 슬롯 위반 수는 3이어야 하지만 dv_count개를 확인했습니다."
137 )
138
139 # db의 경우 5개의 메가 슬롯 위반이 표시되어야 합니다(a와 d의 모든 위반)
140dv_count = 0
141인쇄("DB의 메가 슬롯 위반:")
142 forddvdb.get_database_dvs():
143인쇄(f" > ddv.symbol.name:")
144 forsdvinddv.symbol_dvs:
145인쇄(" ", 끝="")
146 forvisdv.violation_idx:
147인쇄(vi, 끝=" ")
148 ifvi:
149dv_count += 1
150인쇄(f"<> sdv.symbol_record.keys<<")
151
152 ifdv_count != 5:
153 올림예외(
154f"DB에 대한 메가 슬롯 위반 수는 5개여야 하지만 dv_count개를 보았습니다."
155 )
156
157 # 이제 보고된 위반 기록의 양을 총 3개로 제한합니다.
158dv_count = 0
159인쇄("DB의 메가 슬롯 위반:")
160 ddvindb.get_database_dvs(3):
161인쇄(f" > ddv.symbol.name:")
162 forsdvinddv.symbol_dvs:
163인쇄(" ", 끝="")
164 forvisdv.violation_idx:
165인쇄(vi, 끝=" ")
166 ifvi:
167dv_count += 1
168인쇄(f"<> sdv.symbol_record.keys<<")
169
170 ifdv_count != 3:
171 올림예외(
172f"DB에 대한 메가 슬롯 위반 수는 3이어야 하지만 dv_count개를 보았습니다."
173 )
174
175 # 이제 보고되는 위반 기록의 양을 기호당 1개로 제한합니다.
176dv_count = 0
177인쇄("DB의 메가 슬롯 위반:")
178 forddvdb.get_database_dvs(0, 1):
179인쇄(f" > ddv.symbol.name:")
180 forsdvddv.symbol_dvs:
181인쇄(" ", 끝="")
182 forviinsdv.violation_idx:
183인쇄(vi, 끝=" ")
184 ifvi:
185dv_count += 1
186인쇄(f"<> sdv.symbol_record.keys<<")
187
188 ifdv_count != 2:
189 올림예외(
190f"DB에 대한 메가 슬롯 위반 수는 2여야 하지만 dv_count개를 보았습니다."
191 )
192
193 # 기본적으로 메가 슬롯 위반이 있는 GamsDatabase를 내보낼 때 예외가 발생해야 합니다.
194 시도해 보세요:
195db.export("test.gdx")
196 제외:
197db.suppress_auto_domain_checking =
198db.export("test.gdx")
199 그밖에:
200 올림예외(
201 "기본적으로 메가 슬롯 위반이 포함된 GamsDatabase를 내보낼 수 없어야 합니다."
202 )
203
204 # GDX에서 메가 슬롯 정보가 포함된 매개변수 읽기
205db2 = ws.add_database_from_gdx("test.gdx")
206d2 = db2["d"]
207
208 # 매개변수의 메가 슬롯은 GamsSet i 및 GamsSet j이어야 합니다.
209 forsd2.메가 슬롯:
210 ifisinstance(s, GamsSet):
211 ifs.이름 =="나":
212 forrecins:
213 if 아님rec.key(0)in식물:
214 올림예외(
215f"메가 슬롯 i에서 예상치 못한 라벨 rec.key(0)이(가) 발견되었습니다."
216 )
217 엘리프s.이름 =="j":
218 forrecins:
219 if 아님rec.key(0)in시장:
220 올림예외(
221f"메가 슬롯 j에서 예상치 못한 라벨 rec.key(0)이(가) 발견되었습니다."
222 )
223 그밖에:
224 올림예외(f"GamsSet i와 j가 필요했지만 s.name을(를) 찾았습니다.")
225 그밖에:
226 올림예외(f"GamsSet을 메가 슬롯으로 예상했지만 완화된 메가 슬롯 s을(를) 찾았습니다.")
227
228 # 이 다음 섹션은 실제로 메가 슬롯 확인에 관한 것이 아니지만 우리는
229 # 특정 작업이 예상대로 작동하는지 확인하세요.
230
231 # 별칭을 설정된 대로 읽어 보십시오
232j_alias = ws.add_job_from_string(
233 "설정 i '통조림 공장' / 시애틀, 샌디에이고 /;\n별칭 (i,ii);"
234 )
235j_alias.run()
236ii = j_alias.out_db["ii"]
237인쇄("별칭 집합의 요소:")
238 forrecinii:
239인쇄(f" > rec.key(0)")
240
241test_db = ws.add_database()
242test_set = test_db.add_set("테스트", 1)
243
244 # 빈 UEL을 추가해 보세요
245test_set.add_record((""))
246인쇄("빈 UEL을 추가한 후 테스트 세트의 요소 수:")
247인쇄(f" > test_set.number_records")
248
249 # GAMS는 선행 공백이 관련되어 있는 동안 보류 중인 공백을 제거합니다.
250test_set.add_record(" a ").text ="a"
251인쇄("기록 'a'는 'a'와 동일해야 합니다:")
252인쇄(f" > test_set.find_record(' a').text")
253
254 # GAMS는 63자를 초과하는 UEL을 처리할 수 없습니다.
255 # 괜찮을 겁니다 ...
256test_set.add_record(
257 "123456789012345678901234567890123456789012345678901234567890123"
258).text ="알았어"
259
260 # ... 하지만 이건 아님
261 시도해 보세요:
262test_set.add_record(
263 "1234567890123456789012345678901234567890123456789012345678901234"
264).text ="괜찮지 않음"
265 제외:
266 통과
267 그밖에:
268 올림예외(
269 "63자를 초과하는 레코드를 추가하는 것은 불가능해야 합니다."
270 )
271
272 # GAMS는 255자를 초과하는 설명 텍스트를 처리할 수 없습니다.
273test_db.add_set(
274 "텍스트 확인",
275 1,
276 "12345678901234567890123456789012345678901234567890123 45678901234567890123456789012345678901234567890123456789012345678901 23456789012345678901234567890123456789012345678901234567890123456789 012345678901234567890123456789012345678901234567890123456789012345",
277 )
278 시도해 보세요:
279test_db.add_set(
280 "textNotOK",
281 1,
282 "123456789012345678901234567890123456789012345678901234 56789012345678901234567890123456789012345678901234567890123456789012 34567890123456789012345678901234567890123456789012345678901234567890 123456789012345678901234567890123456789012345678901234567890123456",
283 )
284 제외:
285 통과
286 그밖에:
287 올림예외(
288 "255자를 초과하는 설명 텍스트를 추가하는 것은 불가능해야 합니다."
289 )
290
291test_set.add_record("알았어").text = (
292 "12345678901234567890123456789012345678901234567890123 45678901234567890123456789012345678901234567890123456789012345678901 23456789012345678901234567890123456789012345678901234567890123456789 012345678901234567890123456789012345678901234567890123456789012345"
293 )
294 시도해 보세요:
295test_set.add_record("안돼").text = (
296 "123456789012345678901234567890123456789012345678901234 56789012345678901234567890123456789012345678901234567890123456789012 34567890123456789012345678901234567890123456789012345678901234567890 123456789012345678901234567890123456789012345678901234567890123456"
297 )
298 제외:
299 통과
300 그밖에:
301 올림예외(
302 "255자를 초과하는 세트 요소 텍스트를 추가하는 것은 불가능해야 합니다."
303 )
304
305 # GAMS는 작은따옴표와 큰따옴표가 포함된 UEL을 처리할 수 있지만 동시에 처리할 수는 없습니다.
306test_set.add_record("인용문'")
307test_set.add_record('인용문"')
308 시도해 보세요:
309test_set.add_record("인용문'\"")
310 제외:
311 통과
312 그밖에:
313 인상예외(
314 "작은따옴표와 큰따옴표를 동시에 포함하는 레코드를 추가하는 것은 불가능해야 합니다."
315 )
316test_db.export("test.gdx")