Merge pull request #33 from yardstick/feature/QUANT-1656-bundle-first-ordering

QUANT-1656: bundle first ordering
This commit is contained in:
brmnjsh 2022-05-10 11:32:35 -04:00 committed by GitHub
commit 8ee3ae3d2b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 27 additions and 14 deletions

View File

@ -105,6 +105,8 @@ def key_to_uuid(key):
def solution_items(variables: list, solver_run: SolverRun) -> Tuple[list]:
form_items = []
form_bundles = []
final_items = []
solver_variables = []
for v in variables:
@ -120,11 +122,17 @@ def solution_items(variables: list, solver_run: SolverRun) -> Tuple[list]:
bundle_id = v.name.replace('Bundle_', '')
bundle = solver_run.get_bundle(int(bundle_id))
if bundle:
for item in bundle.items:
if item: form_items.append(item)
if bundle: form_bundles.append(bundle)
return form_items, solver_variables
for bundle in form_bundles:
items = bundle.ordered_items if solver_run.bundle_first_ordering else bundle.items
for item in items:
final_items.append(item)
for item in form_items:
final_items.append(item)
return final_items, solver_variables
def print_problem_variables(problem):
# Uncomment this as needed in local dev

View File

@ -46,3 +46,6 @@ class Bundle(BaseModel):
total += self.trf(solver_run.irt_model, target.theta)
return total
def ordered_items(self) -> List[Item]:
return sorted(self.items, key=lambda item: item.position)

View File

@ -8,6 +8,7 @@ from lib.irt.item_information_function import ItemInformationFunction
class Item(BaseModel):
id: int
position: Optional[int]
passage_id: Optional[int]
workflow_state: Optional[str]
attributes: List[Attribute]

View File

@ -14,7 +14,8 @@ from models.advanced_options import AdvancedOptions
class SolverRun(BaseModel):
items: List[Item] = []
bundles: list[Bundle] = []
bundles: List[Bundle] = []
bundle_first_ordering: bool = True
constraints: List[Constraint]
irt_model: IRTModel
objective_function: ObjectiveFunction
@ -40,7 +41,7 @@ class SolverRun(BaseModel):
if type == constraint.reference_attribute.type:
return constraint
def remove_items(self, items: list[Item]) -> bool:
def remove_items(self, items: List[Item]) -> bool:
self.items = [item for item in self.items if item not in items]
return True
@ -100,7 +101,7 @@ class SolverRun(BaseModel):
return next((constraint for constraint in self.constraints
if constraint.reference_attribute.id == name), None)
def unbundled_items(self) -> list:
def unbundled_items(self) -> List[Item]:
# since the only bundles are based on passage id currently
# in the future when we have more than just passage based bundles
# we'll need to develop a more sophisticated way of handling this concern
@ -113,7 +114,7 @@ class SolverRun(BaseModel):
else:
return self.items
def select_items_by_percent(self, percent: int) -> list[Item]:
def select_items_by_percent(self, percent: int) -> List[Item]:
items = self.unbundled_items()
total_items = len(items)
selected_items_amount = round(total_items - (total_items *
@ -121,7 +122,7 @@ class SolverRun(BaseModel):
return random.sample(items, selected_items_amount)
def select_bundles_by_percent(self, percent: int) -> list[Bundle]:
def select_bundles_by_percent(self, percent: int) -> List[Bundle]:
total_bundles = len(self.bundles)
selected_bundles_amount = round(total_bundles - (total_bundles *
(percent / 100)))

View File

@ -83,11 +83,11 @@ class LoftService(Base):
lowBound=0,
upBound=1,
cat='Binary')
bundles = LpVariable.dicts(
"Bundle", [bundle.id for bundle in selected_bundles],
lowBound=0,
upBound=1,
cat='Binary')
bundles = LpVariable.dicts("Bundle",
[bundle.id for bundle in selected_bundles],
lowBound=0,
upBound=1,
cat='Binary')
logging.info(f'Generating Solution for Form {form_number}')