[100] | 1 | from typing import List, Set, Optional
|
---|
| 2 |
|
---|
| 3 | from geniusweb import profile
|
---|
| 4 | from geniusweb.bidspace.pareto.ParetoFrontier import ParetoFrontier
|
---|
| 5 | from geniusweb.bidspace.pareto.PartialPareto import PartialPareto
|
---|
| 6 | from geniusweb.issuevalue.Bid import Bid
|
---|
| 7 | from geniusweb.profile.Profile import Profile
|
---|
| 8 | from geniusweb.profile.utilityspace.LinearAdditive import LinearAdditive
|
---|
| 9 |
|
---|
| 10 |
|
---|
| 11 | class ParetoLinearAdditive(ParetoFrontier):
|
---|
| 12 | '''
|
---|
| 13 | pareto frontier implementation for {@link LinearAdditive}. This is a highly
|
---|
| 14 | optimized pareto method for {@link LinearAdditive} spaces
|
---|
| 15 | '''
|
---|
| 16 |
|
---|
| 17 | def __init__(self, utilSpaces:List[LinearAdditive]):
|
---|
| 18 | '''
|
---|
| 19 | @param utilSpaces. Must contain at least two {@link LinearAdditive}s and
|
---|
| 20 | all must be defined on the same donain.
|
---|
| 21 | '''
|
---|
| 22 | if utilSpaces == None or len(utilSpaces) < 2:
|
---|
| 23 | raise ValueError("utilSpaces must contain at least 2 spaces")
|
---|
| 24 |
|
---|
| 25 | domain = utilSpaces[0].getDomain()
|
---|
| 26 | for space in utilSpaces:
|
---|
| 27 | if not space.getDomain() == domain:
|
---|
| 28 | raise ValueError(
|
---|
| 29 | "Expected all spaces using domain " + domain.getName()
|
---|
| 30 | +" but found " + space.getDomain().getName());
|
---|
| 31 | self._utilSpaces = utilSpaces
|
---|
| 32 | self._points:Optional[Set[Bid] ] = None
|
---|
| 33 |
|
---|
| 34 | # Override
|
---|
| 35 | def getProfiles(self) -> List[Profile]:
|
---|
| 36 | return list(self._utilSpaces)
|
---|
| 37 |
|
---|
| 38 | # Override
|
---|
| 39 | def getPoints(self) -> Set[Bid]:
|
---|
| 40 | if self._points == None:
|
---|
| 41 | self._points = self._computePareto()
|
---|
| 42 | return self._points # type:ignore
|
---|
| 43 |
|
---|
| 44 | # Override
|
---|
| 45 | def toString(self) -> str:
|
---|
| 46 | return "Pareto " + str(self.getPoints())
|
---|
| 47 |
|
---|
| 48 | def _computePareto(self) -> Set[Bid]:
|
---|
| 49 | issues:List[str] = list(self._utilSpaces[0].getDomain().getIssues())
|
---|
| 50 | partial = PartialPareto.create(self._utilSpaces, issues)
|
---|
| 51 | return set([ point.getBid() for point in partial.getPoints() ])
|
---|