From b579855419b18db7dd07219eef219c1f62364d65 Mon Sep 17 00:00:00 2001 From: "Kevin R. Thornton" Date: Wed, 20 Nov 2024 09:56:48 -0800 Subject: [PATCH] Handle invalid proportions * update demes-sped --- demes-spec | 2 +- demes/demes.py | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/demes-spec b/demes-spec index b2341f1..0f5fa52 160000 --- a/demes-spec +++ b/demes-spec @@ -1 +1 @@ -Subproject commit b2341f13e51808f3849a2253c188549c163525a8 +Subproject commit 0f5fa522fd9c79eb01f37931574a703305ac8add diff --git a/demes/demes.py b/demes/demes.py index 9ea2c43..2f1cdf3 100644 --- a/demes/demes.py +++ b/demes/demes.py @@ -52,6 +52,11 @@ def unit_interval(self, attribute, value): raise ValueError(f"must have 0 <= {attribute.name} <= 1") +def unit_interval_exclusive_lo(self, attribute, value): + if not (0 < value <= 1): + raise ValueError(f"must have 0 < {attribute.name} <= 1") + + def sum_less_than_one(self, attribute, value): if sum(value) > 1: raise ValueError(f"{attribute.name} must sum to less than one") @@ -480,7 +485,9 @@ class Pulse: time: Time = attr.ib(validator=[int_or_float, positive, finite]) proportions: List[Proportion] = attr.ib( validator=attr.validators.deep_iterable( - member_validator=attr.validators.and_(int_or_float, unit_interval), + member_validator=attr.validators.and_( + int_or_float, unit_interval_exclusive_lo + ), iterable_validator=attr.validators.instance_of(list), ) ) @@ -2095,7 +2102,7 @@ def fromdict(cls, data: MutableMapping[str, Any]) -> Graph: proportions=( list, attr.validators.deep_iterable( - member_validator=int_or_float, + member_validator=[int_or_float, unit_interval_exclusive_lo], iterable_validator=attr.validators.instance_of(list), ), ), @@ -2156,7 +2163,7 @@ def fromdict(cls, data: MutableMapping[str, Any]) -> Graph: list, attr.validators.deep_iterable( member_validator=attr.validators.and_( - int_or_float, unit_interval + int_or_float, unit_interval_exclusive_lo ), iterable_validator=attr.validators.and_( attr.validators.instance_of(list),