Source code for biogeme.expressions.named_expression

"""Decorator for the derivative calculation, so that the names of the variables are associated with their values.

:author: Michel Bierlaire
:date: Sat Apr 20 08:06:54 2024
"""

from functools import wraps

from biogeme.expressions import Expression
from biogeme.function_output import FunctionOutput, NamedFunctionOutput, convert_to_dict


[docs] def named_function_output(func): """ Decorator to convert a FunctionOutput into a NamedFunctionOutput, using explicitly passed beta indices. The decorated function must now accept an `indices` keyword argument. """ @wraps(func) def wrapper(self: Expression, *args, indices=None, **kwargs): if indices is None: raise ValueError( "Parameter 'indices' must be provided to use @named_function_output." ) # Call the original function/method result: FunctionOutput = func(self, *args, **kwargs) if not isinstance(result, FunctionOutput): raise TypeError( f'Expected function {func.__name__} to return FunctionOutput, got {type(result).__name__} instead.' ) the_result = NamedFunctionOutput( function=result.function, gradient=convert_to_dict(result.gradient, indices), hessian=convert_to_dict( [convert_to_dict(row, indices) for row in result.hessian], indices, ), ) return the_result return wrapper