로드 중...
검색 중...
일치하는 항목 없음
domainchecking.cpp
이 파일의 문서로 이동하세요.
1
25#include "슬롯 나라h"
26#include <지도>
27#include <벡터>
28#include <iostream>
29#include <알고리즘>
30
31네임스페이스 사용게임;
32네임스페이스 사용표준;
33
34std::stringgetDataText()
35{
36 반환 "\n 세트"
37 "i 통조림 식물 / 시애틀, 샌디에고 /; \n"
38 " \n"
39 "별칭 (i,ii); \n";
40}
41
58int 메인(intargc,문자* argv[])
59{
60cout <<"---------- 도메인 확인 중 ------------"<< endl;
61
62 // C++ 데이터 구조를 사용하여 일부 데이터 정의
63벡터<string> 식물"시애틀", "샌디에고"};
64벡터<string> 시장"뉴욕", "시카고", "토피카"};
65map<string, double> 용량"시애틀", 350.0 }, { "샌디에고", 600.0 } };
66map<string, double> 수요"뉴욕", 325.0 }, { "시카고", 300.0 }, { "토피카", 275.0 } };
67맵<튜플<문자열, 문자열>,더블> 거리
68make_tuple<string,string> ("시애틀", "뉴욕"), 2.5 },
69make_tuple<string,string> ("시애틀", "시카고"), 1.7 },
70make_tuple<문자열,문자열> ("시애틀", "토피카"), 1.8 },
71make_tuple<string,string> ("샌디에고", "뉴욕"), 2.5 },
72make_tuple<string,string> ("샌디에고", "시카고"), 1.8 },
73make_tuple<string,string> ("샌디에고", "토피카"), 1.4 }
74};
75
76
77 시도{
79 if(인수 > 1)
80wsInfo.setSystemDirectory(argv[1]);
82 // C++ 데이터 구조의 데이터로 GAMSDatabase 준비
84
85 // GAMSDatabase에 두 세트 추가
86 GAMSSeti = db.추가세트("나", "");
87 for (자동식물: 식물)
88i.추가기록(식물);
89 GAMSSetj = DB.추가세트("j", "");
90 for (자동시장: 시장)
91j.추가기록(시장);
92
93 // 도메인 정보가 포함된 매개변수 추가
94 슬롯 나라매개변수a = DB.addParameter("a", "공장의 생산 능력", i);
95 for (문자열식물: 식물)
96a.추가기록(식물).세트값(용량[공장]);
97
98 // 도메인 위반이 발견되면 문제가 발생한 것입니다.
99 if(!a.checkDomains()) {
100cout <<"*** 예상치 못한 도메인 위반"<< endl;
101 반환1;
102}
103
104 // 완화된 도메인 정보로 매개변수 추가
105 슬롯 나라매개변수b = DB.addParameter("b", "경우에 따라 시장 j의 수요", "j");
106 for (문자열시장: 시장)
107b.추가기록(시장).세트값(수요[시장]);
108
109 // 도메인 위반이 발견되면 문제가 발생한 것입니다.
110 if(!b.checkDomains()) {
111cout <<"*** b에서 예기치 않은 도메인 위반"<< endl;
112 반환1;
113}
114
115 // 도메인 정보가 포함된 2차원 매개변수 추가
116 슬롯 나라매개변수d = db.addParameter("d", "수천 마일 단위의 거리", i, j);
117 for (자동t : 거리)
118 자동튜플 = t.first;
119 자동t1 = get<0>(튜플);
120 자동t2 = get<1>(튜플);
121d.추가기록(t1, t2).세트값(거리[튜플]);
122}
123
124 // 도메인 위반이 발견되면 문제가 발생한 것입니다.
125 if(!d.checkDomains()) {
126cout <<"*** d에서 예기치 않은 도메인 위반"<< endl;
127 반환1;
128}
129
130 // 데이터베이스에서 도메인 위반이 발견되면 문제가 발생한 것입니다.
131 if(!db.checkDomains()) {
132cout <<"*** DB에서 예기치 않은 도메인 위반"<< endl;
133 반환1;
134}
135
136 // "잘못된" 항목 생성
137d.추가기록("시애틀", "아아").세트값(1);
138d.추가기록("bb", "시애틀").세트값(1);
139a.추가기록("아아").세트값(1);
140a.추가기록("bb").세트값(1);
141b.추가기록("아아").세트값(1);
142b.추가기록("bb").세트값(1);
143
144 // 이제 슬롯 나라 데이터베이스와 기호 a 및 d에 도메인 위반이 있어야 합니다.
145 if(db.checkDomains()) {
146cout <<"*** DB에 대한 도메인 위반이 인식되지 않음"<< endl;
147 반환1;
148}
149 if(a.checkDomains()) {
150cout <<"*** 인식되지 않는 도메인 위반"<< endl;
151 반환1;
152}
153 if(d.checkDomains()) {
154cout <<"*** d에 대한 도메인 위반이 인식되지 않음"<< endl;
155 반환1;
156}
157
158 // 대조적으로 b는 실제 도메인 정보로만 정의되었으므로 도메인 위반이 표시되어서는 안 됩니다.
159 if(!b.checkDomains()) {
160cout <<"*** b에서 예기치 않은 도메인 위반"<< endl;
161 반환1;
162}
163
164 // a의 경우 2개의 도메인 위반("aa" 및 "bb")이 표시됩니다.
165 intdvCnt = 0;
166cout <<"다음 도메인 위반:"<< endl;
168cout <<" > ";
169 for (부울vi: sdv.violInd())
170cout << (vi ?"사실입니다":"거짓");
171cout <<"<> ";
172 for (문자열k: sdv.violRec().keys())
173cout << k <<" ";
174cout <<"<<"<< endl;
175dvCnt++;
176}
177 if(dvCnt != 2)
178cout <<"*** a에 대한 도메인 위반 횟수는 2여야 하지만 확인했습니다. "<< dvCnt << endl;
179 반환1;
180}
181
182 // d의 경우 3개의 도메인 위반이 표시됩니다("Seattle", *"aa"*; *"bb"*, *"Seattle"*)
183dvCnt = 0;
184cout <<"d의 도메인 위반:"<< endl;
186cout <<" > ";
187 for (부울vi: sdv.violInd())
188cout << (vi ?"사실입니다":"거짓");
189 if(vi)
190dvCnt++;
191}
192cout <<"<> ";
193 for (문자열k: sdv.violRec().keys())
194cout << k <<" ";
195cout <<"<<"<< endl;
196}
197 if(dvCnt != 3)
198cout <<"*** a에 대한 도메인 위반 횟수는 3이어야 하지만 확인했습니다. "<< dvCnt << endl;
199 반환1;
200}
201
202 // db의 경우 5개의 도메인 위반이 표시되어야 합니다(a와 d의 모든 위반)
203dvCnt = 0;
204cout <<"DB의 도메인 위반:"<< endl;
206cout <<" > "+ DDV.violSym().name() +": "<< endl;
207 for (GAMSSymbolDomainViolationsdv: DDV.violRecs())
208cout <<" ";
209 (부울vi: sdv.violInd())
210cout << vi <<" ";
211 if(vi)
212dvCnt++;
213}
214cout <<"<> ";
215 for (문자열k: sdv.violRec().keys())
216cout << k <<" ";
217cout <<"<<"<< endl;
218}
219}
220 if(dvCnt != 5)
221cout <<"*** db에 대한 도메인 위반 횟수는 5여야 하는데 "<< dvCnt << endl;
222 반환1;
223}
224
225 // 이제 보고된 위반 기록의 양을 총 3으로 제한합니다.
226dvCnt = 0;
227cout <<"DB의 도메인 위반:"<< endl;
229cout <<" > "+ DDV.violSym().name() +": "<< endl;
230 for (GAMSSymbolDomainViolationsdv: DDV.violRecs())
231cout <<" ";
232 for (부울vi: sdv.violInd())
233cout << vi <<" ";
234cout <<"<> ";
235 for (문자열k: sdv.violRec().keys())
236cout << k <<" ";
237cout <<"<<"<< endl;
238dvCnt++;
239}
240}
241 if(dvCnt != 3)
242cout <<"*** db에 대한 도메인 위반 횟수는 3이어야 하는데 "<< dvCnt << endl;
243 반환1;
244}
245 // 이제 보고되는 위반 기록의 양을 기호당 1개로 제한합니다.
246dvCnt = 0;
247cout <<"DB의 도메인 위반:"<< endl;
249cout <<" > "+ DDV.violSym().name() +": "<< endl;
250 for (GAMSSymbolDomainViolationsdv: DDV.violRecs())
251cout <<" ";
252 for (부울vi: sdv.violInd())
253cout << vi <<" ";
254cout <<"<> ";
255 for (문자열k: sdv.violRec().keys())
256cout << k <<" ";
257cout <<"<<"<< endl;
258dvCnt++;
259}
260}
261 if(dvCnt != 2)
262cout <<"*** db에 대한 도메인 위반 횟수는 2여야 하는데 "<< dvCnt << endl;
263 반환1;
264}
265
266 // 기본적으로 도메인 위반이 있는 GAMSDatabase를 내보낼 때 예외가 발생해야 합니다.
267 부울sawException =거짓;
268 시도해 보세요{
269db.do내보내기("test.gdx");
270}잡기(...) {
271sawException =사실;
273db.do내보내기("test.gdx");
274}
275 if(!sawException)
276cout <<"*** 기본적으로 도메인 위반이 포함된 슬롯 나라데이터베이스를 내보낼 수 없어야 합니다."<< endl;
277 반환1;
278}
279
280 // gdx에서 도메인 정보가 포함된 매개변수 읽기
283
284 // 매개변수의 도메인은 GAMSSet i 및 GAMSSet j여야 합니다.
285 for (GAMSDomain항목: d2.도메인()) {
286 if(!item.isRelaxed())
287 GAMSSetdomSet = item.getSet();
288 if(domSet.이름() =="나") {
289 for (GAMSSetRecorduel: domSet)
290 if(find(plants.begin(), Plants.end(), uel.key(0)) == Plants.end())
291cout <<"*** 예상치 못한 uel "+ uel.key(0) +" 도메인 i에서 발견됨"<< endl;
292 반환1;
293}
294}그밖에 if(domSet.이름() =="j") {
295 for (GAMSSetRecorduel: domSet)
296 if(find(markets.begin(), market.end(), uel.key(0)) == market.end())
297cout <<"*** 예상치 못한 uel "+ uel.key(0) +" 도메인 j에서 발견됨"<< endl;
298 반환1;
299}
300}그밖에{
301cout <<"*** GAMSSet i 및 j가 필요했지만 발견됨 "+ domSet.이름() << endl;
302 반환1;
303}
304}
305 그밖에
306{
307cout <<"*** GAMSSet을 도메인으로 예상했지만 완화된 도메인을 찾았습니다. "+ item.name() << endl;
308 반환1;
309}
310}
311
312 /* *************************************************************** *
313* 이 다음 섹션은 실제로 도메인 확인에 관한 것이 아니지만 우리는 *
314* 특정 작업이 예상대로 작동하는지 확인하세요. *
315 * *************************************************************** */
316
317 // 별칭을 세트로 읽어보세요.
319jAlias.실행();
320 GAMSSetii = jAlias.outDB().getSet("ii");
321cout <<"별칭 집합의 요소:"<< endl;
322 for (GAMSSetRecord항목: ii)
323cout <<" > "+ item.key(0) << endl;
324
326 GAMSSettestSet = 테스트DB.추가세트("테스트", 1);
327
328 // 빈 UEL을 추가해 보세요.
329테스트세트.추가기록("");
330cout <<"빈 UEL을 추가한 후 테스트 세트의 요소:"<< endl;
331cout <<" > "<< 테스트세트.번호레코드() << endl;
332
333 // 슬롯 나라는 선행 공백이 관련되어 있는 동안 보류 중인 공백을 제거합니다.
334테스트세트.추가기록(" a ").setText("a");
335cout <<"기록 'a'는 'a'와 동일해야 합니다:"<< endl;
336cout <<" > "<< 테스트세트.findRecord("a").텍스트() << endl;
337
338 // 슬롯 나라는 63자를 초과하는 UEL을 처리할 수 없습니다.
339 // 괜찮을 것 같아요 ...
340테스트세트.추가기록("123456789012345678901234567890123456789012345678901234567890123").setText("알았어");
341 // ...하지만 이건 아님
342sawException =거짓;
343 시도해 보세요{
344테스트세트.추가기록("1234567890123456789012345678901234567890123456789012345678901234").setText("괜찮지 않음");
345}잡기(...) {
346sawException =;
347}
348 if(!sawException)
349cout <<"*** 63자를 초과하는 레코드를 추가하는 것은 불가능해야 합니다."<< endl;
350 반환1;
351}
352
353 // 슬롯 나라는 255자를 초과하는 설명 텍스트를 처리할 수 없습니다.
354테스트DB.추가세트("텍스트 확인", "12345678901234567890123456789012345678901234567890123 45678901234567890123456789012345678901234567890123456789012345678901 23456789012345678901234567890123456789012345678901234567890123456789 012345678901234567890123456789012345678901234567890123456789012345");
355sawException =거짓;
356 시도{
357테스트DB.추가세트("textNotOK", "123456789012345678901234567890123456789012345678901234 56789012345678901234567890123456789012345678901234567890123456789012 34567890123456789012345678901234567890123456789012345678901234567890 123456789012345678901234567890123456789012345678901234567890123456");
358}잡기(...) {
359sawException =;
360}
361 if(!sawException)
362cout <<"*** 255자를 초과하는 설명 텍스트를 추가하는 것은 불가능해야 합니다."<< endl;
363 반환1;
364}
365
366테스트세트.추가기록("알았어").setText("12345678901234567890123456789012345678901234567890123 45678901234567890123456789012345678901234567890123456789012345678901 23456789012345678901234567890123456789012345678901234567890123456789 012345678901234567890123456789012345678901234567890123456789012345");
367sawException =거짓;
368 시도해 보세요{
369테스트세트.추가기록("안돼").setText("123456789012345678901234567890123456789012345678901234 56789012345678901234567890123456789012345678901234567890123456789012 34567890123456789012345678901234567890123456789012345678901234567890 123456789012345678901234567890123456789012345678901234567890123456");
370}잡다(...) {
371sawException =사실;
372}
373 if(!sawException)
374cout <<"*** 255자를 초과하는 설명 텍스트를 추가하는 것은 불가능해야 합니다."<< endl;
375 반환1;
376}
377
378 // 슬롯 나라는 작은따옴표와 큰따옴표가 포함된 UEL을 처리할 수 있지만 동시에 처리할 수는 없습니다.
379testSet.추가기록("인용문'");
380testSet.추가기록("인용문\"");
381sawException =거짓;
382 시도해 보세요{
383testSet.추가기록("인용문'\"");
384}잡기(...) {
385sawException =;
386}
387 if(!sawException)
388cout <<"*** 레코드에 작은따옴표와 큰따옴표를 추가하는 것은 불가능해야 합니다."<< endl;
389 반환1;
390}
391
392테스트DB.do내보내기("test.gdx");
393}잡기 (슬롯 나라예외&ex)
394cout <<"슬롯 나라예외 발생: "<< ex.what() << endl;
395}잡기(예외 &ex)
396cout << ex.what() << endl;
397}
398
399 반환0;
400}
std::벡터< GAMSDatabaseDomainViolation > getDatabaseDVs(int maxViol=0, int maxViolPerSym=0)
GAMSSet addSet(const std::string &name, const int 차원, const std::string &explanatoryText="", GAMSEnum::SetType setType=GAMSEnum::SetType::Multi)
GAMSParameter addParameter(const std::string &name, const int 차원, const std::string &explanatoryText="")
void doExport(const std::string &filePath="")
GAMSSet getSet(const std::string &name)
GAMSParameter getParameter(const std::string &name)
void setSuppressAutoDomainChecking(bool value)
슬롯 나라데이터베이스 outDB()
void setValue(const double val)
GAMSParameterRecord addRecord(const std::벡터< std::string > &keys)
void setText(const std::string &text)
std::string 텍스트()
GAMSSetRecord findRecord(const std::벡터< std::string > &keys)
GAMSSetRecord addRecord(const std::벡터< std::string > &keys)
std::벡터< GAMSSymbolDomainViolation > getSymbolDVs(int maxViol=0)
std::string & name() const
std::벡터< GAMSDomain > 도메인()
void setSystemDirectory(const std::string &systemDir)
GAMSJob addJobFromString(const std::string &gamsSource, const std::string &jobName="")
GAMSDatabase addDatabase(const std::string &databaseName="", const std::string &inModelName="")
GAMSDatabase addDatabaseFromGDX(const std::string &gdxFileName, const std::string &databaseName, const std::string &inModelName)
int main(int argc, char *argv[])
std::string getDataText()