diff --git a/app/helpers/problem_helper.py b/app/helpers/problem_helper.py new file mode 100644 index 0000000..27f5629 --- /dev/null +++ b/app/helpers/problem_helper.py @@ -0,0 +1,23 @@ +from typing import Tuple + +from models.item import Item + +def sanctify(solved_items: [Item]) -> Tuple[list]: + sacred_ids = [] + enemy_ids = [] + + # get all enemies + for item in solved_items: + # if it has enemies, check if it exists as part of the solved items + for enemy_id in item.enemies: + # if it does, it's a true enemy + if enemy_id in (item.id for item in solved_items): + enemy_ids.append(enemy_id) + # remove enemy from solved items, + # lest it has this sacred item added to enemies + solved_items = [i for i in solved_items if i.id != enemy_id] + + # the item is cleansed, now it's sacred + sacred_ids.append(item.id) + + return sacred_ids, enemy_ids \ No newline at end of file diff --git a/app/models/problem.py b/app/models/problem.py index 5ddd33a..8976c64 100644 --- a/app/models/problem.py +++ b/app/models/problem.py @@ -7,7 +7,9 @@ from pulp import LpProblem, LpVariable, LpStatus, lpSum import logging -from helpers import service_helper, irt_helper +from helpers.problem_helper import * + +from helpers import service_helper from models.solution import Solution from models.item import Item @@ -59,29 +61,14 @@ class Problem(BaseModel): # get items from solution solved_items, _ = service_helper.solution_items(self.problem.variables(), solver_run) - sacred_ids = [] - enemy_ids = [] - - # get all enemies - for item in solved_items: - # if it has enemies, check if it exists as part of the solved items - for enemy_id in item.enemies: - # if it does, it's a true enemy - if enemy_id in (item.id for item in solved_items): - enemy_ids.append(enemy_id) - # remove enemy from solved items, - # lest it has this sacred item added to enemies - solved_items = [i for i in solved_items if i.id != enemy_id] - - # the item is cleansed, now it's sacred - sacred_ids.append(item.id) + sacred_ids, enemy_ids = sanctify(solved_items) if enemy_ids: logging.info('enemies found, adding constraints...') # remove old enemy/sacred constraints - self.problem.constrants.pop('Exclude_enemy_items') - self.problem.constrants.pop('Include_sacred_items') + self.problem.constraints.pop('Exclude_enemy_items') + self.problem.constraints.pop('Include_sacred_items') # add constraint to not allow enemy items self.problem += lpSum([