2023-11-10 15:21:16 -05:00

57 lines
1.8 KiB
Python

from pydantic import BaseModel
from typing import List, Optional
from models.attribute import Attribute
from lib.irt.item_response_function import ItemResponseFunction
from lib.irt.item_information_function import ItemInformationFunction
class Item(BaseModel):
id: int
position: Optional[int] = None
passage_id: Optional[int] = None
enemies: Optional[int] = None
workflow_state: Optional[str] = None
attributes: List[Attribute] = None
b_param: float = 0.00
response: Optional[int] = None
def iif(self, irt_model, theta):
return ItemInformationFunction(irt_model).calculate(b_param=self.b_param, theta=theta)
def irf(self, irt_model, theta):
return ItemResponseFunction(irt_model).calculate(b_param=self.b_param, theta=theta)
def get_attribute(self, ref_attribute: Attribute) -> Attribute or None:
for attribute in self.attributes:
if self.attribute_exists(ref_attribute):
return attribute
return None
def attribute_exists(self, ref_attribute: Attribute) -> bool:
for attribute in self.attributes:
if attribute.id == ref_attribute.id and attribute.value.lower(
) == ref_attribute.value.lower():
return True
return False
def iif_irf_sum(self, solver_run):
return self.__iif_sum(solver_run) + self.__irf_sum(solver_run)
def __iif_sum(self, solver_run):
total = 0
for target in solver_run.objective_function.tif_targets:
total += self.iif(solver_run.irt_model, target.theta)
return total
def __irf_sum(self, solver_run):
total = 0
for target in solver_run.objective_function.tif_targets:
total += self.irf(solver_run.irt_model, target.theta)
return total