User Guide
nmodl::visitor::SympyConductanceVisitor Class Reference

Visitor for generating CONDUCTANCE statements for ions More...

Detailed Description

Visitor for generating CONDUCTANCE statements for ions

This class visits each ion expression I = ... in the BREAKPOINT and symbolically differentiates it to get dI/dV, i.e. the conductance. If this coincides with an existing global variable g (e.g. when I is linear in V) then it will add

CONDUCTANCE g USEION I

If dI/dV is a more complicated expression, it generates a new unique variable name g_unique, and adds two lines

CONDUCTANCE g_unique USEION I
g_unique = [dI/dV expression]

If an ion channel already has a CONDUCTANCE statement then it does not modify it.

Definition at line 54 of file sympy_conductance_visitor.hpp.

#include <sympy_conductance_visitor.hpp>

Inheritance diagram for nmodl::visitor::SympyConductanceVisitor:
nmodl::visitor::AstVisitor nmodl::visitor::Visitor

Public Member Functions

 SympyConductanceVisitor ()=default
 
void visit_binary_expression (ast::BinaryExpression &node) override
 visit node of type ast::BinaryExpression More...
 
void visit_breakpoint_block (ast::BreakpointBlock &node) override
 visit node of type ast::BreakpointBlock More...
 
void visit_conductance_hint (ast::ConductanceHint &node) override
 visit node of type ast::ConductanceHint More...
 
void visit_program (ast::Program &node) override
 visit node of type ast::Program More...
 
- Public Member Functions inherited from nmodl::visitor::AstVisitor
void visit_node (ast::Node &node) override
 visit node of type ast::Node More...
 
void visit_statement (ast::Statement &node) override
 visit node of type ast::Statement More...
 
void visit_expression (ast::Expression &node) override
 visit node of type ast::Expression More...
 
void visit_block (ast::Block &node) override
 visit node of type ast::Block More...
 
void visit_identifier (ast::Identifier &node) override
 visit node of type ast::Identifier More...
 
void visit_number (ast::Number &node) override
 visit node of type ast::Number More...
 
void visit_string (ast::String &node) override
 visit node of type ast::String More...
 
void visit_integer (ast::Integer &node) override
 visit node of type ast::Integer More...
 
void visit_float (ast::Float &node) override
 visit node of type ast::Float More...
 
void visit_double (ast::Double &node) override
 visit node of type ast::Double More...
 
void visit_boolean (ast::Boolean &node) override
 visit node of type ast::Boolean More...
 
void visit_name (ast::Name &node) override
 visit node of type ast::Name More...
 
void visit_prime_name (ast::PrimeName &node) override
 visit node of type ast::PrimeName More...
 
void visit_indexed_name (ast::IndexedName &node) override
 visit node of type ast::IndexedName More...
 
void visit_var_name (ast::VarName &node) override
 visit node of type ast::VarName More...
 
void visit_argument (ast::Argument &node) override
 visit node of type ast::Argument More...
 
void visit_react_var_name (ast::ReactVarName &node) override
 visit node of type ast::ReactVarName More...
 
void visit_read_ion_var (ast::ReadIonVar &node) override
 visit node of type ast::ReadIonVar More...
 
void visit_write_ion_var (ast::WriteIonVar &node) override
 visit node of type ast::WriteIonVar More...
 
void visit_nonspecific_cur_var (ast::NonspecificCurVar &node) override
 visit node of type ast::NonspecificCurVar More...
 
void visit_electrode_cur_var (ast::ElectrodeCurVar &node) override
 visit node of type ast::ElectrodeCurVar More...
 
void visit_range_var (ast::RangeVar &node) override
 visit node of type ast::RangeVar More...
 
void visit_global_var (ast::GlobalVar &node) override
 visit node of type ast::GlobalVar More...
 
void visit_pointer_var (ast::PointerVar &node) override
 visit node of type ast::PointerVar More...
 
void visit_random_var (ast::RandomVar &node) override
 visit node of type ast::RandomVar More...
 
void visit_bbcore_pointer_var (ast::BbcorePointerVar &node) override
 visit node of type ast::BbcorePointerVar More...
 
void visit_extern_var (ast::ExternVar &node) override
 visit node of type ast::ExternVar More...
 
void visit_param_block (ast::ParamBlock &node) override
 visit node of type ast::ParamBlock More...
 
void visit_independent_block (ast::IndependentBlock &node) override
 visit node of type ast::IndependentBlock More...
 
void visit_assigned_block (ast::AssignedBlock &node) override
 visit node of type ast::AssignedBlock More...
 
void visit_state_block (ast::StateBlock &node) override
 visit node of type ast::StateBlock More...
 
void visit_initial_block (ast::InitialBlock &node) override
 visit node of type ast::InitialBlock More...
 
void visit_constructor_block (ast::ConstructorBlock &node) override
 visit node of type ast::ConstructorBlock More...
 
void visit_destructor_block (ast::DestructorBlock &node) override
 visit node of type ast::DestructorBlock More...
 
void visit_statement_block (ast::StatementBlock &node) override
 visit node of type ast::StatementBlock More...
 
void visit_derivative_block (ast::DerivativeBlock &node) override
 visit node of type ast::DerivativeBlock More...
 
void visit_linear_block (ast::LinearBlock &node) override
 visit node of type ast::LinearBlock More...
 
void visit_non_linear_block (ast::NonLinearBlock &node) override
 visit node of type ast::NonLinearBlock More...
 
void visit_discrete_block (ast::DiscreteBlock &node) override
 visit node of type ast::DiscreteBlock More...
 
void visit_function_table_block (ast::FunctionTableBlock &node) override
 visit node of type ast::FunctionTableBlock More...
 
void visit_function_block (ast::FunctionBlock &node) override
 visit node of type ast::FunctionBlock More...
 
void visit_procedure_block (ast::ProcedureBlock &node) override
 visit node of type ast::ProcedureBlock More...
 
void visit_net_receive_block (ast::NetReceiveBlock &node) override
 visit node of type ast::NetReceiveBlock More...
 
void visit_solve_block (ast::SolveBlock &node) override
 visit node of type ast::SolveBlock More...
 
void visit_breakpoint_block (ast::BreakpointBlock &node) override
 visit node of type ast::BreakpointBlock More...
 
void visit_before_block (ast::BeforeBlock &node) override
 visit node of type ast::BeforeBlock More...
 
void visit_after_block (ast::AfterBlock &node) override
 visit node of type ast::AfterBlock More...
 
void visit_ba_block (ast::BABlock &node) override
 visit node of type ast::BABlock More...
 
void visit_for_netcon (ast::ForNetcon &node) override
 visit node of type ast::ForNetcon More...
 
void visit_kinetic_block (ast::KineticBlock &node) override
 visit node of type ast::KineticBlock More...
 
void visit_unit_block (ast::UnitBlock &node) override
 visit node of type ast::UnitBlock More...
 
void visit_constant_block (ast::ConstantBlock &node) override
 visit node of type ast::ConstantBlock More...
 
void visit_neuron_block (ast::NeuronBlock &node) override
 visit node of type ast::NeuronBlock More...
 
void visit_unit (ast::Unit &node) override
 visit node of type ast::Unit More...
 
void visit_double_unit (ast::DoubleUnit &node) override
 visit node of type ast::DoubleUnit More...
 
void visit_local_var (ast::LocalVar &node) override
 visit node of type ast::LocalVar More...
 
void visit_limits (ast::Limits &node) override
 visit node of type ast::Limits More...
 
void visit_number_range (ast::NumberRange &node) override
 visit node of type ast::NumberRange More...
 
void visit_constant_var (ast::ConstantVar &node) override
 visit node of type ast::ConstantVar More...
 
void visit_binary_operator (ast::BinaryOperator &node) override
 visit node of type ast::BinaryOperator More...
 
void visit_unary_operator (ast::UnaryOperator &node) override
 visit node of type ast::UnaryOperator More...
 
void visit_reaction_operator (ast::ReactionOperator &node) override
 visit node of type ast::ReactionOperator More...
 
void visit_paren_expression (ast::ParenExpression &node) override
 visit node of type ast::ParenExpression More...
 
void visit_binary_expression (ast::BinaryExpression &node) override
 visit node of type ast::BinaryExpression More...
 
void visit_diff_eq_expression (ast::DiffEqExpression &node) override
 visit node of type ast::DiffEqExpression More...
 
void visit_unary_expression (ast::UnaryExpression &node) override
 visit node of type ast::UnaryExpression More...
 
void visit_non_lin_equation (ast::NonLinEquation &node) override
 visit node of type ast::NonLinEquation More...
 
void visit_lin_equation (ast::LinEquation &node) override
 visit node of type ast::LinEquation More...
 
void visit_function_call (ast::FunctionCall &node) override
 visit node of type ast::FunctionCall More...
 
void visit_watch (ast::Watch &node) override
 visit node of type ast::Watch More...
 
void visit_ba_block_type (ast::BABlockType &node) override
 visit node of type ast::BABlockType More...
 
void visit_unit_def (ast::UnitDef &node) override
 visit node of type ast::UnitDef More...
 
void visit_factor_def (ast::FactorDef &node) override
 visit node of type ast::FactorDef More...
 
void visit_valence (ast::Valence &node) override
 visit node of type ast::Valence More...
 
void visit_unit_state (ast::UnitState &node) override
 visit node of type ast::UnitState More...
 
void visit_local_list_statement (ast::LocalListStatement &node) override
 visit node of type ast::LocalListStatement More...
 
void visit_model (ast::Model &node) override
 visit node of type ast::Model More...
 
void visit_define (ast::Define &node) override
 visit node of type ast::Define More...
 
void visit_include (ast::Include &node) override
 visit node of type ast::Include More...
 
void visit_param_assign (ast::ParamAssign &node) override
 visit node of type ast::ParamAssign More...
 
void visit_assigned_definition (ast::AssignedDefinition &node) override
 visit node of type ast::AssignedDefinition More...
 
void visit_conductance_hint (ast::ConductanceHint &node) override
 visit node of type ast::ConductanceHint More...
 
void visit_expression_statement (ast::ExpressionStatement &node) override
 visit node of type ast::ExpressionStatement More...
 
void visit_protect_statement (ast::ProtectStatement &node) override
 visit node of type ast::ProtectStatement More...
 
void visit_from_statement (ast::FromStatement &node) override
 visit node of type ast::FromStatement More...
 
void visit_while_statement (ast::WhileStatement &node) override
 visit node of type ast::WhileStatement More...
 
void visit_if_statement (ast::IfStatement &node) override
 visit node of type ast::IfStatement More...
 
void visit_else_if_statement (ast::ElseIfStatement &node) override
 visit node of type ast::ElseIfStatement More...
 
void visit_else_statement (ast::ElseStatement &node) override
 visit node of type ast::ElseStatement More...
 
void visit_watch_statement (ast::WatchStatement &node) override
 visit node of type ast::WatchStatement More...
 
void visit_mutex_lock (ast::MutexLock &node) override
 visit node of type ast::MutexLock More...
 
void visit_mutex_unlock (ast::MutexUnlock &node) override
 visit node of type ast::MutexUnlock More...
 
void visit_conserve (ast::Conserve &node) override
 visit node of type ast::Conserve More...
 
void visit_compartment (ast::Compartment &node) override
 visit node of type ast::Compartment More...
 
void visit_lon_difuse (ast::LonDifuse &node) override
 visit node of type ast::LonDifuse More...
 
void visit_reaction_statement (ast::ReactionStatement &node) override
 visit node of type ast::ReactionStatement More...
 
void visit_lag_statement (ast::LagStatement &node) override
 visit node of type ast::LagStatement More...
 
void visit_constant_statement (ast::ConstantStatement &node) override
 visit node of type ast::ConstantStatement More...
 
void visit_table_statement (ast::TableStatement &node) override
 visit node of type ast::TableStatement More...
 
void visit_suffix (ast::Suffix &node) override
 visit node of type ast::Suffix More...
 
void visit_useion (ast::Useion &node) override
 visit node of type ast::Useion More...
 
void visit_nonspecific (ast::Nonspecific &node) override
 visit node of type ast::Nonspecific More...
 
void visit_electrode_current (ast::ElectrodeCurrent &node) override
 visit node of type ast::ElectrodeCurrent More...
 
void visit_range (ast::Range &node) override
 visit node of type ast::Range More...
 
void visit_global (ast::Global &node) override
 visit node of type ast::Global More...
 
void visit_random_var_list (ast::RandomVarList &node) override
 visit node of type ast::RandomVarList More...
 
void visit_pointer (ast::Pointer &node) override
 visit node of type ast::Pointer More...
 
void visit_bbcore_pointer (ast::BbcorePointer &node) override
 visit node of type ast::BbcorePointer More...
 
void visit_external (ast::External &node) override
 visit node of type ast::External More...
 
void visit_thread_safe (ast::ThreadSafe &node) override
 visit node of type ast::ThreadSafe More...
 
void visit_verbatim (ast::Verbatim &node) override
 visit node of type ast::Verbatim More...
 
void visit_line_comment (ast::LineComment &node) override
 visit node of type ast::LineComment More...
 
void visit_block_comment (ast::BlockComment &node) override
 visit node of type ast::BlockComment More...
 
void visit_ontology_statement (ast::OntologyStatement &node) override
 visit node of type ast::OntologyStatement More...
 
void visit_program (ast::Program &node) override
 visit node of type ast::Program More...
 
void visit_nrn_state_block (ast::NrnStateBlock &node) override
 visit node of type ast::NrnStateBlock More...
 
void visit_eigen_newton_solver_block (ast::EigenNewtonSolverBlock &node) override
 visit node of type ast::EigenNewtonSolverBlock More...
 
void visit_eigen_linear_solver_block (ast::EigenLinearSolverBlock &node) override
 visit node of type ast::EigenLinearSolverBlock More...
 
void visit_wrapped_expression (ast::WrappedExpression &node) override
 visit node of type ast::WrappedExpression More...
 
void visit_derivimplicit_callback (ast::DerivimplicitCallback &node) override
 visit node of type ast::DerivimplicitCallback More...
 
void visit_solution_expression (ast::SolutionExpression &node) override
 visit node of type ast::SolutionExpression More...
 
void visit_update_dt (ast::UpdateDt &node) override
 visit node of type ast::UpdateDt More...
 
- Public Member Functions inherited from nmodl::visitor::Visitor
virtual ~Visitor ()=default
 

Private Types

typedef std::map< std::string, std::string > string_map
 
typedef std::set< std::string > string_set
 

Private Member Functions

std::vector< std::string > generate_statement_strings (ast::BreakpointBlock &node)
 
void lookup_useion_statements ()
 
void lookup_nonspecific_statements ()
 

Static Private Member Functions

static std::string to_nmodl_for_sympy (const ast::Ast &node)
 

Private Attributes

bool under_breakpoint_block = false
 true while visiting breakpoint block More...
 
string_set all_vars
 set of all variables for SymPy More...
 
string_set i_ignore
 set of currents to ignore More...
 
string_map i_name
 map between current write names and ion names More...
 
bool NONSPECIFIC_CONDUCTANCE_ALREADY_EXISTS = false
 
std::vector< std::string > ordered_binary_exprs
 list in order of binary expressions in breakpoint More...
 
std::vector< std::string > ordered_binary_exprs_lhs
 ditto but for LHS of expression only More...
 
std::map< std::string, std::size_t > binary_expr_index
 map from lhs of binary expression to index of expression in above vector More...
 
std::vector< std::shared_ptr< const ast::Ast > > use_ion_nodes
 use ion ast nodes More...
 
std::vector< std::shared_ptr< const ast::Ast > > nonspecific_nodes
 non specific currents More...
 

Member Typedef Documentation

◆ string_map

typedef std::map<std::string, std::string> nmodl::visitor::SympyConductanceVisitor::string_map
private

Definition at line 55 of file sympy_conductance_visitor.hpp.

◆ string_set

typedef std::set<std::string> nmodl::visitor::SympyConductanceVisitor::string_set
private

Definition at line 56 of file sympy_conductance_visitor.hpp.

Constructor & Destructor Documentation

◆ SympyConductanceVisitor()

nmodl::visitor::SympyConductanceVisitor::SympyConductanceVisitor ( )
default

Member Function Documentation

◆ generate_statement_strings()

std::vector< std::string > nmodl::visitor::SympyConductanceVisitor::generate_statement_strings ( ast::BreakpointBlock node)
private

Definition at line 48 of file sympy_conductance_visitor.cpp.

◆ lookup_nonspecific_statements()

void nmodl::visitor::SympyConductanceVisitor::lookup_nonspecific_statements ( )
private

Definition at line 139 of file sympy_conductance_visitor.cpp.

◆ lookup_useion_statements()

void nmodl::visitor::SympyConductanceVisitor::lookup_useion_statements ( )
private

Definition at line 161 of file sympy_conductance_visitor.cpp.

◆ to_nmodl_for_sympy()

std::string nmodl::visitor::SympyConductanceVisitor::to_nmodl_for_sympy ( const ast::Ast node)
staticprivate

Definition at line 156 of file sympy_conductance_visitor.cpp.

◆ visit_binary_expression()

void nmodl::visitor::SympyConductanceVisitor::visit_binary_expression ( ast::BinaryExpression node)
overridevirtual

visit node of type ast::BinaryExpression

Implements nmodl::visitor::Visitor.

Definition at line 124 of file sympy_conductance_visitor.cpp.

◆ visit_breakpoint_block()

void nmodl::visitor::SympyConductanceVisitor::visit_breakpoint_block ( ast::BreakpointBlock node)
overridevirtual

visit node of type ast::BreakpointBlock

Implements nmodl::visitor::Visitor.

Definition at line 196 of file sympy_conductance_visitor.cpp.

◆ visit_conductance_hint()

void nmodl::visitor::SympyConductanceVisitor::visit_conductance_hint ( ast::ConductanceHint node)
overridevirtual

visit node of type ast::ConductanceHint

Implements nmodl::visitor::Visitor.

Definition at line 182 of file sympy_conductance_visitor.cpp.

◆ visit_program()

void nmodl::visitor::SympyConductanceVisitor::visit_program ( ast::Program node)
overridevirtual

visit node of type ast::Program

Implements nmodl::visitor::Visitor.

Definition at line 238 of file sympy_conductance_visitor.cpp.

Member Data Documentation

◆ all_vars

string_set nmodl::visitor::SympyConductanceVisitor::all_vars
private

set of all variables for SymPy

Definition at line 63 of file sympy_conductance_visitor.hpp.

◆ binary_expr_index

std::map<std::string, std::size_t> nmodl::visitor::SympyConductanceVisitor::binary_expr_index
private

map from lhs of binary expression to index of expression in above vector

Definition at line 80 of file sympy_conductance_visitor.hpp.

◆ i_ignore

string_set nmodl::visitor::SympyConductanceVisitor::i_ignore
private

set of currents to ignore

Definition at line 66 of file sympy_conductance_visitor.hpp.

◆ i_name

string_map nmodl::visitor::SympyConductanceVisitor::i_name
private

map between current write names and ion names

Definition at line 69 of file sympy_conductance_visitor.hpp.

◆ NONSPECIFIC_CONDUCTANCE_ALREADY_EXISTS

bool nmodl::visitor::SympyConductanceVisitor::NONSPECIFIC_CONDUCTANCE_ALREADY_EXISTS = false
private

Definition at line 71 of file sympy_conductance_visitor.hpp.

◆ nonspecific_nodes

std::vector<std::shared_ptr<const ast::Ast> > nmodl::visitor::SympyConductanceVisitor::nonspecific_nodes
private

non specific currents

Definition at line 86 of file sympy_conductance_visitor.hpp.

◆ ordered_binary_exprs

std::vector<std::string> nmodl::visitor::SympyConductanceVisitor::ordered_binary_exprs
private

list in order of binary expressions in breakpoint

Definition at line 74 of file sympy_conductance_visitor.hpp.

◆ ordered_binary_exprs_lhs

std::vector<std::string> nmodl::visitor::SympyConductanceVisitor::ordered_binary_exprs_lhs
private

ditto but for LHS of expression only

Definition at line 77 of file sympy_conductance_visitor.hpp.

◆ under_breakpoint_block

bool nmodl::visitor::SympyConductanceVisitor::under_breakpoint_block = false
private

true while visiting breakpoint block

Definition at line 60 of file sympy_conductance_visitor.hpp.

◆ use_ion_nodes

std::vector<std::shared_ptr<const ast::Ast> > nmodl::visitor::SympyConductanceVisitor::use_ion_nodes
private

use ion ast nodes

Definition at line 83 of file sympy_conductance_visitor.hpp.


The documentation for this class was generated from the following files: