|
188 | 188 | ReturnFnParamNames=[];
|
189 | 189 | FnsToEvaluateParamNames=[];
|
190 | 190 |
|
191 |
| - |
192 |
| -% Internally, only ever use age-dependent joint-grids (makes all the code much easier to write) |
193 |
| -% Gradually rolling these out so that all the commands build off of these |
194 |
| -z_gridvals_J=zeros(prod(n_z),length(n_z),'gpuArray'); |
195 |
| -pi_z_J=zeros(prod(n_z),prod(n_z),'gpuArray'); |
| 191 | +%% Set up exogenous shock grids now (so they can then just be reused every time) |
| 192 | +% Check if using ExogShockFn or EiidShockFn, and if so, do these use a |
| 193 | +% parameter that is being calibrated |
| 194 | +caliboptions.calibrateshocks=0; % set to one if need to redo shocks for each new calib parameter vector |
196 | 195 | if isfield(vfoptions,'ExogShockFn')
|
197 |
| - if isfield(vfoptions,'ExogShockFnParamNames') |
198 |
| - for jj=1:N_j |
199 |
| - ExogShockFnParamsVec=CreateVectorFromParams(Parameters, vfoptions.ExogShockFnParamNames,jj); |
200 |
| - ExogShockFnParamsCell=cell(length(ExogShockFnParamsVec),1); |
201 |
| - for ii=1:length(ExogShockFnParamsVec) |
202 |
| - ExogShockFnParamsCell(ii,1)={ExogShockFnParamsVec(ii)}; |
203 |
| - end |
204 |
| - [z_grid,pi_z]=vfoptions.ExogShockFn(ExogShockFnParamsCell{:}); |
205 |
| - pi_z_J(:,:,jj)=gpuArray(pi_z); |
206 |
| - if all(size(z_grid)==[sum(n_z),1]) |
207 |
| - z_gridvals_J(:,:,jj)=gpuArray(CreateGridvals(n_z,z_grid,1)); |
208 |
| - else % already joint-grid |
209 |
| - z_gridvals_J(:,:,jj)=gpuArray(z_grid,1); |
210 |
| - end |
211 |
| - end |
212 |
| - else |
213 |
| - for jj=1:N_j |
214 |
| - [z_grid,pi_z]=vfoptions.ExogShockFn(N_j); |
215 |
| - pi_z_J(:,:,jj)=gpuArray(pi_z); |
216 |
| - if all(size(z_grid)==[sum(n_z),1]) |
217 |
| - z_gridvals_J(:,:,jj)=gpuArray(CreateGridvals(n_z,z_grid,1)); |
218 |
| - else % already joint-grid |
219 |
| - z_gridvals_J(:,:,jj)=gpuArray(z_grid,1); |
220 |
| - end |
221 |
| - end |
222 |
| - end |
223 |
| -elseif prod(n_z)==0 % no z |
224 |
| - z_gridvals_J=[]; |
225 |
| -elseif ndims(z_grid)==3 % already an age-dependent joint-grid |
226 |
| - if all(size(z_grid)==[prod(n_z),length(n_z),N_j]) |
227 |
| - z_gridvals_J=z_grid; |
| 196 | + temp=getAnonymousFnInputNames(vfoptions.ExogShockFn); |
| 197 | + % can just leave action space in here as we only use it to see if CalibParamNames is part of it |
| 198 | + if ~isempty(intersect(temp,CalibParamNames)) |
| 199 | + caliboptions.calibrateshocks=1; |
228 | 200 | end
|
229 |
| - pi_z_J=pi_z; |
230 |
| -elseif all(size(z_grid)==[sum(n_z),N_j]) % age-dependent grid |
231 |
| - for jj=1:N_j |
232 |
| - z_gridvals_J(:,:,jj)=CreateGridvals(n_z,z_grid(:,jj),1); |
| 201 | +elseif isfield(vfoptions,'EiidShockFn') |
| 202 | + temp=getAnonymousFnInputNames(vfoptions.EiidShockFn); |
| 203 | + % can just leave action space in here as we only use it to see if CalibParamNames is part of it |
| 204 | + if ~isempty(intersect(temp,CalibParamNames)) |
| 205 | + caliboptions.calibrateshocks=1; |
233 | 206 | end
|
234 |
| - pi_z_J=pi_z; |
235 |
| -elseif all(size(z_grid)==[prod(n_z),length(n_z)]) % joint grid |
236 |
| - z_gridvals_J=z_grid.*ones(1,1,N_j,'gpuArray'); |
237 |
| - pi_z_J=pi_z.*ones(1,1,N_j,'gpuArray'); |
238 |
| -elseif all(size(z_grid)==[sum(n_z),1]) % basic grid |
239 |
| - z_gridvals_J=CreateGridvals(n_z,z_grid,1).*ones(1,1,N_j,'gpuArray'); |
240 |
| - pi_z_J=pi_z.*ones(1,1,N_j,'gpuArray'); |
241 | 207 | end
|
242 |
| - |
243 |
| -% If using e variable, do same for this |
244 |
| -if isfield(vfoptions,'n_e') |
245 |
| - if prod(vfoptions.n_e)==0 |
246 |
| - vfoptions=rmfield(vfoptions,'n_e'); |
247 |
| - else |
248 |
| - if isfield(vfoptions,'e_grid_J') |
249 |
| - error('No longer use vfoptions.e_grid_J, instead just put the age-dependent grid in vfoptions.e_grid (functionality of VFI Toolkit has changed to make it easier to use)') |
250 |
| - end |
251 |
| - if ~isfield(vfoptions,'e_grid') % && ~isfield(vfoptions,'e_grid_J') |
252 |
| - error('You are using an e (iid) variable, and so need to declare vfoptions.e_grid') |
253 |
| - elseif ~isfield(vfoptions,'pi_e') |
254 |
| - error('You are using an e (iid) variable, and so need to declare vfoptions.pi_e') |
255 |
| - end |
256 |
| - |
257 |
| - vfoptions.e_gridvals_J=zeros(prod(vfoptions.n_e),length(vfoptions.n_e),'gpuArray'); |
258 |
| - vfoptions.pi_e_J=zeros(prod(vfoptions.n_e),prod(vfoptions.n_e),'gpuArray'); |
259 |
| - |
260 |
| - if isfield(vfoptions,'EiidShockFn') |
261 |
| - if isfield(vfoptions,'EiidShockFnParamNames') |
262 |
| - for jj=1:N_j |
263 |
| - EiidShockFnParamsVec=CreateVectorFromParams(Parameters, vfoptions.EiidShockFnParamNames,jj); |
264 |
| - EiidShockFnParamsCell=cell(length(EiidShockFnParamsVec),1); |
265 |
| - for ii=1:length(EiidShockFnParamsVec) |
266 |
| - EiidShockFnParamsCell(ii,1)={EiidShockFnParamsVec(ii)}; |
267 |
| - end |
268 |
| - [vfoptions.e_grid,vfoptions.pi_e]=vfoptions.EiidShockFn(EiidShockFnParamsCell{:}); |
269 |
| - vfoptions.pi_e_J(:,jj)=gpuArray(vfoptions.pi_e); |
270 |
| - if all(size(vfoptions.e_grid)==[sum(vfoptions.n_e),1]) |
271 |
| - vfoptions.e_gridvals_J(:,:,jj)=gpuArray(CreateGridvals(vfoptions.n_e,vfoptions.e_grid,1)); |
272 |
| - else % already joint-grid |
273 |
| - vfoptions.e_gridvals_J(:,:,jj)=gpuArray(vfoptions.e_grid,1); |
274 |
| - end |
275 |
| - end |
276 |
| - else |
277 |
| - for jj=1:N_j |
278 |
| - [vfoptions.e_grid,vfoptions.pi_e]=vfoptions.EiidShockFn(N_j); |
279 |
| - vfoptions.pi_e_J(:,jj)=gpuArray(vfoptions.pi_e); |
280 |
| - if all(size(vfoptions.e_grid)==[sum(vfoptions.n_e),1]) |
281 |
| - vfoptions.e_gridvals_J(:,:,jj)=gpuArray(CreateGridvals(vfoptions.n_e,vfoptions.e_grid,1)); |
282 |
| - else % already joint-grid |
283 |
| - vfoptions.e_gridvals_J(:,:,jj)=gpuArray(vfoptions.e_grid,1); |
284 |
| - end |
285 |
| - end |
286 |
| - end |
287 |
| - elseif ndims(vfoptions.e_grid)==3 % already an age-dependent joint-grid |
288 |
| - if all(size(vfoptions.e_grid)==[prod(vfoptions.n_e),length(vfoptions.n_e),N_j]) |
289 |
| - vfoptions.e_gridvals_J=vfoptions.e_grid; |
290 |
| - end |
291 |
| - vfoptions.pi_e_J=vfoptions.pi_e; |
292 |
| - elseif all(size(vfoptions.e_grid)==[sum(vfoptions.n_e),N_j]) % age-dependent stacked-grid |
293 |
| - for jj=1:N_j |
294 |
| - vfoptions.e_gridvals_J(:,:,jj)=CreateGridvals(vfoptions.n_e,vfoptions.e_grid(:,jj),1); |
295 |
| - end |
296 |
| - vfoptions.pi_e_J=vfoptions.pi_e; |
297 |
| - elseif all(size(vfoptions.e_grid)==[prod(vfoptions.n_e),length(vfoptions.n_e)]) % joint grid |
298 |
| - vfoptions.e_gridvals_J=vfoptions.e_grid.*ones(1,1,N_j,'gpuArray'); |
299 |
| - vfoptions.pi_e_J=vfoptions.pi_e.*ones(1,N_j,'gpuArray'); |
300 |
| - elseif all(size(vfoptions.e_grid)==[sum(vfoptions.n_e),1]) % basic grid |
301 |
| - vfoptions.e_gridvals_J=CreateGridvals(vfoptions.n_e,vfoptions.e_grid,1).*ones(1,1,N_j,'gpuArray'); |
302 |
| - vfoptions.pi_e_J=vfoptions.pi_e.*ones(1,N_j,'gpuArray'); |
303 |
| - end |
304 |
| - end |
| 208 | +if caliboptions.calibrateshocks==0 |
| 209 | + % Internally, only ever use age-dependent joint-grids (makes all the code much easier to write) |
| 210 | + [z_gridvals_J, pi_z_J, vfoptions]=ExogShockSetup_FHorz(n_z,z_grid,pi_z,N_j,Parameters,vfoptions,3); |
| 211 | + % output: z_gridvals_J, pi_z_J, vfoptions.e_gridvals_J, vfoptions.pi_e_J |
305 | 212 | simoptions.e_gridvals_J=vfoptions.e_gridvals_J;
|
306 | 213 | simoptions.pi_e_J=vfoptions.pi_e_J;
|
307 | 214 | end
|
308 |
| - |
309 |
| - |
| 215 | +% Regardless of whether they are done here of in _objectivefn, they will be |
| 216 | +% precomputed by the time we get to the value fn, staty dist, etc. So |
| 217 | +vfoptions.alreadygridvals=1; |
| 218 | +simoptions.alreadygridvals=1; |
310 | 219 |
|
311 | 220 |
|
312 | 221 | %%
|
|
0 commit comments