[docs]classElem(Expression):"""This returns the element of a dictionary. The key is evaluated from an expression and must return an integer, possibly negative. """def__init__(self,dict_of_expressions:dict[int,ExpressionOrNumeric],key_expression:ExpressionOrNumeric,):"""Constructor :param dict_of_expressions: dict of objects with numerical keys. :type dict_of_expressions: dict(int: biogeme.expressions.Expression) :param key_expression: object providing the key of the element to be evaluated. :type key_expression: biogeme.expressions.Expression :raise BiogemeError: if one of the expressions is invalid, that is neither a numeric value nor a biogeme.expressions.Expression object. """super().__init__()self.key_expression=validate_and_convert(key_expression)self._key_depends_on_parameters=self.key_expression.embed_expression(Beta)self.children.append(self.key_expression)self.dict_of_expressions={}#: dict of expressionsfork,vindict_of_expressions.items():self.dict_of_expressions[k]=validate_and_convert(v)self.children.append(self.dict_of_expressions[k])
[docs]defdeep_flat_copy(self)->Elem:"""Provides a copy of the expression. It is deep in the sense that it generates copies of the children. It is flat in the sense that any `MultipleExpression` is transformed into the currently selected expression. The flat part is irrelevant for this expression. """copy_dict_of_expressions={key:expression.deep_flat_copy()forkey,expressioninself.dict_of_expressions.items()}copy_key=self.key_expression.deep_flat_copy()returntype(self)(dict_of_expressions=copy_dict_of_expressions,key_expression=copy_key)
[docs]defget_value(self)->float:"""Evaluates the value of the expression :return: value of the expression :rtype: float :raise BiogemeError: if the calculated key is not present in the dictionary. """try:key=int(self.key_expression.get_value())returnself.dict_of_expressions[key].get_value()except(ValueError,KeyError):raiseBiogemeError(f'Invalid or missing key: {key}. 'f'Available keys: {self.dict_of_expressions.keys()}')