Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • normann/preprocessor
  • Dynare/preprocessor
  • FerhatMihoubi/preprocessor
  • MichelJuillard/preprocessor
  • sebastien/preprocessor
  • lnsongxf/preprocessor
  • albop/preprocessor
  • DoraK/preprocessor
  • amg/preprocessor
  • wmutschl/preprocessor
  • JohannesPfeifer/preprocessor
11 results
Show changes
Commits on Source (86)
Showing with 5857 additions and 4247 deletions
# This file should be kept in sync with the one in dynare.git (which also
# contains more explanations).
Language: Cpp
Standard: c++20
ColumnLimit: 100
BasedOnStyle: GNU
AllowShortFunctionsOnASingleLine: None
AlwaysBreakTemplateDeclarations: Yes
BreakConstructorInitializers: AfterColon
BreakInheritanceList: AfterColon
Cpp11BracedListStyle: true
DeriveLineEnding: false
IndentPPDirectives: AfterHash
PackConstructorInitializers: NextLine
PPIndentWidth: 1
PointerAlignment: Left
SpaceAfterTemplateKeyword: false
SpaceBeforeParens: ControlStatements
SpaceBeforeCpp11BracedList: true
# TODO: add the following check families:
# - bugprone-*
# - cppcoreguidelines-
# NB: as of clang-tidy 16, we get several false positives inside boost, notably this one:
# https://github.com/llvm/llvm-project/issues/40486
Checks: 'performance-*,modernize-*,-modernize-use-trailing-return-type,-clang-diagnostic-unqualified-std-cast-call'
variables: variables:
TERM: linux TERM: linux
MINGW32_BOOST_VERSION: 1.81.0-7 MINGW32_BOOST_VERSION: 1.84.0-1
MINGW64_BOOST_VERSION: 1.81.0-7 MINGW64_BOOST_VERSION: 1.84.0-1
WGET_OPTIONS: '--no-verbose --no-use-server-timestamps --retry-connrefused --retry-on-host-error' WGET_OPTIONS: '--no-verbose --no-use-server-timestamps --retry-connrefused --retry-on-host-error'
# To ensure that "false && true" fails, see https://gitlab.com/gitlab-org/gitlab-runner/-/issues/25394#note_412609647
FF_ENABLE_BASH_EXIT_CODE_CHECK: 'true'
build_linux_x86_64: build_linux_x86_64:
stage: build stage: build
...@@ -63,3 +65,10 @@ build_macos_arm64: ...@@ -63,3 +65,10 @@ build_macos_arm64:
artifacts: artifacts:
paths: paths:
- build/src/dynare-preprocessor - build/src/dynare-preprocessor
test_clang_format:
stage: test
script:
- meson setup build-clang-format
- ninja -C build-clang-format clang-format-check
needs: []
This diff is collapsed.
...@@ -2,7 +2,8 @@ ...@@ -2,7 +2,8 @@
# It is not used when building Dynare as a whole. # It is not used when building Dynare as a whole.
project('dynare-preprocessor', 'cpp', project('dynare-preprocessor', 'cpp',
version : '6-unstable', version : '7-unstable',
# NB: update C++ standard in .clang-format whenever the following is modified
default_options : [ 'cpp_std=gnu++20', 'warning_level=2' ], default_options : [ 'cpp_std=gnu++20', 'warning_level=2' ],
meson_version : '>=0.64.0') meson_version : '>=0.64.0')
......
/* /*
* Copyright © 2022-2023 Dynare Team * Copyright © 2022-2024 Dynare Team
* *
* This file is part of Dynare. * This file is part of Dynare.
* *
...@@ -17,14 +17,17 @@ ...@@ -17,14 +17,17 @@
* along with Dynare. If not, see <https://www.gnu.org/licenses/>. * along with Dynare. If not, see <https://www.gnu.org/licenses/>.
*/ */
#include <iostream>
#include <ios>
#include <cstdlib>
#include <algorithm> #include <algorithm>
#include <cstdlib>
#include <ios>
#include <iostream>
#include "Bytecode.hh" #include "Bytecode.hh"
BytecodeWriter::BytecodeWriter(const filesystem::path &filename) namespace Bytecode
{
Writer::Writer(const filesystem::path& filename)
{ {
open(filename, ios::out | ios::binary); open(filename, ios::out | ios::binary);
if (!is_open()) if (!is_open())
...@@ -35,17 +38,16 @@ BytecodeWriter::BytecodeWriter(const filesystem::path &filename) ...@@ -35,17 +38,16 @@ BytecodeWriter::BytecodeWriter(const filesystem::path &filename)
} }
template<> template<>
BytecodeWriter & Writer&
operator<<(BytecodeWriter &code_file, const FCALL_ &instr) operator<<(Writer& code_file, const FCALL& instr)
{ {
code_file.instructions_positions.push_back(code_file.tellp()); code_file.instructions_positions.push_back(code_file.tellp());
auto write_member = [&code_file](const auto &member) auto write_member = [&code_file](const auto& member) {
{ code_file.write(reinterpret_cast<const char*>(&member), sizeof member);
code_file.write(reinterpret_cast<const char *>(&member), sizeof member);
}; };
write_member(instr.op_code); write_member(instr.tag);
write_member(instr.nb_output_arguments); write_member(instr.nb_output_arguments);
write_member(instr.nb_input_arguments); write_member(instr.nb_input_arguments);
write_member(instr.indx); write_member(instr.indx);
...@@ -56,33 +58,32 @@ operator<<(BytecodeWriter &code_file, const FCALL_ &instr) ...@@ -56,33 +58,32 @@ operator<<(BytecodeWriter &code_file, const FCALL_ &instr)
int size = static_cast<int>(instr.func_name.size()); int size = static_cast<int>(instr.func_name.size());
write_member(size); write_member(size);
code_file.write(instr.func_name.c_str(), size+1); code_file.write(instr.func_name.c_str(), size + 1);
size = static_cast<int>(instr.arg_func_name.size()); size = static_cast<int>(instr.arg_func_name.size());
write_member(size); write_member(size);
code_file.write(instr.arg_func_name.c_str(), size+1); code_file.write(instr.arg_func_name.c_str(), size + 1);
return code_file; return code_file;
} }
template<> template<>
BytecodeWriter & Writer&
operator<<(BytecodeWriter &code_file, const FBEGINBLOCK_ &instr) operator<<(Writer& code_file, const FBEGINBLOCK& instr)
{ {
code_file.instructions_positions.push_back(code_file.tellp()); code_file.instructions_positions.push_back(code_file.tellp());
auto write_member = [&code_file](const auto &member) auto write_member = [&code_file](const auto& member) {
{ code_file.write(reinterpret_cast<const char*>(&member), sizeof member);
code_file.write(reinterpret_cast<const char *>(&member), sizeof member);
}; };
write_member(instr.op_code); write_member(instr.tag);
write_member(instr.size); write_member(instr.size);
write_member(instr.type); write_member(instr.type);
for (int i = 0; i < instr.size; i++) for (int i = 0; i < instr.size; i++)
{ {
write_member(instr.variable[i]); write_member(instr.variables[i]);
write_member(instr.equation[i]); write_member(instr.equations[i]);
} }
if (instr.type == BlockSimulationType::solveTwoBoundariesSimple if (instr.type == BlockSimulationType::solveTwoBoundariesSimple
|| instr.type == BlockSimulationType::solveTwoBoundariesComplete || instr.type == BlockSimulationType::solveTwoBoundariesComplete
...@@ -101,3 +102,5 @@ operator<<(BytecodeWriter &code_file, const FBEGINBLOCK_ &instr) ...@@ -101,3 +102,5 @@ operator<<(BytecodeWriter &code_file, const FBEGINBLOCK_ &instr)
return code_file; return code_file;
} }
}
This diff is collapsed.
/* /*
* Copyright © 2007-2022 Dynare Team * Copyright © 2007-2023 Dynare Team
* *
* This file is part of Dynare. * This file is part of Dynare.
* *
...@@ -17,133 +17,138 @@ ...@@ -17,133 +17,138 @@
* along with Dynare. If not, see <https://www.gnu.org/licenses/>. * along with Dynare. If not, see <https://www.gnu.org/licenses/>.
*/ */
#ifndef _COMMON_ENUMS_HH #ifndef COMMON_ENUMS_HH
#define _COMMON_ENUMS_HH #define COMMON_ENUMS_HH
//! Enumeration of possible symbol types //! Enumeration of possible symbol types
/*! Warning: do not to change existing values for 0 to 4: the values matter for homotopy_setup command */ /*! Warning: do not to change existing values for 0 to 4: the values matter for homotopy_setup
* command */
enum class SymbolType enum class SymbolType
{ {
endogenous = 0, //!< Endogenous endogenous = 0, //!< Endogenous
exogenous = 1, //!< Exogenous exogenous = 1, //!< Exogenous
exogenousDet = 2, //!< Exogenous deterministic exogenousDet = 2, //!< Exogenous deterministic
parameter = 4, //!< Parameter parameter = 4, //!< Parameter
modelLocalVariable = 10, //!< Local variable whose scope is model (pound expression) modelLocalVariable = 10, //!< Local variable whose scope is model (pound expression)
modFileLocalVariable = 11, //!< Local variable whose scope is mod file (model excluded) modFileLocalVariable = 11, //!< Local variable whose scope is mod file (model excluded)
externalFunction = 12, //!< External (user-defined) function externalFunction = 12, //!< External (user-defined) function
trend = 13, //!< Trend variable trend = 13, //!< Trend variable
statementDeclaredVariable = 14, //!< Local variable assigned within a Statement (see subsample statement for example) statementDeclaredVariable
logTrend = 15, //!< Log-trend variable = 14, //!< Local variable assigned within a Statement (see subsample statement for example)
unusedEndogenous = 16, //!< Type to mark unused endogenous variables when `nostrict` option is passed logTrend = 15, //!< Log-trend variable
unusedEndogenous
= 16, //!< Type to mark unused endogenous variables when `nostrict` option is passed
// Value 17 is unused for the time being (but could be reused) // Value 17 is unused for the time being (but could be reused)
epilogue = 18, //!< Variables created in epilogue block epilogue = 18, //!< Variables created in epilogue block
excludedVariable = 19 //!< Variable excluded via model_remove/var_remove/include_eqs/exclude_eqs excludedVariable = 19 //!< Variable excluded via model_remove/var_remove/include_eqs/exclude_eqs
}; };
enum class UnaryOpcode enum class UnaryOpcode
{ {
uminus, uminus,
exp, exp,
log, log,
log10, log10,
cos, cos,
sin, sin,
tan, tan,
acos, acos,
asin, asin,
atan, atan,
cosh, cosh,
sinh, sinh,
tanh, tanh,
acosh, acosh,
asinh, asinh,
atanh, atanh,
sqrt, sqrt,
cbrt, cbrt,
abs, abs,
sign, sign,
steadyState, steadyState,
steadyStateParamDeriv, // for the derivative of the STEADY_STATE operator w.r.t. to a parameter steadyStateParamDeriv, // for the derivative of the STEADY_STATE operator w.r.t. to a parameter
steadyStateParam2ndDeriv, // for the 2nd derivative of the STEADY_STATE operator w.r.t. to a parameter steadyStateParam2ndDeriv, // for the 2nd derivative of the STEADY_STATE operator w.r.t. to a
expectation, // parameter
erf, expectation,
erfc, erf,
diff, erfc,
adl diff,
}; adl
};
enum class BinaryOpcode enum class BinaryOpcode
{ {
plus, plus,
minus, minus,
times, times,
divide, divide,
power, power,
powerDeriv, // for the derivative of the power function (see trac ticket #78) powerDeriv, // for the derivative of the power function (see trac ticket #78)
equal, equal,
max, max,
min, min,
less, less,
greater, greater,
lessEqual, lessEqual,
greaterEqual, greaterEqual,
equalEqual, equalEqual,
different different
}; };
// Small number value used when evaluating powerDeriv opcodes. // Small number value used when evaluating powerDeriv opcodes.
// Put here instead of inside BinaryOpNode class, because needed by bytecode MEX. // Put here instead of inside BinaryOpNode class, because needed by bytecode MEX.
constexpr double power_deriv_near_zero{1e-12}; constexpr double power_deriv_near_zero {1e-12};
enum class TrinaryOpcode enum class TrinaryOpcode
{ {
normcdf, normcdf,
normpdf normpdf
}; };
enum class PriorDistributions enum class PriorDistributions
{ {
noShape = 0, noShape = 0,
beta = 1, beta = 1,
gamma = 2, gamma = 2,
normal = 3, normal = 3,
invGamma = 4, invGamma = 4,
invGamma1 = 4, invGamma1 = 4,
uniform = 5, uniform = 5,
invGamma2 = 6, invGamma2 = 6,
dirichlet = 7, dirichlet = 7,
weibull = 8 weibull = 8
}; };
enum class EquationType enum class EquationType
{ {
unknown, //!< Unknown equation type evaluate, //!< Simple evaluation, normalized variable on left-hand side (written as such by the
evaluate, //!< Simple evaluation, normalized variable on left-hand side (written as such by the user) //!< user)
evaluateRenormalized, //!< Simple evaluation, normalized variable on left-hand side (normalization computed by the preprocessor) evaluateRenormalized, //!< Simple evaluation, normalized variable on left-hand side (normalization
solve //!< No simple evaluation of the equation, it has to be solved //!< computed by the preprocessor)
}; solve //!< No simple evaluation of the equation, it has to be solved
};
enum class BlockSimulationType enum class BlockSimulationType
{ {
unknown, //!< Unknown simulation type evaluateForward = 1, //!< Simple evaluation, normalized variable on left-hand side, forward
evaluateForward, //!< Simple evaluation, normalized variable on left-hand side, forward evaluateBackward, //!< Simple evaluation, normalized variable on left-hand side, backward
evaluateBackward, //!< Simple evaluation, normalized variable on left-hand side, backward solveForwardSimple, //!< Block of one equation, newton solver needed, forward
solveForwardSimple, //!< Block of one equation, newton solver needed, forward solveBackwardSimple, //!< Block of one equation, newton solver needed, backward
solveBackwardSimple, //!< Block of one equation, newton solver needed, backward solveTwoBoundariesSimple, //!< Block of one equation, Newton solver needed, forward and backward
solveTwoBoundariesSimple, //!< Block of one equation, Newton solver needed, forward and backward solveForwardComplete, //!< Block of several equations, Newton solver needed, forward
solveForwardComplete, //!< Block of several equations, Newton solver needed, forward solveBackwardComplete, //!< Block of several equations, Newton solver needed, backward
solveBackwardComplete, //!< Block of several equations, Newton solver needed, backward solveTwoBoundariesComplete //!< Block of several equations, Newton solver needed, forward and
solveTwoBoundariesComplete //!< Block of several equations, Newton solver needed, forward and backwar //!< backwar
}; };
enum class PacTargetKind enum class PacTargetKind
{ {
unspecified, // Must be the first one, because it’s the default initializer unspecified, // Must be the first one, because it’s the default initializer
ll, ll,
dl, dl,
dd dd
}; };
#endif // _COMMON_ENUMS_HH #endif
This diff is collapsed.
This diff is collapsed.
...@@ -17,122 +17,110 @@ ...@@ -17,122 +17,110 @@
* along with Dynare. If not, see <https://www.gnu.org/licenses/>. * along with Dynare. If not, see <https://www.gnu.org/licenses/>.
*/ */
#ifndef _CONFIG_FILE_HH #ifndef CONFIGURATION_HH
#define _CONFIG_FILE_HH #define CONFIGURATION_HH
#include <filesystem>
#include <map> #include <map>
#include <vector> #include <vector>
#include <filesystem>
#include "WarningConsolidation.hh" #include "WarningConsolidation.hh"
using namespace std; using namespace std;
using member_nodes_t = map<string, double>; /* The abstract representation of the configuration.
Merges information from the command-line and from the configuration file. */
class Hook class Configuration
{ {
public: public:
explicit Hook(string global_init_file_arg); Configuration(bool parallel_arg, bool parallel_test_arg, bool parallel_follower_open_mode_arg,
bool parallel_use_psexec_arg, string cluster_name);
private: private:
map<string, string> hooks; using member_nodes_t = map<string, double>;
public:
map<string, string> class Path
get_hooks() const
{ {
return hooks; public:
explicit Path(vector<string> includepath_arg);
[[nodiscard]] map<string, vector<string>>
get_paths() const
{
return paths;
};
private:
map<string, vector<string>> paths;
}; };
};
class Path struct FollowerNode
{
public:
explicit Path(vector<string> includepath_arg);
private:
map<string, vector<string>> paths;
public:
map<string, vector<string>>
get_paths() const
{ {
return paths; FollowerNode(string computerName_arg, string port_arg, int minCpuNbr_arg, int maxCpuNbr_arg,
string userName_arg, string password_arg, string remoteDrive_arg,
string remoteDirectory_arg, string programPath_arg, string programConfig_arg,
string matlabOctavePath_arg, bool singleCompThread_arg,
int numberOfThreadsPerJob_arg, string operatingSystem_arg);
const string computerName, port;
int minCpuNbr, maxCpuNbr;
const string userName, password;
const string remoteDrive, remoteDirectory;
const string programPath, programConfig, matlabOctavePath;
const bool singleCompThread;
const int numberOfThreadsPerJob;
const string operatingSystem;
}; };
};
class FollowerNode struct Cluster
{ {
friend class ConfigFile; explicit Cluster(member_nodes_t member_nodes_arg);
public: member_nodes_t member_nodes;
FollowerNode(string computerName_arg, string port_arg, int minCpuNbr_arg, int maxCpuNbr_arg, string userName_arg, };
string password_arg, string remoteDrive_arg, string remoteDirectory_arg,
string programPath_arg, string programConfig_arg, string matlabOctavePath_arg, bool singleCompThread_arg,
int numberOfThreadsPerJob_arg, string operatingSystem_arg);
protected:
const string computerName, port;
int minCpuNbr, maxCpuNbr;
const string userName, password;
const string remoteDrive, remoteDirectory;
const string programPath, programConfig, matlabOctavePath;
const bool singleCompThread;
const int numberOfThreadsPerJob;
const string operatingSystem;
};
class Cluster
{
friend class ConfigFile;
public:
explicit Cluster(member_nodes_t member_nodes_arg);
protected:
member_nodes_t member_nodes;
};
//! The abstract representation of a "config" file
class ConfigFile
{
public:
ConfigFile(bool parallel_arg, bool parallel_test_arg, bool parallel_follower_open_mode_arg,
bool parallel_use_psexec_arg, string cluster_name);
private:
const bool parallel, parallel_test, parallel_follower_open_mode, parallel_use_psexec; const bool parallel, parallel_test, parallel_follower_open_mode, parallel_use_psexec;
const string cluster_name; const string cluster_name;
string firstClusterName; string firstClusterName;
//! Hooks //! Hooks
vector<Hook> hooks; string global_init_file;
//! Paths //! Paths
vector<Path> paths; vector<Path> paths;
//! Cluster Table //! Cluster Table
map<string, Cluster> clusters; map<string, Cluster> clusters;
//! Node Map //! Node Map
map<string, FollowerNode> follower_nodes; map<string, FollowerNode> follower_nodes;
//! Add Hooks
void addHooksConfFileElement(string global_init_file);
//! Add Paths //! Add Paths
void addPathsConfFileElement(vector<string> includepath); void addPathsConfFileElement(vector<string> includepath);
//! Add a FollowerNode or a Cluster object //! Add a FollowerNode or a Cluster object
void addParallelConfFileElement(bool inNode, bool inCluster, const member_nodes_t &member_nodes, const string &name, void addParallelConfFileElement(bool inNode, bool inCluster, const member_nodes_t& member_nodes,
const string &computerName, const string &port, int minCpuNbr, int maxCpuNbr, const string& name, const string& computerName,
const string &userName, const string &password, const string &remoteDrive, const string& port, int minCpuNbr, int maxCpuNbr,
const string &remoteDirectory, const string &programPath, const string &programConfig, const string& userName, const string& password,
const string &matlabOctavePath, bool singleCompThread, int numberOfThreadsPerJob, const string& remoteDrive, const string& remoteDirectory,
const string &operatingSystem); const string& programPath, const string& programConfig,
const string& matlabOctavePath, bool singleCompThread,
int numberOfThreadsPerJob, const string& operatingSystem);
/* Given a filename (e.g. dynare.ini), looks for it in the configuration directory:
– if under Linux or macOS, look into the “dynare” subdirectory of the XDG
configuration directories (following the default values and the precedence order specified in
the XDG specification)
– if under Windows, look into %APPDATA%\dynare\
The returned path will be empty if the file is not found. */
[[nodiscard]] static filesystem::path findConfigFile(const string& filename);
public: public:
//! Parse config file //! Parse config file
void getConfigFileInfo(const filesystem::path &parallel_config_file); void getConfigFileInfo(const filesystem::path& conffile_option, WarningConsolidation& warnings);
//! Check Pass //! Check Pass
void checkPass(WarningConsolidation &warnings) const; void checkPass(WarningConsolidation& warnings) const;
//! Check Pass //! Check Pass
void transformPass(); void transformPass();
//! Get Path Info //! Get Path Info
vector<filesystem::path> getIncludePaths() const; [[nodiscard]] vector<filesystem::path> getIncludePaths() const;
//! Write any hooks //! Write any hooks
void writeHooks(ostream &output) const; void writeHooks(ostream& output) const;
//! Create options_.parallel structure, write options //! Create options_.parallel structure, write options
void writeCluster(ostream &output) const; void writeCluster(ostream& output) const;
//! Close follower nodes if needed //! Close follower nodes if needed
void writeEndParallel(ostream &output) const; void writeEndParallel(ostream& output) const;
}; };
#endif // ! CONFIG_FILE_HH #endif
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.