Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Dóra Kocsis
dynare
Commits
7357a231
Commit
7357a231
authored
Aug 18, 2011
by
Houtan Bastani
Browse files
output mex file for static model (closes #183)
parent
cee82819
Changes
6
Hide whitespace changes
Inline
Side-by-side
preprocessor/ComputingTasks.cc
View file @
7357a231
...
@@ -869,7 +869,7 @@ PlannerObjectiveStatement::computingPass()
...
@@ -869,7 +869,7 @@ PlannerObjectiveStatement::computingPass()
void
void
PlannerObjectiveStatement
::
writeOutput
(
ostream
&
output
,
const
string
&
basename
)
const
PlannerObjectiveStatement
::
writeOutput
(
ostream
&
output
,
const
string
&
basename
)
const
{
{
model_tree
->
writeStaticFile
(
basename
+
"_objective"
,
false
,
false
);
model_tree
->
writeStaticFile
(
basename
+
"_objective"
,
false
,
false
,
false
);
}
}
BVARDensityStatement
::
BVARDensityStatement
(
int
maxnlags_arg
,
const
OptionsList
&
options_list_arg
)
:
BVARDensityStatement
::
BVARDensityStatement
(
int
maxnlags_arg
,
const
OptionsList
&
options_list_arg
)
:
...
...
preprocessor/ExprNode.cc
View file @
7357a231
...
@@ -615,6 +615,7 @@ VariableNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
...
@@ -615,6 +615,7 @@ VariableNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
i
=
datatree
.
getDynJacobianCol
(
datatree
.
getDerivID
(
symb_id
,
lag
))
+
ARRAY_SUBSCRIPT_OFFSET
(
output_type
);
i
=
datatree
.
getDynJacobianCol
(
datatree
.
getDerivID
(
symb_id
,
lag
))
+
ARRAY_SUBSCRIPT_OFFSET
(
output_type
);
output
<<
"y"
<<
LEFT_ARRAY_SUBSCRIPT
(
output_type
)
<<
i
<<
RIGHT_ARRAY_SUBSCRIPT
(
output_type
);
output
<<
"y"
<<
LEFT_ARRAY_SUBSCRIPT
(
output_type
)
<<
i
<<
RIGHT_ARRAY_SUBSCRIPT
(
output_type
);
break
;
break
;
case
oCStaticModel
:
case
oMatlabStaticModel
:
case
oMatlabStaticModel
:
case
oMatlabStaticModelSparse
:
case
oMatlabStaticModelSparse
:
i
=
tsid
+
ARRAY_SUBSCRIPT_OFFSET
(
output_type
);
i
=
tsid
+
ARRAY_SUBSCRIPT_OFFSET
(
output_type
);
...
@@ -669,6 +670,7 @@ VariableNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
...
@@ -669,6 +670,7 @@ VariableNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
else
else
output
<<
"x[it_"
<<
lag
<<
"+"
<<
i
<<
"*nb_row_x]"
;
output
<<
"x[it_"
<<
lag
<<
"+"
<<
i
<<
"*nb_row_x]"
;
break
;
break
;
case
oCStaticModel
:
case
oMatlabStaticModel
:
case
oMatlabStaticModel
:
case
oMatlabStaticModelSparse
:
case
oMatlabStaticModelSparse
:
output
<<
"x"
<<
LEFT_ARRAY_SUBSCRIPT
(
output_type
)
<<
i
<<
RIGHT_ARRAY_SUBSCRIPT
(
output_type
);
output
<<
"x"
<<
LEFT_ARRAY_SUBSCRIPT
(
output_type
)
<<
i
<<
RIGHT_ARRAY_SUBSCRIPT
(
output_type
);
...
@@ -710,6 +712,7 @@ VariableNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
...
@@ -710,6 +712,7 @@ VariableNode::writeOutput(ostream &output, ExprNodeOutputType output_type,
else
else
output
<<
"x[it_"
<<
lag
<<
"+"
<<
i
<<
"*nb_row_x]"
;
output
<<
"x[it_"
<<
lag
<<
"+"
<<
i
<<
"*nb_row_x]"
;
break
;
break
;
case
oCStaticModel
:
case
oMatlabStaticModel
:
case
oMatlabStaticModel
:
case
oMatlabStaticModelSparse
:
case
oMatlabStaticModelSparse
:
output
<<
"x"
<<
LEFT_ARRAY_SUBSCRIPT
(
output_type
)
<<
i
<<
RIGHT_ARRAY_SUBSCRIPT
(
output_type
);
output
<<
"x"
<<
LEFT_ARRAY_SUBSCRIPT
(
output_type
)
<<
i
<<
RIGHT_ARRAY_SUBSCRIPT
(
output_type
);
...
...
preprocessor/ExprNode.hh
View file @
7357a231
...
@@ -65,6 +65,7 @@ enum ExprNodeOutputType
...
@@ -65,6 +65,7 @@ enum ExprNodeOutputType
oMatlabStaticModelSparse
,
//!< Matlab code, static block decomposed model
oMatlabStaticModelSparse
,
//!< Matlab code, static block decomposed model
oMatlabDynamicModelSparse
,
//!< Matlab code, dynamic block decomposed model
oMatlabDynamicModelSparse
,
//!< Matlab code, dynamic block decomposed model
oCDynamicModel
,
//!< C code, dynamic model
oCDynamicModel
,
//!< C code, dynamic model
oCStaticModel
,
//!< C code, static model
oMatlabOutsideModel
,
//!< Matlab code, outside model block (for example in initval)
oMatlabOutsideModel
,
//!< Matlab code, outside model block (for example in initval)
oLatexStaticModel
,
//!< LaTeX code, static model
oLatexStaticModel
,
//!< LaTeX code, static model
oLatexDynamicModel
,
//!< LaTeX code, dynamic model
oLatexDynamicModel
,
//!< LaTeX code, dynamic model
...
@@ -84,7 +85,7 @@ enum ExprNodeOutputType
...
@@ -84,7 +85,7 @@ enum ExprNodeOutputType
|| (output_type) == oMatlabDynamicSparseSteadyStateOperator \
|| (output_type) == oMatlabDynamicSparseSteadyStateOperator \
|| (output_type) == oSteadyStateFile)
|| (output_type) == oSteadyStateFile)
#define IS_C(output_type) ((output_type) == oCDynamicModel || (output_type) == oCDynamicSteadyStateOperator)
#define IS_C(output_type) ((output_type) == oCDynamicModel || (output_type) ==
oCStaticModel || (output_type) ==
oCDynamicSteadyStateOperator)
#define IS_LATEX(output_type) ((output_type) == oLatexStaticModel \
#define IS_LATEX(output_type) ((output_type) == oLatexStaticModel \
|| (output_type) == oLatexDynamicModel \
|| (output_type) == oLatexDynamicModel \
...
...
preprocessor/ModFile.cc
View file @
7357a231
...
@@ -488,7 +488,10 @@ ModFile::writeOutputFiles(const string &basename, bool clear_all, bool console,
...
@@ -488,7 +488,10 @@ ModFile::writeOutputFiles(const string &basename, bool clear_all, bool console,
unlink
(
statfile
.
c_str
());
unlink
(
statfile
.
c_str
());
if
(
!
use_dll
)
if
(
!
use_dll
)
mOutputFile
<<
"erase_compiled_function('"
+
basename
+
"_dynamic');"
<<
endl
;
{
mOutputFile
<<
"erase_compiled_function('"
+
basename
+
"_static');"
<<
endl
;
mOutputFile
<<
"erase_compiled_function('"
+
basename
+
"_dynamic');"
<<
endl
;
}
#if defined(_WIN32) || defined(__CYGWIN32__)
#if defined(_WIN32) || defined(__CYGWIN32__)
// If using USE_DLL with MSVC, check that the user didn't use a function not supported by MSVC (because MSVC doesn't comply with C99 standard)
// If using USE_DLL with MSVC, check that the user didn't use a function not supported by MSVC (because MSVC doesn't comply with C99 standard)
...
@@ -524,16 +527,24 @@ ModFile::writeOutputFiles(const string &basename, bool clear_all, bool console,
...
@@ -524,16 +527,24 @@ ModFile::writeOutputFiles(const string &basename, bool clear_all, bool console,
// Some mex commands are enclosed in an eval(), because otherwise it will make Octave fail
// Some mex commands are enclosed in an eval(), because otherwise it will make Octave fail
#if defined(_WIN32) || defined(__CYGWIN32__)
#if defined(_WIN32) || defined(__CYGWIN32__)
if
(
msvc
)
if
(
msvc
)
mOutputFile
<<
" eval('mex -O LINKFLAGS=
\"
$LINKFLAGS /export:Dynamic
\"
"
<<
basename
<<
"_dynamic.c')"
<<
endl
;
// MATLAB/Windows + Microsoft Visual C++
// MATLAB/Windows + Microsoft Visual C++
mOutputFile
<<
" eval('mex -O LINKFLAGS=
\"
$LINKFLAGS /export:Dynamic
\"
"
<<
basename
<<
"_dynamic.c')"
<<
endl
<<
" eval('mex -O LINKFLAGS=
\"
$LINKFLAGS /export:Dynamic
\"
"
<<
basename
<<
"_static.c')"
<<
endl
;
else
if
(
cygwin
)
else
if
(
cygwin
)
mOutputFile
<<
" eval('mex -O PRELINK_CMDS1=
\"
echo EXPORTS > mex.def & echo mexFunction >> mex.def & echo Dynamic >> mex.def
\"
"
<<
basename
<<
"_dynamic.c')"
<<
endl
;
// MATLAB/Windows + Cygwin g++
// MATLAB/Windows + Cygwin g++
mOutputFile
<<
" eval('mex -O PRELINK_CMDS1=
\"
echo EXPORTS > mex.def & echo mexFunction >> mex.def & echo Dynamic >> mex.def
\"
"
<<
basename
<<
"_dynamic.c')"
<<
endl
<<
" eval('mex -O PRELINK_CMDS1=
\"
echo EXPORTS > mex.def & echo mexFunction >> mex.def & echo Dynamic >> mex.def
\"
"
<<
basename
<<
"_static.c')"
<<
endl
;
else
else
mOutputFile
<<
" error('When using the USE_DLL option, you must give either ''cygwin'' or ''msvc'' option to the ''dynare'' command')"
<<
endl
;
mOutputFile
<<
" error('When using the USE_DLL option, you must give either ''cygwin'' or ''msvc'' option to the ''dynare'' command')"
<<
endl
;
#else
#else
# ifdef __linux__
# ifdef __linux__
mOutputFile
<<
" eval('mex -O LDFLAGS=''-pthread -shared -Wl,--no-undefined'' "
<<
basename
<<
"_dynamic.c')"
<<
endl
;
// MATLAB/Linux
// MATLAB/Linux
mOutputFile
<<
" eval('mex -O LDFLAGS=''-pthread -shared -Wl,--no-undefined'' "
<<
basename
<<
"_dynamic.c')"
<<
endl
<<
" eval('mex -O LDFLAGS=''-pthread -shared -Wl,--no-undefined'' "
<<
basename
<<
"_static.c')"
<<
endl
;
# else // MacOS
# else // MacOS
mOutputFile
<<
" eval('mex -O LDFLAGS=''-Wl,-twolevel_namespace -undefined error -arch
\\
$ARCHS -Wl,-syslibroot,
\\
$SDKROOT -mmacosx-version-min=
\\
$MACOSX_DEPLOYMENT_TARGET -bundle'' "
<<
basename
<<
"_dynamic.c')"
<<
endl
;
// MATLAB/MacOS
// MATLAB/MacOS
mOutputFile
<<
" eval('mex -O LDFLAGS=''-Wl,-twolevel_namespace -undefined error -arch
\\
$ARCHS -Wl,-syslibroot,
\\
$SDKROOT -mmacosx-version-min=
\\
$MACOSX_DEPLOYMENT_TARGET -bundle'' "
<<
basename
<<
"_dynamic.c')"
<<
endl
<<
" eval('mex -O LDFLAGS=''-Wl,-twolevel_namespace -undefined error -arch
\\
$ARCHS -Wl,-syslibroot,
\\
$SDKROOT -mmacosx-version-min=
\\
$MACOSX_DEPLOYMENT_TARGET -bundle'' "
<<
basename
<<
"_static.c')"
<<
endl
;
# endif
# endif
#endif
#endif
mOutputFile
<<
"else"
<<
endl
// Octave
mOutputFile
<<
"else"
<<
endl
// Octave
...
@@ -541,6 +552,7 @@ ModFile::writeOutputFiles(const string &basename, bool clear_all, bool console,
...
@@ -541,6 +552,7 @@ ModFile::writeOutputFiles(const string &basename, bool clear_all, bool console,
<<
" sleep(2)"
<<
endl
<<
" sleep(2)"
<<
endl
<<
" end"
<<
endl
<<
" end"
<<
endl
<<
" mex "
<<
basename
<<
"_dynamic.c"
<<
endl
<<
" mex "
<<
basename
<<
"_dynamic.c"
<<
endl
<<
" mex "
<<
basename
<<
"_static.c"
<<
endl
<<
"end"
<<
endl
;
<<
"end"
<<
endl
;
}
}
...
@@ -595,7 +607,7 @@ ModFile::writeOutputFiles(const string &basename, bool clear_all, bool console,
...
@@ -595,7 +607,7 @@ ModFile::writeOutputFiles(const string &basename, bool clear_all, bool console,
if
(
dynamic_model
.
equation_number
()
>
0
)
if
(
dynamic_model
.
equation_number
()
>
0
)
{
{
if
(
!
no_static
)
if
(
!
no_static
)
static_model
.
writeStaticFile
(
basename
,
block
,
byte_code
);
static_model
.
writeStaticFile
(
basename
,
block
,
byte_code
,
use_dll
);
dynamic_model
.
writeDynamicFile
(
basename
,
block
,
byte_code
,
use_dll
,
mod_file_struct
.
order_option
);
dynamic_model
.
writeDynamicFile
(
basename
,
block
,
byte_code
,
use_dll
,
mod_file_struct
.
order_option
);
dynamic_model
.
writeParamsDerivativesFile
(
basename
);
dynamic_model
.
writeParamsDerivativesFile
(
basename
);
...
...
preprocessor/StaticModel.cc
View file @
7357a231
...
@@ -1140,32 +1140,27 @@ StaticModel::writeStaticMFile(const string &func_name) const
...
@@ -1140,32 +1140,27 @@ StaticModel::writeStaticMFile(const string &func_name) const
<<
"% Status : Computes static model for Dynare"
<<
endl
<<
"% Status : Computes static model for Dynare"
<<
endl
<<
"%"
<<
endl
<<
"%"
<<
endl
<<
"% Warning : this file is generated automatically by Dynare"
<<
endl
<<
"% Warning : this file is generated automatically by Dynare"
<<
endl
<<
"% from model file (.mod)"
<<
endl
<<
"% from model file (.mod)"
<<
endl
<<
endl
;
<<
endl
<<
"residual = zeros( "
<<
equations
.
size
()
<<
", 1);"
<<
endl
<<
endl
<<
"%"
<<
endl
<<
"% Model equations"
<<
endl
<<
"%"
<<
endl
<<
endl
;
deriv_node_temp_terms_t
tef_terms
;
writeStaticModel
(
output
,
false
);
writeModelLocalVariables
(
output
,
oMatlabStaticModel
,
tef_terms
);
output
<<
"end"
<<
endl
;
output
.
close
();
}
writeTemporaryTerms
(
temporary_terms
,
output
,
oMatlabStaticModel
,
tef_terms
);
void
StaticModel
::
writeStaticModel
(
ostream
&
StaticOutput
,
bool
use_dll
)
const
{
ostringstream
model_output
;
// Used for storing model equations
ostringstream
jacobian_output
;
// Used for storing jacobian equations
ostringstream
hessian_output
;
// Used for storing Hessian equations
ExprNodeOutputType
output_type
=
(
use_dll
?
oCStaticModel
:
oMatlabStaticModel
);
writeModelEquations
(
output
,
oMatlabStaticModel
);
deriv_node_temp_terms_t
tef_terms
;
writeModelLocalVariables
(
model_output
,
output_type
,
tef_terms
);
output
<<
"if ~isreal(residual)"
<<
endl
writeTemporaryTerms
(
temporary_terms
,
model_output
,
output_type
,
tef_terms
);
<<
" residual = real(residual)+imag(residual).^2;"
<<
endl
<<
"end"
<<
endl
writeModelEquations
(
model_output
,
output_type
);
<<
"if nargout >= 2,"
<<
endl
<<
" g1 = zeros("
<<
equations
.
size
()
<<
", "
<<
symbol_table
.
endo_nbr
()
<<
");"
<<
endl
<<
endl
<<
"%"
<<
endl
<<
"% Jacobian matrix"
<<
endl
<<
"%"
<<
endl
<<
endl
;
// Write Jacobian w.r. to endogenous only
// Write Jacobian w.r. to endogenous only
for
(
first_derivatives_t
::
const_iterator
it
=
first_derivatives
.
begin
();
for
(
first_derivatives_t
::
const_iterator
it
=
first_derivatives
.
begin
();
...
@@ -1175,72 +1170,212 @@ StaticModel::writeStaticMFile(const string &func_name) const
...
@@ -1175,72 +1170,212 @@ StaticModel::writeStaticMFile(const string &func_name) const
int
symb_id
=
it
->
first
.
second
;
int
symb_id
=
it
->
first
.
second
;
expr_t
d1
=
it
->
second
;
expr_t
d1
=
it
->
second
;
output
<<
" g1("
<<
eq
+
1
<<
","
<<
symbol_table
.
getTypeSpecificID
(
symb_id
)
+
1
<<
")="
;
jacobian_output
<<
" g1"
;
d1
->
writeOutput
(
output
,
oMatlabStaticModel
,
temporary_terms
,
tef_terms
);
jacobianHelper
(
jacobian_output
,
eq
,
symbol_table
.
getTypeSpecificID
(
symb_id
),
output_type
);
output
<<
";"
<<
endl
;
jacobian_output
<<
"="
;
d1
->
writeOutput
(
jacobian_output
,
output_type
,
temporary_terms
,
tef_terms
);
jacobian_output
<<
";"
<<
endl
;
}
}
output
<<
" if ~isreal(g1)"
<<
endl
<<
" g1 = real(g1)+imag(g1).^2;"
<<
endl
<<
" end"
<<
endl
<<
"end"
<<
endl
<<
"if nargout >= 3,"
<<
endl
<<
"%"
<<
endl
<<
"% Hessian matrix"
<<
endl
<<
"%"
<<
endl
<<
endl
;
int
g2ncols
=
symbol_table
.
endo_nbr
()
*
symbol_table
.
endo_nbr
();
int
g2ncols
=
symbol_table
.
endo_nbr
()
*
symbol_table
.
endo_nbr
();
if
(
second_derivatives
.
size
())
// Write Hessian w.r. to endogenous only (only if 2nd order derivatives have been computed)
int
k
=
0
;
// Keep the line of a 2nd derivative in v2
for
(
second_derivatives_t
::
const_iterator
it
=
second_derivatives
.
begin
();
it
!=
second_derivatives
.
end
();
it
++
)
{
{
output
<<
" v2 = zeros("
<<
NNZDerivatives
[
1
]
<<
",3);"
<<
endl
;
int
eq
=
it
->
first
.
first
;
int
symb_id1
=
it
->
first
.
second
.
first
;
int
symb_id2
=
it
->
first
.
second
.
second
;
expr_t
d2
=
it
->
second
;
// Write Hessian w.r. to endogenous only (only if 2nd order derivatives have been computed)
int
tsid1
=
symbol_table
.
getTypeSpecificID
(
symb_id1
);
int
k
=
0
;
// Keep the line of a 2nd derivative in v2
int
tsid2
=
symbol_table
.
getTypeSpecificID
(
symb_id2
);
for
(
second_derivatives_t
::
const_iterator
it
=
second_derivatives
.
begin
();
it
!=
second_derivatives
.
end
();
it
++
)
{
int
eq
=
it
->
first
.
first
;
int
symb_id1
=
it
->
first
.
second
.
first
;
int
symb_id2
=
it
->
first
.
second
.
second
;
expr_t
d2
=
it
->
second
;
int
tsid1
=
symbol_table
.
getTypeSpecificID
(
symb_id1
)
;
int
col_nb
=
tsid1
*
symbol_table
.
endo_nbr
()
+
tsid2
;
int
tsid2
=
symbol_table
.
getTypeSpecificID
(
symb_id2
)
;
int
col_nb_sym
=
tsid2
*
symbol_table
.
endo_nbr
()
+
tsid1
;
int
col_nb
=
tsid1
*
symbol_table
.
endo_nbr
()
+
tsid2
;
hessianHelper
(
hessian_output
,
k
,
0
,
output_type
)
;
int
col_nb_sym
=
tsid2
*
symbol_table
.
endo_nbr
()
+
tsid1
;
hessian_output
<<
"="
<<
eq
+
1
<<
";"
<<
endl
;
output
<<
"v2("
<<
k
+
1
<<
",1)="
<<
eq
+
1
<<
";"
<<
endl
hessianHelper
(
hessian_output
,
k
,
1
,
output_type
);
<<
"v2("
<<
k
+
1
<<
",2)="
<<
col_nb
+
1
<<
";"
<<
endl
hessian_output
<<
"="
<<
col_nb
+
1
<<
";"
<<
endl
;
<<
"v2("
<<
k
+
1
<<
",3)="
;
d2
->
writeOutput
(
output
,
oMatlabStaticModel
,
temporary_terms
,
tef_terms
);
output
<<
";"
<<
endl
;
k
++
;
hessianHelper
(
hessian_output
,
k
,
2
,
output_type
);
hessian_output
<<
"="
;
d2
->
writeOutput
(
hessian_output
,
output_type
,
temporary_terms
,
tef_terms
);
hessian_output
<<
";"
<<
endl
;
// Treating symetric elements
k
++
;
if
(
symb_id1
!=
symb_id2
)
{
// Treating symetric elements
output
<<
"v2("
<<
k
+
1
<<
",1)="
<<
eq
+
1
<<
";"
<<
endl
if
(
symb_id1
!=
symb_id2
)
<<
"v2("
<<
k
+
1
<<
",2)="
<<
col_nb_sym
+
1
<<
";"
<<
endl
{
<<
"v2("
<<
k
+
1
<<
",3)=v2("
<<
k
<<
",3);"
<<
endl
;
hessianHelper
(
hessian_output
,
k
,
0
,
output_type
);
k
++
;
hessian_output
<<
"="
<<
eq
+
1
<<
";"
<<
endl
;
}
hessianHelper
(
hessian_output
,
k
,
1
,
output_type
);
hessian_output
<<
"="
<<
col_nb_sym
+
1
<<
";"
<<
endl
;
hessianHelper
(
hessian_output
,
k
,
2
,
output_type
);
hessian_output
<<
"="
;
hessianHelper
(
hessian_output
,
k
-
1
,
2
,
output_type
);
hessian_output
<<
";"
<<
endl
;
k
++
;
}
}
}
output
<<
" g2 = sparse(v2(:,1),v2(:,2),v2(:,3),"
<<
equations
.
size
()
<<
","
<<
g2ncols
<<
");"
<<
endl
;
if
(
!
use_dll
)
{
StaticOutput
<<
"residual = zeros( "
<<
equations
.
size
()
<<
", 1);"
<<
endl
<<
endl
<<
"%"
<<
endl
<<
"% Model equations"
<<
endl
<<
"%"
<<
endl
<<
endl
<<
model_output
.
str
()
<<
"if ~isreal(residual)"
<<
endl
<<
" residual = real(residual)+imag(residual).^2;"
<<
endl
<<
"end"
<<
endl
<<
"if nargout >= 2,"
<<
endl
<<
" g1 = zeros("
<<
equations
.
size
()
<<
", "
<<
symbol_table
.
endo_nbr
()
<<
");"
<<
endl
<<
endl
<<
" %"
<<
endl
<<
" % Jacobian matrix"
<<
endl
<<
" %"
<<
endl
<<
endl
<<
jacobian_output
.
str
()
<<
" if ~isreal(g1)"
<<
endl
<<
" g1 = real(g1)+imag(g1).^2;"
<<
endl
<<
" end"
<<
endl
<<
"end"
<<
endl
<<
"if nargout >= 3,"
<<
endl
<<
" %"
<<
endl
<<
" % Hessian matrix"
<<
endl
<<
" %"
<<
endl
<<
endl
;
if
(
second_derivatives
.
size
())
StaticOutput
<<
" v2 = zeros("
<<
NNZDerivatives
[
1
]
<<
",3);"
<<
endl
<<
hessian_output
.
str
()
<<
" g2 = sparse(v2(:,1),v2(:,2),v2(:,3),"
<<
equations
.
size
()
<<
","
<<
g2ncols
<<
");"
<<
endl
;
else
StaticOutput
<<
" g2 = sparse([],[],[],"
<<
equations
.
size
()
<<
","
<<
g2ncols
<<
");"
<<
endl
;
StaticOutput
<<
"end"
<<
endl
;
}
}
else
// Either hessian is all zero, or we didn't compute it
else
output
<<
" g2 = sparse([],[],[],"
<<
equations
.
size
()
<<
","
<<
g2ncols
<<
");"
<<
endl
;
{
StaticOutput
<<
"void Static(double *y, double *x, int nb_row_x, double *params, double *residual, double *g1, double *v2)"
<<
endl
<<
"{"
<<
endl
<<
" double lhs, rhs;"
<<
endl
<<
endl
<<
" /* Residual equations */"
<<
endl
<<
model_output
.
str
()
<<
" /* Jacobian */"
<<
endl
<<
" if (g1 == NULL)"
<<
endl
<<
" return;"
<<
endl
<<
" else"
<<
endl
<<
" {"
<<
endl
<<
jacobian_output
.
str
()
<<
" }"
<<
endl
;
if
(
second_derivatives
.
size
())
StaticOutput
<<
" /* Hessian for endogenous and exogenous variables */"
<<
endl
<<
" if (v2 == NULL)"
<<
endl
<<
" return;"
<<
endl
<<
" else"
<<
endl
<<
" {"
<<
endl
<<
hessian_output
.
str
()
<<
" }"
<<
endl
;
}
}
output
<<
"end"
<<
endl
;
// Close the if nargout >= 3 statement
void
output
<<
"end"
<<
endl
;
// Close the *_static function
StaticModel
::
writeStaticCFile
(
const
string
&
func_name
)
const
{
// Writing comments and function definition command
string
filename
=
func_name
+
"_static.c"
;
ofstream
output
;
output
.
open
(
filename
.
c_str
(),
ios
::
out
|
ios
::
binary
);
if
(
!
output
.
is_open
())
{
cerr
<<
"ERROR: Can't open file "
<<
filename
<<
" for writing"
<<
endl
;
exit
(
EXIT_FAILURE
);
}
output
<<
"/*"
<<
endl
<<
" * "
<<
filename
<<
" : Computes static model for Dynare"
<<
endl
<<
" *"
<<
endl
<<
" * Warning : this file is generated automatically by Dynare"
<<
endl
<<
" * from model file (.mod)"
<<
endl
<<
endl
<<
" */"
<<
endl
<<
"#include <math.h>"
<<
endl
<<
"#include
\"
mex.h
\"
"
<<
endl
<<
endl
<<
"#define max(a, b) (((a) > (b)) ? (a) : (b))"
<<
endl
<<
"#define min(a, b) (((a) > (b)) ? (b) : (a))"
<<
endl
;
// Write function definition if oPowerDeriv is used
writePowerDerivCHeader
(
output
);
// Writing the function body
writeStaticModel
(
output
,
true
);
output
<<
"}"
<<
endl
<<
endl
;
// Writing the gateway routine
output
<<
"/* The gateway routine */"
<<
endl
<<
"void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])"
<<
endl
<<
"{"
<<
endl
<<
" double *y, *x, *params;"
<<
endl
<<
" double *residual, *g1, *v2;"
<<
endl
<<
" int nb_row_x;"
<<
endl
<<
endl
<<
" /* Create a pointer to the input matrix y. */"
<<
endl
<<
" y = mxGetPr(prhs[0]);"
<<
endl
<<
endl
<<
" /* Create a pointer to the input matrix x. */"
<<
endl
<<
" x = mxGetPr(prhs[1]);"
<<
endl
<<
endl
<<
" /* Create a pointer to the input matrix params. */"
<<
endl
<<
" params = mxGetPr(prhs[2]);"
<<
endl
<<
endl
<<
" /* Gets number of rows of matrix x. */"
<<
endl
<<
" nb_row_x = mxGetM(prhs[1]);"
<<
endl
<<
endl
<<
" residual = NULL;"
<<
endl
<<
" if (nlhs >= 1)"
<<
endl
<<
" {"
<<
endl
<<
" /* Set the output pointer to the output matrix residual. */"
<<
endl
<<
" plhs[0] = mxCreateDoubleMatrix("
<<
equations
.
size
()
<<
",1, mxREAL);"
<<
endl
<<
" /* Create a C pointer to a copy of the output matrix residual. */"
<<
endl
<<
" residual = mxGetPr(plhs[0]);"
<<
endl
<<
" }"
<<
endl
<<
endl
<<
" g1 = NULL;"
<<
endl
<<
" if (nlhs >= 2)"
<<
endl
<<
" {"
<<
endl
<<
" /* Set the output pointer to the output matrix g1. */"
<<
endl
<<
" plhs[1] = mxCreateDoubleMatrix("
<<
equations
.
size
()
<<
", "
<<
symbol_table
.
endo_nbr
()
<<
", mxREAL);"
<<
endl
<<
" /* Create a C pointer to a copy of the output matrix g1. */"
<<
endl
<<
" g1 = mxGetPr(plhs[1]);"
<<
endl
<<
" }"
<<
endl
<<
endl
<<
" v2 = NULL;"
<<
endl
<<
" if (nlhs >= 3)"
<<
endl
<<
" {"
<<
endl
<<
" /* Set the output pointer to the output matrix v2. */"
<<
endl
<<
" plhs[2] = mxCreateDoubleMatrix("
<<
NNZDerivatives
[
1
]
<<
", "
<<
3
<<
", mxREAL);"
<<
endl
<<
" v2 = mxGetPr(plhs[2]);"
<<
endl
<<
" }"
<<
endl
<<
endl
<<
" /* Call the C subroutines. */"
<<
endl
<<
" Static(y, x, nb_row_x, params, residual, g1, v2);"
<<
endl
<<
"}"
<<
endl
<<
endl
;
writePowerDeriv
(
output
,
true
);
output
.
close
();
output
.
close
();
}
}
void
void
StaticModel
::
writeStaticFile
(
const
string
&
basename
,
bool
block
,
bool
bytecode
)
const
StaticModel
::
writeStaticFile
(
const
string
&
basename
,
bool
block
,
bool
bytecode
,
bool
use_dll
)
const
{
{
int
r
;
int
r
;
...
@@ -1267,6 +1402,8 @@ StaticModel::writeStaticFile(const string &basename, bool block, bool bytecode)
...
@@ -1267,6 +1402,8 @@ StaticModel::writeStaticFile(const string &basename, bool block, bool bytecode)
chdir
(
".."
);
chdir
(
".."
);
writeStaticBlockMFSFile
(
basename
);
writeStaticBlockMFSFile
(
basename
);
}
}
else
if
(
use_dll
)
writeStaticCFile
(
basename
);
else
else
writeStaticMFile
(
basename
);
writeStaticMFile
(
basename
);
writeAuxVarRecursiveDefinitions
(
basename
);
writeAuxVarRecursiveDefinitions
(
basename
);
...
@@ -1570,7 +1707,7 @@ StaticModel::jacobianHelper(ostream &output, int eq_nb, int col_nb, ExprNodeOutp
...
@@ -1570,7 +1707,7 @@ StaticModel::jacobianHelper(ostream &output, int eq_nb, int col_nb, ExprNodeOutp
{
{
output
<<
LEFT_ARRAY_SUBSCRIPT
(
output_type
);
output
<<
LEFT_ARRAY_SUBSCRIPT
(
output_type
);
if
(
IS_MATLAB
(
output_type
))
if
(
IS_MATLAB
(
output_type
))
output
<<
eq_nb
+
1
<<
",
"
<<
col_nb
+
1
;
output
<<
eq_nb
+
1
<<
","
<<
col_nb
+
1
;
else
else
output
<<
eq_nb
+
col_nb
*
equations
.
size
();
output
<<
eq_nb
+
col_nb
*
equations
.
size
();
output
<<
RIGHT_ARRAY_SUBSCRIPT
(
output_type
);
output
<<
RIGHT_ARRAY_SUBSCRIPT
(
output_type
);
...
@@ -1579,7 +1716,7 @@ StaticModel::jacobianHelper(ostream &output, int eq_nb, int col_nb, ExprNodeOutp
...
@@ -1579,7 +1716,7 @@ StaticModel::jacobianHelper(ostream &output, int eq_nb, int col_nb, ExprNodeOutp
void
void
StaticModel
::
hessianHelper
(
ostream
&
output
,
int
row_nb
,
int
col_nb
,
ExprNodeOutputType
output_type
)
const
StaticModel
::
hessianHelper
(
ostream
&
output
,
int
row_nb
,
int
col_nb
,
ExprNodeOutputType
output_type
)
const
{
{
output
<<
LEFT_ARRAY_SUBSCRIPT
(
output_type
);
output
<<
"v2"
<<
LEFT_ARRAY_SUBSCRIPT
(
output_type
);
if
(
IS_MATLAB
(
output_type
))
if
(
IS_MATLAB
(
output_type
))
output
<<
row_nb
+
1
<<
", "
<<
col_nb
+
1
;
output
<<
row_nb
+
1
<<
", "
<<
col_nb
+
1
;
else
else
...
...
preprocessor/StaticModel.hh
View file @
7357a231
...
@@ -53,13 +53,15 @@ private:
...
@@ -53,13 +53,15 @@ private:
//! Writes static model file (standard Matlab version)
//! Writes static model file (standard Matlab version)
void
writeStaticMFile
(
const
string
&
static_basename
)
const
;
void
writeStaticMFile
(
const
string
&
static_basename
)
const
;
//! Writes static model file (C version)
void
writeStaticCFile
(
const
string
&
func_name
)
const
;
//! Writes the static model equations and its derivatives
void
writeStaticModel
(
ostream
&
StaticOutput
,
bool
use_dll
)
const
;
//! Writes the static function calling the block to solve (Matlab version)
//! Writes the static function calling the block to solve (Matlab version)
void
writeStaticBlockMFSFile
(
const
string
&
basename
)
const
;
void
writeStaticBlockMFSFile
(
const
string
&
basename
)
const
;
//! Writes static model file (C version)
/*! \todo add third derivatives handling */
void
writeStaticCFile
(
const
string
&
static_basename
)
const
;
//! Writes the Block reordred structure of the model in M output
//! Writes the Block reordred structure of the model in M output
void
writeModelEquationsOrdered_M
(
const
string
&
dynamic_basename
)
const
;
void
writeModelEquationsOrdered_M
(
const
string
&
dynamic_basename
)
const
;
...
@@ -182,7 +184,7 @@ public:
...
@@ -182,7 +184,7 @@ public:
int
&
u_count_int
,
bool
&
file_open
)
const
;
int
&
u_count_int
,
bool
&
file_open
)
const
;
//! Writes static model file
//! Writes static model file
void
writeStaticFile
(
const
string
&
basename
,
bool
block
,
bool
bytecode
)
const
;
void
writeStaticFile
(
const
string
&
basename
,
bool
block
,
bool
bytecode
,
bool
use_dll
)
const
;
//! Writes LaTeX file with the equations of the static model
//! Writes LaTeX file with the equations of the static model
void
writeLatexFile
(
const
string
&
basename
)
const
;
void
writeLatexFile
(
const
string
&
basename
)
const
;
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment