/* * Copyright © 2007-2023 Dynare Team * * This file is part of Dynare. * * Dynare is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Dynare is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Dynare. If not, see . */ #ifndef EVALUATE_HH #define EVALUATE_HH #include #include #include #include #include #include #include "BasicSymbolTable.hh" #include "Bytecode.hh" class Evaluate { private: using instructions_list_t = vector; using it_code_type = instructions_list_t::const_iterator; const BasicSymbolTable& symbol_table; const bool steady_state; // Whether this is a static or dynamic .cod file // Memory copy of the contents of the .cod file vector raw_bytecode; /* Owns read instructions that have their specialized deserializing constructors (and are thus not part of the “code” memory block). We use std::deque for storing them, because that class guarantees the stability of iterators, and thus of pointers to elements; we store such pointers in the “instructions_list” data member. */ deque deserialized_fbeginblock; deque deserialized_fcall; /* List of deserialized instructions Those are either pointers inside “raw_bytecode” or “deserialized_{fbeginblock,fcall}” */ instructions_list_t instructions_list; // Number of blocks in the model int nb_blocks {0}; // Index of beginnings of blocks within instructions_list vector begin_block; int block_num; // Index of the current block int size; // Size of the current block Bytecode::ExpressionType EQN_type; int EQN_equation, EQN_dvar1; int EQN_lag1, EQN_lag2, EQN_lag3; [[nodiscard]] string error_location(it_code_type expr_begin, it_code_type faulty_op, int it_) const; /* Prints a bytecode expression in human readable form. If faulty_op is not default constructed, it should point to a tag within the expression that created a floating point exception, in which case the corresponding mathematical operator will be printed within braces. The second output argument points to the tag past the expression. */ [[nodiscard]] pair print_expression(const it_code_type& expr_begin, const optional& faulty_op = nullopt) const; [[nodiscard]] Bytecode::FBEGINBLOCK* currentBlockTag() const { return reinterpret_cast(instructions_list[begin_block[block_num]]); } // Returns iterator to first instruction in the current block (after FBEGINBLOCK) it_code_type currentBlockBeginning() { return instructions_list.begin() + begin_block[block_num] + 1; } public: Evaluate(const filesystem::path& codfile, bool steady_state_arg, const BasicSymbolTable& symbol_table_arg); void evaluateBlock(int it_, int y_kmin, double* __restrict__ y, int y_size, double* __restrict__ x, int nb_row_x, double* __restrict__ params, const double* __restrict__ steady_y, double* __restrict__ u, int Per_u_, double* __restrict__ T, int T_nrows, map& TEF, map, double>& TEFD, map, double>& TEFDD, double* __restrict__ r, double* __restrict__ g1, double* __restrict__ jacob, double* __restrict__ jacob_exo, double* __restrict__ jacob_exo_det, bool evaluate, bool no_derivatives); // Prints current block void printCurrentBlock(); void gotoBlock(int block); [[nodiscard]] int getNumberOfTemporaryTerms() const; [[nodiscard]] auto getCurrentBlockSize() const { return currentBlockTag()->get_size(); } [[nodiscard]] auto getCurrentBlockType() const { return currentBlockTag()->get_type(); } [[nodiscard]] auto isCurrentBlockLinear() const { return currentBlockTag()->get_is_linear(); } [[nodiscard]] auto getCurrentBlockEquationsAndVariables() const { return currentBlockTag()->get_Block_Contain(); } [[nodiscard]] auto getCurrentBlockUCount() const { return currentBlockTag()->get_u_count_int(); } [[nodiscard]] auto getCurrentBlockExogenous() const { return currentBlockTag()->get_exogenous(); } [[nodiscard]] auto getCurrentBlockEndogenous() const { return currentBlockTag()->get_endogenous(); } [[nodiscard]] auto getCurrentBlockNbColJacob() const { return currentBlockTag()->get_nb_col_jacob(); } [[nodiscard]] auto getCurrentBlockExoSize() const { return currentBlockTag()->get_exo_size(); } [[nodiscard]] auto getCurrentBlockExoDetSize() const { return currentBlockTag()->get_det_exo_size(); } [[nodiscard]] int getTotalBlockNumber() const { return nb_blocks; } }; #endif