Merge branch 'master' into ecb-master
commit
97743cbb3f
|
@ -191,6 +191,7 @@ Running Dynare
|
||||||
* Dynare invocation::
|
* Dynare invocation::
|
||||||
* Dynare hooks::
|
* Dynare hooks::
|
||||||
* Understanding Preprocessor Error Messages::
|
* Understanding Preprocessor Error Messages::
|
||||||
|
* Invoking the Dynare Preprocessor from the GNU/Linux or macOS Command Line::
|
||||||
|
|
||||||
The Model file
|
The Model file
|
||||||
|
|
||||||
|
@ -729,6 +730,7 @@ required by the user. Its contents are described in @ref{The Model file}.
|
||||||
* Dynare invocation::
|
* Dynare invocation::
|
||||||
* Dynare hooks::
|
* Dynare hooks::
|
||||||
* Understanding Preprocessor Error Messages::
|
* Understanding Preprocessor Error Messages::
|
||||||
|
* Invoking the Dynare Preprocessor from the GNU/Linux or macOS Command Line::
|
||||||
@end menu
|
@end menu
|
||||||
|
|
||||||
@node Dynare invocation
|
@node Dynare invocation
|
||||||
|
@ -1108,6 +1110,41 @@ it did not expect. Hence, it throws an error of the form: @code{ERROR:
|
||||||
PARAMETERS}. In this case, you would simply place a semicolon at the
|
PARAMETERS}. In this case, you would simply place a semicolon at the
|
||||||
end of line one and the parser would continue processing.
|
end of line one and the parser would continue processing.
|
||||||
|
|
||||||
|
@node Invoking the Dynare Preprocessor from the GNU/Linux or macOS Command Line
|
||||||
|
@section Invoking the Dynare Preprocessor from the GNU/Linux or macOS Command Line
|
||||||
|
|
||||||
|
You can invoke the preprocessor directly from the command line. In this way,
|
||||||
|
the preprocessor can be called a @file{.mod} file as explained above or on the
|
||||||
|
text of a @file{.mod} file as explained herein.
|
||||||
|
|
||||||
|
In certain circumstances, it may be useful to invoke the preprocessor on the
|
||||||
|
text of a @file{.mod} file. To do so, simply invoke the preprocessor by passing
|
||||||
|
it the text of your @file{.mod} file as the first argument. This argument
|
||||||
|
requires special care. First, any native Matlab statements contained in the
|
||||||
|
string representing your @file{.mod} file must be followed by a newline
|
||||||
|
character (@code{\n}). Further, any single-line comments must also be followed
|
||||||
|
by a newline character. Finally, any apostrophe's must be escaped with a
|
||||||
|
backslash (@i{i.e.}, @code{\'} instead of @code{'}.
|
||||||
|
|
||||||
|
Taking into account the considerations above, the file located in
|
||||||
|
@code{examples/example1.mod} could be run by executing:
|
||||||
|
@example
|
||||||
|
./dynare_m $'/* * Example 1 from F. Collard (2001): "Stochastic simulations
|
||||||
|
with DYNARE: * A practical guide" (see "guide.pdf" in the documentation
|
||||||
|
directory). */var y, c, k, a, h, b;varexo e, u;parameters beta, rho, alpha,
|
||||||
|
delta, theta, psi, tau;alpha = 0.36;rho = 0.95;tau = 0.025;beta = 0.99;delta =
|
||||||
|
0.025;psi = 0;theta = 2.95;phi = 0.1;\nmodel;c*theta*h^(1+psi)=(1-alpha)*y;k =
|
||||||
|
beta*(((exp(b)*c)/(exp(b(+1))*c(+1))) *(exp(b(+1))*alpha*y(+1)+(1-delta)*k));y
|
||||||
|
= exp(a)*(k(-1)^alpha)*(h^(1-alpha));k = exp(b)*(y-c)+(1-delta)*k(-1);a =
|
||||||
|
rho*a(-1)+tau*b(-1) + e;b = tau*a(-1)+rho*b(-1) + u;end;initval;y =
|
||||||
|
1.08068253095672;c = 0.80359242014163;h = 0.29175631001732;k =
|
||||||
|
11.08360443260358;a = 0;b = 0;e = 0;u = 0;end;shocks;var e; stderr 0.009;var u;
|
||||||
|
stderr 0.009;var e, u = phi*0.009*0.009;end;stoch_simul;'
|
||||||
|
@end example
|
||||||
|
|
||||||
|
This produces the same output as when running dynare on a @file{.mod} file with
|
||||||
|
the basename of the output files being set to @code{mod_file_passed_as_string_}.
|
||||||
|
|
||||||
@node The Model file
|
@node The Model file
|
||||||
@chapter The Model file
|
@chapter The Model file
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,7 @@ for ii=1:length(TeX_Files)
|
||||||
~strcmp(TeX_Files(ii).name,[M_.fname,'_dynamic.tex']) && ...
|
~strcmp(TeX_Files(ii).name,[M_.fname,'_dynamic.tex']) && ...
|
||||||
~strcmp(TeX_Files(ii).name,[M_.fname,'_static.tex']) && ...
|
~strcmp(TeX_Files(ii).name,[M_.fname,'_static.tex']) && ...
|
||||||
~strcmp(TeX_Files(ii).name,[M_.fname,'_original.tex']) && ...
|
~strcmp(TeX_Files(ii).name,[M_.fname,'_original.tex']) && ...
|
||||||
|
~strcmp(TeX_Files(ii).name,[M_.fname,'_steady_state.tex']) && ...
|
||||||
~strcmp(TeX_Files(ii).name,[M_.fname,'_TeX_binder.tex'])
|
~strcmp(TeX_Files(ii).name,[M_.fname,'_TeX_binder.tex'])
|
||||||
fprintf(fid,'%s \n',['\include{',f_name,'}']);
|
fprintf(fid,'%s \n',['\include{',f_name,'}']);
|
||||||
end
|
end
|
||||||
|
|
|
@ -98,7 +98,7 @@ if ~ischar(fname)
|
||||||
end
|
end
|
||||||
|
|
||||||
% Testing if filename has more than one period (not allowed).
|
% Testing if filename has more than one period (not allowed).
|
||||||
dot_location=(strfind(fname,'.'));
|
dot_location=strfind(fname,'.');
|
||||||
if length(dot_location)>1
|
if length(dot_location)>1
|
||||||
error('DYNARE: Periods in filenames are only allowed for .mod or .dyn extensions')
|
error('DYNARE: Periods in filenames are only allowed for .mod or .dyn extensions')
|
||||||
end
|
end
|
||||||
|
@ -108,7 +108,7 @@ if dot_location==length(fname)
|
||||||
end
|
end
|
||||||
|
|
||||||
% Add dyn or mod extension to the file name if not already provided.
|
% Add dyn or mod extension to the file name if not already provided.
|
||||||
if isempty(strfind(fname,'.'))
|
if isempty(dot_location)
|
||||||
fnamelength = length(fname);
|
fnamelength = length(fname);
|
||||||
fname1 = [fname '.dyn'];
|
fname1 = [fname '.dyn'];
|
||||||
d = dir(fname1);
|
d = dir(fname1);
|
||||||
|
|
|
@ -777,63 +777,6 @@ RamseyConstraintsStatement::writeJsonOutput(ostream &output) const
|
||||||
output << "}";
|
output << "}";
|
||||||
}
|
}
|
||||||
|
|
||||||
// Statement *
|
|
||||||
// RamseyConstraintsStatement::cloneAndReindexSymbIds(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table)
|
|
||||||
// {
|
|
||||||
// vector<string> errors;
|
|
||||||
// SymbolList new_symbol_list, new_options_symbol_list;
|
|
||||||
// OptionsList new_options_list = options_list;
|
|
||||||
// SymbolTable *new_symbol_table = dynamic_datatree.getSymbolTable();
|
|
||||||
// vector<string> symbols = symbol_list.get_symbols();
|
|
||||||
|
|
||||||
// for (vector<string>::const_iterator it = symbols.begin(); it != symbols.end(); it++)
|
|
||||||
// try
|
|
||||||
// {
|
|
||||||
// new_symbol_table->getID(*it);
|
|
||||||
// new_symbol_list.addSymbol(*it);
|
|
||||||
// }
|
|
||||||
// catch (SymbolTable::UnknownSymbolIDException &e)
|
|
||||||
// {
|
|
||||||
// errors.push_back(orig_symbol_table.getName(e.id));
|
|
||||||
// }
|
|
||||||
// catch (SymbolTable::UnknownSymbolNameException &e)
|
|
||||||
// {
|
|
||||||
// errors.push_back(e.name);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// OptionsList::symbol_list_options_t::const_iterator it = options_list.symbol_list_options.find("instruments");
|
|
||||||
// if (it != options_list.symbol_list_options.end())
|
|
||||||
// {
|
|
||||||
// symbols = it->second.get_symbols();
|
|
||||||
// for (vector<string>::const_iterator it1 = symbols.begin(); it1 != symbols.end(); it1++)
|
|
||||||
// try
|
|
||||||
// {
|
|
||||||
// new_symbol_table->getID(*it1);
|
|
||||||
// new_options_symbol_list.addSymbol(*it1);
|
|
||||||
// }
|
|
||||||
// catch (SymbolTable::UnknownSymbolIDException &e)
|
|
||||||
// {
|
|
||||||
// errors.push_back(orig_symbol_table.getName(e.id));
|
|
||||||
// }
|
|
||||||
// catch (SymbolTable::UnknownSymbolNameException &e)
|
|
||||||
// {
|
|
||||||
// errors.push_back(e.name);
|
|
||||||
// }
|
|
||||||
// new_options_list.symbol_list_options["instruments"] = new_options_symbol_list;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// if (!errors.empty())
|
|
||||||
// {
|
|
||||||
// cerr << endl
|
|
||||||
// << "ERROR: The following vars were used in the ramsey_policy statement(s) but were not declared." << endl
|
|
||||||
// << " This likely means that you declared them as varexo and that they're not in the model" << endl;
|
|
||||||
// for (vector<string>::const_iterator it = errors.begin(); it != errors.end(); it++)
|
|
||||||
// cerr << *it << endl;
|
|
||||||
// exit(EXIT_FAILURE);
|
|
||||||
// }
|
|
||||||
// return new RamseyPolicyStatement(new_symbol_list, options_list);
|
|
||||||
// }
|
|
||||||
|
|
||||||
RamseyPolicyStatement::RamseyPolicyStatement(const SymbolTable &symbol_table_arg,
|
RamseyPolicyStatement::RamseyPolicyStatement(const SymbolTable &symbol_table_arg,
|
||||||
const vector<string> &ramsey_policy_list_arg,
|
const vector<string> &ramsey_policy_list_arg,
|
||||||
const OptionsList &options_list_arg) :
|
const OptionsList &options_list_arg) :
|
||||||
|
|
|
@ -213,7 +213,6 @@ public:
|
||||||
virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
|
virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
|
||||||
virtual void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const;
|
virtual void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const;
|
||||||
virtual void writeJsonOutput(ostream &output) const;
|
virtual void writeJsonOutput(ostream &output) const;
|
||||||
// virtual Statement *cloneAndReindexSymbIds(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class RamseyPolicyStatement : public Statement
|
class RamseyPolicyStatement : public Statement
|
||||||
|
|
|
@ -48,9 +48,8 @@ void main2(stringstream &in, string &basename, bool debug, bool clear_all, bool
|
||||||
, JsonOutputPointType json, JsonFileOutputType json_output_mode, bool onlyjson, bool jsonderivsimple
|
, JsonOutputPointType json, JsonFileOutputType json_output_mode, bool onlyjson, bool jsonderivsimple
|
||||||
);
|
);
|
||||||
|
|
||||||
void main1(char *modfile, string &basename, bool debug, bool save_macro, string &save_macro_file,
|
void main1(string &modfile, string &basename, string &modfiletxt, bool debug, bool save_macro, string &save_macro_file,
|
||||||
bool no_line_macro,
|
bool no_line_macro, map<string, string> &defines, vector<string> &path, stringstream ¯o_output);
|
||||||
map<string, string> &defines, vector<string> &path, stringstream ¯o_output);
|
|
||||||
|
|
||||||
void
|
void
|
||||||
usage()
|
usage()
|
||||||
|
@ -339,10 +338,35 @@ main(int argc, char **argv)
|
||||||
|
|
||||||
// Construct basename (i.e. remove file extension if there is one)
|
// Construct basename (i.e. remove file extension if there is one)
|
||||||
string basename = argv[1];
|
string basename = argv[1];
|
||||||
|
string modfile, modfiletxt;
|
||||||
|
size_t fsc = basename.find_first_of(';');
|
||||||
|
if (fsc != string::npos)
|
||||||
|
{
|
||||||
|
// If a semicolon is found in argv[1], treat it as the text of the modfile
|
||||||
|
modfile = "mod_file_passed_as_string.mod";
|
||||||
|
basename = "mod_file_passed_as_string";
|
||||||
|
modfiletxt = argv[1];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// If a semicolon is NOT found in argv[1], treat it as the name of the modfile
|
||||||
|
modfile = argv[1];
|
||||||
size_t pos = basename.find_last_of('.');
|
size_t pos = basename.find_last_of('.');
|
||||||
if (pos != string::npos)
|
if (pos != string::npos)
|
||||||
basename.erase(pos);
|
basename.erase(pos);
|
||||||
|
|
||||||
|
ifstream modfile(argv[1], ios::binary);
|
||||||
|
if (modfile.fail())
|
||||||
|
{
|
||||||
|
cerr << "ERROR: Could not open file: " << argv[1] << endl;
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
stringstream buffer;
|
||||||
|
buffer << modfile.rdbuf();
|
||||||
|
modfiletxt = buffer.str();
|
||||||
|
}
|
||||||
|
|
||||||
WarningConsolidation warnings(no_warn);
|
WarningConsolidation warnings(no_warn);
|
||||||
|
|
||||||
// Process config file
|
// Process config file
|
||||||
|
@ -360,7 +384,7 @@ main(int argc, char **argv)
|
||||||
|
|
||||||
// Do macro processing
|
// Do macro processing
|
||||||
stringstream macro_output;
|
stringstream macro_output;
|
||||||
main1(argv[1], basename, debug, save_macro, save_macro_file, no_line_macro, defines, path, macro_output);
|
main1(modfile, basename, modfiletxt, debug, save_macro, save_macro_file, no_line_macro, defines, path, macro_output);
|
||||||
|
|
||||||
if (only_macro)
|
if (only_macro)
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
|
|
|
@ -23,13 +23,13 @@
|
||||||
#include "macro/MacroDriver.hh"
|
#include "macro/MacroDriver.hh"
|
||||||
|
|
||||||
void
|
void
|
||||||
main1(char *modfile, string &basename, bool debug, bool save_macro, string &save_macro_file, bool no_line_macro,
|
main1(string &modfile, string &basename, string &modfiletxt, bool debug, bool save_macro, string &save_macro_file,
|
||||||
map<string, string> &defines, vector<string> &path, stringstream ¯o_output)
|
bool no_line_macro, map<string, string> &defines, vector<string> &path, stringstream ¯o_output)
|
||||||
{
|
{
|
||||||
// Do macro processing
|
// Do macro processing
|
||||||
MacroDriver m;
|
MacroDriver m;
|
||||||
|
|
||||||
m.parse(modfile, macro_output, debug, no_line_macro, defines, path);
|
m.parse(modfile, modfiletxt, macro_output, debug, no_line_macro, defines, path);
|
||||||
if (save_macro)
|
if (save_macro)
|
||||||
{
|
{
|
||||||
if (save_macro_file.empty())
|
if (save_macro_file.empty())
|
||||||
|
|
|
@ -2147,11 +2147,14 @@ UnaryOpNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
|
||||||
output << "exp";
|
output << "exp";
|
||||||
break;
|
break;
|
||||||
case oLog:
|
case oLog:
|
||||||
|
if (IS_LATEX(output_type))
|
||||||
|
output << "\\log";
|
||||||
|
else
|
||||||
output << "log";
|
output << "log";
|
||||||
break;
|
break;
|
||||||
case oLog10:
|
case oLog10:
|
||||||
if (IS_LATEX(output_type))
|
if (IS_LATEX(output_type))
|
||||||
output << "log_{10}";
|
output << "\\log_{10}";
|
||||||
else
|
else
|
||||||
output << "log10";
|
output << "log10";
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -413,6 +413,23 @@ ModFile::transformPass(bool nostrict, bool stochastic, bool compute_xrefs)
|
||||||
mod_file_struct.ramsey_eq_nbr = dynamic_model.equation_number() - mod_file_struct.orig_eq_nbr;
|
mod_file_struct.ramsey_eq_nbr = dynamic_model.equation_number() - mod_file_struct.orig_eq_nbr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Workaround for #1193
|
||||||
|
if (!mod_file_struct.hist_vals_wrong_lag.empty())
|
||||||
|
{
|
||||||
|
bool err = false;
|
||||||
|
for (map<int, int>::const_iterator it = mod_file_struct.hist_vals_wrong_lag.begin();
|
||||||
|
it != mod_file_struct.hist_vals_wrong_lag.end(); it++)
|
||||||
|
if (dynamic_model.minLagForSymbol(it->first) > it->second - 1)
|
||||||
|
{
|
||||||
|
cerr << "ERROR: histval: variable " << symbol_table.getName(it->first)
|
||||||
|
<< " does not appear in the model with the lag " << it->second - 1
|
||||||
|
<< " (see the reference manual for the timing convention in 'histval')" << endl;
|
||||||
|
err = true;
|
||||||
|
}
|
||||||
|
if (err)
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
if (mod_file_struct.stoch_simul_present
|
if (mod_file_struct.stoch_simul_present
|
||||||
|| mod_file_struct.estimation_present
|
|| mod_file_struct.estimation_present
|
||||||
|| mod_file_struct.osr_present
|
|| mod_file_struct.osr_present
|
||||||
|
|
|
@ -308,9 +308,11 @@ EndValStatement::writeJsonOutput(ostream &output) const
|
||||||
}
|
}
|
||||||
|
|
||||||
HistValStatement::HistValStatement(const hist_values_t &hist_values_arg,
|
HistValStatement::HistValStatement(const hist_values_t &hist_values_arg,
|
||||||
|
const hist_vals_wrong_lag_t hist_vals_wrong_lag_arg,
|
||||||
const SymbolTable &symbol_table_arg,
|
const SymbolTable &symbol_table_arg,
|
||||||
const bool &all_values_required_arg) :
|
const bool &all_values_required_arg) :
|
||||||
hist_values(hist_values_arg),
|
hist_values(hist_values_arg),
|
||||||
|
hist_vals_wrong_lag(hist_vals_wrong_lag_arg),
|
||||||
symbol_table(symbol_table_arg),
|
symbol_table(symbol_table_arg),
|
||||||
all_values_required(all_values_required_arg)
|
all_values_required(all_values_required_arg)
|
||||||
{
|
{
|
||||||
|
@ -356,6 +358,7 @@ HistValStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidat
|
||||||
if (unused_endo.size() > 0 || unused_exo.size() > 0)
|
if (unused_endo.size() > 0 || unused_exo.size() > 0)
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
mod_file_struct.hist_vals_wrong_lag = hist_vals_wrong_lag;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -107,12 +107,15 @@ public:
|
||||||
Maps pairs (symbol_id, lag) to expr_t
|
Maps pairs (symbol_id, lag) to expr_t
|
||||||
*/
|
*/
|
||||||
typedef map<pair<int, int>, expr_t> hist_values_t;
|
typedef map<pair<int, int>, expr_t> hist_values_t;
|
||||||
|
typedef map<int, int> hist_vals_wrong_lag_t;
|
||||||
private:
|
private:
|
||||||
const hist_values_t hist_values;
|
const hist_values_t hist_values;
|
||||||
|
const hist_vals_wrong_lag_t hist_vals_wrong_lag;
|
||||||
const SymbolTable &symbol_table;
|
const SymbolTable &symbol_table;
|
||||||
const bool all_values_required;
|
const bool all_values_required;
|
||||||
public:
|
public:
|
||||||
HistValStatement(const hist_values_t &hist_values_arg,
|
HistValStatement(const hist_values_t &hist_values_arg,
|
||||||
|
const hist_vals_wrong_lag_t hist_vals_wrong_lag_arg,
|
||||||
const SymbolTable &symbol_table_arg,
|
const SymbolTable &symbol_table_arg,
|
||||||
const bool &all_values_required_arg);
|
const bool &all_values_required_arg);
|
||||||
//! Workaround for trac ticket #157
|
//! Workaround for trac ticket #157
|
||||||
|
|
|
@ -712,14 +712,13 @@ ParsingDriver::hist_val(string *name, string *lag, expr_t rhs)
|
||||||
error("histval: " + *name + " should be an endogenous or exogenous variable");
|
error("histval: " + *name + " should be an endogenous or exogenous variable");
|
||||||
|
|
||||||
int ilag = atoi(lag->c_str());
|
int ilag = atoi(lag->c_str());
|
||||||
|
if (ilag > 0)
|
||||||
|
error("histval: the lag on " + *name + " should be less than or equal to 0");
|
||||||
|
|
||||||
pair<int, int> key(symb_id, ilag);
|
pair<int, int> key(symb_id, ilag);
|
||||||
|
|
||||||
if (mod_file->dynamic_model.minLagForSymbol(symb_id) > ilag - 1)
|
if (mod_file->dynamic_model.minLagForSymbol(symb_id) > ilag - 1)
|
||||||
{
|
hist_vals_wrong_lag[symb_id] = ilag;
|
||||||
ostringstream s;
|
|
||||||
s << ilag-1;
|
|
||||||
error("histval: variable " + *name + " does not appear in the model with the lag " + s.str() + " (see the reference manual for the timing convention in 'histval')");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hist_values.find(key) != hist_values.end())
|
if (hist_values.find(key) != hist_values.end())
|
||||||
error("hist_val: (" + *name + ", " + *lag + ") declared twice");
|
error("hist_val: (" + *name + ", " + *lag + ") declared twice");
|
||||||
|
@ -835,7 +834,7 @@ ParsingDriver::end_endval(bool all_values_required)
|
||||||
void
|
void
|
||||||
ParsingDriver::end_histval(bool all_values_required)
|
ParsingDriver::end_histval(bool all_values_required)
|
||||||
{
|
{
|
||||||
mod_file->addStatement(new HistValStatement(hist_values, mod_file->symbol_table, all_values_required));
|
mod_file->addStatement(new HistValStatement(hist_values, hist_vals_wrong_lag, mod_file->symbol_table, all_values_required));
|
||||||
hist_values.clear();
|
hist_values.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -157,6 +157,8 @@ private:
|
||||||
InitOrEndValStatement::init_values_t init_values;
|
InitOrEndValStatement::init_values_t init_values;
|
||||||
//! Temporary storage for histval blocks
|
//! Temporary storage for histval blocks
|
||||||
HistValStatement::hist_values_t hist_values;
|
HistValStatement::hist_values_t hist_values;
|
||||||
|
//! Temporary storage for histval blocks
|
||||||
|
HistValStatement::hist_vals_wrong_lag_t hist_vals_wrong_lag;
|
||||||
//! Temporary storage for homotopy_setup blocks
|
//! Temporary storage for homotopy_setup blocks
|
||||||
HomotopyStatement::homotopy_values_t homotopy_values;
|
HomotopyStatement::homotopy_values_t homotopy_values;
|
||||||
//! Temporary storage for moment_calibration
|
//! Temporary storage for moment_calibration
|
||||||
|
|
|
@ -123,6 +123,8 @@ public:
|
||||||
bool steady_state_model_present;
|
bool steady_state_model_present;
|
||||||
//! Whether there is a write_latex_steady_state_model statement present
|
//! Whether there is a write_latex_steady_state_model statement present
|
||||||
bool write_latex_steady_state_model_present;
|
bool write_latex_steady_state_model_present;
|
||||||
|
//! Histval values that do not have the appropriate lag
|
||||||
|
map<int, int> hist_vals_wrong_lag;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Statement
|
class Statement
|
||||||
|
|
|
@ -38,7 +38,7 @@ AuxVarInfo::AuxVarInfo(int symb_id_arg, aux_var_t type_arg, int orig_symb_id_arg
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
SymbolTable::SymbolTable() : frozen(false), size(0)
|
SymbolTable::SymbolTable() : frozen(false)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,7 +78,7 @@ SymbolTable::addSymbol(const string &name, SymbolType type, const string &tex_na
|
||||||
else
|
else
|
||||||
non_long_name_partition_exists = true;
|
non_long_name_partition_exists = true;
|
||||||
|
|
||||||
int id = size++;
|
int id = symbol_table.size();
|
||||||
|
|
||||||
symbol_table[name] = id;
|
symbol_table[name] = id;
|
||||||
type_table.push_back(type);
|
type_table.push_back(type);
|
||||||
|
@ -110,7 +110,7 @@ SymbolTable::freeze() throw (FrozenException)
|
||||||
|
|
||||||
frozen = true;
|
frozen = true;
|
||||||
|
|
||||||
for (int i = 0; i < size; i++)
|
for (int i = 0; i < symbol_table.size(); i++)
|
||||||
{
|
{
|
||||||
int tsi;
|
int tsi;
|
||||||
switch (getType(i))
|
switch (getType(i))
|
||||||
|
@ -156,8 +156,7 @@ SymbolTable::changeType(int id, SymbolType newtype) throw (UnknownSymbolIDExcept
|
||||||
if (frozen)
|
if (frozen)
|
||||||
throw FrozenException();
|
throw FrozenException();
|
||||||
|
|
||||||
if (id < 0 || id >= size)
|
validateSymbID(id);
|
||||||
throw UnknownSymbolIDException(id);
|
|
||||||
|
|
||||||
type_table[id] = newtype;
|
type_table[id] = newtype;
|
||||||
}
|
}
|
||||||
|
@ -790,8 +789,8 @@ SymbolTable::getAuxiliaryVarsExprNode(int symb_id) const throw (SearchFailedExce
|
||||||
void
|
void
|
||||||
SymbolTable::markPredetermined(int symb_id) throw (UnknownSymbolIDException, FrozenException)
|
SymbolTable::markPredetermined(int symb_id) throw (UnknownSymbolIDException, FrozenException)
|
||||||
{
|
{
|
||||||
if (symb_id < 0 || symb_id >= size)
|
validateSymbID(symb_id);
|
||||||
throw UnknownSymbolIDException(symb_id);
|
|
||||||
if (frozen)
|
if (frozen)
|
||||||
throw FrozenException();
|
throw FrozenException();
|
||||||
|
|
||||||
|
@ -803,9 +802,7 @@ SymbolTable::markPredetermined(int symb_id) throw (UnknownSymbolIDException, Fro
|
||||||
bool
|
bool
|
||||||
SymbolTable::isPredetermined(int symb_id) const throw (UnknownSymbolIDException)
|
SymbolTable::isPredetermined(int symb_id) const throw (UnknownSymbolIDException)
|
||||||
{
|
{
|
||||||
if (symb_id < 0 || symb_id >= size)
|
validateSymbID(symb_id);
|
||||||
throw UnknownSymbolIDException(symb_id);
|
|
||||||
|
|
||||||
return (predetermined_variables.find(symb_id) != predetermined_variables.end());
|
return (predetermined_variables.find(symb_id) != predetermined_variables.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -818,9 +815,7 @@ SymbolTable::predeterminedNbr() const
|
||||||
void
|
void
|
||||||
SymbolTable::addObservedVariable(int symb_id) throw (UnknownSymbolIDException)
|
SymbolTable::addObservedVariable(int symb_id) throw (UnknownSymbolIDException)
|
||||||
{
|
{
|
||||||
if (symb_id < 0 || symb_id >= size)
|
validateSymbID(symb_id);
|
||||||
throw UnknownSymbolIDException(symb_id);
|
|
||||||
|
|
||||||
assert(getType(symb_id) == eEndogenous);
|
assert(getType(symb_id) == eEndogenous);
|
||||||
varobs.push_back(symb_id);
|
varobs.push_back(symb_id);
|
||||||
}
|
}
|
||||||
|
@ -848,9 +843,7 @@ SymbolTable::getObservedVariableIndex(int symb_id) const
|
||||||
void
|
void
|
||||||
SymbolTable::addObservedExogenousVariable(int symb_id) throw (UnknownSymbolIDException)
|
SymbolTable::addObservedExogenousVariable(int symb_id) throw (UnknownSymbolIDException)
|
||||||
{
|
{
|
||||||
if (symb_id < 0 || symb_id >= size)
|
validateSymbID(id);
|
||||||
throw UnknownSymbolIDException(symb_id);
|
|
||||||
|
|
||||||
assert(getType(symb_id) != eEndogenous);
|
assert(getType(symb_id) != eEndogenous);
|
||||||
varexobs.push_back(symb_id);
|
varexobs.push_back(symb_id);
|
||||||
}
|
}
|
||||||
|
|
|
@ -112,9 +112,6 @@ private:
|
||||||
//! Has method freeze() been called?
|
//! Has method freeze() been called?
|
||||||
bool frozen;
|
bool frozen;
|
||||||
|
|
||||||
//! Number of symbols contained in the table
|
|
||||||
int size;
|
|
||||||
|
|
||||||
typedef map<string, int> symbol_table_type;
|
typedef map<string, int> symbol_table_type;
|
||||||
//! Maps strings to symbol IDs
|
//! Maps strings to symbol IDs
|
||||||
symbol_table_type symbol_table;
|
symbol_table_type symbol_table;
|
||||||
|
@ -226,6 +223,8 @@ private:
|
||||||
int addLeadAuxiliaryVarInternal(bool endo, int index, expr_t arg) throw (FrozenException);
|
int addLeadAuxiliaryVarInternal(bool endo, int index, expr_t arg) throw (FrozenException);
|
||||||
//! Factorized code for Json writing
|
//! Factorized code for Json writing
|
||||||
void writeJsonVarVector(ostream &output, const vector<int> &varvec) const;
|
void writeJsonVarVector(ostream &output, const vector<int> &varvec) const;
|
||||||
|
//! Factorized code for asserting that 0 <= symb_id <= symbol_table.size()
|
||||||
|
inline void validateSymbID(int symb_id) const throw (UnknownSymbolIDException);
|
||||||
public:
|
public:
|
||||||
//! Add a symbol
|
//! Add a symbol
|
||||||
/*! Returns the symbol ID */
|
/*! Returns the symbol ID */
|
||||||
|
@ -382,6 +381,13 @@ public:
|
||||||
set <int> getOrigEndogenous() const;
|
set <int> getOrigEndogenous() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
inline void
|
||||||
|
SymbolTable::validateSymbID(int symb_id) const throw (UnknownSymbolIDException)
|
||||||
|
{
|
||||||
|
if (symb_id < 0 || symb_id > symbol_table.size())
|
||||||
|
throw UnknownSymbolIDException(symb_id);
|
||||||
|
}
|
||||||
|
|
||||||
inline bool
|
inline bool
|
||||||
SymbolTable::exists(const string &name) const
|
SymbolTable::exists(const string &name) const
|
||||||
{
|
{
|
||||||
|
@ -392,36 +398,28 @@ SymbolTable::exists(const string &name) const
|
||||||
inline string
|
inline string
|
||||||
SymbolTable::getName(int id) const throw (UnknownSymbolIDException)
|
SymbolTable::getName(int id) const throw (UnknownSymbolIDException)
|
||||||
{
|
{
|
||||||
if (id < 0 || id >= size)
|
validateSymbID(id);
|
||||||
throw UnknownSymbolIDException(id);
|
|
||||||
else
|
|
||||||
return name_table[id];
|
return name_table[id];
|
||||||
}
|
}
|
||||||
|
|
||||||
inline string
|
inline string
|
||||||
SymbolTable::getTeXName(int id) const throw (UnknownSymbolIDException)
|
SymbolTable::getTeXName(int id) const throw (UnknownSymbolIDException)
|
||||||
{
|
{
|
||||||
if (id < 0 || id >= size)
|
validateSymbID(id);
|
||||||
throw UnknownSymbolIDException(id);
|
|
||||||
else
|
|
||||||
return tex_name_table[id];
|
return tex_name_table[id];
|
||||||
}
|
}
|
||||||
|
|
||||||
inline string
|
inline string
|
||||||
SymbolTable::getLongName(int id) const throw (UnknownSymbolIDException)
|
SymbolTable::getLongName(int id) const throw (UnknownSymbolIDException)
|
||||||
{
|
{
|
||||||
if (id < 0 || id >= size)
|
validateSymbID(id);
|
||||||
throw UnknownSymbolIDException(id);
|
|
||||||
else
|
|
||||||
return long_name_table[id];
|
return long_name_table[id];
|
||||||
}
|
}
|
||||||
|
|
||||||
inline SymbolType
|
inline SymbolType
|
||||||
SymbolTable::getType(int id) const throw (UnknownSymbolIDException)
|
SymbolTable::getType(int id) const throw (UnknownSymbolIDException)
|
||||||
{
|
{
|
||||||
if (id < 0 || id >= size)
|
validateSymbID(id);
|
||||||
throw UnknownSymbolIDException(id);
|
|
||||||
else
|
|
||||||
return type_table[id];
|
return type_table[id];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -447,8 +445,7 @@ SymbolTable::getTypeSpecificID(int id) const throw (UnknownSymbolIDException, No
|
||||||
if (!frozen)
|
if (!frozen)
|
||||||
throw NotYetFrozenException();
|
throw NotYetFrozenException();
|
||||||
|
|
||||||
if (id < 0 || id >= size)
|
validateSymbID(id);
|
||||||
throw UnknownSymbolIDException(id);
|
|
||||||
|
|
||||||
return type_specific_ids[id];
|
return type_specific_ids[id];
|
||||||
}
|
}
|
||||||
|
@ -498,7 +495,7 @@ SymbolTable::param_nbr() const throw (NotYetFrozenException)
|
||||||
inline int
|
inline int
|
||||||
SymbolTable::maxID()
|
SymbolTable::maxID()
|
||||||
{
|
{
|
||||||
return (size-1);
|
return symbol_table.size() - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline int
|
inline int
|
||||||
|
|
|
@ -37,18 +37,11 @@ MacroDriver::~MacroDriver()
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
MacroDriver::parse(const string &f, ostream &out, bool debug, bool no_line_macro,
|
MacroDriver::parse(const string &f, const string &modfiletxt, ostream &out, bool debug, bool no_line_macro,
|
||||||
map<string, string> defines, vector<string> path)
|
map<string, string> defines, vector<string> path)
|
||||||
{
|
{
|
||||||
file = f;
|
file = f;
|
||||||
|
|
||||||
ifstream in(f.c_str(), ios::binary);
|
|
||||||
if (in.fail())
|
|
||||||
{
|
|
||||||
cerr << "ERROR: Could not open file: " << f << endl;
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copy the file into a stringstream, and add an extra end-of-line. This is a
|
Copy the file into a stringstream, and add an extra end-of-line. This is a
|
||||||
workaround for trac ticket #73: with this workaround, MOD files ending with
|
workaround for trac ticket #73: with this workaround, MOD files ending with
|
||||||
|
@ -66,7 +59,7 @@ MacroDriver::parse(const string &f, ostream &out, bool debug, bool no_line_macro
|
||||||
{
|
{
|
||||||
file_with_endl << "@#define " << it->first << " = \"" << it->second << "\"" << endl;
|
file_with_endl << "@#define " << it->first << " = \"" << it->second << "\"" << endl;
|
||||||
}
|
}
|
||||||
file_with_endl << in.rdbuf() << endl;
|
file_with_endl << modfiletxt << endl;
|
||||||
|
|
||||||
lexer = new MacroFlex(&file_with_endl, &out, no_line_macro, path);
|
lexer = new MacroFlex(&file_with_endl, &out, no_line_macro, path);
|
||||||
lexer->set_debug(debug);
|
lexer->set_debug(debug);
|
||||||
|
|
|
@ -182,7 +182,7 @@ public:
|
||||||
|
|
||||||
//! Starts parsing a file, returns output in out
|
//! Starts parsing a file, returns output in out
|
||||||
/*! \param no_line_macro should we omit the @#line statements ? */
|
/*! \param no_line_macro should we omit the @#line statements ? */
|
||||||
void parse(const string &f, ostream &out, bool debug, bool no_line_macro,
|
void parse(const string &f, const string &modfiletxt, ostream &out, bool debug, bool no_line_macro,
|
||||||
map<string, string> defines, vector<string> path);
|
map<string, string> defines, vector<string> path);
|
||||||
|
|
||||||
//! Name of main file being parsed
|
//! Name of main file being parsed
|
||||||
|
|
|
@ -85,6 +85,7 @@ MODFILES = \
|
||||||
optimal_policy/Ramsey/ramsey_ex.mod \
|
optimal_policy/Ramsey/ramsey_ex.mod \
|
||||||
optimal_policy/Ramsey/ramsey_ex_initval_AR2.mod \
|
optimal_policy/Ramsey/ramsey_ex_initval_AR2.mod \
|
||||||
optimal_policy/Ramsey/ramsey_ex_aux.mod \
|
optimal_policy/Ramsey/ramsey_ex_aux.mod \
|
||||||
|
optimal_policy/Ramsey/ramsey_histval.mod \
|
||||||
optimal_policy/Ramsey/Gali_commitment.mod \
|
optimal_policy/Ramsey/Gali_commitment.mod \
|
||||||
optimal_policy/RamseyConstraints/test1.mod \
|
optimal_policy/RamseyConstraints/test1.mod \
|
||||||
discretionary_policy/dennis_1.mod \
|
discretionary_policy/dennis_1.mod \
|
||||||
|
@ -357,6 +358,7 @@ XFAIL_MODFILES = ramst_xfail.mod \
|
||||||
estimation/fs2000_stochastic_singularity_xfail.mod \
|
estimation/fs2000_stochastic_singularity_xfail.mod \
|
||||||
identification/ident_unit_root/ident_unit_root_xfail.mod \
|
identification/ident_unit_root/ident_unit_root_xfail.mod \
|
||||||
steady_state/Linear_steady_state_xfail.mod \
|
steady_state/Linear_steady_state_xfail.mod \
|
||||||
|
optimal_policy/Ramsey/ramsey_histval_xfail.mod \
|
||||||
example1_extra_exo_xfail.mod
|
example1_extra_exo_xfail.mod
|
||||||
|
|
||||||
MFILES = initval_file/ramst_initval_file_data.m
|
MFILES = initval_file/ramst_initval_file_data.m
|
||||||
|
|
|
@ -142,6 +142,7 @@ write_latex_static_model;
|
||||||
write_latex_dynamic_model(write_equation_tags);
|
write_latex_dynamic_model(write_equation_tags);
|
||||||
write_latex_parameter_table;
|
write_latex_parameter_table;
|
||||||
write_latex_definitions;
|
write_latex_definitions;
|
||||||
|
write_latex_steady_state_model;
|
||||||
|
|
||||||
estimated_params;
|
estimated_params;
|
||||||
alp, 0.356;
|
alp, 0.356;
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
% Test whether preprocessor recognizes state variables introduced by optimal policy Github #1193
|
||||||
|
|
||||||
|
var pai, c, n, r, a;
|
||||||
|
varexo u;
|
||||||
|
parameters beta, rho, epsilon, omega, phi, gamma;
|
||||||
|
|
||||||
|
beta=0.99;
|
||||||
|
gamma=3;
|
||||||
|
omega=17;
|
||||||
|
epsilon=8;
|
||||||
|
phi=1;
|
||||||
|
rho=0.95;
|
||||||
|
|
||||||
|
model;
|
||||||
|
a = rho*a(-1)+u;
|
||||||
|
1/c = beta*r/(c(+1)*pai(+1));
|
||||||
|
pai*(pai-1)/c = beta*pai(+1)*(pai(+1)-1)/c(+1)+epsilon*phi*n^(gamma+1)/omega -exp(a)*n*(epsilon-1)/(omega*c);
|
||||||
|
exp(a)*n = c+(omega/2)*(pai-1)^2;
|
||||||
|
end;
|
||||||
|
|
||||||
|
initval;
|
||||||
|
r=1;
|
||||||
|
end;
|
||||||
|
|
||||||
|
histval;
|
||||||
|
r(0)=1;
|
||||||
|
end;
|
||||||
|
|
||||||
|
steady_state_model;
|
||||||
|
a = 0;
|
||||||
|
pai = beta*r;
|
||||||
|
c = find_c(0.96,pai,beta,epsilon,phi,gamma,omega);
|
||||||
|
n = c+(omega/2)*(pai-1)^2;
|
||||||
|
end;
|
||||||
|
|
||||||
|
shocks;
|
||||||
|
var u; stderr 0.008;
|
||||||
|
var u;
|
||||||
|
periods 1;
|
||||||
|
values 1;
|
||||||
|
end;
|
||||||
|
options_.dr_display_tol=0;
|
||||||
|
planner_objective(ln(c)-phi*((n^(1+gamma))/(1+gamma)));
|
||||||
|
ramsey_policy(planner_discount=0.99,order=1,instruments=(r),periods=500);
|
|
@ -0,0 +1,44 @@
|
||||||
|
% Test whether preprocessor fails if histval set future lags
|
||||||
|
|
||||||
|
var pai, c, n, r, a;
|
||||||
|
varexo u;
|
||||||
|
parameters beta, rho, epsilon, omega, phi, gamma;
|
||||||
|
|
||||||
|
beta=0.99;
|
||||||
|
gamma=3;
|
||||||
|
omega=17;
|
||||||
|
epsilon=8;
|
||||||
|
phi=1;
|
||||||
|
rho=0.95;
|
||||||
|
|
||||||
|
model;
|
||||||
|
a = rho*a(-1)+u;
|
||||||
|
1/c = beta*r/(c(+1)*pai(+1));
|
||||||
|
pai*(pai-1)/c = beta*pai(+1)*(pai(+1)-1)/c(+1)+epsilon*phi*n^(gamma+1)/omega -exp(a)*n*(epsilon-1)/(omega*c);
|
||||||
|
exp(a)*n = c+(omega/2)*(pai-1)^2;
|
||||||
|
end;
|
||||||
|
|
||||||
|
initval;
|
||||||
|
r=1;
|
||||||
|
end;
|
||||||
|
|
||||||
|
histval;
|
||||||
|
a(5)=1;
|
||||||
|
end;
|
||||||
|
|
||||||
|
steady_state_model;
|
||||||
|
a = 0;
|
||||||
|
pai = beta*r;
|
||||||
|
c = find_c(0.96,pai,beta,epsilon,phi,gamma,omega);
|
||||||
|
n = c+(omega/2)*(pai-1)^2;
|
||||||
|
end;
|
||||||
|
|
||||||
|
shocks;
|
||||||
|
var u; stderr 0.008;
|
||||||
|
var u;
|
||||||
|
periods 1;
|
||||||
|
values 1;
|
||||||
|
end;
|
||||||
|
options_.dr_display_tol=0;
|
||||||
|
planner_objective(ln(c)-phi*((n^(1+gamma))/(1+gamma)));
|
||||||
|
ramsey_policy(planner_discount=0.99,order=1,instruments=(r),periods=500);
|
Loading…
Reference in New Issue