Skip to content

Commit b67df08

Browse files
committed
correcting minmax for Table implementation
1 parent be8acfb commit b67df08

File tree

3 files changed

+39
-28
lines changed

3 files changed

+39
-28
lines changed

src/negmas/helpers/misc.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -147,14 +147,17 @@ def nonmonotonic_minmax(
147147
input: Iterable, f: Callable[[Any], float]
148148
) -> tuple[float, float]:
149149
"""Finds the limits of a function `f` for the input assuming that it is non-monotonic and input is iterable"""
150-
mn, mx = float("inf"), float("-inf")
151-
fmn, fmx = float("-inf"), float("inf")
152-
for x in input:
150+
_mn, _mx = None, None
151+
vals = [_ for _ in input]
152+
if not vals:
153+
return float("nan"), float("nan")
154+
fmn, fmx = float("inf"), float("-inf")
155+
for x in vals:
153156
fx = float(f(x))
154-
if fx < mn:
155-
mn, fmn = x, fx
156-
if fx > mx:
157-
mx, fmx = x, fx
157+
if fx < fmn:
158+
_mn, fmn = x, fx
159+
if fx > fmx:
160+
_mx, fmx = x, fx
158161
return fmn, fmx
159162

160163

src/negmas/inout.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -599,7 +599,9 @@ def from_genius_folder(
599599
return s.load_info(path)
600600

601601
@classmethod
602-
def load(cls, folder: Path | str, safe_parsing=False) -> Scenario | None:
602+
def load(
603+
cls, folder: Path | str, safe_parsing=False, ignore_discount=False, **kwargs
604+
) -> Scenario | None:
603605
"""
604606
Loads the scenario from a folder with supported formats: XML, YML
605607
"""
@@ -610,7 +612,12 @@ def load(cls, folder: Path | str, safe_parsing=False) -> Scenario | None:
610612
):
611613
domain, _ = finder(folder)
612614
if domain is not None:
613-
s = loader(folder, safe_parsing=safe_parsing)
615+
s = loader(
616+
folder,
617+
safe_parsing=safe_parsing,
618+
ignore_discount=ignore_discount,
619+
**kwargs,
620+
)
614621
if s is not None:
615622
return s.load_info(folder)
616623

src/negmas/preferences/value_fun.py

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,6 @@ class TableFun(BaseFun):
8585
def minmax(self, input: Issue) -> tuple[float, float]:
8686
return self._minmax(input)
8787

88-
@lru_cache
8988
def _minmax(self, input: Issue) -> tuple[float, float]:
9089
return nonmonotonic_minmax(input, self)
9190

@@ -111,13 +110,11 @@ def xml(self, indx: int, issue: Issue, bias=0.0) -> str:
111110
if issue.is_float()
112111
else "discrete"
113112
)
114-
output = f'<issue index="{indx+1}" etype="{dtype}" type="{dtype}" vtype="{vtype}" name="{issue_name}">\n'
113+
output = f'<issue index="{indx + 1}" etype="{dtype}" type="{dtype}" vtype="{vtype}" name="{issue_name}">\n'
115114
vals = issue.all
116115
for i, issue_value in enumerate(vals):
117116
uu = self(issue_value) + bias
118-
output += (
119-
f' <item index="{i+1}" value="{issue_value}" evaluation="{uu}" />\n'
120-
)
117+
output += f' <item index="{i + 1}" value="{issue_value}" evaluation="{uu}" />\n'
121118
output += "</issue>\n"
122119
return output
123120

@@ -147,7 +144,7 @@ def xml(self, indx: int, issue: Issue, bias=0.0) -> str:
147144
issue_name = issue.name
148145
if issue.is_continuous():
149146
output = f'<issue index="{indx + 1}" etype="real" type="real" vtype="real" name="{issue_name}">\n'
150-
output += f' <evaluator ftype="linear" parameter0="{bias+self.bias}" parameter1="{self.slope}"></evaluator>\n'
147+
output += f' <evaluator ftype="linear" parameter0="{bias + self.bias}" parameter1="{self.slope}"></evaluator>\n'
151148
# elif isinstance(issue, ContiguousIssue) and issue.cardinality > 50_000:
152149
# output = f'<issue index="{indx + 1}" etype="real" type="integer" vtype="integer" name="{issue_name}">\n'
153150
# output += f' <evaluator ftype="linear" parameter0="{bias+self.bias}" parameter1="{self.slope}"></evaluator>\n'
@@ -329,10 +326,10 @@ def xml(self, indx: int, issue: Issue, bias) -> str:
329326
issue_name = issue.name
330327
if issue.is_continuous():
331328
output = f'<issue index="{indx + 1}" etype="real" type="real" vtype="real" name="{issue_name}">\n'
332-
output += f' <evaluator ftype="quadratic" parameter0="{bias+self.bias}" parameter1="{self.a1} parameter2={self.a2}"></evaluator>\n'
329+
output += f' <evaluator ftype="quadratic" parameter0="{bias + self.bias}" parameter1="{self.a1} parameter2={self.a2}"></evaluator>\n'
333330
elif isinstance(issue, ContiguousIssue):
334331
output = f'<issue index="{indx + 1}" etype="integer" type="integer" vtype="integer" name="{issue_name}">\n'
335-
output += f' <evaluator ftype="quadratic" parameter0="{bias+self.bias}" parameter1="{self.a1} parameter2={self.a2}"></evaluator>\n'
332+
output += f' <evaluator ftype="quadratic" parameter0="{bias + self.bias}" parameter1="{self.a1} parameter2={self.a2}"></evaluator>\n'
336333
else:
337334
vals = list(issue.all)
338335
return TableFun(dict(zip(vals, [self(_) for _ in vals]))).xml(
@@ -372,14 +369,18 @@ def xml(self, indx: int, issue: Issue, bias) -> str:
372369
issue_name = issue.name
373370
if issue.is_continuous():
374371
output = f'<issue index="{indx + 1}" etype="real" type="real" vtype="real" name="{issue_name}">\n'
375-
output += f' <evaluator ftype="poynomial" parameter0="{bias+self.bias}"'
372+
output += (
373+
f' <evaluator ftype="poynomial" parameter0="{bias + self.bias}"'
374+
)
376375
for i, x in enumerate(self.coefficients):
377376
output += f'parameter{i}="{x}"'
378377

379378
output += "></evaluator>\n"
380379
elif isinstance(issue, ContiguousIssue):
381380
output = f'<issue index="{indx + 1}" etype="integer" type="integer" vtype="integer" name="{issue_name}">\n'
382-
output += f' <evaluator ftype="poynomial" parameter0="{bias+self.bias}"'
381+
output += (
382+
f' <evaluator ftype="poynomial" parameter0="{bias + self.bias}"'
383+
)
383384
for i, x in enumerate(self.coefficients):
384385
output += f'parameter{i}="{x}"'
385386

@@ -478,10 +479,10 @@ def xml(self, indx: int, issue: Issue, bias) -> str:
478479
issue_name = issue.name
479480
if issue.is_continuous():
480481
output = f'<issue index="{indx + 1}" etype="real" type="real" vtype="real" name="{issue_name}">\n'
481-
output += f' <evaluator ftype="exponential" parameter0="{bias+self.bias}" parameter1="{self.tau} parameter2={self.base}"></evaluator>\n'
482+
output += f' <evaluator ftype="exponential" parameter0="{bias + self.bias}" parameter1="{self.tau} parameter2={self.base}"></evaluator>\n'
482483
elif isinstance(issue, ContiguousIssue):
483484
output = f'<issue index="{indx + 1}" etype="integer" type="integer" vtype="integer" name="{issue_name}">\n'
484-
output += f' <evaluator ftype="exponential" parameter0="{bias+self.bias}" parameter1="{self.tau} parameter2={self.base}"></evaluator>\n'
485+
output += f' <evaluator ftype="exponential" parameter0="{bias + self.bias}" parameter1="{self.tau} parameter2={self.base}"></evaluator>\n'
485486
else:
486487
vals = list(issue.all)
487488
return TableFun(dict(zip(vals, [self(_) for _ in vals]))).xml(
@@ -530,10 +531,10 @@ def xml(self, indx: int, issue: Issue, bias) -> str:
530531
issue_name = issue.name
531532
if issue.is_continuous():
532533
output = f'<issue index="{indx + 1}" etype="real" type="real" vtype="real" name="{issue_name}">\n'
533-
output += f' <evaluator ftype="cos" parameter0="{bias+self.bias}" parameter1="{self.amplitude} parameter2={self.multiplier} parameter3={self.phase}"></evaluator>\n'
534+
output += f' <evaluator ftype="cos" parameter0="{bias + self.bias}" parameter1="{self.amplitude} parameter2={self.multiplier} parameter3={self.phase}"></evaluator>\n'
534535
elif isinstance(issue, ContiguousIssue):
535536
output = f'<issue index="{indx + 1}" etype="integer" type="integer" vtype="integer" name="{issue_name}">\n'
536-
output += f' <evaluator ftype="cos" parameter0="{bias+self.bias}" parameter1="{self.amplitude} parameter2={self.multiplier} parameter3={self.phase}"></evaluator>\n'
537+
output += f' <evaluator ftype="cos" parameter0="{bias + self.bias}" parameter1="{self.amplitude} parameter2={self.multiplier} parameter3={self.phase}"></evaluator>\n'
537538
else:
538539
vals = list(issue.all)
539540
return TableFun(dict(zip(vals, [self(_) for _ in vals]))).xml(
@@ -582,10 +583,10 @@ def xml(self, indx: int, issue: Issue, bias) -> str:
582583
issue_name = issue.name
583584
if issue.is_continuous():
584585
output = f'<issue index="{indx + 1}" etype="real" type="real" vtype="real" name="{issue_name}">\n'
585-
output += f' <evaluator ftype="sin" parameter0="{bias+self.bias}" parameter1="{self.amplitude} parameter2={self.multiplier} parameter3={self.phase}"></evaluator>\n'
586+
output += f' <evaluator ftype="sin" parameter0="{bias + self.bias}" parameter1="{self.amplitude} parameter2={self.multiplier} parameter3={self.phase}"></evaluator>\n'
586587
elif isinstance(issue, ContiguousIssue):
587588
output = f'<issue index="{indx + 1}" etype="integer" type="integer" vtype="integer" name="{issue_name}">\n'
588-
output += f' <evaluator ftype="sin" parameter0="{bias+self.bias}" parameter1="{self.amplitude} parameter2={self.multiplier} parameter3={self.phase}"></evaluator>\n'
589+
output += f' <evaluator ftype="sin" parameter0="{bias + self.bias}" parameter1="{self.amplitude} parameter2={self.multiplier} parameter3={self.phase}"></evaluator>\n'
589590
else:
590591
vals = list(issue.all)
591592
return TableFun(dict(zip(vals, [self(_) for _ in vals]))).xml(
@@ -629,10 +630,10 @@ def xml(self, indx: int, issue: Issue, bias) -> str:
629630
issue_name = issue.name
630631
if issue.is_continuous():
631632
output = f'<issue index="{indx + 1}" etype="real" type="real" vtype="real" name="{issue_name}">\n'
632-
output += f' <evaluator ftype="log" parameter0="{bias+self.bias}" parameter1="{self.tau} parameter2={self.base} paramter3={self.scale}"></evaluator>\n'
633+
output += f' <evaluator ftype="log" parameter0="{bias + self.bias}" parameter1="{self.tau} parameter2={self.base} paramter3={self.scale}"></evaluator>\n'
633634
elif isinstance(issue, ContiguousIssue):
634635
output = f'<issue index="{indx + 1}" etype="integer" type="integer" vtype="integer" name="{issue_name}">\n'
635-
output += f' <evaluator ftype="log" parameter0="{bias+self.bias}" parameter1="{self.tau} parameter2={self.base} parameter3={self.scale}"></evaluator>\n'
636+
output += f' <evaluator ftype="log" parameter0="{bias + self.bias}" parameter1="{self.tau} parameter2={self.base} parameter3={self.scale}"></evaluator>\n'
636637
else:
637638
vals = list(issue.all)
638639
return TableFun(dict(zip(vals, [self(_) for _ in vals]))).xml(
@@ -807,4 +808,4 @@ def make_fun_from_xml(item) -> tuple[BaseFun, str]:
807808
return TriangularFun(start=strt, end=end, middle=middle), "triangular"
808809
else:
809810
# todo: implement all other functions defined in value_fun.py
810-
raise ValueError(f'Unknown ftype {item.attrib["ftype"]}')
811+
raise ValueError(f"Unknown ftype {item.attrib['ftype']}")

0 commit comments

Comments
 (0)