swz: markov switching statement
git-svn-id: https://www.dynare.org/svn/dynare/trunk@3212 ac1d8469-bf42-47a9-8791-bf33cf982152time-shift
parent
7ac2213f9d
commit
a2f878a179
|
@ -1141,3 +1141,43 @@ SvarIdentificationStatement::writeOutput(ostream &output, const string &basename
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MarkovSwitchingStatement::MarkovSwitchingStatement(const OptionsList &options_list_arg) :
|
||||||
|
options_list(options_list_arg)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MarkovSwitchingStatement::writeOutput(ostream &output, const string &basename) const
|
||||||
|
{
|
||||||
|
OptionsList::num_options_type::const_iterator itChain, itState, itNOS, itDuration;
|
||||||
|
|
||||||
|
itChain = options_list.num_options.find("ms.chain");
|
||||||
|
if (itChain == options_list.num_options.end())
|
||||||
|
{
|
||||||
|
cerr << "MarkovSwitchingStatement::writeOutput() Should not arrive here (1). Please report this to the Dynare Team." << endl;
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
itDuration = options_list.num_options.find("ms.duration");
|
||||||
|
if (itDuration == options_list.num_options.end())
|
||||||
|
{
|
||||||
|
cerr << "MarkovSwitchingStatement::writeOutput() Should not arrive here (2). Please report this to the Dynare Team." << endl;
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
itState = options_list.num_options.find("ms.state");
|
||||||
|
itNOS = options_list.num_options.find("ms.number_of_states");
|
||||||
|
if (itState != options_list.num_options.end() &&
|
||||||
|
itNOS == options_list.num_options.end())
|
||||||
|
output << "options_.ms.ms_chain(" << itChain->second << ").state(" << itState->second << ").duration = " << itDuration->second << ";" << endl;
|
||||||
|
else if (itState == options_list.num_options.end() &&
|
||||||
|
itNOS != options_list.num_options.end())
|
||||||
|
for (int i=0; i<atoi(itNOS->second.c_str()); i++)
|
||||||
|
output << "options_.ms.ms_chain(" << itChain->second << ").state(" << i+1 << ").duration = " << itDuration->second << ";" << endl;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cerr << "MarkovSwitchingStatement::writeOutput() Should not arrive here (3). Please report this to the Dynare Team." << endl;
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -508,4 +508,13 @@ public:
|
||||||
virtual void writeOutput(ostream &output, const string &basename) const;
|
virtual void writeOutput(ostream &output, const string &basename) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class MarkovSwitchingStatement : public Statement
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
const OptionsList options_list;
|
||||||
|
public:
|
||||||
|
MarkovSwitchingStatement(const OptionsList &options_list_arg);
|
||||||
|
virtual void writeOutput(ostream &output, const string &basename) const;
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -629,7 +629,7 @@ svar_var_list : svar_var_list COMMA symbol
|
||||||
;
|
;
|
||||||
|
|
||||||
markov_switching : MARKOV_SWITCHING '(' ms_options_list ')' ';'
|
markov_switching : MARKOV_SWITCHING '(' ms_options_list ')' ';'
|
||||||
{ ;}
|
{ driver.markov_switching(); }
|
||||||
;
|
;
|
||||||
|
|
||||||
ms_options_list : ms_options_list COMMA ms_options
|
ms_options_list : ms_options_list COMMA ms_options
|
||||||
|
@ -1859,14 +1859,14 @@ o_draws_nbr_modified_harmonic_mean : DRAWS_NBR_MODIFIED_HARMONIC_MEAN EQUAL INT_
|
||||||
o_dirichlet_scale : DIRICHLET_SCALE EQUAL INT_NUMBER {driver.option_num("ms.dirichlet_scale",$3); };
|
o_dirichlet_scale : DIRICHLET_SCALE EQUAL INT_NUMBER {driver.option_num("ms.dirichlet_scale",$3); };
|
||||||
o_k_order_solver : K_ORDER_SOLVER {driver.option_num("k_order_solver","1"); };
|
o_k_order_solver : K_ORDER_SOLVER {driver.option_num("k_order_solver","1"); };
|
||||||
|
|
||||||
o_chain : CHAIN EQUAL INT_NUMBER { ;};
|
o_chain : CHAIN EQUAL INT_NUMBER { driver.option_num("ms.chain",$3); };
|
||||||
o_state : STATE EQUAL INT_NUMBER { ;};
|
o_state : STATE EQUAL INT_NUMBER { driver.option_num("ms.state",$3); };
|
||||||
o_duration : DURATION EQUAL number
|
o_duration : DURATION EQUAL number
|
||||||
{ ;}
|
{ driver.option_num("ms.duration",$3); }
|
||||||
| DURATION EQUAL INF_CONSTANT
|
| DURATION EQUAL INF_CONSTANT
|
||||||
{ ;}
|
{ driver.option_num("ms.duration","Inf"); }
|
||||||
;
|
;
|
||||||
o_number_of_states : NUMBER_OF_STATES EQUAL INT_NUMBER { ;};
|
o_number_of_states : NUMBER_OF_STATES EQUAL INT_NUMBER { driver.option_num("ms.number_of_states",$3); };
|
||||||
o_coefficients : COEFFICIENTS { ;};
|
o_coefficients : COEFFICIENTS { ;};
|
||||||
o_variances : VARIANCES { ;};
|
o_variances : VARIANCES { ;};
|
||||||
o_constants : CONSTANTS { ;};
|
o_constants : CONSTANTS { ;};
|
||||||
|
|
|
@ -1194,6 +1194,47 @@ ParsingDriver::ms_sbvar()
|
||||||
options_list.clear();
|
options_list.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ParsingDriver::markov_switching()
|
||||||
|
{
|
||||||
|
OptionsList::num_options_type::const_iterator it0, it1;
|
||||||
|
|
||||||
|
it0 = options_list.num_options.find("ms.chain");
|
||||||
|
if (it0 == options_list.num_options.end())
|
||||||
|
error("A chain option must be passed to the markov_switching statement.");
|
||||||
|
else if (atoi(it0->second.c_str()) <= 0)
|
||||||
|
error("The value passed to the chain option must be greater than zero.");
|
||||||
|
|
||||||
|
it0=options_list.num_options.find("ms.state");
|
||||||
|
it1=options_list.num_options.find("ms.number_of_states");
|
||||||
|
if ((it0 == options_list.num_options.end()) &&
|
||||||
|
(it1 == options_list.num_options.end()))
|
||||||
|
error("Either a state option or a number_of_states option must be passed to the markov_switching statement.");
|
||||||
|
|
||||||
|
if ((it0 != options_list.num_options.end()) &&
|
||||||
|
(it1 != options_list.num_options.end()))
|
||||||
|
error("You cannot pass both a state option and a number_of_states option to the markov_switching statement.");
|
||||||
|
|
||||||
|
if (it0 != options_list.num_options.end())
|
||||||
|
if (atoi(it0->second.c_str()) <= 0)
|
||||||
|
error("The value passed to the state option must be greater than zero.");
|
||||||
|
|
||||||
|
if (it1 != options_list.num_options.end())
|
||||||
|
if (atoi(it1->second.c_str()) <= 0)
|
||||||
|
error("The value passed to the number_of_states option must be greater than zero.");
|
||||||
|
|
||||||
|
string infStr ("Inf");
|
||||||
|
it0 = options_list.num_options.find("ms.duration");
|
||||||
|
if (it0 == options_list.num_options.end())
|
||||||
|
error("A duration option must be passed to the markov_switching statement.");
|
||||||
|
else if (infStr.compare(it0->second) != 0)
|
||||||
|
if (atof(it0->second.c_str()) <= 0.0)
|
||||||
|
error("The value passed to the duration option must be greater than zero.");
|
||||||
|
|
||||||
|
mod_file->addStatement(new MarkovSwitchingStatement(options_list));
|
||||||
|
options_list.clear();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ParsingDriver::shock_decomposition()
|
ParsingDriver::shock_decomposition()
|
||||||
{
|
{
|
||||||
|
|
|
@ -371,6 +371,8 @@ public:
|
||||||
void sbvar();
|
void sbvar();
|
||||||
//! MS_SBVAR statement
|
//! MS_SBVAR statement
|
||||||
void ms_sbvar();
|
void ms_sbvar();
|
||||||
|
//! MarkovSwitching statement
|
||||||
|
void markov_switching();
|
||||||
//! Shock decomposition
|
//! Shock decomposition
|
||||||
void shock_decomposition();
|
void shock_decomposition();
|
||||||
//! Conditional forecast statement
|
//! Conditional forecast statement
|
||||||
|
|
Loading…
Reference in New Issue