User Guide
sympy_conductance_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::SympyConductanceVisitor
13  */
14 
15 #include <map>
16 #include <set>
17 #include <vector>
18 
19 #include "visitors/ast_visitor.hpp"
20 
21 namespace nmodl {
22 
23 namespace visitor {
24 
25 /**
26  * @addtogroup visitor_classes
27  * @{
28  */
29 
30 /**
31  * \class SympyConductanceVisitor
32  * \brief %Visitor for generating CONDUCTANCE statements for ions
33  *
34  * This class visits each ion expression `I = ...` in the `BREAKPOINT`
35  * and symbolically differentiates it to get `dI/dV`, i.e. the conductance.
36  * If this coincides with an existing global variable `g` (e.g. when
37  * `I` is linear in `V`) then it will add
38  *
39  * \code{.mod}
40  * CONDUCTANCE g USEION I
41  * \endcode
42  *
43  * If `dI/dV` is a more complicated expression, it generates a new unique
44  * variable name `g_unique`, and adds two lines
45  *
46  * \code{.mod}
47  * CONDUCTANCE g_unique USEION I
48  * g_unique = [dI/dV expression]
49  * \endcode
50  *
51  * If an ion channel already has a `CONDUCTANCE` statement then it does
52  * not modify it.
53  */
55  typedef std::map<std::string, std::string> string_map;
56  typedef std::set<std::string> string_set;
57 
58  private:
59  /// true while visiting breakpoint block
60  bool under_breakpoint_block = false;
61 
62  /// set of all variables for SymPy
64 
65  /// set of currents to ignore
67 
68  /// map between current write names and ion names
70 
72 
73  /// list in order of binary expressions in breakpoint
74  std::vector<std::string> ordered_binary_exprs;
75 
76  /// ditto but for LHS of expression only
77  std::vector<std::string> ordered_binary_exprs_lhs;
78 
79  /// map from lhs of binary expression to index of expression in above vector
80  std::map<std::string, std::size_t> binary_expr_index;
81 
82  /// use ion ast nodes
83  std::vector<std::shared_ptr<const ast::Ast>> use_ion_nodes;
84 
85  /// non specific currents
86  std::vector<std::shared_ptr<const ast::Ast>> nonspecific_nodes;
87 
88  std::vector<std::string> generate_statement_strings(ast::BreakpointBlock& node);
91 
92  static std::string to_nmodl_for_sympy(const ast::Ast& node);
93 
94  public:
95  SympyConductanceVisitor() = default;
97  void visit_breakpoint_block(ast::BreakpointBlock& node) override;
98  void visit_conductance_hint(ast::ConductanceHint& node) override;
99  void visit_program(ast::Program& node) override;
100 };
101 
102 /** @} */ // end of visitor_classes
103 
104 } // namespace visitor
105 } // namespace nmodl
nmodl::ast::Ast
Base class for all Abstract Syntax Tree node types.
Definition: ast.hpp:69
nmodl::visitor::SympyConductanceVisitor
Visitor for generating CONDUCTANCE statements for ions
Definition: sympy_conductance_visitor.hpp:54
nmodl::visitor::SympyConductanceVisitor::generate_statement_strings
std::vector< std::string > generate_statement_strings(ast::BreakpointBlock &node)
Definition: sympy_conductance_visitor.cpp:48
nmodl::ast::ConductanceHint
Represents CONDUCTANCE statement in NMODL.
Definition: conductance_hint.hpp:46
nmodl::visitor::SympyConductanceVisitor::i_name
string_map i_name
map between current write names and ion names
Definition: sympy_conductance_visitor.hpp:69
nmodl::visitor::SympyConductanceVisitor::under_breakpoint_block
bool under_breakpoint_block
true while visiting breakpoint block
Definition: sympy_conductance_visitor.hpp:60
nmodl
encapsulates code generation backend implementations
Definition: ast_common.hpp:26
nmodl::visitor::SympyConductanceVisitor::all_vars
string_set all_vars
set of all variables for SymPy
Definition: sympy_conductance_visitor.hpp:63
nmodl::visitor::SympyConductanceVisitor::visit_binary_expression
void visit_binary_expression(ast::BinaryExpression &node) override
visit node of type ast::BinaryExpression
Definition: sympy_conductance_visitor.cpp:124
nmodl::visitor::SympyConductanceVisitor::ordered_binary_exprs
std::vector< std::string > ordered_binary_exprs
list in order of binary expressions in breakpoint
Definition: sympy_conductance_visitor.hpp:74
nmodl::visitor::SympyConductanceVisitor::SympyConductanceVisitor
SympyConductanceVisitor()=default
nmodl::visitor::SympyConductanceVisitor::to_nmodl_for_sympy
static std::string to_nmodl_for_sympy(const ast::Ast &node)
Definition: sympy_conductance_visitor.cpp:156
nmodl::visitor::SympyConductanceVisitor::visit_program
void visit_program(ast::Program &node) override
visit node of type ast::Program
Definition: sympy_conductance_visitor.cpp:238
nmodl::visitor::SympyConductanceVisitor::use_ion_nodes
std::vector< std::shared_ptr< const ast::Ast > > use_ion_nodes
use ion ast nodes
Definition: sympy_conductance_visitor.hpp:83
nmodl::visitor::SympyConductanceVisitor::visit_breakpoint_block
void visit_breakpoint_block(ast::BreakpointBlock &node) override
visit node of type ast::BreakpointBlock
Definition: sympy_conductance_visitor.cpp:196
nmodl::visitor::SympyConductanceVisitor::lookup_nonspecific_statements
void lookup_nonspecific_statements()
Definition: sympy_conductance_visitor.cpp:139
nmodl::visitor::SympyConductanceVisitor::string_set
std::set< std::string > string_set
Definition: sympy_conductance_visitor.hpp:56
nmodl::ast::BreakpointBlock
Represents a BREAKPOINT block in NMODL.
Definition: breakpoint_block.hpp:53
nmodl::visitor::SympyConductanceVisitor::binary_expr_index
std::map< std::string, std::size_t > binary_expr_index
map from lhs of binary expression to index of expression in above vector
Definition: sympy_conductance_visitor.hpp:80
nmodl::visitor::AstVisitor
Concrete visitor for all AST classes.
Definition: ast_visitor.hpp:37
nmodl::visitor::SympyConductanceVisitor::ordered_binary_exprs_lhs
std::vector< std::string > ordered_binary_exprs_lhs
ditto but for LHS of expression only
Definition: sympy_conductance_visitor.hpp:77
nmodl::visitor::SympyConductanceVisitor::NONSPECIFIC_CONDUCTANCE_ALREADY_EXISTS
bool NONSPECIFIC_CONDUCTANCE_ALREADY_EXISTS
Definition: sympy_conductance_visitor.hpp:71
nmodl::visitor::SympyConductanceVisitor::string_map
std::map< std::string, std::string > string_map
Definition: sympy_conductance_visitor.hpp:55
nmodl::ast::Program
Represents top level AST node for whole NMODL input.
Definition: program.hpp:39
nmodl::visitor::SympyConductanceVisitor::i_ignore
string_set i_ignore
set of currents to ignore
Definition: sympy_conductance_visitor.hpp:66
nmodl::visitor::SympyConductanceVisitor::nonspecific_nodes
std::vector< std::shared_ptr< const ast::Ast > > nonspecific_nodes
non specific currents
Definition: sympy_conductance_visitor.hpp:86
nmodl::visitor::SympyConductanceVisitor::visit_conductance_hint
void visit_conductance_hint(ast::ConductanceHint &node) override
visit node of type ast::ConductanceHint
Definition: sympy_conductance_visitor.cpp:182
nmodl::ast::BinaryExpression
Represents binary expression in the NMODL.
Definition: binary_expression.hpp:52
nmodl::visitor::SympyConductanceVisitor::lookup_useion_statements
void lookup_useion_statements()
Definition: sympy_conductance_visitor.cpp:161
ast_visitor.hpp
Concrete visitor for all AST classes.