1 | from typing import List
|
---|
2 |
|
---|
3 | from tudelft_utilities_logging.Reporter import Reporter
|
---|
4 |
|
---|
5 | from geniusweb.deadline.Deadline import Deadline
|
---|
6 | from geniusweb.protocol.session.SessionProtocol import SessionProtocol
|
---|
7 | from geniusweb.protocol.session.SessionSettings import SessionSettings
|
---|
8 | from geniusweb.protocol.session.TeamInfo import TeamInfo
|
---|
9 |
|
---|
10 | from geniusweb.references.PartyWithProfile import PartyWithProfile
|
---|
11 |
|
---|
12 |
|
---|
13 | class SAOPSettings(SessionSettings):
|
---|
14 |
|
---|
15 | def __init__(self, participants:List[TeamInfo], deadline:Deadline ):
|
---|
16 | '''
|
---|
17 | @param participants the list of {@link PartyWithProfile} in clockwise
|
---|
18 | order. There must be at least 2 to run the SAOP
|
---|
19 | protocol. But SAOP can be initialized with less, for
|
---|
20 | use in TournamentSettings.
|
---|
21 | @param deadline the deadline of the negotiation
|
---|
22 | '''
|
---|
23 | self._participants = participants;
|
---|
24 | self._deadline = deadline;
|
---|
25 | if participants == None:
|
---|
26 | raise ValueError("participants must not be null")
|
---|
27 | if deadline == None:
|
---|
28 | raise ValueError("deadline must not be null")
|
---|
29 |
|
---|
30 | def getMaxRunTime(self) -> float:
|
---|
31 | return self._deadline.getDuration() / 1000.
|
---|
32 |
|
---|
33 | def getProtocol(self, logger:Reporter ) -> SessionProtocol :
|
---|
34 | # avoid circular imports
|
---|
35 | from geniusweb.protocol.session.saop.SAOP import SAOP
|
---|
36 | from geniusweb.protocol.session.saop.SAOPState import SAOPState
|
---|
37 | return SAOP(SAOPState([],[],None, self), logger)
|
---|
38 |
|
---|
39 | def getParticipants(self) -> List[TeamInfo] :
|
---|
40 | return list(self._participants)
|
---|
41 |
|
---|
42 | def getTeams(self) -> List[TeamInfo] :
|
---|
43 | return list(self._participants)
|
---|
44 |
|
---|
45 | def getDeadline(self)->Deadline :
|
---|
46 | '''
|
---|
47 | @return the deadline for this negotiation
|
---|
48 | '''
|
---|
49 | return self._deadline
|
---|
50 |
|
---|
51 | def getAllParties(self) -> List[PartyWithProfile] :
|
---|
52 | return [particip.getParties()[0] for particip in self._participants ]
|
---|
53 |
|
---|
54 | def getTeamSize(self) -> int:
|
---|
55 | return 1
|
---|
56 |
|
---|
57 | def __repr__(self)->str:
|
---|
58 | return "SAOPSettings" + str(self._participants) + "," + str(self._deadline) + "]"
|
---|
59 |
|
---|
60 | def __hash__(self):
|
---|
61 | return hash((self._deadline, tuple(self._participants)))
|
---|
62 |
|
---|
63 | def __eq__(self, other):
|
---|
64 | return isinstance(other, self.__class__) \
|
---|
65 | and self._deadline == other._deadline and self._participants==other._participants
|
---|
66 |
|
---|
67 | def With(self, team:TeamInfo) -> SessionSettings :
|
---|
68 | if team.getSize() != 1:
|
---|
69 | raise ValueError("Team must be size 1 but found " + str(team));
|
---|
70 | newparts = list(self._participants)
|
---|
71 | newparts.append(team)
|
---|
72 | return SAOPSettings(newparts, self._deadline)
|
---|
73 |
|
---|