96 lines
1.6 KiB
Python
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)
|
|
|
|
|
|
|