Coverage for HARK/parser.py: 81%
31 statements
« prev ^ index » next coverage.py v7.11.0, created at 2025-11-02 05:14 +0000
« prev ^ index » next coverage.py v7.11.0, created at 2025-11-02 05:14 +0000
1from HARK.distributions import Bernoulli, Lognormal, MeanOneLogNormal
2from sympy.utilities.lambdify import lambdify
3from sympy.parsing.sympy_parser import parse_expr
4import yaml
7class ControlToken:
8 """
9 Represents a parsed Control variable.
10 """
12 def __init__(self, args):
13 pass
16class Expression:
17 def __init__(self, text):
18 self.txt
19 self.expr = parse_expr(text)
20 self.npf = self.func()
22 # first derivatives.
23 self.grad = {
24 sym.__str__(): self.expr.diff(sym) for sym in list(self.expr.free_symbols)
25 }
27 def func(self):
28 return lambdify(list(self.expr.free_symbols), self.expr, "numpy")
31def tuple_constructor_from_class(cls):
32 def constructor(loader, node):
33 value = loader.construct_mapping(node)
34 return (cls, value)
36 return constructor
39def math_text_to_lambda(text):
40 """
41 Returns a function represented by the given mathematical text.
42 """
43 expr = parse_expr(text)
44 func = lambdify(list(expr.free_symbols), expr, "numpy")
45 return func
48def harklang_loader():
49 """
50 A PyYAML loader that supports tags for HARKLang,
51 such as random variables and model tags.
52 """
53 loader = yaml.SafeLoader
54 yaml.SafeLoader.add_constructor(
55 "!Bernoulli", tuple_constructor_from_class(Bernoulli)
56 )
57 yaml.SafeLoader.add_constructor(
58 "!MeanOneLogNormal", tuple_constructor_from_class(MeanOneLogNormal)
59 )
60 yaml.SafeLoader.add_constructor(
61 "!Lognormal", tuple_constructor_from_class(Lognormal)
62 )
63 yaml.SafeLoader.add_constructor(
64 "!Control", tuple_constructor_from_class(ControlToken)
65 )
67 return loader