currently in utils.py, there is this function
def _get_entity_combinations(
entities: Collection[ObjectOrVariable],
types: Sequence[Type]) -> Iterator[List[ObjectOrVariable]]:
"""Get all combinations of entities satisfying the given types sequence."""
sorted_entities = sorted(entities)
choices = []
for vt in types:
this_choices = []
for ent in sorted_entities:
if ent.is_instance(vt):
this_choices.append(ent)
choices.append(this_choices)
for choice in itertools.product(*choices):
yield list(choice)
For my application, when there are two objects of the same types in the parameters, it should not try to ground the one object to two parameters. The following edit seems to work:
def _get_entity_combinations(
entities: Collection[ObjectOrVariable],
types: Sequence[Type]) -> Iterator[List[ObjectOrVariable]]:
"""Get all combinations of entities satisfying the given types sequence.
Note: Each entity will appear at most once in each combination.
"""
sorted_entities = sorted(entities)
choices = []
for vt in types:
this_choices = []
for ent in sorted_entities:
if ent.is_instance(vt):
this_choices.append(ent)
choices.append(this_choices)
for choice in itertools.product(*choices):
# Filter out combinations with duplicate entities
if len(set(choice)) == len(choice):
yield list(choice)
else:
logging.warning(f"Duplicate entities in combination: {choice}")
currently in utils.py, there is this function
For my application, when there are two objects of the same types in the parameters, it should not try to ground the one object to two parameters. The following edit seems to work: