Files
furka/constraints.py
2022-07-26 15:04:23 +02:00

96 lines
1.6 KiB
Python

#!/usr/bin/env python3
from math import inf
class ExtraConstraint:
def __init__(self, **kwargs):
self.kwargs = _unpack(kwargs)
def __call__(self, x):
kwargs = self.kwargs
for name, value in x.items():
vmin = kwargs.get(f"{name}_min", -inf)
vmax = kwargs.get(f"{name}_max", +inf)
check = (vmin <= value < vmax)
# print(name, f"\t{vmin} <= {value} < {vmax}\t->", check)
if not check:
return False
return True
def _unpack(d):
res = {}
for k, v in d.items():
if k.endswith("_min") or k.endswith("_max"):
res[k] = v
else:
try:
vmin, vmax = v
except (ValueError, TypeError) as e:
raise ValueError(f"cannot unpack {k} = {v} into ({k}_min, {k}_max), need exactly 2 values") from e
res[k + "_min"] = vmin
res[k + "_max"] = vmax
if res != d:
print(f"unpacked: {d} -> {res}")
return res
if __name__ == "__main__":
cons = ExtraConstraint(beta_min=0, beta_max=10, gamma_max=33)
example = {
"alpha": 1,
"beta": 1
}
assert cons(example)
example = {
"alpha": 1,
"beta": 11
}
assert not cons(example)
example = {
"gamma": 3
}
assert cons(example)
example = {
"gamma": 333
}
assert not cons(example)
cons = ExtraConstraint(alpha=(1, 100))
example = {
"alpha": 10
}
assert cons(example)
example = {
"alpha": 1000
}
assert not cons(example)
badcons = ExtraConstraint(test=33)