User Guide
kinetic_block_visitor.hpp
Go to the documentation of this file.
1 /*
2  * Copyright 2023 Blue Brain Project, EPFL.
3  * See the top-level LICENSE file for details.
4  *
5  * SPDX-License-Identifier: Apache-2.0
6  */
7 
8 #pragma once
9 
10 /**
11  * \file
12  * \brief \copybrief nmodl::visitor::KineticBlockVisitor
13  */
14 
15 #include <memory>
16 #include <string>
17 #include <unordered_map>
18 #include <unordered_set>
19 #include <vector>
20 
21 #include "visitors/ast_visitor.hpp"
22 
23 namespace nmodl {
24 namespace visitor {
25 
26 /**
27  * \addtogroup visitor_classes
28  * \{
29  */
30 
31 /**
32  * \class KineticBlockVisitor
33  * \brief %Visitor for kinetic block statements
34  *
35  * Replaces each KINETIC block with a DERIVATIVE block
36  * containing a system of ODEs that is equivalent to
37  * the original set of reaction statements
38  *
39  * Note: assumes that the order of statements between the first and last
40  * reaction statement (those starting with "~") does not matter.
41  *
42  * If there is a CONSERVE statement it is rewritten in an equivalent
43  * form which is then be used by the SympySolver visitor to replace
44  * the ODE for the last state variable on the LHS of the CONSERVE statement
45  *
46  */
48  private:
49  /// update stoichiometric matrices with reaction var term
50  void process_reac_var(const std::string& varname, int count = 1);
51 
52  /// update CONSERVE statement with reaction var term
53  void process_conserve_reac_var(const std::string& varname, int count = 1);
54 
55  /// stochiometric matrices nu_L, nu_R
56  /// forwards/backwards fluxes k_f, k_b
57  /// (see kinetic_schemes.ipynb notebook for details)
58  struct RateEqs {
59  std::vector<std::vector<int>> nu_L;
60  std::vector<std::vector<int>> nu_R;
61  std::vector<std::string> k_f;
62  std::vector<std::string> k_b;
63  } rate_eqs;
64 
65  /// multiplicative factors for ODEs from COMPARTMENT statements
66  std::vector<std::string> compartment_factors;
67 
68  /// additive constant terms for ODEs from reaction statements like ~ x << (a)
69  std::vector<std::string> additive_terms;
70 
71  /// multiplicate constant terms for fluxes from non-state vars as reactants
72  /// e.g. reaction statements like ~ x <-> c (a,a)
73  /// where c is not a state var, which is equivalent to the ODE
74  /// x' = a * (c - x)
75  std::vector<std::string> non_state_var_fflux;
76  std::vector<std::string> non_state_var_bflux;
77 
78  /// generated set of fluxes and ODEs
79  std::vector<std::string> fflux;
80  std::vector<std::string> bflux;
81  std::vector<std::string> odes;
82 
83  /// current expressions for the `fflux`, `bflux` variables that can be used in the mod file
84  /// and that are determined by the preceeding kinetic reaction statement, i.e. their
85  /// value changes depending on their location inside the kinetic block
86  std::string modfile_fflux;
87  std::string modfile_bflux;
88 
89  /// number of state variables
90  int state_var_count = 0;
91 
92  /// state variables vector
93  std::vector<std::string> state_var;
94 
95  /// unordered_map from state variable to corresponding index
96  std::unordered_map<std::string, int> state_var_index;
97 
98  /// unordered_map from array state variable to its size (for summing over each element of any
99  /// array state vars in a CONSERVE statement)
100  std::unordered_map<std::string, int> array_state_var_size;
101 
102  /// true if we are visiting a reaction statement
103  bool in_reaction_statement = false;
104 
105  /// true if we are visiting the left hand side of reaction statement
107 
108  /// true if we are visiting a CONSERVE statement
109  bool in_conserve_statement = false;
110 
111  /// counts the number of CONSERVE statements in Kinetic blocks
113 
114  /// conserve statement equation as string
116 
117  /// conserve statement: current state variable being processed
119 
120  /// conserve statement: current state var multiplicative factor being processed
122 
123  /// current statement index
124  int i_statement = 0;
125 
126  /// vector of kinetic block nodes
127  std::vector<ast::KineticBlock*> kinetic_blocks;
128 
129  /// statements to remove from block
130  std::unordered_set<ast::Statement*> statements_to_remove;
131 
132  /// current statement block being visited
134 
135  public:
136  KineticBlockVisitor() = default;
137  inline int get_conserve_statement_count() const {
139  }
140 
142  void visit_reaction_operator(ast::ReactionOperator& node) override;
143  void visit_react_var_name(ast::ReactVarName& node) override;
145  void visit_conserve(ast::Conserve& node) override;
146  void visit_compartment(ast::Compartment& node) override;
147  void visit_statement_block(ast::StatementBlock& node) override;
148  void visit_kinetic_block(ast::KineticBlock& node) override;
149  void visit_program(ast::Program& node) override;
150 };
151 
152 /** \} */ // end of visitor_classes
153 
154 } // namespace visitor
155 } // namespace nmodl
nmodl::visitor::KineticBlockVisitor::visit_wrapped_expression
void visit_wrapped_expression(ast::WrappedExpression &node) override
visit node of type ast::WrappedExpression
Definition: kinetic_block_visitor.cpp:325
nmodl::visitor::KineticBlockVisitor::array_state_var_size
std::unordered_map< std::string, int > array_state_var_size
unordered_map from array state variable to its size (for summing over each element of any array state...
Definition: kinetic_block_visitor.hpp:100
nmodl::visitor::KineticBlockVisitor::RateEqs
stochiometric matrices nu_L, nu_R forwards/backwards fluxes k_f, k_b (see kinetic_schemes....
Definition: kinetic_block_visitor.hpp:58
nmodl::visitor::KineticBlockVisitor::visit_statement_block
void visit_statement_block(ast::StatementBlock &node) override
visit node of type ast::StatementBlock
Definition: kinetic_block_visitor.cpp:345
nmodl::visitor::KineticBlockVisitor::process_conserve_reac_var
void process_conserve_reac_var(const std::string &varname, int count=1)
update CONSERVE statement with reaction var term
Definition: kinetic_block_visitor.cpp:63
nmodl::ast::Conserve
Represent CONSERVE statement in NMODL.
Definition: conserve.hpp:38
nmodl::visitor::KineticBlockVisitor::get_conserve_statement_count
int get_conserve_statement_count() const
Definition: kinetic_block_visitor.hpp:137
nmodl::visitor::KineticBlockVisitor::non_state_var_fflux
std::vector< std::string > non_state_var_fflux
multiplicate constant terms for fluxes from non-state vars as reactants e.g.
Definition: kinetic_block_visitor.hpp:75
nmodl::visitor::KineticBlockVisitor::conserve_statement_count
int conserve_statement_count
counts the number of CONSERVE statements in Kinetic blocks
Definition: kinetic_block_visitor.hpp:112
nmodl
encapsulates code generation backend implementations
Definition: ast_common.hpp:26
nmodl::ast::ReactVarName
TODO.
Definition: react_var_name.hpp:38
nmodl::visitor::KineticBlockVisitor::compartment_factors
std::vector< std::string > compartment_factors
multiplicative factors for ODEs from COMPARTMENT statements
Definition: kinetic_block_visitor.hpp:66
nmodl::visitor::KineticBlockVisitor::visit_program
void visit_program(ast::Program &node) override
visit node of type ast::Program
Definition: kinetic_block_visitor.cpp:432
nmodl::visitor::KineticBlockVisitor::state_var_count
int state_var_count
number of state variables
Definition: kinetic_block_visitor.hpp:90
nmodl::visitor::KineticBlockVisitor::visit_compartment
void visit_compartment(ast::Compartment &node) override
visit node of type ast::Compartment
Definition: kinetic_block_visitor.cpp:144
nmodl::visitor::KineticBlockVisitor::fflux
std::vector< std::string > fflux
generated set of fluxes and ODEs
Definition: kinetic_block_visitor.hpp:79
nmodl::visitor::KineticBlockVisitor::conserve_equation_statevar
std::string conserve_equation_statevar
conserve statement: current state variable being processed
Definition: kinetic_block_visitor.hpp:118
nmodl::visitor::KineticBlockVisitor::visit_reaction_operator
void visit_reaction_operator(ast::ReactionOperator &node) override
visit node of type ast::ReactionOperator
Definition: kinetic_block_visitor.cpp:169
nmodl::visitor::KineticBlockVisitor::rate_eqs
struct nmodl::visitor::KineticBlockVisitor::RateEqs rate_eqs
nmodl::visitor::KineticBlockVisitor
Visitor for kinetic block statements
Definition: kinetic_block_visitor.hpp:47
nmodl::ast::ReactionOperator
TODO.
Definition: reaction_operator.hpp:38
nmodl::visitor::KineticBlockVisitor::visit_conserve
void visit_conserve(ast::Conserve &node) override
visit node of type ast::Conserve
Definition: kinetic_block_visitor.cpp:102
nmodl::visitor::KineticBlockVisitor::KineticBlockVisitor
KineticBlockVisitor()=default
nmodl::visitor::KineticBlockVisitor::in_reaction_statement_lhs
bool in_reaction_statement_lhs
true if we are visiting the left hand side of reaction statement
Definition: kinetic_block_visitor.hpp:106
nmodl::visitor::KineticBlockVisitor::i_statement
int i_statement
current statement index
Definition: kinetic_block_visitor.hpp:124
nmodl::visitor::KineticBlockVisitor::in_conserve_statement
bool in_conserve_statement
true if we are visiting a CONSERVE statement
Definition: kinetic_block_visitor.hpp:109
nmodl::visitor::KineticBlockVisitor::statements_to_remove
std::unordered_set< ast::Statement * > statements_to_remove
statements to remove from block
Definition: kinetic_block_visitor.hpp:130
nmodl::visitor::AstVisitor
Concrete visitor for all AST classes.
Definition: ast_visitor.hpp:37
nmodl::visitor::KineticBlockVisitor::modfile_fflux
std::string modfile_fflux
current expressions for the fflux, bflux variables that can be used in the mod file and that are dete...
Definition: kinetic_block_visitor.hpp:86
nmodl::visitor::KineticBlockVisitor::visit_reaction_statement
void visit_reaction_statement(ast::ReactionStatement &node) override
visit node of type ast::ReactionStatement
Definition: kinetic_block_visitor.cpp:201
nmodl::visitor::KineticBlockVisitor::state_var
std::vector< std::string > state_var
state variables vector
Definition: kinetic_block_visitor.hpp:93
nmodl::visitor::KineticBlockVisitor::conserve_equation_str
std::string conserve_equation_str
conserve statement equation as string
Definition: kinetic_block_visitor.hpp:115
nmodl::ast::KineticBlock
TODO.
Definition: kinetic_block.hpp:39
nmodl::visitor::KineticBlockVisitor::bflux
std::vector< std::string > bflux
Definition: kinetic_block_visitor.hpp:80
nmodl::ast::Compartment
Represent COMPARTMENT statement in NMODL.
Definition: compartment.hpp:39
nmodl::visitor::KineticBlockVisitor::visit_react_var_name
void visit_react_var_name(ast::ReactVarName &node) override
visit node of type ast::ReactVarName
Definition: kinetic_block_visitor.cpp:179
nmodl::ast::StatementBlock
Represents block encapsulating list of statements.
Definition: statement_block.hpp:53
nmodl::visitor::KineticBlockVisitor::modfile_bflux
std::string modfile_bflux
Definition: kinetic_block_visitor.hpp:87
nmodl::visitor::KineticBlockVisitor::RateEqs::k_b
std::vector< std::string > k_b
Definition: kinetic_block_visitor.hpp:62
nmodl::ast::ReactionStatement
TODO.
Definition: reaction_statement.hpp:39
nmodl::visitor::KineticBlockVisitor::additive_terms
std::vector< std::string > additive_terms
additive constant terms for ODEs from reaction statements like ~ x << (a)
Definition: kinetic_block_visitor.hpp:69
nmodl::visitor::KineticBlockVisitor::visit_kinetic_block
void visit_kinetic_block(ast::KineticBlock &node) override
visit node of type ast::KineticBlock
Definition: kinetic_block_visitor.cpp:354
nmodl::visitor::KineticBlockVisitor::state_var_index
std::unordered_map< std::string, int > state_var_index
unordered_map from state variable to corresponding index
Definition: kinetic_block_visitor.hpp:96
nmodl::visitor::KineticBlockVisitor::kinetic_blocks
std::vector< ast::KineticBlock * > kinetic_blocks
vector of kinetic block nodes
Definition: kinetic_block_visitor.hpp:127
nmodl::visitor::KineticBlockVisitor::current_statement_block
ast::StatementBlock * current_statement_block
current statement block being visited
Definition: kinetic_block_visitor.hpp:133
nmodl::visitor::KineticBlockVisitor::RateEqs::k_f
std::vector< std::string > k_f
Definition: kinetic_block_visitor.hpp:61
nmodl::visitor::KineticBlockVisitor::odes
std::vector< std::string > odes
Definition: kinetic_block_visitor.hpp:81
nmodl::visitor::KineticBlockVisitor::process_reac_var
void process_reac_var(const std::string &varname, int count=1)
update stoichiometric matrices with reaction var term
Definition: kinetic_block_visitor.cpp:22
nmodl::ast::Program
Represents top level AST node for whole NMODL input.
Definition: program.hpp:39
nmodl::visitor::KineticBlockVisitor::in_reaction_statement
bool in_reaction_statement
true if we are visiting a reaction statement
Definition: kinetic_block_visitor.hpp:103
nmodl::visitor::KineticBlockVisitor::RateEqs::nu_R
std::vector< std::vector< int > > nu_R
Definition: kinetic_block_visitor.hpp:60
nmodl::visitor::KineticBlockVisitor::RateEqs::nu_L
std::vector< std::vector< int > > nu_L
Definition: kinetic_block_visitor.hpp:59
nmodl::ast::WrappedExpression
Wrap any other expression type.
Definition: wrapped_expression.hpp:38
nmodl::visitor::KineticBlockVisitor::non_state_var_bflux
std::vector< std::string > non_state_var_bflux
Definition: kinetic_block_visitor.hpp:76
nmodl::visitor::KineticBlockVisitor::conserve_equation_factor
std::string conserve_equation_factor
conserve statement: current state var multiplicative factor being processed
Definition: kinetic_block_visitor.hpp:121
ast_visitor.hpp
Concrete visitor for all AST classes.