AIM Subsystem cosists of 

A function dynAIMsolver1(jacobia_,M_,dr) which maps Dynare to Gary Anderson AIM package subsystem and derives the solution for gy=dr.hgx and gu=dr.hgu from the AIM outputs (where "1" in the title is for 1st order solver).

A subset of routines from Gary Anderson AIM package starting with SP... needed to compute and solve system passed on and returned by dynAIMsolver1.
( see  http://www.federalreserve.gov/Pubs/oss/oss4/aimindex.html  )

The path to the AIM directory,if exists, is added by dynare_config.m using addpath.

DR1 tries to invoke AIM if options_.aim_solver == 1 is set and, if not check only, and if 1st order only: 
    if (options_.aim_solver == 1) && (task == 0) && (options_.order == 1) 

for start, options_.aim_solver = 0 is set by default in global_initialization.m so that system uses mjdgges by default. 

If AIM is to be used, options_.aim_solver = 1 needs to be set either in the model <>.mod file, before invoking, estimate and/or stoch_simul, or by issuing appropriate command for estimate and/or stoch_simul. 

NOTE: in the current implementation, as of July 2008, handling of exceptions is rather fundamental and, in particular, when Blanchard and Kahn conditions are not met, only a large penalty value 1.0e+8 is being set.

Hence, system may not coverge ot resluts may not be accurate if there were many messages like 
Error in AIM: aimcode=4 : Aim: too few big roots
or
Error in AIM: aimcode=3 : Aim: too many big roots
especially close to the point of convergence.

However, if other exceptions occur and aimcode (see codes below) is higher than 5, the system resets options_.aim_solver = 0 and tries to use mjdgges instead.


APPENDIX

% AIM System is given as a sum: 
% i.e. for i=-$...+&   SUM(Hi*xt+i)= £*zt, t = 0, . . . ,?
% and its input as single array of matrices: [H-$...  Hi ... H+&]
% and its solution as xt=SUM( Bi*xt+i) + @*£*zt for i=-$...-1 
% with the output in form bb=[B-$...  Bi ... B-1] and @=inv(Ho+H1*B-1) 
% Dynare jacobian = [fy'-$...  fy'i ... fy'+&  fu'] 
% where [fy'-$...  fy'i ... fy'+&]=[H-$...  Hi ... H+&] and fu'= £


%function [dr,aimcode]=dynAIMsolver1(jacobia_,M_,dr)
% INPUTS
%   jacobia_   [matrix]           1st order derivative of the model 
%   dr         [matlab structure] Decision rules for stochastic simulations.
%   M_         [matlab structure] Definition of the model.           
%    
% OUTPUTS
%   dr         [matlab structure] Decision rules for stochastic simulations.
%   aimcode    [integer]          1: the model defines variables uniquely
%   aimcode is resolved in AIMerr as
%      (c==1)  e='Aim: unique solution.';
%      (c==2)  e='Aim: roots not correctly computed by real_schur.';
%      (c==3)  e='Aim: too many big roots.';
%      (c==35) e='Aim: too many big roots, and q(:,right) is singular.';
%      (c==4)  e='Aim: too few big roots.';
%      (c==45) e='Aim: too few big roots, and q(:,right) is singular.';
%      (c==5)  e='Aim: q(:,right) is singular.';
%      (c==61) e='Aim: too many exact shiftrights.';
%      (c==62) e='Aim: too many numeric shiftrights.';
%      else    e='Aimerr: return code not properly specified';
%    
% SPECIAL REQUIREMENTS
% Dynare use: 
%       1) the lognormal block in DR1 is being invoked for some models and changing
%       values of ghx and ghy. We need to return the AIM output
%       values before that block and run the block with the current returned values
%       of gy (i.e. dr.ghx) and gu (dr.ghu) if it is needed even when the AIM is used  
%       (it does not depend on mjdgges output).
%       
%       2) for forward looking models, passing into dynAIMsolver 
%		aa={Q'|1}*jacobia_ can produce ~ one order closer  
%       results to the Dynare solutiion then when if plain jacobia_ is passed, 
%       i.e. diff < e-14 for aa and diff < *e-13 for jacobia_ if Q' is used.  
%
% GP July 2008  
% part of DYNARE, copyright Dynare Team (1996-2008)
% Gnu Public License.
