{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# How we solve a model defined by `IndShockConsumerType`\n", "\n", "The IndShockConsumerType reprents the work-horse consumption savings model with temporary and permanent shocks to income, finite or infinite horizons, CRRA utility and more. In this DemARK we take you through the steps involved in solving one period of such a model. The inheritance chains can be a little long, so figuring out where all the parameters and methods come from can be a bit confusing. Hence this map! The intention is to make it easier to know how to inheret from IndShockConsumerType in the sense that you know where to look for specific solver logic, but also so you know can figure out which methods to overwrite or supplement in your own `AgentType` and solver!\n", "## The `solveConsIndShock` function\n", "In HARK, a period's problem is always solved by the callable (function or callable object instance) stored in the field `solve_one_period`. In the case of `IndShockConsumerType`, this function is called `solveConsIndShock`. The function accepts a number of arguments, that it uses to construct an instance of either a `ConsIndShockSolverBasic` or a `ConsIndShockSolver`. These solvers both have the methods `prepare_to_solve` and `solve`, that we will have a closer look at in this notebook. This means, that the logic of `solveConsIndShock` is basically:\n", "\n", " 1. Check if cubic interpolation (`CubicBool`) or construction of the value function interpolant (`vFuncBool`) are requested. Construct an instance of `ConsIndShockSolverBasic` if neither are requested, else construct a `ConsIndShockSolver`. Call this `solver`.\n", " 1. Call `solver.prepare_to_solve()`\n", " 1. Call `solver.solve()` and return the output as the current solution." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Two types of solvers\n", "As mentioned above, `solve_one_period` will construct an instance of the class `ConsIndShockSolverBasic`or `ConsIndShockSolver`. The main difference is whether it uses cubic interpolation or if it explicitly constructs a value function approximation. The choice and construction of a solver instance is bullet 1) from above.\n", "\n", "#### What happens in upon construction\n", "Neither of the two solvers have their own `__init__`. `ConsIndShockSolver` inherits from `ConsIndShockSolverBasic` that in turn inherits from `ConsIndShockSetup`. `ConsIndShockSetup` inherits from `ConsPerfForesightSolver`, which itself is just an `Object`, so we get the inheritance structure\n", "\n", "- `ConsPerfForesightSolver` $\\leftarrow$ `ConsIndShockSetup` $\\leftarrow$ `ConsIndShockSolverBasic` $\\leftarrow$ `ConsIndShockSolver`\n", "\n", "When one of the two classes in the end of the inheritance chain is called, it will call `ConsIndShockSetup.__init__(args...)`. This takes a whole list of fixed inputs that then gets assigned to the object through a\n", "```\n", "ConsIndShockSetup.assign_parameters(solution_next,IncomeDstn,LivPrb,DiscFac,CRRA,Rfree,PermGroFac,BoroCnstArt,aXtraGrid,vFuncBool,CubicBool)\n", "```\n", "call, that then calls\n", "```\n", "ConsPerfForesightSolver.assign_parameters(self,solution_next,DiscFac,LivPrb,CRRA,Rfree,PermGroFac)\n", "```\n", "We're getting kind of detailed here, but it is simply to help us understand the inheritance structure. The methods are quite straight forward, and simply assign the list of variables to self. The ones that do not get assigned by the `ConsPerfForesightSolver` method gets assign by the `ConsIndShockSetup` method instead.\n", "\n", "\n", "After all the input parameters are set, we update the utility function definitions. Remember, that we restrict ourselves to CRRA utility functions, and these are parameterized with the scalar we call `CRRA` in HARK. We use the two-argument CRRA utility (and derivatives, inverses, etc) from `HARK.utilities`, so we need to create a `lambda` (an anonymous function) according to the fixed `CRRA` we have chosen. This gets done through a call to\n", "\n", "```\n", "ConsIndShockSetup.defUtilityFuncs()\n", "```\n", "that itself calls\n", "```\n", "ConsPerfForesightSolver.defUtilityFuncs()\n", "```\n", "Again, we wish to emphasize the inheritance structure. The method in `ConsPerfForesightSolver` defines the most basic utility functions (utility, its marginal and its marginal marginal), and `ConsIndShockSolver` adds additional functions (marginal of inverse, inverse of marginal, marginal of inverse of marginal, and optionally inverse if `vFuncBool` is true).\n", "\n", "To sum up, the `__init__` method lives in `ConsIndShockSetup`, calls `assign_parameters` and `defUtilityFuncs` from `ConsPerfForesightSolver` and defines its own methods with the same names that adds some methods used to solve the `IndShockConsumerType` using EGM. The main things controlled by the end-user are whether cubic interpolation should be used, `CubicBool`, and if the value function should be explicitly formed, `vFuncBool`.\n", "### Prepare to solve\n", "We are now in bullet 2) from the list above. The `prepare_to_solve` method is all about grabbing relevant information from next period's solution, calculating some limiting solutions. It comes from `ConsIndShockSetup` and calls two methods:\n", "\n", "1. `ConsIndShockSetup.setAndUpdateValues(self.solution_next,self.IncomeDstn,self.LivPrb,self.DiscFac)`\n", "2. `ConsIndShockSetup.defBoroCnst(self.BoroCnstArt)`\n", "\n", "First, we have `setAndUpdateValues`. The main purpose is to grab the relevant vectors that represent the shock distributions, the effective discount factor, and value function (marginal, level, marginal marginal depending on the options). It also calculates some limiting marginal propensities to consume and human wealth levels. Second, we have `defBoroCnst`. As the name indicates, it calculates the natural borrowing constraint, handles artificial borrowing constraints, and defines the consumption function where the constraint binds (`cFuncNowCnst`).\n", "\n", "To sum, `prepare_to_solve` sets up the stochastic environment an borrowing constraints the consumer might face. It also grabs interpolants from \"next period\"'s solution.\n", "\n", "### Solve it!\n", "The last method `solveConsIndShock` will call from the `solver` is `solve`. This method essentially has four steps:\n", " 1. Pre-processing for EGM: solver.prepare_to_calc_EndOfPrdvP\n", " 1. First step of EGM: solver.calc_EndOfPrdvP\n", " 1. Second step of EGM: solver.make_basic_solution\n", " 1. Add MPC and human wealth: solver.add_MPC_and_human_wealth\n", "\n", "#### Pre-processing for EGM `prepare_to_calc_EndOfPrdvP`\n", "Find relevant values of end-of-period asset values (according to `aXtraGrid` and natural borrowing constraint) and next period values implied by current period end-of-period assets and stochastic elements. The method stores the following in `self`:\n", "\n", " 1. values of permanent shocks in `PermShkVals_temp`\n", " 1. shock probabilities in `ShkPrbs_temp`\n", " 1. next period resources in `mNrmNext`\n", " 1. current grid of end-of-period assets in `aNrmNow`\n", "\n", "The method also returns `aNrmNow`. The definition is in `ConsIndShockSolverBasic` and is not overwritten in `ConsIndShockSolver`.\n", "\n", "#### First step of EGM `calc_EndOfPrdvP`\n", "Find the marginal value of having some level of end-of-period assets today. End-of-period assets as well as stochastics imply next-period resources at the beginning of the period, calculated above. Return the result as `EndOfPrdvP`.\n", "\n", "#### Second step of EGM `make_basic_solution`\n", "Apply inverse marginal utility function to nodes from about to find (m, c) pairs for the new consumption function in `get_points_for_interpolation` and create the interpolants in `use_points_for_interpolation`. The latter constructs the `ConsumerSolution` that contains the current consumption function `cFunc`, the current marginal value function `vPfunc`, and the smallest possible resource level `mNrmMinNow`.\n", "\n", "#### Add MPC and human wealth `add_MPC_and_human_wealth`\n", "Add values calculated in `defBoroCnst` now that we have a solution object to put them in.\n", "\n", "#### Special to the non-Basic solver\n", "We are now done, but in the `ConsIndShockSolver` (non-`Basic`!) solver there are a few extra steps. We add steady state m, and depending on the values of `vFuncBool` and `CubicBool` we also add the value function and the marginal marginal value function." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Let's try it in action!\n", "First, we define a standard lifecycle model, solve it and then" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from HARK.ConsumptionSaving.ConsIndShockModel import (\n", " IndShockConsumerType,\n", " init_lifecycle,\n", ")\n", "import numpy as np\n", "\n", "LifecycleExample = IndShockConsumerType(**init_lifecycle)\n", "LifecycleExample.cycles = (\n", " 1 # Make this consumer live a sequence of periods exactly once\n", ")\n", "LifecycleExample.solve()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's have a look at the solution in time period second period. We should then be able to" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from HARK.utilities import plot_funcs\n", "\n", "plot_funcs(\n", " [LifecycleExample.solution[0].cFunc], LifecycleExample.solution[0].mNrmMin, 10\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us then create a solver for the first period.\n", "\n", "**Note:** These next cells import from legacy code that will eventually be deprecated in HARK. The methodology and math described here is correct, but the specific organization of methods is in flux." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "from HARK.ConsumptionSaving.LegacyOOsolvers import ConsIndShockSolverBasic\n", "\n", "solver = ConsIndShockSolverBasic(\n", " LifecycleExample.solution[1],\n", " LifecycleExample.IncShkDstn[0],\n", " LifecycleExample.LivPrb[0],\n", " LifecycleExample.DiscFac,\n", " LifecycleExample.CRRA,\n", " LifecycleExample.Rfree,\n", " LifecycleExample.PermGroFac[0],\n", " LifecycleExample.BoroCnstArt,\n", " LifecycleExample.aXtraGrid,\n", " LifecycleExample.vFuncBool,\n", " LifecycleExample.CubicBool,\n", ")" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "solver.prepare_to_solve()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Many important values are now calculated and stored in solver, such as the effective discount factor, the smallest permanent income shock, and more." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.9586233599999999" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "solver.DiscFacEff" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.6554858756904396" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "solver.PermShkMinNext" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "These values were calculated in `setAndUpdateValues`. In `defBoroCnst` that was also called, several things were calculated, for example the consumption function defined by the borrowing constraint." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_funcs([solver.cFuncNowCnst], solver.mNrmMinNow, 10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then, we set up all the grids, grabs the discrete shock distributions, and state grids in `prepare_to_calc_EndOfPrdvP`." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([-1.97928710e-01, -1.78757337e-01, -1.58464113e-01, -1.36959776e-01,\n", " -1.14146021e-01, -8.99143874e-02, -6.41449810e-02, -3.67050128e-02,\n", " -7.44711582e-03, 2.37925970e-02, 5.71967790e-02, 9.29694545e-02,\n", " 1.31339050e-01, 1.72561926e-01, 2.16926520e-01, 2.64758197e-01,\n", " 3.16424968e-01, 3.72344255e-01, 4.32990903e-01, 4.98906718e-01,\n", " 5.70711872e-01, 6.49118576e-01, 7.34947546e-01, 8.29147929e-01,\n", " 9.32821508e-01, 1.04725224e+00, 1.17394250e+00, 1.31465773e+00,\n", " 1.47148180e+00, 1.64688590e+00, 1.84381499e+00, 2.06579663e+00,\n", " 2.31707906e+00, 2.60280747e+00, 2.92925051e+00, 3.30409357e+00,\n", " 3.73682117e+00, 4.23921964e+00, 4.82604335e+00, 5.51590530e+00,\n", " 6.33247875e+00, 7.30613392e+00, 8.47619016e+00, 9.89404831e+00,\n", " 1.16275966e+01, 1.37674827e+01, 1.64361548e+01, 1.98010713e+01])" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "solver.prepare_to_calc_EndOfPrdvP()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then we calculate the marginal utility of next period's resources given the stochastic environment and current grids." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "EndOfPrdvP = solver.calc_EndOfPrdvP()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then, we essentially just have to construct the (resource, consumption) pairs by completing the EGM step, and constructing the interpolants by using the knowledge that the limiting solutions are those of the perfect foresight model. This is done with `make_basic_solution` as discussed above." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "solution = solver.make_basic_solution(\n", " EndOfPrdvP, solver.aNrmNow, solver.make_linear_cFunc\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lastly, we add the MPC and human wealth quantities we calculated in the method that prepared the solution of this period." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "solver.add_MPC_and_human_wealth(solution)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "All that is left is to verify that the solution in `solution` is identical to `LifecycleExample.solution[0]`. We can plot the against each other:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_funcs(\n", " [LifecycleExample.solution[0].cFunc, solution.cFunc],\n", " LifecycleExample.solution[0].mNrmMin,\n", " 10,\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Although, it's probably even clearer if we just subtract the function values from each other at some grid." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eval_grid = np.linspace(0, 20, 200)\n", "LifecycleExample.solution[0].cFunc(eval_grid) - solution.cFunc(eval_grid)" ] } ], "metadata": { "@webio": { "lastCommId": null, "lastKernelId": null }, "hide_input": false, "jupytext": { "formats": "ipynb,py:percent" }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.0" }, "latex_envs": { "LaTeX_envs_menu_present": true, "autoclose": false, "autocomplete": true, "bibliofile": "biblio.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 1, "hotkeys": { "equation": "Ctrl-E", "itemize": "Ctrl-I" }, "labels_anchors": false, "latex_user_defs": false, "report_style_numbering": false, "user_envs_cfg": false }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 4 }