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() ])

