# Bug in WorkshopOLGTPath4

**URL:** https://discourse.vfitoolkit.com/t/bug-in-workshopolgtpath4/586
**Category:** Uncategorized
**Created:** [February 6, 2026, 4:24am UTC](https://discourse.vfitoolkit.com/t/bug-in-workshopolgtpath4/586 "2026-02-06T04:24:14Z")
**Posts on this page:** 2
**Page:** 1

<div class="post-metadata">

### Author: ![yechen](https://discourse.vfitoolkit.com/letter_avatar_proxy/v4/letter/y/5fc32e/32.png) [@yechen](https://discourse.vfitoolkit.com/u/yechen)
#### Post date: [February 6, 2026, 4:24am UTC](https://discourse.vfitoolkit.com/t/bug-in-workshopolgtpath4/586/1 "2026-02-06T04:24:15Z")

</div>

There are bugs in WorkshopOLGTPath4.

**Bug 1** (In Line 72): The addition of ‘sj’ to DiscountFactorParamNames is missing.

**Bug 2** (In line 100): The ‘mewj’ should be calculated based on ‘sj’. When revising the corresponding scripts, I made the following changes:

```auto
Params.mewj = ones(1,N_j)/N_j;
for jj = 2:length(Params.mewj)
    Params.mewj(jj) = Params.sj(jj-1)*Params.mewj(jj-1);
end
Params.mewj = Params.mewj./sum(Params.mewj);

```

However, the bequests condition no longer converges to a satisfactory result following these revisions.

```auto
Current GE prices: 
	r: 0.0287 
	w: 1.5154 
	G: 0.0643 
	Beq: 0.0303 
Current aggregate variables: 
	L: 0.4246 
	K: 4.6528 
	taxrevenue: 0.0643 
	Beqleft: 0.0158 
	Beqreceived: 0.0176 
Current GeneralEqmEqns: 
	capitalmarket: 0.000919 
	labormarket: 0.000064 
	govbudgetbalance: 0.000076 
	bequests: -0.001788 
Elapsed time is 611.383478 seconds.

GEcondns_init = 

  struct with fields:

       capitalmarket: 9.1949e-04
         labormarket: 6.4371e-05
    govbudgetbalance: 7.6062e-05
            bequests: -0.0018

```

After revising ReturnFn\_OLGTPath4 to distribute accidental bequests evenly across all agents (adding ‘beq’ to retired agents’ budgets), the solution improves significantly. Given that both approaches simply redistribute bequests to survivors, why is there such a substantial difference in result accuracy? It confused me. The results from my revised scripts are below:

```auto
Current GE prices: 
	r: 0.0282 
	w: 1.5088 
	G: 0.0645 
	Beq: 0.0263 
Current aggregate variables: 
	L: 0.4276 
	K: 4.6311 
	taxrevenue: 0.0645 
	Beqleft: 0.0156 
	Beqreceived: 0.0153 
Current GeneralEqmEqns: 
	capitalmarket: -0.000205 
	labormarket: -0.000018 
	govbudgetbalance: -0.000014 
	bequests: 0.000334 
Elapsed time is 637.750974 seconds.

GEcondns_init = 

  struct with fields:

       capitalmarket: -2.0544e-04
         labormarket: -1.7555e-05
    govbudgetbalance: -1.4226e-05
            bequests: 3.3424e-04

```

**Bug 3** (Line 246): The argument GeneralEqmEqns in the function TransitionPath\_Case1\_Fhorz should be GeneralEqmEqns\_Transition. However, when I passed GeneralEqmEqns\_Transition to the function, the script returned error messages. It indicates that Bequest\_tminus1 is undefined. I am uncertain about the proper way to define lagged or lead variables/parameters in the toolkit.

```auto
Unrecognized function or variable 'Beqleft_tminus1'.

Error in OLGTPath4>@(Beqleft,Beqreceived)Beqleft_tminus1-Beqreceived (line
205)
GeneralEqmEqns_Transition.bequests = @(Beqleft,Beqreceived)
Beqleft_tminus1-Beqreceived; % Note: bequests are left in t-1 and received
in t (not declare Beqleft_tminus1?)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error in GeneralEqmConditions_Case1_v3 (line 11)
GeneralEqmConditionsValue=GeneralEqmEqnsCell(GeneralEqmEqnParamsCell{:});
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error in updatePricePathNew_TPath_tt (line 6)
    p_i(gg)=real(GeneralEqmConditions_Case1_v3(GeneralEqmEqnsCell{gg},
    GeneralEqmEqnParamNames(gg).Names, Parameters));
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error in TransitionPath_FHorz_shooting_fastOLG (line 178)
        [PricePathNew_tt,GEcondnPath_tt]=updatePricePathNew_TPath_tt(Parameters,GeneralEqmEqnsCell,GeneralEqmEqnParamNames,PricePathOld(tt,:),transpathoptions);
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error in TransitionPath_Case1_FHorz (line 740)
                    [PricePath,GEcondnPath]=TransitionPath_FHorz_shooting_fastOLG(PricePath0,
                    PricePathNames, PricePathSizeVec, l_p, ParamPath,
                    ParamPathNames, ParamPathSizeVec, T, V_final,
                    AgentDist_initial, jequalOneDist, n_d, n_a, n_z, N_j,
                    N_d,N_a,N_z, l_d,l_aprime,l_a,l_z,
                    d_gridvals,aprime_gridvals,a_gridvals,d_grid,a_grid,z_gridvals_J,ze_gridvals_J_fastOLG,
                    pi_z_J,pi_z_J_sim, ReturnFn, FnsToEvaluateCell,
                    AggVarNames, FnsToEvaluateParamNames, GEeqnNames,
                    GeneralEqmEqnsCell, GeneralEqmEqnParamNames, Parameters,
                    DiscountFactorParamNames, AgeWeights_T,
                    ReturnFnParamNames,
                    N_probs,II1orII,II2,exceptlastj,exceptfirstj,justfirstj,
                    use_tminus1price, use_tminus1params, use_tplus1price,
                    use_tminus1AggVars, tminus1priceNames,
                    tminus1paramNames, tplus1priceNames,
                    tminus1AggVarsNames, vfoptions, simoptions,
                    transpathoptions);
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error in OLGTPath4 (line 232)
[PricePath, GECondnsPath] =
TransitionPath_Case1_FHorz(PricePath0,ParamPath,T,V_final,AgentDist_init,jequaloneDist,n_d,n_a,n_z,N_j,d_grid,a_grid,z_grid,pi_z,ReturnFn,FnsToEvaluate,GeneralEqmEqns_Transition,Params,DiscountFactorParamNames,AgeWeightParamNames,transpathoptions,simoptions,vfoptions);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

```

---

<div class="post-metadata">

### Author: ![robertdkirkby](https://discourse.vfitoolkit.com/user_avatar/discourse.vfitoolkit.com/robertdkirkby/32/287_2.png) [@robertdkirkby](https://discourse.vfitoolkit.com/u/robertdkirkby)
#### Post date: [February 23, 2026, 3:06am UTC](https://discourse.vfitoolkit.com/t/bug-in-workshopolgtpath4/586/2 "2026-02-23T03:06:25Z")

</div>

I made the first two changes.

The general eqm is accurate (p\_eqm\_init.Beq is 0.0304 and the GE condition for bequests is -0.0018; so the difference between beq left and beq received is small relative to the bequests).

If you want it smaller you can change  
`heteroagentoptions.toleranceGEcondns=10^(-4); % Accuracy of general eqm eqns`  
to be, e.g., 10^(-6).

You can also play with  
`heteroagentoptions.multiGEweights=ones(1,length(fieldnames(GeneralEqmEqns))); % Weights on GECondns, when being combined`  
and put a bigger weight on the bequest if you felt it was more important that is close to zero than for the others.

I fixed up the \_tminus1 bit too. You just set

```auto
% Because we are using Beqleft_tminus1, we need to store the t=0 value
transpathoptions.initialvalues.Beqleft=p_eqm_init.Beq*sum(Params.mewj(1:Params.Jr-1));

```

Just update both toolkit and the workshop code to the current github versions.

Thanks for pointing these out.
