1 | from typing import List, Dict, Set, Optional
|
---|
2 |
|
---|
3 | from geniusweb.actions.Action import Action
|
---|
4 | from geniusweb.actions.LearningDone import LearningDone
|
---|
5 | from geniusweb.actions.PartyId import PartyId
|
---|
6 | from geniusweb.inform.Agreements import Agreements
|
---|
7 | from geniusweb.progress.Progress import Progress
|
---|
8 | from geniusweb.protocol.ProtocolException import ProtocolException
|
---|
9 | from geniusweb.protocol.session.DefaultSessionState import DefaultSessionState
|
---|
10 | from geniusweb.protocol.session.SessionResult import SessionResult
|
---|
11 | from geniusweb.protocol.session.learn.LearnSettings import LearnSettings
|
---|
12 | from geniusweb.references.PartyWithProfile import PartyWithProfile
|
---|
13 |
|
---|
14 |
|
---|
15 | class LearnState (DefaultSessionState["LearnState", "LearnSettings"]):
|
---|
16 | '''
|
---|
17 | Stores the state for Learn protocol. Immutable.
|
---|
18 | '''
|
---|
19 |
|
---|
20 | def __init__(self, actions:List[Action] , conns:List[PartyId] ,
|
---|
21 | progress:Optional[Progress] , settings:LearnSettings ,
|
---|
22 | partyprofiles:Dict[PartyId, PartyWithProfile]={},
|
---|
23 | e:Optional[ProtocolException]=None):
|
---|
24 | '''
|
---|
25 | @param actions the actions done by the parties
|
---|
26 | @param conns the existing party connections. we assume ownership
|
---|
27 | of this so it should not be modified although
|
---|
28 | connections may of course break. If null, default
|
---|
29 | empty list is used. Can be less than 2 parties in
|
---|
30 | the first phases of the setup.
|
---|
31 | @param progress the {@link Progress} line. can be null
|
---|
32 | @param settings the {@link LearnSettings}
|
---|
33 | @param partyprofiles map with the {@link PartyWithProfile} for connected
|
---|
34 | parties.
|
---|
35 | @param e the {@link ProtocolException}, or null if none
|
---|
36 | occurred.
|
---|
37 | '''
|
---|
38 |
|
---|
39 | super().__init__(actions, conns, progress, settings, partyprofiles, e)
|
---|
40 |
|
---|
41 | # def LearnState(LearnSettings settings) {
|
---|
42 | # '''
|
---|
43 | # Creates the initial state from the given settings and progress=null
|
---|
44 | #
|
---|
45 | # @param settings the {@link LearnSettings}
|
---|
46 | # '''
|
---|
47 | # this(Collections.emptyList(), Collections.emptyList(), null, settings,
|
---|
48 | # null, null);
|
---|
49 | #
|
---|
50 | # }
|
---|
51 |
|
---|
52 | def With(self, actions:List[Action] , conns:List[PartyId],
|
---|
53 | progr:Optional[Progress] , settings:LearnSettings,
|
---|
54 | partyprofiles:Dict[PartyId, PartyWithProfile] ,
|
---|
55 | e:Optional[ProtocolException]) -> "LearnState":
|
---|
56 | return LearnState(actions, conns, progr, settings, partyprofiles,
|
---|
57 | e)
|
---|
58 |
|
---|
59 | def getAgreements(self) -> Agreements:
|
---|
60 | return Agreements()
|
---|
61 |
|
---|
62 | def getResults(self) -> List[SessionResult]:
|
---|
63 | return [SessionResult(self.getPartyProfiles(), self.getAgreements(),
|
---|
64 | {}, None)]
|
---|
65 |
|
---|
66 | def isFinal(self, currentTimeMs:int) -> bool:
|
---|
67 | done = self._getDoneLearning()
|
---|
68 | # if done is empty we're probably still starting up.
|
---|
69 | return super().isFinal(currentTimeMs)\
|
---|
70 | or (len(done) != 0 and set(self.getConnections()).issubset(done))
|
---|
71 |
|
---|
72 | def WithException(self, e:ProtocolException) -> "LearnState":
|
---|
73 | '''
|
---|
74 | @param e the error that occured
|
---|
75 | @return a new state with the error set.
|
---|
76 | '''
|
---|
77 | return LearnState(self.getActions(), self.getConnections(), self.getProgress(),
|
---|
78 | self.getSettings(), self.getPartyProfiles(), e)
|
---|
79 |
|
---|
80 | def checkAction(self, actor:PartyId , action:Action) -> Optional[str]:
|
---|
81 | '''
|
---|
82 | @param actor the known real actor that did this action
|
---|
83 | @param action an {@link Action}
|
---|
84 | @return null if action seems ok, or message explaining why not.
|
---|
85 | '''
|
---|
86 | msg = super().checkAction(actor, action)
|
---|
87 | if msg != None:
|
---|
88 | return msg
|
---|
89 | if actor in self._getDoneLearning():
|
---|
90 | return "actor already was done learning"
|
---|
91 | if not isinstance(action, LearningDone):
|
---|
92 | return "Action " + str(action) + " is not allowed"
|
---|
93 | return None
|
---|
94 |
|
---|
95 | def _getDoneLearning(self) -> Set[PartyId]:
|
---|
96 | '''
|
---|
97 | @return set of parties that reported they are done with learning.
|
---|
98 | '''
|
---|
99 | return set([party.getActor() for party in self.getActions() ])
|
---|
100 |
|
---|