CompEcon Toolbox – Changes, Bugs, etc.
The CompEcon Toolbox was extensively revised during the fall of 2002 to make it conform with the final published version of Applied Computational Economics and Finance. We are not able to document all the changes before the release of the text. All changes October, 2002 through 2017 are documented here (dates refer to when the fix was made – not when it was posted to the web site). Changes after 2017 will be documented on the CompEcon GitHub site: https://github.com/PaulFackler/CompEcon
Numerous errors fixed and m-files versions provided for most of the MEX functions in the toolbox. All demos now run without MEX files.
Line 58 changed to read
Corrected program so the model definition allows either model.horizon or model.T to specify the time horizon.
A new ZIP file was put on the web site that correctly updated the toolbox.
One of the options (eps0) was used to do two things – it was used in the convergence criteria and was used to determine if the step direction is
sufficiently uphill. These two functions are at odds with each other and the same values should not have been used. This can cause convergence problems
or excessive resetting of the search direction or both. To change this, a new optional variable was created (eps1) to handle the uphill direction
check. The default values are eps0=1 and eps1=1e-12.
The was a bug in icdfn.c that did not handle values with x<=0 or x>=1 correctly when x is a vector. This is corrected and a new MEX file should be created. Change directories to the cetools directory and type “mex icdfn.c” at the command prompt or run mexallagain.
Made minor changes to speed up execution slightly and added a warning message if N>model.horizon
Method was incorrectly code; the line Q=diag(A); should have been Q=diag(diag(A)); or, better yet, Q = sparse(1:n,1:n,diag(A),n,n);
Fixed the c-code to correctly handle sparse matrices. Somehow the changes of 10/23/03 did not get made to this function.
Adjusted to ensure that sizes of analytic and numerical derivatives are consistent.
Added a clear all command to ensure that default setting are restored.
All demos run now without errors.
The constant of integration was incorrectly computed for the piece-wise linear (“LIN”) family of functions. It is now correctly so the integral is 0 at the left endpoint of the function.
The x- and y-axis labels were reversed (quantity should be on the x-axis).
In the finite horizon section the line
s = n+1-sum(r(:,u)<cumsum(pstar(s,:,t),2),2);
should be changed to
if t<=N, s = n+1-sum(r(:,u)<cumsum(pstar(s,:,t),2),2); end
!!!!THIS IS VERY IMPORTANT!!!!
A change in the behavior of MATLAB’s API functions created bugs in several MEX files. Specifically, mxIsDouble used to return false if passed a sparse matrix, but beginning with ver 6.5 now returns true. All the MEX files (files with extension .c) have been corrected to work with all versions of MATLAB (ver 5 or higher). These files should be reinstalled and MEXALL should be rerun to ensure the proper behavior of the toolbox. For Windows ver 5. users, new DLLs for are provided with the toolbox. All other users MUST run MEXALL.
The utility to compile all of the toolbox MEX files apparently did not run correctly on UNIX machines. The problem seemed to be in the use of “/” for directory separators rather than “\”. The utility should work on both Windows and UNIX machines now. If you have trouble with this function please contact me.
Changed the handling of “direct” format when evaluated at points defined by a cell array. This also affected the operation of FUNDEF, which inadvertently used the “direct” format needlessly. This is a technical fix that should speed up operations that used FUNDEF.
Added the ability to convert form “tensor” to “expanded” form. This is a feature that is expected to be used rarely but was added to help with the fix to FUNBASX.
Added the ability to handle mixed format matrices (sparse/double and double/sparse) within the C MEX file. Previously mixed formats were handled by callbacks to the M file DPRODS. The MEX function both speeds up direct product operations and reduces the memory load of the operator. DPROD is a low level utility located in the CETOOLS\PRIVATE directory. The new DPROD makes DPRODS no longer be necessary.
NOTE: DPROD currently only works for REAL matrices.
Corrected a problem that incorrectly set evenly spaced breakpoint indicator to 0; this would slow execution of basis computations for piecewise linear functions. Also corrected check for even spacing; if all(abs(diff(diff((breaks))))>5e-15*mean(abs(breaks))) returns true, the breakpoint sequence is considered to be evenly spaced.
Corrected a problem in appending piecewise linear dimensions to a basis definition. FUNDEFN now checks if the optional extra breakpoint sequences are evenly spaced and sets the parameters accordingly. The same test is used as in LINDEF. Also corrected the documentation, which did not describe this feature.
Changed line 236 from
nx = length(model.actions);
nx = = size(X,1);
to allow for multiple discrete control variables.
FJAC1 and FDJAC1
Two new functions added that are 1 sided equivalants of FJAC and FDJAC. Note that the input syntax of these functions differs from the associated FJAC and FDJAC because an additional input variable for the function value f(x) can be passed. This is often already known so it saves on one function evaluation. Thus a derivative approximation can be obtained in half the time it takes for FJAC and FDJAC.
Actually included the new code refered to below (2/22/03); somehow an old version snuck back in.
Improved documentation and added a fourth search method allowing the user to return a approximation to the inverse Hessian to be used in determining the search direction. The user defined function f must have the following syntax
[fx,g,A] = f(x,additional variables)
and the command
should be executed before qnewton is called.
Made a number of changes to RESOLVE to make it conform to a paper on the topic. This is an alternative rational expectations solver to the one described in the text (REMSOLVE). See demre01 and demre02 for demos. Email me for a working paper on the solver.
Corrected the m-file version to make 4th and 5th inputs optional. Note that this m-file shoould not be used – the whole point is to obtain the speedup of the MEX implementation.
If coefficients are all 0, this now returns a scalar 0 rather than an empty matrix.
Added a new function to perform linear solves using precomputed LU factors. Matlab code for the function is:
A MEX file version is also available that speeds up the operation. Some quick speed comparisons indicated 20% speedups.
FINSOLVE now calls LUSOLVE if implicit or CN algorithms are used.
Altered convergence criteria to help avoid premature termination.
DPROD (in cetools\private)
Added sparse/sparse computation to MEX file C-code (callbacks to MATLAB are still used for mixed full/sparse). The routine is storage and timing efficient and should speed up evaluation of spline function and basis evaluations.
Altered explicit and CN algorithms to perform LU decomposition (with minimum degree column permuatation) prior to iteration loop. This avoids the repeated linear solves used in old algorithm. This leads to dramatic speed improvements and makes the methods competitive with the explicit algorithm for multidimensional problems (with larger time steps).
Added a new feature: setting model.american to -1 will produce early exercise options for the asset seller such as callable bonds and early deliver of futures. Buyer early exercise is computed as the maximum of the value of waiting and the value of exercising. Seller early exercise is the minumium of the two.
Corrected documentation and implementation of setable options
No change in functionality
CHANGES IN DYNAMIC GAME SOLVER AND DEMOS
Added new feature to GAMESOLVE to allow the initial coefficient matrix
to be passed as an empty matrix. GAMESOLVE will compute the initial
coefficients using a policy iteration step evaluated at the initial
values of the decision variables (x).
Also added a new function, GAMECHECK, that checks whether the analytic
derivatives in a model function file match their finite difference
approximations. This works like DPCHECK.
Altered the 3 game demos to correct errors in the derivatives.
In demgame01 the fxx value were incorrect
In demgame02 the gx and gxx values were incorrect
In demgame03 the fx and fxx values did not compute cross terms
In demgame01 this leads to faster solution times but does not change
In demgame02 the solution is changed (although qualitative results
In demgame03 no changes occur because the cross terms in fx and fxx are
Note the cross terms in fx and fxx lead not be computed (although
gamecheck will produce a warning message).
The cross terms in gx and gxx, however, are used and must be returned
by the model function file.
Also altered demgame02 to utilize better initial values of x and to
set cinit= to force GAMESOLVE to compute initial coefficient values.
Simplified the code by using FJAC instead of FDJAC.