Skip to content

Commit

Permalink
Merge pull request #1427 from sbenthall/i1373
Browse files Browse the repository at this point in the history
allow use of string expressions instead of lambdas when definition new format models.
  • Loading branch information
mnwhite authored Jun 28, 2024
2 parents d86eb93 + a9b0407 commit 801e3df
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 5 deletions.
7 changes: 4 additions & 3 deletions Documentation/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,14 @@ For more information on HARK, see [our Github organization](https://github.com/e

## Changes

### 0.15.2 (in development)
### 0.16.0 (in development)

Release Date: TBD

#### Major Changes

none
- Allows structural equations in model files to be provided in string form [#1427](https://github.com/econ-ark/HARK/pull/1427)
- Introduces `HARK.parser' module for parsing configuration files into models [#1427](https://github.com/econ-ark/HARK/pull/1427)

#### Minor Changes

Expand Down Expand Up @@ -50,7 +51,7 @@ This release drops support for Python 3.8 and 3.9, consistent with SPEC 0, and a
- Object-oriented solver code has been moved to /HARK/ConsumptionSaving/LegacyOOsolvers.py, for legacy support of downstream projects.
- AgentTypeMonteCarloSimulator now requires model shock, parameter, and dynamics information to be organized into 'blocks'. The DBlock object is introduced. [#1411](https://github.com/econ-ark/HARK/pull/1411)
- RBlock object allows for recursive composition of DBlocks in models, as demonstrated by the AgentTypeMonteCarloSimulator [#1417](https://github.com/econ-ark/HARK/pull/1417/)
- Transtion, reward, state-rulle value function, decision value function, and arrival value function added to DBlock [#1417](https://github.com/econ-ark/HARK/pull/1417/)
- Transtion, reward, state-rule value function, decision value function, and arrival value function added to DBlock [#1417](https://github.com/econ-ark/HARK/pull/1417/)
- All methods that construct inputs for solvers are now functions that are specified in the dictionary attribute `constructors`. [#1410](https://github.com/econ-ark/HARK/pull/1410)
- Such constructed inputs can use alternate parameterizations / formats by changing the `constructor` function and providing its arguments in `parameters`.
- Move `HARK.datasets` to `HARK.Calibration` for better organization of data and calibration tools. [#1430](https://github.com/econ-ark/HARK/pull/1430)
Expand Down
17 changes: 16 additions & 1 deletion HARK/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
)
from inspect import signature
import numpy as np
from HARK.parser import math_text_to_lambda
from typing import Any, Callable, Mapping, List, Union


Expand Down Expand Up @@ -143,7 +144,16 @@ class DBlock:
Parameters
----------
...
shocks: Mapping(str, Distribution)
A mapping from variable names to Distribution objects,
representing exogenous shocks.
dynamics: Mapping(str, str or callable)
A dictionary mapping variable names to mathematical expressions.
These expressions can be simple functions, in which case the
argument names should match the variable inputs.
Or these can be strings, which are parsed into functions.
"""

name: str = ""
Expand All @@ -152,6 +162,11 @@ class DBlock:
dynamics: dict = field(default_factory=dict)
reward: dict = field(default_factory=dict)

def __post_init__(self):
for v in self.dynamics:
if isinstance(self.dynamics[v], str):
self.dynamics[v] = math_text_to_lambda(self.dynamics[v])

def get_shocks(self):
return self.shocks

Expand Down
2 changes: 1 addition & 1 deletion HARK/models/consumer.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@
"b": lambda k, R, PermGroFac: k * R / PermGroFac,
"m": lambda b, theta: b + theta,
"c": Control(["m"]),
"a": lambda m, c: m - c,
"a": "m - c",
},
"reward": {"u": lambda c, CRRA: c ** (1 - CRRA) / (1 - CRRA)},
}
Expand Down
26 changes: 26 additions & 0 deletions HARK/parser.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
from sympy.utilities.lambdify import lambdify
from sympy.parsing.sympy_parser import parse_expr


class Expression:
def __init__(self, text):
self.txt
self.expr = parse_expr(text)
self.npf = self.func()

# first derivatives.
self.grad = {
sym.__str__(): self.expr.diff(sym) for sym in list(self.expr.free_symbols)
}

def func(self):
return lambdify(list(self.expr.free_symbols), self.expr, "numpy")


def math_text_to_lambda(text):
"""
Returns a function represented by the given mathematical text.
"""
expr = parse_expr(text)
func = lambdify(list(expr.free_symbols), expr, "numpy")
return func

0 comments on commit 801e3df

Please sign in to comment.