source: src/main/java/agents/qoagent2/QMessages.java@ 126

Last change on this file since 126 was 126, checked in by Aron Hammond, 6 years ago

Added function to calculate opposition to MultiLateralAnalysis.java

Moved code to add RLBOA listeners to RLBOAUtils is misc package

Added input for strategyParameters to SessionPanel (gui)

!! close SessionInfo after tournament; this caused /tmp/ to fill up with GeniusData files

Our own package:

  • Added opponents and strategies that are mentioned in the report
  • Change class hierarchy, agents can now extend from RLBOAagentBilateral to inherit RL functionality.
  • States extend from AbstractState
File size: 16.2 KB
RevLine 
[126]1package agents.qoagent2;
2
3import java.util.StringTokenizer;
4
5/*
6 * Created on 30/05/2004
7 *
8 */
9
10/**
11 * @author raz
12 * @version 1.0
13 * @see QOAgent
14 * @see QCommunication
15 */
16public class QMessages
17{
18 // constants for probability receiveMessage
19 public final static int MESSAGE_RECEIVED = 0;
20 public final static int MESSAGE_REJECTED = 1;
21
22 public final static int REGISTER = 0;
23 public final static int THREAT = 1;
24 public final static int COMMENT = 2;
25 public final static int OFFER = 3;
26 public final static int PROMISE = 4;
27 public final static int QUERY = 5;
28 public final static int ACCEPT = 6;
29 public final static int REJECT = 7;
30 public final static int OPT_OUT = 8;
31 public final static int COUNTER_OFFER = 9;
32
33 private QOAgent m_agent;
34
35 /**
36 * @param agent - saves the QOAgent in the member variable
37 */
38 public QMessages(QOAgent agent)
39 {
40 m_agent = agent;
41 }
42
43 /**
44 * Formats the message in the predefined structure for sending it
45 * later to the server
46 * @param nMessageKind - the message kind. Can be either:
47 * REGISTER, THREAT, COMMENT, OFFER, PROMISE, QUERY, ACCEPT, REJECT, OPT_OUT, COUNTER_OFFER.
48 * @param sMsgBody - the message body: additional data for creating the message.
49 * sMsgBody differs for the different message types
50 * @return the formatted message
51 * @see QOAgent
52 * @see QCommunication
53 */
54 public String formatMessage(int nMessageKind, String sMsgBody)
55 {
56 String sFormattedMsg = "";
57
58 switch (nMessageKind)
59 {
60 case REGISTER:
61 {
62 sFormattedMsg = "type register tag " + m_agent.getMsgId() + " id " +
63 sMsgBody + " side " + m_agent.getAgentSide() + " name " + m_agent.getAgentName() +
64 " supportMediator " + m_agent.getSupportMediator() +
65 " preferenceDetails automatedAgent";
66 ;
67 }
68 break;
69 case THREAT:
70 {
71 sFormattedMsg = "type threat" +
72 " source " + m_agent.getAgentId() +
73 " target " + m_agent.getOpponentAgentId() +
74 " tag " + m_agent.getMsgId() +
75 " body "+ sMsgBody;
76 }
77 break;
78 case COMMENT:
79 {
80 sFormattedMsg = "type comment" +
81 " source " + m_agent.getAgentId() +
82 " target " + m_agent.getOpponentAgentId() +
83 " tag " + m_agent.getMsgId() +
84 " body "+ sMsgBody;
85 }
86 break;
87 case OFFER:
88 {
89 sFormattedMsg = "type offer" +
90 " source " + m_agent.getAgentId() +
91 " target " + m_agent.getOpponentAgentId() +
92 " tag " + m_agent.getMsgId() +
93 " issueSet ";
94
95 sFormattedMsg += sMsgBody;
96 }
97 break;
98 case COUNTER_OFFER:
99 {
100 sFormattedMsg = "type counter_offer" +
101 " source " + m_agent.getAgentId() +
102 " target " + m_agent.getOpponentAgentId() +
103 " tag " + m_agent.getMsgId() +
104 " issueSet ";
105
106 sFormattedMsg += sMsgBody;
107 }
108 break;
109 case PROMISE:
110 {
111 sFormattedMsg = "type promise" +
112 " source " + m_agent.getAgentId() +
113 " target " + m_agent.getOpponentAgentId() +
114 " tag " + m_agent.getMsgId();
115
116 // build the agent's issue set
117 String sAgentPromise = " myIssueSet ";
118
119 // NOTE: In our scenario there are no actions
120 // that only for one side.
121 // We do not use the option of myIssueSet and yourIssueSet
122 sAgentPromise += sMsgBody;
123
124 /*
125 QPromiseType agentPromise = m_agent.getPromiseList();
126
127 String sAttribute, sValue;
128 ArrayList agentPromiseList = (ArrayList)agentPromise.agentIssueSet;
129 for (int i = 0; i < agentPromiseList.size(); ++i)
130 {
131 QAttributeValue av = (QAttributeValue)agentPromiseList.get(i);
132 sAttribute = av.sAttribute;
133 sValue= av.sValue;
134
135 sAgentPromise += sValue + "*" + sAttribute + "*";
136 }
137 */
138 sFormattedMsg += sAgentPromise + " ";
139
140 // build the opponent's issue set
141 String sOpponentPromise = "yourIssueSet ";
142
143 /*
144 ArrayList opponentPromiseList = (ArrayList)agentPromise.opponentIssueSet;
145
146 for (int i = 0; i < opponentPromiseList.size(); ++i)
147 {
148 QAttributeValue av = (QAttributeValue)opponentPromiseList.get(i);
149 sAttribute = av.sAttribute;
150 sValue= av.sValue;
151
152 sOpponentPromise += sValue + "*" + sAttribute + "*";
153 }
154 */
155 sFormattedMsg += sOpponentPromise;
156 }
157 break;
158 case QUERY:
159 {
160 sFormattedMsg = "type query" +
161 " source " + m_agent.getAgentId() +
162 " target " + m_agent.getOpponentAgentId() +
163 " tag " + m_agent.getMsgId() +
164 " issueSet ";
165
166 sFormattedMsg += sMsgBody;
167 }
168 break;
169 case ACCEPT:
170 {
171 sFormattedMsg = "type response" +
172 " source " + m_agent.getAgentId() +
173 " target " + m_agent.getOpponentAgentId() +
174 " tag " + m_agent.getMsgId() +
175 " answer AGREE" +
176 " message " + sMsgBody +
177 " reason "; // NOTE: No reason is supplied;
178
179 // save accepted msg
180 String sResponse = sFormattedMsg.substring(sFormattedMsg.indexOf("answer ")+7, sFormattedMsg.indexOf("reason")-1);
181 String sMessage = sResponse.substring(sResponse.indexOf("message ") + 8);
182
183 //TODO: Do more than just save accepted offer?
184
185 // message accepted - save message
186 // parse message by its type (offer, promise, query)
187 String sSavedMsg = "";
188 if (sMessage.startsWith("type query"))
189 sSavedMsg = sMessage.substring(sMessage.indexOf("issueSet ") + 9);
190 else if (sMessage.startsWith("type counter_offer"))
191 sSavedMsg = sMessage.substring(sMessage.indexOf("issueSet ") + 9);
192 else if (sMessage.startsWith("type offer"))
193 sSavedMsg = sMessage.substring(sMessage.indexOf("issueSet ") + 9);
194 else if (sMessage.startsWith("type promise"))
195 {
196 String sPromise = sMessage.substring(sMessage.indexOf("myIssueSet ") + 11);
197 String sMyIssueSet = sPromise.substring(0, sPromise.indexOf("yourIssueSet "));
198 String sYourIssueSet = sPromise.substring(sPromise.indexOf("yourIssueSet ") + 13);
199
200 // parse to one agreement
201 sSavedMsg = sMyIssueSet + sYourIssueSet;
202 }
203
204 // only if accepted an offer - save it
205 if ( sMessage.startsWith("type counter_offer") || sMessage.startsWith("type offer"))
206 m_agent.saveAcceptedMsg(sSavedMsg);
207 }
208 break;
209 case REJECT:
210 {
211 sFormattedMsg = "type response" +
212 " source " + m_agent.getAgentId() +
213 " target " + m_agent.getOpponentAgentId() +
214 " tag " + m_agent.getMsgId() +
215 " answer DISAGREE" +
216 " message " + sMsgBody +
217 " reason "; // NOTE: No reason is supplied
218 }
219 break;
220 case OPT_OUT:
221 {
222 sFormattedMsg = "type opt-out tag " + m_agent.getMsgId();
223 }
224 break;
225 default:
226 {
227 System.out.println("[QO]ERROR: Invalid message kind: " + nMessageKind + " [QMessages::formatMessage(199)]");
228 System.err.println("[QO]ERROR: Invalid message kind: " + nMessageKind + " [QMessages::formatMessage(199)]");
229 }
230 break;
231 }
232
233 return sFormattedMsg;
234 }
235
236 /**
237 * Parses messages from the server.
238 * NOTE: There is no validation that this agent is the
239 * target for the message. Assuming correctness of server routing messages.
240 * @param sServerLine - the server's message
241 * @return the parsed string - relevant only if "nak"
242 * @see QOAgent
243 * @see QCommunication
244 */
245 public String parseMessage(String sServerLine)
246 {
247 String sParsedString = "";
248
249 if (sServerLine.startsWith("type comment"))
250 {
251 String sComment=sServerLine.substring(sServerLine.indexOf(" body ")+6);
252
253 // TODO: use comments?
254 }
255 else if (sServerLine.startsWith("type threat"))
256 {
257 String sThreat=sServerLine.substring(sServerLine.indexOf(" body ")+6);
258
259 // TODO: use threats?
260 }
261 else if (sServerLine.startsWith("type endTurn"))
262 {
263 // turn ended
264 m_agent.incrementCurrentTurn();
265 }
266 else if (sServerLine.startsWith("type endNegotiation"))
267 {
268 // negotiation ended
269 m_agent.m_gtStopTurn.setRun(false);
270 m_agent.m_gtStopNeg.setRun(false);
271
272 String sEndNegDetails = sServerLine.substring(sServerLine.indexOf("whyEnded"));
273
274 System.out.println("[QO]Negotiation Ended");
275 System.err.println("[QO]Negotiation Ended");
276
277 m_agent.endNegotiation();
278
279 // NOTE: no need to parse the end reason, agreement
280 // and score. They are saved in the file.
281 }
282 else if (sServerLine.startsWith("type response"))
283 {
284 String sResponse = sServerLine.substring(sServerLine.indexOf("answer ")+7, sServerLine.indexOf("reason")-1);
285 String sAnswerType = sResponse.substring(0,sResponse.indexOf(" "));
286 String sMessage = sResponse.substring(sResponse.indexOf("message ") + 8);
287
288 String sReason = sServerLine.substring(sServerLine.indexOf("reason ") + 7);
289
290 if(sAnswerType.equals("AGREE"))
291 {
292 //TODO: Do more than just save accepted offer?
293
294 // message accepted - save message
295 // parse message by its type (offer, promise, query)
296 String sSavedMsg = "";
297 if (sMessage.startsWith("type query"))
298 sSavedMsg = sMessage.substring(sMessage.indexOf("issueSet ") + 9);
299 else if (sMessage.startsWith("type counter_offer"))
300 sSavedMsg = sMessage.substring(sMessage.indexOf("issueSet ") + 9);
301 else if (sMessage.startsWith("type offer"))
302 sSavedMsg = sMessage.substring(sMessage.indexOf("issueSet ") + 9);
303 else if (sMessage.startsWith("type promise"))
304 {
305 String sPromise = sMessage.substring(sMessage.indexOf("myIssueSet ") + 11);
306 String sMyIssueSet = sPromise.substring(0, sPromise.indexOf("yourIssueSet "));
307 String sYourIssueSet = sPromise.substring(sPromise.indexOf("yourIssueSet ") + 13);
308
309 // parse to one agreement
310 sSavedMsg = sMyIssueSet + sYourIssueSet;
311 }
312
313 // only if accepted an offer - save it
314 // TODO: if our agent send queries/promises - need to offer it now [if it's still worthwhile for us]
315 if ( sMessage.startsWith("type counter_offer") || sMessage.startsWith("type offer"))
316 m_agent.saveAcceptedMsg(sSavedMsg);
317 }
318 else if(sAnswerType.equals("DISAGREE"))
319 {
320 // message rejected
321 // parse message by its type (offer, promise, query)
322 String sSavedMsg = "";
323 int nMessageType = -1;
324 if (sMessage.startsWith("type query"))
325 {
326 sSavedMsg = sMessage.substring(sMessage.indexOf("issueSet ") + 9);
327 nMessageType = QUERY;
328 }
329 else if (sMessage.startsWith("type counter_offer"))
330 {
331 nMessageType = OFFER;
332 sSavedMsg = sMessage.substring(sMessage.indexOf("issueSet ") + 9);
333 }
334 else if (sMessage.startsWith("type offer"))
335 {
336 nMessageType = OFFER;
337 sSavedMsg = sMessage.substring(sMessage.indexOf("issueSet ") + 9);
338 }
339 else if (sMessage.startsWith("type promise"))
340 {
341 nMessageType = PROMISE;
342 String sPromise = sMessage.substring(sMessage.indexOf("myIssueSet ") + 11);
343 String sMyIssueSet = sPromise.substring(0, sPromise.indexOf("yourIssueSet "));
344 String sYourIssueSet = sPromise.substring(sPromise.indexOf("yourIssueSet ") + 13);
345
346 // parse to one agreement
347 sSavedMsg = sMyIssueSet + sYourIssueSet;
348 }
349
350 // receiveMessage opponent's probability
351 int CurrentAgreementIdx[] = new int[QAgentType.MAX_ISSUES];
352 CurrentAgreementIdx = m_agent.getAgreementIndices(sSavedMsg);
353
354 // Update probability of opponent based on message
355 m_agent.updateOpponentProbability(CurrentAgreementIdx, nMessageType, MESSAGE_REJECTED);
356 }
357 }
358 else if (sServerLine.startsWith("type registered"))
359 {
360 String sSecsForTurn = sServerLine.substring(sServerLine.indexOf("secForTurn ")+11);
361 StringTokenizer st = new StringTokenizer(sSecsForTurn);
362
363 long lSecondsForTurn = Long.parseLong(st.nextToken());
364 m_agent.setSecondsForTurn(lSecondsForTurn);
365
366 String sMaxTurns=sServerLine.substring(sServerLine.indexOf("maxTurn ")+8);
367 st = new StringTokenizer(sMaxTurns);
368 m_agent.setMaxTurns(Integer.parseInt(st.nextToken()));
369
370 long lTotalSec=lSecondsForTurn;
371 int nHours=(int)lTotalSec/3600;
372
373 lTotalSec -= nHours*3600;
374 int nMinutes=(int)lTotalSec/60;
375
376 lTotalSec -= nMinutes*60;
377
378 m_agent.m_gtStopTurn = new QGameTime(false,nHours,nMinutes,(int)lTotalSec,m_agent,true);
379 m_agent.m_gtStopTurn.newGame(); // initializing the stop-watch
380
381 new Thread(m_agent.m_gtStopTurn).start();
382
383 lTotalSec=lSecondsForTurn * m_agent.getMaxTurns();
384 nHours=(int)lTotalSec/3600;
385
386 lTotalSec -= nHours*3600;
387 nMinutes=(int)lTotalSec/60;
388
389 lTotalSec -= nMinutes*60;
390
391 m_agent.m_gtStopNeg = new QGameTime(false,nHours,nMinutes,(int)lTotalSec,m_agent,false);
392 m_agent.m_gtStopNeg.newGame(); // initializing the stop-watch
393
394 new Thread(m_agent.m_gtStopNeg).start();
395
396 String sAgentID = sServerLine.substring(sServerLine.indexOf("agentID ")+8);
397
398 m_agent.setHasOpponent(true, sAgentID);
399
400 m_agent.calculateFirstOffer();
401 }
402 else if (sServerLine.startsWith("type agentOptOut"))
403 {
404 m_agent.setHasOpponent(false, null);
405
406 m_agent.m_gtStopTurn.setRun(false);
407 m_agent.m_gtStopNeg.setRun(false);
408 }
409 else if (sServerLine.equals("type log request error"))
410 {
411 // not relevant for the QOAgent
412 }
413 else if (sServerLine.startsWith("type log response"))
414 {
415 // not relevant for the QOAgent
416 }
417 else if (sServerLine.startsWith("type query"))
418 {
419 // query received
420
421 // get message id
422 String sMsgId;
423 StringTokenizer st = new StringTokenizer(sServerLine);
424
425 boolean bFound = false;
426 while (st.hasMoreTokens() && !bFound)
427 {
428 if (st.nextToken().equals("tag"))
429 {
430 bFound = true;
431 sMsgId = st.nextToken();
432 }
433 }
434
435 String sQuery=sServerLine.substring(sServerLine.indexOf("issueSet ")+9);
436
437 int CurrentAgreementIdx[] = new int[QAgentType.MAX_ISSUES];
438 CurrentAgreementIdx = m_agent.getAgreementIndices(sQuery);
439
440 m_agent.calculateResponse(QUERY, CurrentAgreementIdx, sServerLine);
441 }
442 else if (sServerLine.startsWith("type counter_offer"))
443 {
444 // counter_offer received
445
446 // get message id
447 String sMsgId;
448 StringTokenizer st = new StringTokenizer(sServerLine);
449
450 boolean bFound = false;
451 while (st.hasMoreTokens() && !bFound)
452 {
453 if (st.nextToken().equals("tag"))
454 {
455 bFound = true;
456 sMsgId = st.nextToken();
457 }
458 }
459
460 String sOffer=sServerLine.substring(sServerLine.indexOf("issueSet ")+9);
461
462 int CurrentAgreementIdx[] = new int[QAgentType.MAX_ISSUES];
463 CurrentAgreementIdx = m_agent.getAgreementIndices(sOffer);
464 m_agent.calculateResponse(COUNTER_OFFER, CurrentAgreementIdx, sServerLine);
465 }
466 else if (sServerLine.startsWith("type offer"))
467 {
468 // offer received
469
470 // get message id
471 String sMsgId;
472 StringTokenizer st = new StringTokenizer(sServerLine);
473
474 boolean bFound = false;
475 while (st.hasMoreTokens() && !bFound)
476 {
477 if (st.nextToken().equals("tag"))
478 {
479 bFound = true;
480 sMsgId = st.nextToken();
481 }
482 }
483
484 String sOffer=sServerLine.substring(sServerLine.indexOf("issueSet ")+9);
485
486 int CurrentAgreementIdx[] = new int[QAgentType.MAX_ISSUES];
487 CurrentAgreementIdx = m_agent.getAgreementIndices(sOffer);
488
489 m_agent.calculateResponse(OFFER, CurrentAgreementIdx, sServerLine);
490 }
491 else if (sServerLine.startsWith("type promise"))
492 {
493 // promise received
494
495 // get message id
496 String sMsgId;
497 StringTokenizer st = new StringTokenizer(sServerLine);
498
499 boolean bFound = false;
500 while (st.hasMoreTokens() && !bFound)
501 {
502 if (st.nextToken().equals("tag"))
503 {
504 bFound = true;
505 sMsgId = st.nextToken();
506 }
507 }
508
509 String sPromise=sServerLine.substring(sServerLine.indexOf("myIssueSet ")+11);
510 String sMyIssueSet=sPromise.substring(0,sPromise.indexOf("yourIssueSet "));
511 String sYourIssueSet=sPromise.substring(sPromise.indexOf("yourIssueSet ")+13);
512
513 // parse to one agreement
514 int CurrentAgreementIdxMine[] = new int[QAgentType.MAX_ISSUES];
515 int CurrentAgreementIdxYours[] = new int[QAgentType.MAX_ISSUES];
516 CurrentAgreementIdxMine = m_agent.getAgreementIndices(sMyIssueSet);
517 CurrentAgreementIdxYours = m_agent.getAgreementIndices(sYourIssueSet);
518
519 // combine indices
520 for (int i = 0; i < QAgentType.MAX_ISSUES; ++i)
521 {
522 if (CurrentAgreementIdxYours[i] != QAgentType.NO_VALUE)
523 CurrentAgreementIdxMine[i] = CurrentAgreementIdxYours[i];
524 }
525
526 m_agent.calculateResponse(PROMISE, CurrentAgreementIdxMine, sServerLine);
527 }
528 else if (sServerLine.equals("nak") || sServerLine.equals("ack"))
529 {
530 sParsedString = sServerLine;
531 }
532 else // other unknown message
533 {
534 System.out.println("[QO]Unknown Message Error: " + sServerLine + " [QMessages::parseMessage(470)]");
535 System.err.println("[QO]Unknown Message Error: " + sServerLine + " [QMessages::parseMessage(470)]");
536
537 sParsedString = sServerLine;
538 }
539
540 return sParsedString;
541 }
542}
Note: See TracBrowser for help on using the repository browser.