[81] | 1 | from abc import ABC, abstractmethod
|
---|
| 2 | from pyson.JsonSubTypes import JsonSubTypes
|
---|
| 3 | from pyson.JsonTypeInfo import Id, As
|
---|
| 4 | from pyson.JsonTypeInfo import JsonTypeInfo
|
---|
| 5 | from geniusweb.inform.Agreements import Agreements
|
---|
| 6 | from geniusweb.voting.CollectedVotes import CollectedVotes
|
---|
| 7 |
|
---|
| 8 |
|
---|
| 9 | @JsonSubTypes(["geniusweb.voting.votingevaluators.LargestAgreement.LargestAgreement",
|
---|
| 10 | "geniusweb.voting.votingevaluators.LargestAgreementsLoop.LargestAgreementsLoop"])
|
---|
| 11 | @JsonTypeInfo(use=Id.NAME, include=As.WRAPPER_OBJECT)
|
---|
| 12 | class VotingEvaluator(ABC) :
|
---|
| 13 | '''
|
---|
| 14 | Evaluates the {@link CollectedVotes}, determining the agreements and if the
|
---|
| 15 | negotiation should continue.
|
---|
| 16 |
|
---|
| 17 | Implementations should be immutable and not serialize internal variables (eg
|
---|
| 18 | @JsonIgnore them).
|
---|
| 19 | '''
|
---|
| 20 | @abstractmethod
|
---|
| 21 | def create(self, votes:CollectedVotes)->"VotingEvaluator" :
|
---|
| 22 | '''
|
---|
| 23 | This function is the effective constructor. This mechanism serves several
|
---|
| 24 | purposes:
|
---|
| 25 | <ul>
|
---|
| 26 | <li>It defines the constructor at interface level, so that we can ensure
|
---|
| 27 | it's available and can call it given an instance,
|
---|
| 28 | <li>We can use a (typically blank) instance of this to make more
|
---|
| 29 | instances
|
---|
| 30 | <li>You can cache intermediate results in the object for caching
|
---|
| 31 | </ul>
|
---|
| 32 |
|
---|
| 33 | @param votes the Votes made by parties in the round to be evaluated.. All
|
---|
| 34 | active parties in the negotiation must be available, even if
|
---|
| 35 | they did not vote, to ensure that {@link #isFinished()} can
|
---|
| 36 | work properly.
|
---|
| 37 |
|
---|
| 38 | @return new VotingEvaluation object containing the given votes.
|
---|
| 39 | '''
|
---|
| 40 |
|
---|
| 41 | @abstractmethod
|
---|
| 42 | def getAgreements(self)-> Agreements:
|
---|
| 43 | '''
|
---|
| 44 | @return the agreements that is contained in the current available votes.
|
---|
| 45 | The exact procedure varies with the implementation.
|
---|
| 46 | '''
|
---|
| 47 |
|
---|
| 48 | def isFinished(self )->bool:
|
---|
| 49 | '''
|
---|
| 50 | @return true iff the negotiation is finished after taking the agreement
|
---|
| 51 | returned by {@link #getAgreements()}
|
---|
| 52 | '''
|
---|
| 53 |
|
---|