1 | from typing import List
|
---|
2 | from uuid import UUID
|
---|
3 |
|
---|
4 | from tudelft_utilities_logging.Reporter import Reporter
|
---|
5 |
|
---|
6 | from geniusweb.deadline.Deadline import Deadline
|
---|
7 | from geniusweb.protocol.session.SessionProtocol import SessionProtocol
|
---|
8 | from geniusweb.protocol.session.SessionSettings import SessionSettings
|
---|
9 | from geniusweb.protocol.session.TeamInfo import TeamInfo
|
---|
10 | from geniusweb.references.PartyWithProfile import PartyWithProfile
|
---|
11 |
|
---|
12 |
|
---|
13 | class LearnSettings(SessionSettings):
|
---|
14 | '''
|
---|
15 | Settings for learn protocol.
|
---|
16 | '''
|
---|
17 |
|
---|
18 | def __init__(self, participants:List[TeamInfo] , deadline:Deadline) :
|
---|
19 | '''
|
---|
20 | @param participants the list of {@link PartyWithProfile} in clockwise
|
---|
21 | order. There must be at least 2 to run the SAOP
|
---|
22 | protocol. But SAOP can be initialized with less, for
|
---|
23 | use in TournamentSettings.
|
---|
24 | <table>
|
---|
25 | <caption>Required parameters</caption>
|
---|
26 | <tr>
|
---|
27 | <td>persistentstate</td>
|
---|
28 | <td>a {@link FileLocation}, serialized as json eg
|
---|
29 | <code>"b29f3bf5-1dc4-499e-a676-7b2dbb864a03"</code> ,
|
---|
30 | where the party's persistant state is stored; this
|
---|
31 | must match the persistantstate used in earlier calls
|
---|
32 | for e.g. {@link SAOPSettings}.</td>
|
---|
33 | </tr>
|
---|
34 |
|
---|
35 | <tr>
|
---|
36 | <td>negotiationdata</td>
|
---|
37 | <td>a List of {@link FileLocation}s, serialized as
|
---|
38 | json, matching the negotiationdata used in earlier
|
---|
39 | calls for eg {@link SAOPSettings}.</td>
|
---|
40 | </tr>
|
---|
41 | </table>
|
---|
42 | @param deadline the deadline of the negotiation.
|
---|
43 | '''
|
---|
44 | self._participants = participants
|
---|
45 | self._deadline = deadline
|
---|
46 | if participants == None:
|
---|
47 | raise ValueError("participants must not be null")
|
---|
48 | if deadline == None:
|
---|
49 | raise ValueError("deadline must not be null")
|
---|
50 |
|
---|
51 | for pwithp in self.getAllParties():
|
---|
52 | params = pwithp.getParty().getParameters()
|
---|
53 | statestr = params.get("persistentstate")
|
---|
54 | if not isinstance(statestr , str):
|
---|
55 | raise ValueError(
|
---|
56 | "persistentstate parameter containing UUID string is required, but found "\
|
---|
57 | + str(statestr))
|
---|
58 | # check that it contains a UUID. Don't store it, we don't need
|
---|
59 | # it.
|
---|
60 | UUID(statestr)
|
---|
61 |
|
---|
62 | # and check the negotiationdata
|
---|
63 | negotiationsstr = params.get("negotiationdata")
|
---|
64 | if not isinstance(negotiationsstr, list):
|
---|
65 | raise ValueError(
|
---|
66 | "negotiationdata parameter containing a List is required")
|
---|
67 |
|
---|
68 | for negostr in negotiationsstr:
|
---|
69 | if not isinstance(negostr,str):
|
---|
70 | raise ValueError(
|
---|
71 | "The list in negotiationdata must contain UUID strings but found "\
|
---|
72 | + str(negostr))
|
---|
73 | UUID(negostr)
|
---|
74 |
|
---|
75 | def getMaxRunTime(self)->float:
|
---|
76 | return self._deadline.getDuration() / 1000.
|
---|
77 |
|
---|
78 | def getProtocol(self, logger:Reporter )->SessionProtocol :
|
---|
79 | from geniusweb.protocol.session.learn.LearnState import LearnState
|
---|
80 | from geniusweb.protocol.session.learn.Learn import Learn
|
---|
81 | return Learn(LearnState([],[],None, self), logger)
|
---|
82 |
|
---|
83 | def getTeams(self)->List[TeamInfo] :
|
---|
84 | return list(self._participants)
|
---|
85 |
|
---|
86 | def getParticipants(self) -> List[TeamInfo] :
|
---|
87 | return list(self._participants)
|
---|
88 |
|
---|
89 | def getDeadline(self)->Deadline :
|
---|
90 | '''
|
---|
91 | @return the deadline for this negotiation
|
---|
92 | '''
|
---|
93 | return self._deadline
|
---|
94 |
|
---|
95 | def getAllParties(self)->List[PartyWithProfile] :
|
---|
96 | return [particip.getParties()[0]
|
---|
97 | for particip in self._participants ]
|
---|
98 |
|
---|
99 | def getTeamSize(self)->int:
|
---|
100 | return 1
|
---|
101 |
|
---|
102 | def __repr__(self):
|
---|
103 | return "LearnSettings" + str(self._participants) +\
|
---|
104 | "," + str(self._deadline) + "]"
|
---|
105 |
|
---|
106 | def __hash__(self):
|
---|
107 | return hash((self._deadline, tuple(self._participants)))
|
---|
108 |
|
---|
109 |
|
---|
110 | def __eq__(self, other) -> bool:
|
---|
111 | return isinstance(other, self.__class__) and \
|
---|
112 | self._participants == other._participants and \
|
---|
113 | self._deadline==other._deadline
|
---|
114 |
|
---|
115 | def With(self, team:TeamInfo)->SessionSettings :
|
---|
116 | if team.getSize() != 1:
|
---|
117 | raise ValueError(
|
---|
118 | "Team must be size 1 but found " + str(team))
|
---|
119 | newparts = list(self._participants)
|
---|
120 | newparts.append(team)
|
---|
121 | return LearnSettings(newparts, self._deadline)
|
---|