User Guide
eigen_newton_solver_block.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 ///
9 /// THIS FILE IS GENERATED AT BUILD TIME AND SHALL NOT BE EDITED.
10 ///
11 
12 #pragma once
13 
14 /**
15  * \dir
16  * \brief Auto generated AST Implementations
17  *
18  * \file
19  * \brief Auto generated AST classes declaration
20  */
21 
22 #include "ast/ast_decl.hpp"
23 #include "ast/block.hpp"
24 
25 namespace nmodl::ast {
26 
27 /**
28  * \addtogroup ast_class
29  * \ingroup ast
30  * \{
31  */
32 
33 /**
34  * \brief Represent newton solver solution block based on Eigen
35  *
36  *
37 */
38 class EigenNewtonSolverBlock : public Block {
39  private:
40  /// number of state vars used in solve
41  std::shared_ptr<Integer> n_state_vars;
42  /// Statements to be declared in the functor
43  std::shared_ptr<StatementBlock> variable_block;
44  /// Statement block to be executed before calling newton solver
45  std::shared_ptr<StatementBlock> initialize_block;
46  /// update X from states
47  std::shared_ptr<StatementBlock> setup_x_block;
48  /// odes as functor for eigen
49  std::shared_ptr<StatementBlock> functor_block;
50  /// update back states from X
51  std::shared_ptr<StatementBlock> update_states_block;
52  /// Statement block to be executed after calling newton solver
53  std::shared_ptr<StatementBlock> finalize_block;
54  /// token with location information
55  std::shared_ptr<ModToken> token;
56  /// symbol table for a block
58 
59  public:
60  /// \name Ctor & dtor
61  /// \{
63  explicit EigenNewtonSolverBlock(std::shared_ptr<Integer> n_state_vars, std::shared_ptr<StatementBlock> variable_block, std::shared_ptr<StatementBlock> initialize_block, std::shared_ptr<StatementBlock> setup_x_block, std::shared_ptr<StatementBlock> functor_block, std::shared_ptr<StatementBlock> update_states_block, std::shared_ptr<StatementBlock> finalize_block);
65  virtual ~EigenNewtonSolverBlock() = default;
66  /// \}
67 
68  /**
69  * \brief Check if the ast node is an instance of ast::EigenNewtonSolverBlock
70  * \return true as object is of type ast::EigenNewtonSolverBlock
71  */
72  bool is_eigen_newton_solver_block () const noexcept override {
73  return true;
74  }
75 
76  /**
77  * \brief Return a copy of the current node
78  *
79  * Recursively make a new copy/clone of the current node including
80  * all members and return a pointer to the node. This is used for
81  * passes like nmodl::visitor::InlineVisitor where nodes are cloned in the
82  * ast.
83  *
84  * \return pointer to the clone/copy of the current node
85  */
86  // NOLINTBEGIN(clang-analyzer-cplusplus.NewDeleteLeaks)
87  EigenNewtonSolverBlock* clone() const override {
88  return new EigenNewtonSolverBlock(*this);
89  }
90  // NOLINTEND(clang-analyzer-cplusplus.NewDeleteLeaks)
91 
92  /// \name Getters
93  /// \{
94 
95  /**
96  * \brief Return type (ast::AstNodeType) of ast node
97  *
98  * Every node in the ast has a type defined in ast::AstNodeType and this
99  * function is used to retrieve the same.
100  *
101  * \return ast node type i.e. ast::AstNodeType::EIGEN_NEWTON_SOLVER_BLOCK
102  *
103  * \sa Ast::get_node_type_name
104  */
105  AstNodeType get_node_type() const noexcept override {
107  }
108 
109  /**
110  * \brief Return type (ast::AstNodeType) of ast node as std::string
111  *
112  * Every node in the ast has a type defined in ast::AstNodeType.
113  * This type name can be returned as a std::string for printing
114  * node to text/json form.
115  *
116  * \return name of the node type as a string i.e. "EigenNewtonSolverBlock"
117  *
118  * \sa Ast::get_node_name
119  */
120  std::string get_node_type_name() const noexcept override {
121  return "EigenNewtonSolverBlock";
122  }
123 
124  /**
125  * \brief Return NMODL statement of ast node as std::string
126  *
127  * Every node is related to a special statement in the NMODL. This
128  * statement can be returned as a std::string for printing to
129  * text/json form.
130  *
131  * \return name of the statement as a string i.e. "EIGEN_NEWTON_SOLVE"
132  *
133  * \sa Ast::get_nmodl_name
134  */
135  std::string get_nmodl_name() const noexcept override {
136  return "EIGEN_NEWTON_SOLVE";
137  }
138 
139  /**
140  * \brief Get std::shared_ptr from `this` pointer of the current ast node
141  */
142  std::shared_ptr<Ast> get_shared_ptr() override {
143  return std::static_pointer_cast<EigenNewtonSolverBlock>(shared_from_this());
144  }
145 
146  /**
147  * \brief Get std::shared_ptr from `this` pointer of the current ast node
148  */
149  std::shared_ptr<const Ast> get_shared_ptr() const override {
150  return std::static_pointer_cast<const EigenNewtonSolverBlock>(shared_from_this());
151  }
152 
153  /**
154  * \brief Return associated token for the current ast node
155  *
156  * Not all ast nodes have token information. For example, nmodl::visitor::NeuronSolveVisitor
157  * can insert new nodes in the ast as a solution of ODEs. In this case, we return
158  * nullptr to store in the nmodl::symtab::SymbolTable.
159  *
160  * \return pointer to token if exist otherwise nullptr
161  */
162  const ModToken* get_token() const noexcept override {
163  return token.get();
164  }
165  /**
166  * \brief Return associated symbol table for the current ast node
167  *
168  * Only certain ast nodes (e.g. inherited from ast::Block) have associated
169  * symbol table. These nodes have nmodl::symtab::SymbolTable as member
170  * and it can be accessed using this method.
171  *
172  * \return pointer to the symbol table
173  *
174  * \sa nmodl::symtab::SymbolTable nmodl::visitor::SymtabVisitor
175  */
177  return symtab;
178  }
179 
180 
181 
182  /**
183  * \brief Getter for member variable \ref EigenNewtonSolverBlock.n_state_vars
184  */
185  std::shared_ptr<Integer> get_n_state_vars() const noexcept {
186  return n_state_vars;
187  }
188 
189 
190 
191  /**
192  * \brief Getter for member variable \ref EigenNewtonSolverBlock.variable_block
193  */
194  std::shared_ptr<StatementBlock> get_variable_block() const noexcept {
195  return variable_block;
196  }
197 
198 
199 
200  /**
201  * \brief Getter for member variable \ref EigenNewtonSolverBlock.initialize_block
202  */
203  std::shared_ptr<StatementBlock> get_initialize_block() const noexcept {
204  return initialize_block;
205  }
206 
207 
208 
209  /**
210  * \brief Getter for member variable \ref EigenNewtonSolverBlock.setup_x_block
211  */
212  std::shared_ptr<StatementBlock> get_setup_x_block() const noexcept {
213  return setup_x_block;
214  }
215 
216 
217 
218  /**
219  * \brief Getter for member variable \ref EigenNewtonSolverBlock.functor_block
220  */
221  std::shared_ptr<StatementBlock> get_functor_block() const noexcept {
222  return functor_block;
223  }
224 
225 
226 
227  /**
228  * \brief Getter for member variable \ref EigenNewtonSolverBlock.update_states_block
229  */
230  std::shared_ptr<StatementBlock> get_update_states_block() const noexcept {
231  return update_states_block;
232  }
233 
234 
235 
236  /**
237  * \brief Getter for member variable \ref EigenNewtonSolverBlock.finalize_block
238  */
239  std::shared_ptr<StatementBlock> get_finalize_block() const noexcept {
240  return finalize_block;
241  }
242  /// \}
243 
244  /// \name Setters
245  /// \{
246  /**
247  * \brief Set token for the current ast node
248  */
249  void set_token(const ModToken& tok) { token = std::make_shared<ModToken>(tok); }
250  /**
251  * \brief Set symbol table for the current ast node
252  *
253  * Top level, block scoped nodes store symbol table in the ast node.
254  * nmodl::visitor::SymtabVisitor then used this method to setup symbol table
255  * for every node in the ast.
256  *
257  * \sa nmodl::visitor::SymtabVisitor
258  */
259  void set_symbol_table(symtab::SymbolTable* newsymtab) override {
260  symtab = newsymtab;
261  }
262 
263  /**
264  * \brief Setter for member variable \ref EigenNewtonSolverBlock.n_state_vars (rvalue reference)
265  */
266  void set_n_state_vars(std::shared_ptr<Integer>&& n_state_vars);
267 
268  /**
269  * \brief Setter for member variable \ref EigenNewtonSolverBlock.n_state_vars
270  */
271  void set_n_state_vars(const std::shared_ptr<Integer>& n_state_vars);
272 
273 
274  /**
275  * \brief Setter for member variable \ref EigenNewtonSolverBlock.variable_block (rvalue reference)
276  */
277  void set_variable_block(std::shared_ptr<StatementBlock>&& variable_block);
278 
279  /**
280  * \brief Setter for member variable \ref EigenNewtonSolverBlock.variable_block
281  */
282  void set_variable_block(const std::shared_ptr<StatementBlock>& variable_block);
283 
284 
285  /**
286  * \brief Setter for member variable \ref EigenNewtonSolverBlock.initialize_block (rvalue reference)
287  */
288  void set_initialize_block(std::shared_ptr<StatementBlock>&& initialize_block);
289 
290  /**
291  * \brief Setter for member variable \ref EigenNewtonSolverBlock.initialize_block
292  */
293  void set_initialize_block(const std::shared_ptr<StatementBlock>& initialize_block);
294 
295 
296  /**
297  * \brief Setter for member variable \ref EigenNewtonSolverBlock.setup_x_block (rvalue reference)
298  */
299  void set_setup_x_block(std::shared_ptr<StatementBlock>&& setup_x_block);
300 
301  /**
302  * \brief Setter for member variable \ref EigenNewtonSolverBlock.setup_x_block
303  */
304  void set_setup_x_block(const std::shared_ptr<StatementBlock>& setup_x_block);
305 
306 
307  /**
308  * \brief Setter for member variable \ref EigenNewtonSolverBlock.functor_block (rvalue reference)
309  */
310  void set_functor_block(std::shared_ptr<StatementBlock>&& functor_block);
311 
312  /**
313  * \brief Setter for member variable \ref EigenNewtonSolverBlock.functor_block
314  */
315  void set_functor_block(const std::shared_ptr<StatementBlock>& functor_block);
316 
317 
318  /**
319  * \brief Setter for member variable \ref EigenNewtonSolverBlock.update_states_block (rvalue reference)
320  */
321  void set_update_states_block(std::shared_ptr<StatementBlock>&& update_states_block);
322 
323  /**
324  * \brief Setter for member variable \ref EigenNewtonSolverBlock.update_states_block
325  */
326  void set_update_states_block(const std::shared_ptr<StatementBlock>& update_states_block);
327 
328 
329  /**
330  * \brief Setter for member variable \ref EigenNewtonSolverBlock.finalize_block (rvalue reference)
331  */
332  void set_finalize_block(std::shared_ptr<StatementBlock>&& finalize_block);
333 
334  /**
335  * \brief Setter for member variable \ref EigenNewtonSolverBlock.finalize_block
336  */
337  void set_finalize_block(const std::shared_ptr<StatementBlock>& finalize_block);
338 
339  /// \}
340 
341  /// \name Visitor
342  /// \{
343  /**
344  * \brief visit children i.e. member variables of current node using provided visitor
345  *
346  * Different nodes in the AST have different members (i.e. children). This method
347  * recursively visits children using provided visitor.
348  *
349  * \param v Concrete visitor that will be used to recursively visit children
350  *
351  * \sa Ast::visit_children for example.
352  */
353  void visit_children(visitor::Visitor& v) override;
354 
355  /**
356  * \brief visit children i.e. member variables of current node using provided visitor
357  *
358  * Different nodes in the AST have different members (i.e. children). This method
359  * recursively visits children using provided visitor.
360  *
361  * \param v Concrete constant visitor that will be used to recursively visit children
362  *
363  * \sa Ast::visit_children for example.
364  */
365  void visit_children(visitor::ConstVisitor& v) const override;
366 
367  /**
368  * \brief accept (or visit) the current AST node using provided visitor
369  *
370  * Instead of visiting children of AST node, like Ast::visit_children,
371  * accept allows to visit the current node itself using provided concrete
372  * visitor.
373  *
374  * \param v Concrete visitor that will be used to recursively visit node
375  *
376  * \sa Ast::accept for example.
377  */
378  void accept(visitor::Visitor& v) override;
379 
380  /**
381  * \copydoc accept(visitor::Visitor&)
382  */
383  void accept(visitor::ConstVisitor& v) const override;
384  /// \}
385 
386  private:
387  /**
388  * \brief Set this object as parent for all the children
389  *
390  * This should be called in every object (with children) constructor
391  * to set parents. Since it is called only in the constructors it
392  * should not be virtual to avoid ambiguities (issue #295).
393  */
394  void set_parent_in_children();
395 };
396 
397 /** \} */ // end of ast_class
398 
399 
400 
401 
402 
403 
404 
405 
406 
407 } // namespace nmodl::ast
nmodl::visitor::ConstVisitor
Abstract base class for all constant visitors implementation.
Definition: visitor.hpp:298
nmodl::ast::EigenNewtonSolverBlock::set_finalize_block
void set_finalize_block(std::shared_ptr< StatementBlock > &&finalize_block)
Setter for member variable EigenNewtonSolverBlock::finalize_block (rvalue reference)
Definition: ast.cpp:13336
nmodl::ast::EigenNewtonSolverBlock::set_update_states_block
void set_update_states_block(std::shared_ptr< StatementBlock > &&update_states_block)
Setter for member variable EigenNewtonSolverBlock::update_states_block (rvalue reference)
Definition: ast.cpp:13319
nmodl::ast::EigenNewtonSolverBlock::token
std::shared_ptr< ModToken > token
token with location information
Definition: eigen_newton_solver_block.hpp:55
nmodl::ast::EigenNewtonSolverBlock::update_states_block
std::shared_ptr< StatementBlock > update_states_block
update back states from X
Definition: eigen_newton_solver_block.hpp:51
nmodl::ast::EigenNewtonSolverBlock::set_initialize_block
void set_initialize_block(std::shared_ptr< StatementBlock > &&initialize_block)
Setter for member variable EigenNewtonSolverBlock::initialize_block (rvalue reference)
Definition: ast.cpp:13268
ast_decl.hpp
THIS FILE IS GENERATED AT BUILD TIME AND SHALL NOT BE EDITED.
nmodl::ast::EigenNewtonSolverBlock::get_initialize_block
std::shared_ptr< StatementBlock > get_initialize_block() const noexcept
Getter for member variable EigenNewtonSolverBlock::initialize_block.
Definition: eigen_newton_solver_block.hpp:203
nmodl::ast::AstNodeType::EIGEN_NEWTON_SOLVER_BLOCK
@ EIGEN_NEWTON_SOLVER_BLOCK
type of ast::EigenNewtonSolverBlock
block.hpp
Auto generated AST classes declaration.
nmodl::ast::EigenNewtonSolverBlock::set_variable_block
void set_variable_block(std::shared_ptr< StatementBlock > &&variable_block)
Setter for member variable EigenNewtonSolverBlock::variable_block (rvalue reference)
Definition: ast.cpp:13251
nmodl::ast::EigenNewtonSolverBlock::n_state_vars
std::shared_ptr< Integer > n_state_vars
number of state vars used in solve
Definition: eigen_newton_solver_block.hpp:41
nmodl::ast::Integer
Represents an integer variable.
Definition: integer.hpp:49
nmodl::ast::EigenNewtonSolverBlock::set_setup_x_block
void set_setup_x_block(std::shared_ptr< StatementBlock > &&setup_x_block)
Setter for member variable EigenNewtonSolverBlock::setup_x_block (rvalue reference)
Definition: ast.cpp:13285
nmodl::ast
Abstract Syntax Tree (AST) related implementations.
Definition: ast_common.hpp:29
nmodl::ast::EigenNewtonSolverBlock::setup_x_block
std::shared_ptr< StatementBlock > setup_x_block
update X from states
Definition: eigen_newton_solver_block.hpp:47
nmodl::ast::EigenNewtonSolverBlock::set_n_state_vars
void set_n_state_vars(std::shared_ptr< Integer > &&n_state_vars)
Setter for member variable EigenNewtonSolverBlock::n_state_vars (rvalue reference)
Definition: ast.cpp:13234
nmodl::ast::EigenNewtonSolverBlock::get_n_state_vars
std::shared_ptr< Integer > get_n_state_vars() const noexcept
Getter for member variable EigenNewtonSolverBlock::n_state_vars.
Definition: eigen_newton_solver_block.hpp:185
nmodl::ast::EigenNewtonSolverBlock::set_parent_in_children
void set_parent_in_children()
Set this object as parent for all the children.
Definition: ast.cpp:13199
nmodl::ast::EigenNewtonSolverBlock::functor_block
std::shared_ptr< StatementBlock > functor_block
odes as functor for eigen
Definition: eigen_newton_solver_block.hpp:49
nmodl::ast::EigenNewtonSolverBlock
Represent newton solver solution block based on Eigen.
Definition: eigen_newton_solver_block.hpp:38
nmodl::ast::AstNodeType
AstNodeType
Enum type for every AST node type.
Definition: ast_decl.hpp:164
nmodl::ast::EigenNewtonSolverBlock::get_token
const ModToken * get_token() const noexcept override
Return associated token for the current ast node.
Definition: eigen_newton_solver_block.hpp:162
nmodl::ast::EigenNewtonSolverBlock::get_node_type_name
std::string get_node_type_name() const noexcept override
Return type (ast::AstNodeType) of ast node as std::string.
Definition: eigen_newton_solver_block.hpp:120
nmodl::ast::Block
Base class for all block scoped nodes.
Definition: block.hpp:41
nmodl::ast::EigenNewtonSolverBlock::get_setup_x_block
std::shared_ptr< StatementBlock > get_setup_x_block() const noexcept
Getter for member variable EigenNewtonSolverBlock::setup_x_block.
Definition: eigen_newton_solver_block.hpp:212
nmodl::ast::EigenNewtonSolverBlock::accept
void accept(visitor::Visitor &v) override
accept (or visit) the current AST node using provided visitor
Definition: ast.cpp:13140
nmodl::ast::EigenNewtonSolverBlock::set_functor_block
void set_functor_block(std::shared_ptr< StatementBlock > &&functor_block)
Setter for member variable EigenNewtonSolverBlock::functor_block (rvalue reference)
Definition: ast.cpp:13302
nmodl::visitor::Visitor
Abstract base class for all visitors implementation.
Definition: visitor.hpp:39
nmodl::ast::EigenNewtonSolverBlock::get_node_type
AstNodeType get_node_type() const noexcept override
Return type (ast::AstNodeType) of ast node.
Definition: eigen_newton_solver_block.hpp:105
nmodl::ast::EigenNewtonSolverBlock::set_symbol_table
void set_symbol_table(symtab::SymbolTable *newsymtab) override
Set symbol table for the current ast node.
Definition: eigen_newton_solver_block.hpp:259
nmodl::ast::EigenNewtonSolverBlock::get_symbol_table
symtab::SymbolTable * get_symbol_table() const override
Return associated symbol table for the current ast node.
Definition: eigen_newton_solver_block.hpp:176
nmodl::ast::EigenNewtonSolverBlock::symtab
symtab::SymbolTable * symtab
symbol table for a block
Definition: eigen_newton_solver_block.hpp:57
nmodl::ast::EigenNewtonSolverBlock::variable_block
std::shared_ptr< StatementBlock > variable_block
Statements to be declared in the functor.
Definition: eigen_newton_solver_block.hpp:43
nmodl::ast::EigenNewtonSolverBlock::~EigenNewtonSolverBlock
virtual ~EigenNewtonSolverBlock()=default
nmodl::ast::EigenNewtonSolverBlock::finalize_block
std::shared_ptr< StatementBlock > finalize_block
Statement block to be executed after calling newton solver.
Definition: eigen_newton_solver_block.hpp:53
nmodl::symtab::SymbolTable
Represent symbol table for a NMODL block.
Definition: symbol_table.hpp:57
nmodl::ast::EigenNewtonSolverBlock::initialize_block
std::shared_ptr< StatementBlock > initialize_block
Statement block to be executed before calling newton solver.
Definition: eigen_newton_solver_block.hpp:45
nmodl::ast::EigenNewtonSolverBlock::get_nmodl_name
std::string get_nmodl_name() const noexcept override
Return NMODL statement of ast node as std::string.
Definition: eigen_newton_solver_block.hpp:135
nmodl::ast::EigenNewtonSolverBlock::is_eigen_newton_solver_block
bool is_eigen_newton_solver_block() const noexcept override
Check if the ast node is an instance of ast::EigenNewtonSolverBlock.
Definition: eigen_newton_solver_block.hpp:72
nmodl::ast::EigenNewtonSolverBlock::get_functor_block
std::shared_ptr< StatementBlock > get_functor_block() const noexcept
Getter for member variable EigenNewtonSolverBlock::functor_block.
Definition: eigen_newton_solver_block.hpp:221
nmodl::ast::EigenNewtonSolverBlock::set_token
void set_token(const ModToken &tok)
Set token for the current ast node.
Definition: eigen_newton_solver_block.hpp:249
nmodl::ast::StatementBlock
Represents block encapsulating list of statements.
Definition: statement_block.hpp:53
nmodl::ast::EigenNewtonSolverBlock::get_variable_block
std::shared_ptr< StatementBlock > get_variable_block() const noexcept
Getter for member variable EigenNewtonSolverBlock::variable_block.
Definition: eigen_newton_solver_block.hpp:194
nmodl::ast::EigenNewtonSolverBlock::clone
EigenNewtonSolverBlock * clone() const override
Return a copy of the current node.
Definition: eigen_newton_solver_block.hpp:87
nmodl::ast::EigenNewtonSolverBlock::visit_children
void visit_children(visitor::Visitor &v) override
visit children i.e.
Definition: ast.cpp:13092
nmodl::ast::EigenNewtonSolverBlock::EigenNewtonSolverBlock
EigenNewtonSolverBlock(Integer *n_state_vars, StatementBlock *variable_block, StatementBlock *initialize_block, StatementBlock *setup_x_block, StatementBlock *functor_block, StatementBlock *update_states_block, StatementBlock *finalize_block)
Definition: ast.cpp:13149
nmodl::ast::EigenNewtonSolverBlock::get_shared_ptr
std::shared_ptr< const Ast > get_shared_ptr() const override
Get std::shared_ptr from this pointer of the current ast node.
Definition: eigen_newton_solver_block.hpp:149
nmodl::ast::EigenNewtonSolverBlock::get_update_states_block
std::shared_ptr< StatementBlock > get_update_states_block() const noexcept
Getter for member variable EigenNewtonSolverBlock::update_states_block.
Definition: eigen_newton_solver_block.hpp:230
nmodl::ast::EigenNewtonSolverBlock::get_finalize_block
std::shared_ptr< StatementBlock > get_finalize_block() const noexcept
Getter for member variable EigenNewtonSolverBlock::finalize_block.
Definition: eigen_newton_solver_block.hpp:239
nmodl::ModToken
Represent token returned by scanner.
Definition: modtoken.hpp:50
nmodl::ast::EigenNewtonSolverBlock::get_shared_ptr
std::shared_ptr< Ast > get_shared_ptr() override
Get std::shared_ptr from this pointer of the current ast node.
Definition: eigen_newton_solver_block.hpp:142