leet the solver drift
This commit is contained in:
parent
cc704d97da
commit
812e7aaad9
@ -15,14 +15,14 @@ class Bundle(BaseModel):
|
|||||||
type: str
|
type: str
|
||||||
|
|
||||||
def tif(self, irt_model: IRTModel, theta: float) -> float:
|
def tif(self, irt_model: IRTModel, theta: float) -> float:
|
||||||
return 0.9
|
val = TestInformationFunction(irt_model).calculate(self.items, theta=theta)
|
||||||
# return TestInformationFunction(irt_model).calculate(self.items,
|
|
||||||
# theta=theta)
|
return round(val, 2)
|
||||||
|
|
||||||
def trf(self, irt_model: IRTModel, theta: float) -> float:
|
def trf(self, irt_model: IRTModel, theta: float) -> float:
|
||||||
return 0.9
|
val = TestResponseFunction(irt_model).calculate(self.items, theta=theta)
|
||||||
# return TestResponseFunction(irt_model).calculate(self.items,
|
|
||||||
# theta=theta)
|
return round(val, 2)
|
||||||
|
|
||||||
def tif_trf_sum(self, solver_run):
|
def tif_trf_sum(self, solver_run):
|
||||||
return self.__trf_sum(solver_run) + self.__tif_sum(solver_run)
|
return self.__trf_sum(solver_run) + self.__tif_sum(solver_run)
|
||||||
|
@ -14,14 +14,14 @@ class Item(BaseModel):
|
|||||||
b_param: float = 0.00
|
b_param: float = 0.00
|
||||||
|
|
||||||
def iif(self, solver_run, theta):
|
def iif(self, solver_run, theta):
|
||||||
return 0.9
|
val = ItemInformationFunction(solver_run.irt_model).calculate(b_param=self.b_param, theta=theta)
|
||||||
# return ItemInformationFunction(solver_run.irt_model).calculate(
|
|
||||||
# b_param=self.b_param, theta=theta)
|
return round(val, 2)
|
||||||
|
|
||||||
def irf(self, solver_run, theta):
|
def irf(self, solver_run, theta):
|
||||||
return 0.9
|
val = ItemResponseFunction(solver_run.irt_model).calculate(b_param=self.b_param, theta=theta)
|
||||||
# return ItemResponseFunction(solver_run.irt_model).calculate(
|
|
||||||
# b_param=self.b_param, theta=theta)
|
return round(val, 2)
|
||||||
|
|
||||||
def get_attribute(self, ref_attribute):
|
def get_attribute(self, ref_attribute):
|
||||||
for attribute in self.attributes:
|
for attribute in self.attributes:
|
||||||
|
@ -9,8 +9,14 @@ class Target(BaseModel):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def max_drift(cls):
|
def max_drift(cls):
|
||||||
return 10 # 10% elasticity
|
return 120 # let it drift...
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def max_drift_increment(cls):
|
def max_drift_increment(cls):
|
||||||
return 1 # 1%
|
return 10 # 10%
|
||||||
|
|
||||||
|
def minimum(self, drift_percent = 0.0) -> float:
|
||||||
|
return round(self.value - (self.value * drift_percent), 2)
|
||||||
|
|
||||||
|
def maximum(self, drift_percent = 0.0) -> float:
|
||||||
|
return round(self.value + (self.value * drift_percent), 2)
|
||||||
|
@ -86,13 +86,13 @@ class LoftService(Base):
|
|||||||
problem = LpProblem('ata-form-generate', LpMinimize)
|
problem = LpProblem('ata-form-generate', LpMinimize)
|
||||||
|
|
||||||
# objective function
|
# objective function
|
||||||
problem += lpSum(
|
# problem += lpSum(
|
||||||
[item.iif_irf_sum(self.solver_run) * items[item.id] for item in self.solver_run.unbundled_items()]
|
# [item.iif_irf_sum(self.solver_run) * items[item.id] for item in self.solver_run.unbundled_items()]
|
||||||
+
|
# +
|
||||||
[bundle.tif_trf_sum(self.solver_run) * bundles[bundle.id] for bundle in self.solver_run.bundles]
|
# [bundle.tif_trf_sum(self.solver_run) * bundles[bundle.id] for bundle in self.solver_run.bundles]
|
||||||
)
|
# )
|
||||||
# problem += lpSum([items[item.id] for item in self.solver_run.unbundled_items()] + [bundles[bundle.id] for bundle in self.solver_run.bundles])
|
# problem += lpSum([items[item.id] for item in self.solver_run.unbundled_items()] + [bundles[bundle.id] for bundle in self.solver_run.bundles])
|
||||||
# problem += lpSum([items[item.id] for item in self.solver_run.items])
|
problem += lpSum([items[item.id] for item in self.solver_run.items])
|
||||||
|
|
||||||
# Form Constraints
|
# Form Constraints
|
||||||
problem += lpSum(
|
problem += lpSum(
|
||||||
@ -111,93 +111,87 @@ class LoftService(Base):
|
|||||||
# ) == self.solver_run.total_form_items, f'Total bundle form items for form {form_number}'
|
# ) == self.solver_run.total_form_items, f'Total bundle form items for form {form_number}'
|
||||||
|
|
||||||
# Dynamic constraints.. currently we only support Metadata and Bundles(Cases/Passages)
|
# Dynamic constraints.. currently we only support Metadata and Bundles(Cases/Passages)
|
||||||
problem = solver_helper.build_constraints(self.solver_run, problem, items, bundles)
|
# problem = solver_helper.build_constraints(self.solver_run, problem, items, bundles)
|
||||||
|
|
||||||
logging.info('Creating TIF and TCC Elastic constraints')
|
logging.info('Creating TIF and TCC Elastic constraints')
|
||||||
|
|
||||||
# Behold our very own Elastic constraints!
|
# Behold our very own Elastic constraints!
|
||||||
for tif_target in self.solver_run.objective_function.tif_targets:
|
for tif_target in self.solver_run.objective_function.tif_targets:
|
||||||
problem += lpSum(
|
|
||||||
[
|
|
||||||
bundle.tif(self.solver_run.irt_model, tif_target.theta) * bundles[bundle.id]
|
|
||||||
for bundle in self.solver_run.bundles
|
|
||||||
] +
|
|
||||||
[
|
|
||||||
item.iif(self.solver_run, tif_target.theta) * items[item.id]
|
|
||||||
for item in self.solver_run.unbundled_items()
|
|
||||||
]
|
|
||||||
) >= tif_target.value - (tif_target.value * drift_percent)
|
|
||||||
problem += lpSum(
|
|
||||||
[
|
|
||||||
bundle.tif(self.solver_run.irt_model, tif_target.theta) * bundles[bundle.id]
|
|
||||||
for bundle in self.solver_run.bundles
|
|
||||||
] +
|
|
||||||
[
|
|
||||||
item.iif(self.solver_run, tif_target.theta) * items[item.id]
|
|
||||||
for item in self.solver_run.unbundled_items()
|
|
||||||
]
|
|
||||||
) <= tif_target.value + (tif_target.value * drift_percent)
|
|
||||||
|
|
||||||
# problem += lpSum(
|
# problem += lpSum(
|
||||||
# [
|
# [
|
||||||
|
# bundle.tif(self.solver_run.irt_model, tif_target.theta) * bundles[bundle.id]
|
||||||
|
# for bundle in self.solver_run.bundles
|
||||||
|
# ] +
|
||||||
|
# [
|
||||||
# item.iif(self.solver_run, tif_target.theta) * items[item.id]
|
# item.iif(self.solver_run, tif_target.theta) * items[item.id]
|
||||||
# for item in self.solver_run.items
|
# for item in self.solver_run.unbundled_items()
|
||||||
# ]
|
# ]
|
||||||
# ) >= tif_target.value - (tif_target.value * drift_percent)
|
# ) >= tif_target.value - (tif_target.value * drift_percent)
|
||||||
# problem += lpSum(
|
# problem += lpSum(
|
||||||
# [
|
# [
|
||||||
|
# bundle.tif(self.solver_run.irt_model, tif_target.theta) * bundles[bundle.id]
|
||||||
|
# for bundle in self.solver_run.bundles
|
||||||
|
# ] +
|
||||||
|
# [
|
||||||
# item.iif(self.solver_run, tif_target.theta) * items[item.id]
|
# item.iif(self.solver_run, tif_target.theta) * items[item.id]
|
||||||
# for item in self.solver_run.items
|
# for item in self.solver_run.unbundled_items()
|
||||||
# ]
|
# ]
|
||||||
# ) <= tif_target.value + (tif_target.value * drift_percent)
|
# ) <= tif_target.value + (tif_target.value * drift_percent)
|
||||||
|
|
||||||
for tcc_target in self.solver_run.objective_function.tcc_targets:
|
|
||||||
problem += lpSum(
|
problem += lpSum(
|
||||||
[
|
[
|
||||||
bundle.trf(self.solver_run.irt_model, tcc_target.theta) * bundles[bundle.id]
|
item.iif(self.solver_run, tif_target.theta) * items[item.id]
|
||||||
for bundle in self.solver_run.bundles
|
for item in self.solver_run.items
|
||||||
] +
|
|
||||||
[
|
|
||||||
item.irf(self.solver_run, tcc_target.theta) * items[item.id]
|
|
||||||
for item in self.solver_run.unbundled_items()
|
|
||||||
]
|
]
|
||||||
) >= tcc_target.value - (tcc_target.value * drift_percent)
|
) >= tif_target.minimum(drift_percent)
|
||||||
problem += lpSum(
|
problem += lpSum(
|
||||||
[
|
[
|
||||||
bundle.trf(self.solver_run.irt_model, tcc_target.theta) * bundles[bundle.id]
|
item.iif(self.solver_run, tif_target.theta) * items[item.id]
|
||||||
for bundle in self.solver_run.bundles
|
for item in self.solver_run.items
|
||||||
] +
|
|
||||||
[
|
|
||||||
item.irf(self.solver_run, tcc_target.theta) * items[item.id]
|
|
||||||
for item in self.solver_run.unbundled_items()
|
|
||||||
]
|
]
|
||||||
) <= tcc_target.value + (tcc_target.value * drift_percent)
|
) <= tif_target.maximum(drift_percent)
|
||||||
|
|
||||||
|
for tcc_target in self.solver_run.objective_function.tcc_targets:
|
||||||
# problem += lpSum(
|
# problem += lpSum(
|
||||||
# [
|
# [
|
||||||
|
# bundle.trf(self.solver_run.irt_model, tcc_target.theta) * bundles[bundle.id]
|
||||||
|
# for bundle in self.solver_run.bundles
|
||||||
|
# ] +
|
||||||
|
# [
|
||||||
# item.irf(self.solver_run, tcc_target.theta) * items[item.id]
|
# item.irf(self.solver_run, tcc_target.theta) * items[item.id]
|
||||||
# for item in self.solver_run.items
|
# for item in self.solver_run.unbundled_items()
|
||||||
# ]
|
# ]
|
||||||
# ) >= tcc_target.value - (tcc_target.value * drift_percent)
|
# ) >= tcc_target.value - (tcc_target.value * drift_percent)
|
||||||
# problem += lpSum(
|
# problem += lpSum(
|
||||||
# [
|
# [
|
||||||
|
# bundle.trf(self.solver_run.irt_model, tcc_target.theta) * bundles[bundle.id]
|
||||||
|
# for bundle in self.solver_run.bundles
|
||||||
|
# ] +
|
||||||
|
# [
|
||||||
# item.irf(self.solver_run, tcc_target.theta) * items[item.id]
|
# item.irf(self.solver_run, tcc_target.theta) * items[item.id]
|
||||||
# for item in self.solver_run.items
|
# for item in self.solver_run.unbundled_items()
|
||||||
# ]
|
# ]
|
||||||
# ) <= tcc_target.value + (tcc_target.value * drift_percent)
|
# ) <= tcc_target.value + (tcc_target.value * drift_percent)
|
||||||
|
|
||||||
|
problem += lpSum(
|
||||||
|
[
|
||||||
|
item.irf(self.solver_run, tcc_target.theta) * items[item.id]
|
||||||
|
for item in self.solver_run.items
|
||||||
|
]
|
||||||
|
) >= tcc_target.minimum(drift_percent)
|
||||||
|
problem += lpSum(
|
||||||
|
[
|
||||||
|
item.irf(self.solver_run, tcc_target.theta) * items[item.id]
|
||||||
|
for item in self.solver_run.items
|
||||||
|
]
|
||||||
|
) <= tcc_target.maximum(drift_percent)
|
||||||
|
|
||||||
logging.info(f'Solving for Form {form_number} with a drift of {current_drift}%')
|
logging.info(f'Solving for Form {form_number} with a drift of {current_drift}%')
|
||||||
problem.solve()
|
problem.solve()
|
||||||
|
|
||||||
if LpStatus[problem.status] == 'Infeasible':
|
if LpStatus[problem.status] == 'Infeasible':
|
||||||
logging.info(f'attempt infeasible for drift of {current_drift}%')
|
logging.info(f'attempt infeasible for drift of {current_drift}%')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# print(problem.objective.value())
|
|
||||||
# print(problem.constraints)
|
|
||||||
# print(problem.objective)
|
|
||||||
|
|
||||||
if current_drift == Target.max_drift(): # this is the last attempt, so lets finalize the solution
|
if current_drift == Target.max_drift(): # this is the last attempt, so lets finalize the solution
|
||||||
for v in problem.variables(): print(v.name, "=", v.varValue);
|
for v in problem.variables(): print(v.name, "=", v.varValue);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user