[90] | 1 | from typing import Any, Dict, Union, Set, Optional
|
---|
| 2 | from geniusweb.issuevalue.Value import Value
|
---|
| 3 | from geniusweb.utils import toStr
|
---|
| 4 |
|
---|
| 5 | NoneType=type(None)
|
---|
| 6 |
|
---|
| 7 | class Bid:
|
---|
| 8 | def __init__(self, issuevalues:Dict[str, Value]):
|
---|
| 9 | '''
|
---|
| 10 | @param a map of issue, Value pairs. The String is the issue name.
|
---|
| 11 | '''
|
---|
| 12 | if not isinstance(issuevalues,dict):
|
---|
| 13 | raise ValueError("issuevalues must be dict, got "+str(issuevalues))
|
---|
| 14 | for (iss,val) in issuevalues.items():
|
---|
| 15 | if not isinstance(iss, str):
|
---|
| 16 | raise ValueError("Issue "+str(iss)+" must be a str")
|
---|
| 17 | if not isinstance(val, Value):
|
---|
| 18 | raise ValueError("value "+str(val)+" must be a Value, but is "+str(type(val)))
|
---|
| 19 | self._issuevalues = dict(issuevalues) #shallow copy : Value is immutable
|
---|
| 20 |
|
---|
| 21 | def getIssueValues(self) -> Dict[str, Value]:
|
---|
| 22 | '''
|
---|
| 23 | @param issue name of the issue
|
---|
| 24 | @return the value for the given issue, or null if there is no value for
|
---|
| 25 | the given issue.
|
---|
| 26 | '''
|
---|
| 27 | return self._issuevalues
|
---|
| 28 |
|
---|
| 29 | def getIssues(self)->Set[str]:
|
---|
| 30 | return set(self._issuevalues.keys())
|
---|
| 31 |
|
---|
| 32 |
|
---|
| 33 | def getValue(self, issue:str) -> Optional[Value] :
|
---|
| 34 | '''
|
---|
| 35 | @param issue name of the issue
|
---|
| 36 | @return the value for the given issue, or None if there is no value for
|
---|
| 37 | the given issue.
|
---|
| 38 | '''
|
---|
| 39 | if not issue in self._issuevalues:
|
---|
| 40 | return None
|
---|
| 41 | return self._issuevalues[issue];
|
---|
| 42 |
|
---|
| 43 | def merge(self, otherbid:"Bid")->"Bid" :
|
---|
| 44 | '''
|
---|
| 45 | this this partial bid with another partial bid.
|
---|
| 46 |
|
---|
| 47 | @param otherbid another partial bid.
|
---|
| 48 | @return a bid with the combined values of both partial bids.
|
---|
| 49 | @throws IllegalArgumentException if issues overlap.
|
---|
| 50 | '''
|
---|
| 51 | ourissues = set(self._issuevalues.keys())
|
---|
| 52 | ourissues = ourissues.intersection(otherbid.getIssues())
|
---|
| 53 | if len(ourissues)!=0:
|
---|
| 54 | raise ValueError(\
|
---|
| 55 | "Otherbid contains issues that are already set:"\
|
---|
| 56 | + str(ourissues))
|
---|
| 57 |
|
---|
| 58 | newvalues = dict(self._issuevalues)
|
---|
| 59 | newvalues.update(otherbid._issuevalues)
|
---|
| 60 | return Bid(newvalues)
|
---|
| 61 |
|
---|
| 62 | def __eq__(self, other):
|
---|
| 63 | return isinstance(other, self.__class__) and \
|
---|
| 64 | self._issuevalues == other._issuevalues
|
---|
| 65 |
|
---|
| 66 | def __repr__(self) -> str:
|
---|
| 67 | return "Bid" + toStr(self._issuevalues);
|
---|
| 68 |
|
---|
| 69 | def __hash__(self):
|
---|
| 70 | return hash((tuple(self._issuevalues.items())))
|
---|
| 71 | |
---|