35 lines
1.2 KiB
Python
35 lines
1.2 KiB
Python
from __future__ import annotations
|
|
from typing import TYPE_CHECKING
|
|
|
|
from models.constraints.generic_constraint import *
|
|
|
|
if TYPE_CHECKING:
|
|
from models.solver_run import SolverRun
|
|
|
|
class FormUniquenessConstraint(GenericConstraint):
|
|
@classmethod
|
|
def create(cls: Type[_T], total_items: int) -> _T:
|
|
return cls(
|
|
minimum=0,
|
|
maximum=0,
|
|
reference_attribute=Attribute(
|
|
value=total_items,
|
|
type='form_uniqueness',
|
|
id='form_uniqueness'
|
|
)
|
|
)
|
|
|
|
def build(self, problem_handler: Problem, **kwargs) -> None:
|
|
logging.info('Form Uniqueness Constraint Generating...')
|
|
|
|
# form uniqueness constraint
|
|
problem_handler.problem += lpSum(
|
|
[
|
|
kwargs['solution'].items_exist_in_forms(bundle.items) * problem_handler.solver_bundles_var[bundle.id]
|
|
for bundle in problem_handler.bundles
|
|
] + [
|
|
kwargs['solution'].items_exist_in_forms([item]) * problem_handler.solver_items_var[item.id]
|
|
for item in problem_handler.items
|
|
]
|
|
) <= self.reference_attribute.value, f'Ensuring uniqueness for form'
|