Benezivas / algobattle

Let teams compete by making them create hard instances and fast solvers for problems of your choice. Then pitch these instances and solvers against one another. All language-agnostic.
https://algobattle.org
MIT License
8 stars 3 forks source link

Pydantic annotations using instance attributes seem to be ignored #142

Closed Benezivas closed 11 months ago

Benezivas commented 11 months ago

We have designed a problem for packing a 2D Knapsack as full as possible. Here is a snippet from the problem.py:

Number = SizeIndex
lengthItem = Annotated[int, Interval(ge=1, le=InstanceRef.length)]
widthItem = Annotated[int, Interval(ge=1, le=InstanceRef.width)]
Point = tuple[lengthItem, widthItem]
lengthPosition = Annotated[int, Interval(ge=0, lt=InstanceRef.length)]
widthPosition = Annotated[int, Interval(ge=0, lt=InstanceRef.width)]
rotation = Literal["unrotated", "rotated"]

class Instance(InstanceModel):
    """An instance of a 2dKnapsack problem."""

    length: u64 = Field(ge=1)
    width: u64 = Field(ge=1)

    items: list[Point]

    @property
    def size(self) -> int:
        return len(self.items)

Do note the items attribute: It is defined as a list of Points, which themselves are a tuple with members lengthItem and widthItem. These two members are defined to each be in an interval between 1 and InstanceRef.length.

This last guard seems to be completely ignored. Students are able to pass items such as (0,0) and to exceed the implicit guard of u64, of length and width.

Is this a problem of the concrete way we annotated these attributes?